kubernetes的基本单位Pod详解( 四 )

  • API Server 把最新的状态保存到 etcd 中 。
  • Pod 的销毁过程:
    • 用户发送删除 Pod 的命令 。
    • 将会更新 API Server 中的 Pod 对象,设定 Pod 被”销毁“完成的大致时间(默认 30s),超出这个宽限时间 Pod 将被强制终止 。
    • 同时触发以下操作:Pod 被标记为 Terminating 。kubelet 发现 Pod 已标记为 Terminating 后,将会执行 Pod 关闭过程 。Endpoint 控制器监控到 Pod 即将删除,将溢出所有 Service 对象中与该 Pod 相关的 Endpoint 。
    • 如果 Pod 定义了 preStop 回调,则这会在 Pod 中执行,如果宽限时间到了 preStop 还在运行,则会通知 API Server增加少量宽限时间(2s) 。
    • Pod 中的进程接收到 TERM 信号 。
    • 如果宽限时间过期,Pod 中的进行仍在运行,则会被 SIGKILL 信号终止 。
    • kubelet 通过 API Server 设置宽限时间为 0(立即删除),完成 Pod 的删除操作,Pod 从 API 中移除 。
    删除操作的延迟时间默认为 30s 。kubectl delete 命令支持--grace-period=秒,用户可以自定义延迟时间 。如果这个值设置为0,则表示强制删除 Pod,但是在使用--grace-period=0 时需要增加选项 --force 才能执行强制删除 。
    Pod 的生命周期时间Pod 在整个运行过程中,会有两个大的阶段,第一阶段是初始化容器运行阶段,第二阶段是正式容器运行阶段,每个阶段都会有不同的事件
    初始化容器运行阶段Pod 中可以包含一个或者多个初始化容器,这些容器是在应用程序容器正式运行之前运行的,主要负责一些初始化工作,所有初始化容器执行完后才能执行应用程序容器,因此初始化容器不能是长期运行的容器,而是执行完一定操作后就必须结束的 。如果是多个初始化容器,只能顺序执行,不能同时运行 。在应用程序容器开始前,所有初始化容器都必须正常结束 。
    初始化容器执行失败时,如果 restartPolicy 是 OnFailure 或者 Always,那么会重复执行失败的初始化容器,直到成功;如果 restartPolicy 是 Never,则不会重启失败的初始化容器 。
    下面我们举一个例子,在部署应用程序前,检测 db 是否就绪,并执行以下初始化脚本 。
    apiVersion: v1kind: Podmetadata:name: expodinitcontainerspec:containers:- name: maincontainerimage: busyboxcommand: ['sh', '-c']args: ['echo "maincontainer is running!"; sleep 3600']initContainers:- name: initdbcheckimage: busyboxcommand: ['sh', '-c']args: ['echo "checking db!"; sleep 30; echo "checking done!"']- name: initscriptimage: busyboxcommand: ['sh', '-c']args: ['echo "init script exec!"; sleep 30; echo "init script exec done!"']这里包含一个主容器,两个初始化容器,每个初始化容器执行 30s,接下来我们创建一下 Pod,再查看他们的状态:
    kubectl apply -f expodinitcontainers.yml在 30s 内执行第一个初始化容器,所以 Pod 状态是 Init:0/2,在 30s-60s 之间执行第二个初始化容器,所以 Pod 状态是 Init:1/2,当所有初始化容器执行完毕后,状态会先变为 PodInitializing,然后变为 Running 状态 。通过 kubectl describe 命令查看 Pod 详细信息,可以看到先执行 initdbcheck,然后执行 initscript,最后才运行 maincontainer 。
    kubernetes的基本单位Pod详解

    文章插图
     
    正式容器运行阶段正式容器创建成功后,就会触发 PostStart 事件,在容器运行的过程中,可以设置存活探针和就绪探针来持续监测容器的健康状况,在容器结束前,会触发 PreStop 事件 。
    • PostStart:容器刚创建成功后,触发此事件,如果回调执行失败,则容器会被终止,然后根据重启策略决定是否要重启该容器 。
    • PreStop:容器开始和结束前,触发此事件,无论执行结果如何,都会结束容器 。
    回调的方式有两种:Exec 执行一段脚本和 HttpGet 执行特定的请求 。
    • Exec 回调会执行特定的命令,如果 Exec 执行的命令最后正常退出,则代表执行成功;否则就认为执行异常,配置方式如下:
    postStart/preStop:exec:command: xxxxx# 命令列表
    • HttpGet 回调会执行特定的 Http 请求,通过返回的状态码来判断该请求执行是否成功,配置方式如下:
    postStart/preStop:httpGet:host: xxxx # 请求的 IP 地址或域名port: xx # 请求的端口号path: xxxxxx # 请求的路径,比如github.com/xingxingzaixian,"/xingxingzaixian"就是路径scheme: http/https # 请求的协议,默认为 HTTP我们来举例使用一下 PostStart 和 PreStop 事件


    推荐阅读