k8s pod 細節

k8s pod 細節

1、pod容器拉取策略 imagePullPolicy

imagePullPolicy: Always       // 總是拉取 pull
imagePullPolicy: IfNotPresent // 默認值,本地有則使用本地鏡像,不拉取
imagePullPolicy: Never        // 只使用本地鏡像,從不拉取

2、pod生命週期(狀態)

pending , running, succeeded, failed, unknown

掛起(Pending):Pod 已被 Kubernetes 系統接受,但有一個或者多個容器鏡像尚未創建。等待時間包括調度 Pod 的時間和通過網絡下載鏡像的時間,這可能需要花點時間。
運行中(Running):該 Pod 已經綁定到了一個節點上,Pod 中所有的容器都已被創建。至少有一個容器正在運行,或者正處於啓動或重啓狀態。
成功(Succeeded):Pod 中的所有容器都被成功終止,並且不會再重啓。
失敗(Failed):Pod 中的所有容器都已終止了,並且至少有一個容器是因爲失敗終止。也就是說,容器以非0狀態退出或者被系統終止。
未知(Unknown):因爲某些原因無法取得 Pod 的狀態,通常是因爲與 Pod 所在主機通信失敗。

3、pod重啓策略

當某個容器異常退出或者健康檢查失敗, kubelet將根據RestartPolicy的設置來進行相應的操作, 重啓策略有Always , OnFailure, Never

Always: 當容器失效時, 由kubelet自動重啓該容器
OnFailure: 當容器終止運行且退出碼不爲0時, 由kubelet自動重啓該容器
Never: 不論容器運行狀態如何, kubelet都不會重啓該容器

kubelet重啓失效容器的時間間隔以sync-frequency乘以2n來計算, 例如1丶2丶4丶8倍等, 最長延時5min, 並且在重啓後的10min後重置該時間
pod的重啓策略與控制方式息息相關

RC和DeamonSet必須設置爲Always,需要保證該容器持續運行
Job: OnFailure或Never, 確保容器執行完成後不再重啓

4、示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    spec:
      restartPolicy: Always # pod重啓策略
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent # 鏡像拉取策略
        ports:
        - containerPort: 80

5、pod健康檢查

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

探針執行方式

LivenessProbe:  判斷容器是否存活 running狀態, 如果不健康kubelet就會殺掉pod,根據重啓策略RestartPolicy進行相應的處理
ReadinessProbe: 判斷容器是否處於可用Ready狀態, 達到ready狀態表示pod可以接受請求,  如果不健康, 從service的後端endpoint列表中把pod隔離出去

診斷方式

ExecAction(exec):容器內執行指定命令,狀態由命令執行完返回的狀態碼確定。如果命令退出時返回碼爲 0 則認爲健康,返回非零值,則kubelet會終止容器並重新啓動它。
TCPSocketAction(tcpSocket):對指定端口上的容器的 IP 地址進行 TCP 檢查。如果端口打開,則診斷被認爲是成功的。
HTTPGetAction(httpGet):(推薦使用)對指定的端口和路徑上的容器的 IP 地址執行 HTTP Get 請求。如果響應的狀態碼大於等於200 且小於 400,則診斷被認爲是成功的。

參數說明

initialDelaySeconds:容器啓動後第一次執行探測是需要等待多少秒。
periodSeconds:執行探測的頻率。默認是10秒,最小1秒。
timeoutSeconds:探測超時時間。默認1秒,最小1秒。
successThreshold:探測失敗後,最少連續探測成功多少次才被認定爲成功。默認是1。對於liveness必須是1。最小值是1。
failureThreshold:探測成功後,最少連續探測失敗多少次才被認定爲失敗。默認是3。最小值是1。
HTTP probe 中可以給 httpGet設置其他配置項:

端口使用說明

ports:
- name: liveness-port
  containerPort: 8080
  hostPort: 8080

livenessProbe:
  httpGet:
  path: /healthz
  port: liveness-port  # 使用命名的ContainerPort作爲HTTP或TCP liveness檢查:

方式1 ExecAction

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: busybox
        image: busybox:1.28.4
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        args: ["/bin/sh","-c","touch /tmp/healthy;sleep 30; rm -f /tmp/healthy; sleep 3600"]
        livenessProbe:
          exec:
            command: ["cat","/tmp/healthy"]  # /tmp/healthy 文件
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          exec:
            command: ["cat","/tmp/ready"] # /tmp/ready 文件
          initialDelaySeconds: 5
          periodSeconds: 5

運行探測結果

kubectl describe pod busybox-deployment

FirstSeen LastSeen    Count   From            SubobjectPath           Type        Reason      Message
--------- --------    -----   ----            -------------           --------    ------      -------
37s       37s     1   {default-scheduler }                    Normal      Scheduled   Successfully assigned liveness-exec to worker0
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Pulling     pulling image "busybox"
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Pulled      Successfully pulled image "busybox"
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Created     Created container with docker id 86849c15382e; Security:[seccomp=unconfined]
36s       36s     1   {kubelet worker0}   spec.containers{liveness}   Normal      Started     Started container with docker id 86849c15382e
2s        2s      1   {kubelet worker0}   spec.containers{liveness}   Warning     Unhealthy   Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory

失敗後的重啓

kubectl get pod
NAME                 READY     STATUS    RESTARTS   AGE
busybox-deployment   1/1       Running   1          1m    # RESTARTS 增加了1

方式2 TCPSocketAction

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        
        
        livenessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 3
        readinessProbe:
          tcpSocket:
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 3

方式3 HTTPGetAction

參數說明

host:連接的主機名,默認連接到pod的IP。你可能想在http header中設置"Host"而不是使用IP。
scheme:連接使用的schema,默認HTTP。
path: 訪問的HTTP server的path。linenessProbe建議使用 /health   readinessProbe 建議使用/ready
httpHeaders:自定義請求的header。HTTP運行重複的header。
port:訪問的容器的端口名字或者端口號。端口號必須介於1和65535之間。

示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 
        
        livenessProbe:
          httpGet:
            path: /health
            port: 8090
            httpHeaders:
            - name: X-Custom-Header
              value: hello
          initialDelaySeconds: 5  # first wait time
          periodSeconds: 3        # probe interval
        readinessProbe:
          httpGet:
            path: /ready
            port: 80
            httpHeaders:
            - name: X-Custom-Header
              value: hello
          initialDelaySeconds: 5
          periodSeconds: 3        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章