1. 程式人生 > 其它 >K8S基礎 - 04Pod生命週期

K8S基礎 - 04Pod生命週期

K8S基礎 - 04Pod生命週期

一、Pod生命週期

狀態: Pending, Running, Failed, Succeeded, Unknown

官網文件:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-phase

Pending The Pod has been accepted by the Kubernetes cluster, but one or more of the containers has not been set up and made ready to run. This includes time a Pod spends waiting to be scheduled as well as the time spent downloading container images over the network.
Running The Pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting.
Succeeded All containers in the Pod have terminated in success, and will not be restarted.
Failed All containers in the Pod have terminated, and at least one container has terminated in failure. That is, the container either exited with non-zero status or was terminated by the system.
Unknown For some reason the state of the Pod could not be obtained. This phase typically occurs due to an error in communicating with the node where the Pod should be running.

Pod生命週期

二、初始化容器

三、容器探測

3.1livenessProbe

[root@k8s-master pod-k8s]# cat pod-live.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-live-exec
  namespace: default
spec:
  containers:
  - name: container-live-exec
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh", "-c", "touch /tmp/healthy-test; sleep 60; rm -rf /tmp/healthy-test; sleep 3600"]
    livenessProbe:
      exec:
        command: ["test", "-e", "/tmp/healthy-test"]
      initialDelaySeconds: 1
      periodSeconds: 3

