日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Pod 生命周期與重啟策略

作者:看,未來 更新時間: 2022-09-22 編程語言

文章目錄

    • Pod 生命周期
      • Pod 的創建過程
      • pod的終止過程
      • 初始化容器
      • 鉤子函數
    • 重啟策略

在這里插入圖片描述

Pod 生命周期

在這里插入圖片描述

Pod 的創建過程

1、用戶通過kubectl或其他api客戶端提交需要創建的pod信息給apiServer。
2、apiServer開始生成pod對象的信息,并將信息存入etcd,然后返回確認信息至客戶端。
3、apiServer開始反映etcd中的pod對象的變化,其它組件使用watch機制來跟蹤檢查apiServer上的變動。
4、scheduler發現有新的pod對象要創建,開始為Pod分配主機并將結果信息更新至apiServer。
5、node節點上的kubelet發現有pod調度過來,嘗試調用docker啟動容器,并將結果回送至apiServer。
6、apiServer將接收到的pod狀態信息存入etcd中。
在這里插入圖片描述

pod的終止過程

1、用戶向apiServer發送刪除pod對象的命令。
2、apiServcer中的pod對象信息會隨著時間的推移而更新,在寬限期內(默認30s),pod被視為dead。
3、將pod標記為terminating狀態。
4、kubelet在監控到pod對象轉為terminating狀態的同時啟動pod關閉過程。
5、端點控制器監控到pod對象的關閉行為時將其從所有匹配到此端點的service資源的端點列表中移除。
6、如果當前pod對象定義了preStop鉤子處理器,則在其標記為terminating后即會以同步的方式啟動執行。
7、pod對象中的容器進程收到停止信號。
8、寬限期結束后,若pod中還存在仍在運行的進程,那么pod對象會收到立即終止的信號。
9、kubelet請求apiServer將此pod資源的寬限期設置為0從而完成刪除操作,此時pod對于用戶已不可見。


初始化容器

初始化容器是在pod的主容器啟動之前要運行的容器,主要是做一些主容器的前置工作,它具有兩大特征:

  • 初始化容器必須運行完成直至結束,若某初始化容器運行失敗,那么kubernetes需要重啟它直到成功完成。
  • 初始化容器必須按照定義的順序執行,當且僅當前一個成功之后,后面的一個才能運行。

初始化容器有很多的應用場景,下面列出的是最常見的幾個:

  • 提供主容器鏡像中不具備的工具程序或自定義代碼。
  • 初始化容器要先于應用容器串行啟動并運行完成,因此可用于延后應用容器的啟動直至其依賴的條件得到滿足。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-initcontainer
  namespace: dev
spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    ports: 
    - name: nginx-port
      containerPort: 80
  initContainers:
  - name: test-mysql
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.90.14 -c 1 ; do echo waiting for mysql...; sleep 2; done;']
  - name: test-redis
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.90.15 -c 1 ; do echo waiting for reids...; sleep 2; done;']

鉤子函數

鉤子函數能夠感知自身生命周期中的事件,并在相應的時刻到來時運行用戶指定的程序代碼。

kubernetes在主容器的啟動之后和停止之前提供了兩個鉤子函數:

postStart:容器創建之后執行,如果失敗了會重啟容器
preStop :容器終止之前執行,執行完成之后容器將成功終止,在其完成之前會阻塞刪除容器的操作

鉤子處理器支持使用下面三種方式定義動作:

  • Exec命令:在容器內執行一次命令
……
  lifecycle:
    postStart: 
      exec:
        command:
        - cat
        - /tmp/healthy
……
  • TCPSocket:在當前容器嘗試訪問指定的socket
……      
  lifecycle:
    postStart:
      tcpSocket:
        port: 8080
……
  • HTTPGet:在當前容器中向某url發起http請求
……
  lifecycle:
    postStart:
      httpGet:
        path: / #URI地址
        port: 80 #端口號
        host: 192.168.5.3 #主機地址
        scheme: HTTP #支持的協議,http或者https
