一、Pod生命周期¶
参考链接:Pod生命周期
1.Pod启动过程
(1)启动流程图

(2)Pod启动过程
- 当我们执行kubectl时,api-server收到新建pod指令后,pod因选择某个节点部署处于pending状态。
- 当pod已经选择好节点后,处于ContainerCreating状态。准备拉取镜像
- 当成功拉取镜像后,变成Running状态
- 当有初始化容器时,先执行初始化容器里面的操作,然后启动主容器
- 当启动完成主容器后,如果配置pod探针,先执行startupProbe探针再执行livenessProbe 和 readinessProbe探针
- 当健康检查完成后,由Endpoint添加Pod IP
2.Pod退出过程
(1)退出流程图

(2)Pod退出过程
- 当我们执行kubectl时,api-server收到删除pod指令后,api-server会将pod状态改为dead状态,再变为Terminating状态(我们看不到)。
- 正常无流量情况下,在宽限期内(30s)内控制面会将关闭的 Pod 从对应的 EndpointSlice(和 Endpoints)对象中移除;当流量没有结束的情况下,会在已有的宽限期再加2s,此后控制面会将关闭的 Pod 从对应的 EndpointSlice(和 Endpoints)对象中移除。
- 超出终止宽限期限时,
kubelet会触发强制关闭过程。容器运行时会向 Pod 中所有容器内仍在运行的进程发送SIGKILL信号。如果容器运行时使用了这种容器的话,kubelet也会清理隐藏的pause容器。 kubelet触发强制从 API 服务器上删除 Pod 对象的逻辑,并将宽限期设置为 0 (这意味着马上删除)。
二、preStop和postStart¶
参考链接:为容器的生命周期事件设置处理函数
Kubernetes 支持 postStart 和 preStop 事件。 当一个容器启动后,Kubernetes 将立即发送 postStart 事件;在容器被终结之前, Kubernetes 将发送一个 preStop 事件。容器可以为每个事件指定一个处理程序。二者支持Exec(涉及到命令必须存在,否则执行不成功)和HTTPGet。
针对postStart有个注意点,如果它下面带着command命令,那么它会跟command命令一起执行,而不是分先后顺序。
下面简单演示一下其功能:
1.定义一个yaml文件
$ vim nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: lifecycle-demo-container
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
2.创建 Pod
$ k create -f nginx.yml
3.查看Pod创建情况
$ k get po nginx
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 6s
4.在 shell 中,验证 postStart 处理函数创建了 message 文件:
$ k exec -it nginx -- cat /usr/share/message
Hello from the postStart handler
三、gRPC探测实践¶
gRPC是一个高性能、开源的远程过程调用(RPC)框架,由Google开发。它允许客户端和服务器之间通过定义简单的服务接口来通信,并使用协议缓冲区(Protocol Buffers)进行高效的数据编码和解码。
下面简单演示一下:
1.定义一个yaml文件
$ vim grpc.yml
apiVersion: v1
kind: Pod
metadata:
name: etcd
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
name: etcd
command: [ "/usr/local/bin/etcd", "--data-dir", "/var/lib/etcd", "--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
ports:
- containerPort: 2379
livenessProbe:
grpc:
port: 2379
initialDelaySeconds: 10
2.创建 Pod
$ k create -f grpc.yml
3.查看Pod创建情况
$ k get po etcd
NAME READY STATUS RESTARTS AGE
etcd 1/1 Running 0 3m57s