k8s pod的生命周期和poststart、prestop

k8s生命周期

Kubernetes 是什么

 


Kubernetes 是开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

k8s可以为我们做服务发现和负载均衡(ingress)、存储编排(挂载存储)、自动部署和回滚(deployment)、自动装箱隔离(cpu、内存等)、自我修复(健康检查、重启失败的容器)、密钥与配置管理

k8s整体图

 

 

 

POD是什么

Pod 是 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod 包含一个或多个容器---》最常见的是docker容器。pod里的这些容器共享IP和存储

流程图


 

 

 

POD的启动 

  1. api server收到创建pod的请求后,创建pod对象,写入默认值,保存到etcd
  2. scheduler 通过api server 监听到etcd有 尚未绑定node节点的pod,开始为新pod调度node节点,假如找到合适的node,则将信息写入etcd
  3. node节点的kubelet watch到api server->etcd,有新的pod绑定到当前node节点,则创建pod
  4. 依次启动init container,用来初始化环节,init container必须依次运行完成
  5. 依次启动container
  6. container启动前可以执行poststart

 

PostStart :这个钩子在容器创建后立即执行。

但是,并不能保证钩子在容器ENTRYPOINT之前运行。

PostStart主要用于资源部署、环境准备等。

PostStart的执行相对于容器的代码执行是异步的。

只有 postStart 处理函数执行完毕,容器的状态才会变成 RUNNING。

需要注意的是如果钩子花费时间过长以及于不能运行或者挂起,容器就不能达到Running状态。


POD的阶段

取值描述
Pending(悬决) Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。
Running(运行中) Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
Succeeded(成功) Pod 中的所有容器都已成功终止,并且不会再重启。
Failed(失败) Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
Unknown(未知) 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

 

 

POD的终止

  1. api server收到删除pod的请求,将 pod 标记为“Terminating”状态

  2. kubelet开始关闭pod
  3. 容器运行时给所有容器的1号进程发送TERM
  4. 如果定义了preStop,则会执行preStop
  5. 容器开始graceful关闭
  6. 如果超过grace-period,pod还没有被关闭,则会执行强制关闭pod流程,容器运行时向所有的container发送 SIGKILL;之后kubelet强制删除pod



PreStop

钩子在容器终止前立即被调用。

它是阻塞的,所以它必须在删除容器的调用触发之前完成。

主要用于优雅关闭应用程序、通知其他系统等。

如果钩子在执行期间挂起,Pod阶段将停留在Running状态并且不会达到failed状态。

另外,PreStop的执行现对于SIGTERM信息,也是异步的,k8s也不会等待PreStop执行完成。

如果容器crash,崩溃了,prestop是不会执行的。



poststart 和prestop支持3种方式

Exec  返回0则认为成功

TCPSocket  端口可以建立连接则认为成功

HttpGet 返回200-400则认为成功

 

 

示例

有以下yaml

 

apiVersion: v1
kind: Pod
metadata:
  name: test-life
spec:
  initContainers:
  - name: init-c1
    image: busybox:latest
    command: ["/bin/sh", "-c", "echo $(date) 'written by init-c1 entrypoint'  && sleep 6"]
  - name: init-c2
    image: busybox:latest
    imagePullPolicy: Never
    command: ["/bin/sh", "-c", "echo $(date) 'written by init-c2 entrypoint'  && sleep 6"]
  containers:
  - name: hook-c1
    image: busybox:latest
    imagePullPolicy: Never
    command: ["/bin/sh", "-c", "echo $(date) 'written by hook-c1 entrypoint'  && sleep 600"]
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo $(date) 'written by hook-c1 postStart'>>tmp/log.log  && sleep 1"]

      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo $(date) 'written by hook-c1 prestop'>>tmp/log.log  && sleep 100"]

 

 

 

1:kubectl apply -f hook.yaml
pod/test-life created
2 : kubectl describe pod test-life

 

 3:docker ps  

4: docker exec -it fc73fcdbc22b /bin/sh
5:tail -f /tmp/log.log

6:另外的命令行

kubectl delete po test-life

7:

 

POD生命周期相关的官方文档

english:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
中文:https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/

 

posted @ 2022-04-06 20:01  JustDotNet  阅读(5250)  评论(0编辑  收藏  举报