第6章Pod生命周期
1.什么是Pod的生命周期

相关概念:
init container(初始化容器):
初始化容器是指在主容器启动之前,先启动一个容器来做一些准备工作,比如两个容器做了共享volum,然后可以先启动一个容器来对目录进行更改用户授权。
比如主容器需要连接数据库,可以先使用初始化容器测试可否正常连接数据库,如果可以正常连接再启动主容器。
hook(钩子):
PostStart:在容器启动创建后立刻执行,但是时间不能太长,否则容器将不会是running状态
PreStop:在容器停止被删除前执行,主要用于优雅的关闭应用程序。
liveness probe(存活性探针):
存活性探针,用于确定容器内的应用是否还活着
readiness probe(就绪性探针):
就绪性探针,用于确定容器是否已经准备就绪可以干活了,比如扩容一个Pod,只有等这个Pod里面的应用完全启动了,才会将流量进入。
2.Pod的运行状态

相关概念:
Pending(挂起):
Pod 已被Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间
Running(运行中):
Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。
Succeeded(成功):
Pod 中的所有容器都已成功终止,并且不会再重启。
Failed(失败):
Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。
Unknown(未知):
因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。
3.Pod生命周期--初始化容器
1)初始化容器作用
Init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。
2)举例
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  initContainers:
  - name: init-busybox
    image: busybox:1.28
    command: ['sh', '-c', "sleep 10;echo ok > /cache/index.html"]
    volumeMounts:
    - mountPath: /cache
      name: cache-volume	
	
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent	
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
	
  volumes:
  - name: cache-volume
    emptyDir: {}
4.Pod生命周期--启动函数
1)PostStart和initContainers区别
容器上:
initContainers是新的一个容器
PostStart就是业务容器,只不过是业务容器创建时同时执行的命令
存活性:
initContainers执行完就删了
PostStart是业务容器执行的命令,不会退出或删除
执行时机:
initContainers是在业务容器启动前执行的
PostStart和业务容器同时立刻执行
2)举例
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent	
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello k8s > /usr/share/nginx/html/index.html;sleep 30"]
5.Pod生命周期--停止函数
1)preStop介绍
Kubernetes 在容器结束前立即发送 preStop 事件。除非 Pod 宽限期限超时,Kubernetes 的容器管理逻辑会一直阻塞等待 preStop 处理函数执行完毕。
2)举例
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh","-c","echo Hello k8s > /usr/share/nginx/html/index.html;sleep 10"]
      preStop:
        exec:
          command: ["/bin/sh","-c","sleep 10;nginx -s quit"]
6.Pod生命周期--存活性探针
1)存活性探针检查机制
exec
在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
httpGet
对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。
tcpSocket
对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的。
2)exec探针举例
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
3)http探针举例
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    livenessProbe:
      httpGet:
        path: /index.html
		port: 80
      initialDelaySeconds: 3
      periodSeconds: 3
4)tcp探针举例
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: redis
    image: redis
	imagePullPolicy: IfNotPresent
	
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 1
7.Pod生命周期--就绪性探针
1)就绪性探针介绍
有时候,应用会暂时性地无法为请求提供服务。 例如,应用在启动时可能需要加载大量的数据或配置文件,或是启动后要依赖等待外部服务。 在这种情况下,既不想杀死应用,也不想给它发送请求。 Kubernetes 提供了就绪探针来发现并缓解这些情况。 容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。
2)举例
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod
spec:
  containers:
  - image: nginx
    name: nginx-pod
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        path: /bro.html
        port: 80
      initialDelaySeconds: 30
      periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx-pod
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30000
  type: NodePort
更新: 2024-08-27 14:47:59