[root@k8s-master ~]# kubectl create -f pod-live.yaml 
pod/pod-live-exec created
[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
pod-live-exec                 1/1     Running   0          7s

[root@k8s-master ~]# kubectl describe pod pod-live-exec

  State:          Running
      Started:      Sat, 23 Oct 2021 16:37:40 +0800

  State:          Running
      Started:      Sat, 23 Oct 2021 16:39:19 +0800
    Last State:     Terminated
      Reason:       Error
      Exit Code:    137
      Started:      Sat, 23 Oct 2021 16:37:40 +0800
      Finished:     Sat, 23 Oct 2021 16:39:18 +0800
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  2m42s                default-scheduler  Successfully assigned default/pod-live-exec to k8s-node32.bearpx.com
  Warning  Unhealthy  93s (x3 over 99s)    kubelet            Liveness probe failed:
  Normal   Killing    93s                  kubelet            Container container-live-exec failed liveness probe, will be restarted
  Normal   Pulled     63s (x2 over 2m42s)  kubelet            Container image "busybox" already present on machine
  Normal   Created    62s (x2 over 2m42s)  kubelet            Created container container-live-exec
  Normal   Started    62s (x2 over 2m41s)  kubelet            Started container container-live-exec

[root@k8s-master ~]# kubectl get pods
NAME                    READY   STATUS        RESTARTS    AGE
pod-live-exec           1/1     Running       2           4m2s

3.2 liveness HTTPGET方式

[root@k8s-master pod-k8s]# cat pod-live-httpget.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-live-httpget
  namespace: default
spec:
  containers:
  - name: container-live-httpget
    image: sun2010wg/my-nginx:v2
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 81
    livenessProbe:
      httpGet:
        port: http
      initialDelaySeconds: 1
      periodSeconds: 3

  

Events:
  Type     Reason     Age               From               Message
  ----     ------     ----              ----               -------
  Normal   Scheduled  16s               default-scheduler  Successfully assigned default/pod-live-httpget to k8s-node32.bearpx.com
  Normal   Killing    9s                kubelet            Container container-live-httpget failed liveness probe, will be restarted
  Normal   Pulled     8s (x2 over 17s)  kubelet            Container image "sun2010wg/my-nginx:v2" already present on machine
  Normal   Created    8s (x2 over 17s)  kubelet            Created container container-live-httpget
  Normal   Started    8s (x2 over 16s)  kubelet            Started container container-live-httpget
  Warning  Unhealthy  3s (x5 over 15s)  kubelet            Liveness probe failed: Get "http://10.244.3.14:81/": dial tcp 10.244.3.14:81: connect: connection refused

[root@k8s-master ~]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
pod-live-httpget              1/1     Running   1          2m38s

3.3readinessProbe

[root@k8s-master pod-k8s]# cat pod-read-httpget.yml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-live-httpget
  namespace: default
spec:
  containers:
  - name: container-live-httpget
    image: sun2010wg/my-nginx:v2
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    readinessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3

  

### 1. Pod正常啟動
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 28s default-scheduler Successfully assigned default/pod-live-readiness to k8s-node33.bearpx.com Normal Pulled 27s kubelet Container image "sun2010wg/my-nginx:v2" already present on machine Normal Created 27s kubelet Created container container-live-httpget Normal Started 27s kubelet Started container container-live-httpget ### 2. 刪除容器的index.html [root@k8s-master pod-k8s]# kubectl exec -it pod-live-readiness -- /bin/sh /usr/share/nginx/html # rm -rf index.html ### 3. Pod內的容器READY數量變化 [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE pod-live-readiness 0/1 Running 0 103s ### 4. Pod檢測到Unhealthy Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 3m25s default-scheduler Successfully assigned default/pod-live-readiness to k8s-node33.bearpx.com Normal Pulled 3m25s kubelet Container image "sun2010wg/my-nginx:v2" already present on machine Normal Created 3m25s kubelet Created container container-live-httpget Normal Started 3m25s kubelet Started container container-live-httpget Warning Unhealthy 58s (x22 over 2m1s) kubelet Readiness probe failed: HTTP probe failed with statuscode: 404 ### 5. 新增index.html /usr/share/nginx/html # echo "123" > index.html ### 6. Pod內的容器恢復正常 [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE pod-live-readiness 1/1 Running 0 3m58s [root@k8s-master ~]# curl 10.244.2.32 123

  

四、 Post Start

# 執行失敗
apiVersion: v1 kind: Pod metadata: name: pod-poststart namespace: default spec: containers: - name: busybox-httpd image: busybox imagePullPolicy: IfNotPresent lifecycle: postStart: exec: command: ["/bin/sh","-c","mkdir -p /data/web/html; echo 'Home Page' >> /data/web/html/home.html"] command: ["/bin/httpd"] args: ["-f","-h /data/web/html"]

在容器啟動時, 需要 /data/web/html,容器啟動失敗 

Events:
  Type     Reason               Age                From               Message
  ----     ------               ----               ----               -------
  Normal   Scheduled            40s                default-scheduler  Successfully assigned default/pod-poststart to k8s-node32.bearpx.com
  Normal   Pulled               24s (x3 over 41s)  kubelet            Container image "busybox" already present on machine
  Normal   Created              24s (x3 over 40s)  kubelet            Created container busybox-httpd
  Normal   Started              24s (x3 over 40s)  kubelet            Started container busybox-httpd
  Warning  FailedPostStartHook  24s (x3 over 40s)  kubelet            Exec lifecycle hook ([/bin/sh -c mkdir -p /data/web/html; echo 'Home Page' >> /data/web/html/home.html]) 
                                                                      for Container "busybox-httpd" in Pod "pod-poststart_default(6b5e789f-8213-4a6f-9c38-bb34889005df)" failed - error: 
                                command '/bin/sh -c mkdir -p /data/web/html; echo 'Home Page' >> /data/web/html/home.html' exited with 126: , message: "cannot exec in a stopped state: unknown\r\n"
  Normal   Killing              24s (x3 over 40s)  kubelet            FailedPostStartHook
  Warning  BackOff              9s (x4 over 39s)   kubelet            Back-off restarting failed container

  

[root@k8s-master pod-k8s]# cat pod-lifecycle.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-poststart
  namespace: default
spec:
  containers:
  - name: busybox-httpd
    image: busybox
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh","-c","echo Home_Page >> /tmp/index.html"]
    command: ["/bin/httpd"]
    args: ["-f", "-h /tmp"]

[root@k8s-master ~]# kubectl logs pod-poststart
httpd: can't change directory to ' /tmp': No such file or directory


Events:
  Type     Reason               Age              From               Message
  ----     ------               ----             ----               -------
  Normal   Scheduled            4s               default-scheduler  Successfully assigned default/pod-poststart to k8s-node32.bearpx.com
  Normal   Pulled               3s (x2 over 3s)  kubelet            Container image "busybox" already present on machine
  Normal   Created              3s (x2 over 3s)  kubelet            Created container busybox-httpd
  Normal   Started              3s (x2 over 3s)  kubelet            Started container busybox-httpd
  Warning  FailedPostStartHook  3s (x2 over 3s)  kubelet            Exec lifecycle hook ([/bin/sh -c echo Home_Page >> /tmp/index.html]) for Container "busybox-httpd" 
                                in Pod "pod-poststart_default(e22da6dc-b4d4-47ac-879f-659f08dcce5e)" failed - error: command '/bin/sh -c echo Home_Page >> /tmp/index.html' exited with 126: ,
                                message: "cannot exec in a stopped state: unknown\r\n"
  Normal   Killing              3s (x2 over 3s)  kubelet            FailedPostStartHook
  Warning  BackOff              1s (x2 over 2s)  kubelet            Back-off restarting failed container
[root@k8s-master pod-k8s]# cat pod-poststart.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-poststart-ok
  namespace: default
spec:
  containers:
  - name: busybox-httpd
    image: busybox
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh","-c","echo Home_Page >> /tmp/index.html"]
    command: ["/bin/httpd"]
    args: ["-f"]

  

[root@k8s-master pod-k8s]# kubectl exec -it  pod-poststart-ok -- /bin/sh
/ # netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::80                   :::*                    LISTEN      1/httpd
/ # cd /tmp/
/tmp # ls
index.html
/tmp # cat index.html 
Home_Page

  

Pod回顧總結

apiVersion,  kind,  metadata,  spec,  status(只讀)
spec:
  containers	
  initContainers	
  nodeName	
  nodeSelector	 <map[string]string>
  restartPolicy	 <string>  One of Always, OnFailure,Never. Default to Always. 
  tolerations	<[]Object>
  volumes	<[]Object>

  containers:
    name
    image
    imagePullPolicy: Always、 Never、 IfNotPresent
    ports:
      name
      containerPort
    lifecycle
    livenessProbe
    readinessProbe
      ExecAction: exec
      TcpSocketAction: tcpSocket
      HTTPGetAction: httpGet