k8s--pod的生命週期

Pod生命週期

##基礎知識與圖解:
在這裏插入圖片描述
Pod 可以包含多個容器,應用運行在這些容器裏面,同時 Pod 也可以有一個或多個先於應用容器啓動的 Init 容器。

Init 容器與普通的容器非常像,除了如下兩點: • 它們總是運行到完成。
Init 容器不支持 Readiness,因爲它們必須在 Pod 就緒之前運行完成。
每個 Init 容器必須運行成功,下一個才能夠運行。

如果 Pod 的 Init 容器失敗,Kubernetes 會不斷地重啓該 Pod,直到 Init 容器成 功爲止。然而,如果 Pod 對應的 restartPolicy 值爲 Never,它不會重新啓動。

Init 容器能做什麼?

Init 容器可以包含一些安裝過程中應用容器中不存在的實用工具或個性化
代碼。
Init 容器可以安全地運行這些工具,避免這些工具導致應用鏡像的安全性
降低。
應用鏡像的創建者和部署者可以各自獨立工作,而沒有必要聯合構建一個
單獨的應用鏡像。
Init 容器能以不同於Pod內應用容器的文件系統視圖運行。因此,Init容器
可具有訪問 Secrets 的權限,而應用容器不能夠訪問。
由於 Init 容器必須在應用容器啓動之前運行完成,因此 Init 容器提供了一
種機制來阻塞或延遲應用容器的啓動,直到滿足了一組先決條件。一旦前 置條件滿足,Pod內的所有的應用容器會並行啓動。

apiVersion: v1 
kind: Pod 
metadata:
  name: nginx 
  labels:
    app: nginx 