……

接下來,以exec方式為例,演示下鉤子函數的使用,創建pod-hook-exec.yaml文件,內容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-hook-exec
  namespace: dev
spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
    lifecycle:
      postStart: 
        exec: # 在容器啟動的時候執行一個命令,修改掉nginx的默認首頁內容
          command: ["/bin/sh", "-c", "echo postStart... > /usr/share/nginx/html/index.html"]
      preStop:
        exec: # 在容器停止之前停止nginx服務
          command: ["/usr/sbin/nginx","-s","quit"]

容器探測用于檢測容器中的應用實例是否正常工作,是保障業務可用性的一種傳統機制。如果經過探測,實例的狀態不符合預期,那么kubernetes就會把該問題實例" 摘除 ",不承擔業務流量。kubernetes提供了兩種探針來實現容器探測,分別是:

liveness probes:存活性探針,用于檢測應用實例當前是否處于正常運行狀態,如果不是,k8s會重啟容器
readiness probes:就緒性探針,用于檢測應用實例當前是否可以接收請求,如果不能,k8s不會轉發流量

livenessProbe 決定是否重啟容器,readinessProbe 決定是否將請求轉發給容器。

上面兩種探針目前均支持三種探測方式:

  • Exec命令:在容器內執行一次命令,如果命令執行的退出碼為0,則認為程序正常,否則不正常
……
  livenessProbe:
    exec:
      command:
      - cat
      - /tmp/healthy
……
  • TCPSocket:將會嘗試訪問一個用戶容器的端口,如果能夠建立這條連接,則認為程序正常,否則不正常
……      
  livenessProbe:
    tcpSocket:
      port: 8080
……
  • HTTPGet:調用容器內Web應用的URL,如果返回的狀態碼在200和399之間,則認為程序正常,否則不正常
……
  livenessProbe:
    httpGet:
      path: / #URI地址
      port: 80 #端口號
      host: 127.0.0.1 #主機地址
      scheme: HTTP #支持的協議,http或者https
……

下面以liveness probes為例,做幾個演示:

方式一:Exec

創建pod-liveness-exec.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness-exec
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports: 
    - name: nginx-port
      containerPort: 80
    livenessProbe:
      exec:
        command: ["/bin/cat","/tmp/hello.txt"] # 執行一個查看文件的命令

方式二:TCPSocket

創建pod-liveness-tcpsocket.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness-tcpsocket
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports: 
    - name: nginx-port
      containerPort: 80
    livenessProbe:
      tcpSocket:
        port: 8080 # 嘗試訪問8080端口

方式三:HTTPGet

創建pod-liveness-httpget.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness-httpget
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe:
      httpGet:  # 其實就是訪問http://127.0.0.1:80/hello  
        scheme: HTTP #支持的協議,http或者https
        port: 80 #端口號
        path: /hello #URI地址

重啟策略

一旦容器探測出現了問題,kubernetes就會對容器所在的Pod進行重啟,其實這是由pod的重啟策略決定的,pod的重啟策略有 3 種,分別如下:

Always :容器失效時,自動重啟該容器,這也是默認值。
OnFailure : 容器終止運行且退出碼不為0時重啟
Never : 不論狀態為何,都不重啟該容器

重啟策略適用于pod對象中的所有容器,首次需要重啟的容器,將在其需要時立即進行重啟,隨后再次需要重啟的操作將由kubelet延遲一段時間后進行,且反復的重啟操作的延遲時長以此為10s、20s、40s、80s、160s和300s,300s是最大延遲時長。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-restartpolicy
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    ports:
    - name: nginx-port
      containerPort: 80
    livenessProbe:
      httpGet:
        scheme: HTTP
        port: 80
        path: /hello
  restartPolicy: Never # 設置重啟策略為Never

原文鏈接:https://lion-wu.blog.csdn.net/article/details/125770660

欄目分類
最近更新