一、Pod生命周期

参考链接:Pod生命周期

1.Pod启动过程

(1)启动流程图

Pod启动过程

(2)Pod启动过程

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

2.Pod退出过程

(1)退出流程图

Pod生命周期-Pod退出过程

(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