spec:
  containers:
    - name: nginx
      image: nginx
      imagePullPolicy: IfNotPresent 
    initContainers:
      - name: init-container
         image: busybox
         command: ["/bin/sh", "-c", "until nslookup myservice.default.svc.cluster.local; do echo
waiting for myservice; sleep 2; done"]

探針 是由 kubelet 對容器執行的定期診斷

ExecAction:在容器內執行指定命令。如果命令退出時返回碼爲 0 則認爲診斷成功。

TCPSocketAction:對指定端口上的容器的 IP 地址進行 TCP 檢查。如果端口打開,則診斷被認爲是成功的。

HTTPGetAction:對指定的端口和路徑上的容器的 IP 地址執行 HTTP Get請求。如果響應的狀態碼大於等於200 且小於 400,則診斷被認爲是成功 的。

每次探測都將獲得以下三種結果之一:

成功:容器通過了診斷。

失敗:容器未通過診斷。

未知:診斷失敗,因此不會採取任何行動。

Kubelet 可以選擇是否執行在容器上運行的三種探針執行和做出反應

livenessProbe:指示容器是否正在運行。如果存活探測失敗,則 kubelet 會
殺死容器,並且容器將受到其 重啓策略 的影響。如果容器不提供存活探針, 則默認狀態爲 Success

readinessProbe:指示容器是否準備好服務請求。如果就緒探測失敗,端點 控制器將從與 Pod 匹配的所有 Service 的端點中刪除該 Pod 的 IP 地址。初 始延遲之前的就緒狀態默認爲 Failure。如果容器不提供就緒探針,則默認狀 態爲 Success。

startupProbe: 指示容器中的應用是否已經啓動。如果提供了啓動探測 (startup probe),則禁用所有其他探測,直到它成功爲止。如果啓動探測失 敗,kubelet 將殺死容器,容器服從其重啓策略進行重啓。如果容器沒有提 供啓動探測,則默認狀態爲成功Success。

重啓策略

PodSpec 中有一個 restartPolicy 字段,可能的值爲 Always、OnFailure 和Never。默認爲 Always。

Pod 的生命

一般Pod 不會消失,直到人爲銷燬他們,這可能是一個人或控制器。

建議創建適當的控制器來創建 Pod,而不是直接自己創建 Pod。因爲單獨的Pod 在機器故障的情況下沒有辦法自動復原,而控制器卻可以。

三種可用的控制器:

使用 Job 運行預期會終止的 Pod,例如批量計算。Job 僅適用於重啓策略爲OnFailure 或 Never 的 Pod。

對預期不會終止的 Pod 使用 ReplicationController、ReplicaSet 和Deployment ,例如 Web 服務器。 ReplicationController 僅適用於具有restartPolicy 爲 Always 的 Pod。

提供特定於機器的系統服務,使用 DaemonSet 爲每臺機器運行一個 Pod

readiness實例 
apiVersion: v1
kind: Pod metadata:
  labels:
    test: readness
  name: readiness-http 
spec:
  containers:
    - name: readiness
      image: nginx 
      readinessProbe:
         httpGet:
           path: /test.html 
           port: 80
         initialDelaySeconds: 1 
         periodSeconds: 3 
         timeoutSeconds: 1

探針 是由 kubelet 對容器執行的定期診斷:

ExecAction:在容器內執行指定命令。如果命令退出時返回碼爲 0 則認爲 診斷成功。

TCPSocketAction:對指定端口上的容器的 IP 地址進行 TCP 檢查。如果 端口打開,則診斷被認爲是成功的。

HTTPGetAction:對指定的端口和路徑上的容器的 IP 地址執行 HTTP Get 請求。如果響應的狀態碼大於等於200 且小於 400,則診斷被認爲是成功 的。

每次探測都將獲得以下三種結果之一:
成功:容器通過了診斷。
失敗:容器未通過診斷。
未知:診斷失敗,因此不會採取任何行動。

Kubelet 可以選擇是否執行在容器上運行的三種探針執行和做出反應:
livenessProbe:指示容器是否正在運行。如果存活探測失敗,則 kubelet 會 殺死容器,並且容器將受到其 重啓策略 的影響。如果容器不提供存活探針, 則默認狀態爲 Success。

readinessProbe:指示容器是否準備好服務請求。如果就緒探測失敗,端點 控制器將從與 Pod 匹配的所有 Service 的端點中刪除該 Pod 的 IP 地址。初 始延遲之前的就緒狀態默認爲 Failure。如果容器不提供就緒探針,則默認狀 態爲 Success。

startupProbe: 指示容器中的應用是否已經啓動。如果提供了啓動探測 (startup probe),則禁用所有其他探測,直到它成功爲止。如果啓動探測失 敗,kubelet 將殺死容器,容器服從其重啓策略進行重啓。如果容器沒有提 供啓動探測,則默認狀態爲成功Success

重啓策略

PodSpec 中有一個 restartPolicy 字段,可能的值爲 Always、OnFailure 和 Never。默認爲 Always。

Pod 的生命
一般Pod 不會消失,直到人爲銷燬他們,這可能是一個人或控制器。
建議創建適當的控制器來創建 Pod,而不是直接自己創建 Pod。因爲單獨的 Pod 在機器故障的情況下沒有辦法自動復原,而控制器卻可以。

三種可用的控制器:

使用 Job 運行預期會終止的 Pod,例如批量計算。Job 僅適用於重啓策略爲 OnFailure 或 Never 的 Pod。
對預期不會終止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服務器。 ReplicationController 僅適用於具有 restartPolicy 爲 Always 的 Pod。
提供特定於機器的系統服務,使用 DaemonSet 爲每臺機器運行一個 Pod

readiness實例 
 apiVersion: v1 
 kind: Pod 
 metadata:  
   labels:    
     test: readness  
   name: readiness-http 
 spec:  
   containers:    
     -name: readiness      
     image: nginx      
     readinessProbe:        
       httpGet:          
         path: /test.html          
         port: 80        
       initialDelaySeconds: 1        
       periodSeconds: 3        
       timeoutSeconds: 1


 
liveness實例 a
piVersion: v1 
kind: Pod 
metadata:  
  labels:    
    test: liveness  
  name: liveness-http 
spec:  
  containers:    
    - name: liveness      
      image: nginx      
      imagePullPolicy: IfNotPresent      
      livenessProbe:        
        tcpSocket:          
          port: 80        
        initialDelaySeconds: 1        
        periodSeconds: 3        
        timeoutSeconds: 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章