您现在的位置是:首页 >技术教程 >pod生命周期网站首页技术教程

pod生命周期

小鱼儿& 2024-08-17 00:01:02
简介pod生命周期

1. pod的生命周期

在这里插入图片描述

  • 上图主要描述在容器环境初始化完成之后,pod创建到退出的中间这段过程:

  • 从大的方向上看,pod生命周期分两个阶段:

    1. 第一阶段是初始化容器。
    2. 第二阶段是主容器的整个生命周期。
  • 在 Kubernetes 中,每个 Pod 都可以包括多个容器。pause 容器是 Kubernetes 系统自带的一个容器,它是每个 Pod 中必须存在的一个容器。pause 容器没有实际的业务逻辑,它的作用是作为所有其他容器的父进程当 Pod 中的其他容器启动时,它们会与 pause 容器共享网络和存储空间。pause 容器会先启动并进入等待状态,等待其他容器加入进来。整个 Pod 中的所有容器都共享同一个 Linux namespace 和同一个网络栈,而 pause 容器则提供了这个 namespace 和网络栈。这种设计在 Kubernetes 中被称为 Pod 共享模型

  • 对于Init Container来说,一个pod中可以定义多个初始化容器,他们必须是串行执行,只有当所有的初始化容器执行完后,对应的主容器才会启动

  • 如上图所示,会按顺序把1、2、3的InitC都执行完成之后,才进入Main Container阶段

  • Main Container生命周期又分为三个阶段:

    1. 第一阶段是运行Post-start hook,这个阶段是主容器运行之后立即需要做的事,例如从配置文件加载应用程序的配置、向外部服务注册、启动后台进程、执行数据库迁移等等。
    2. 第二阶段是主容器正常运行的阶段,在这个阶段中,我们可以定义对容器的健康状态(liveness)检查和就绪状态(readiness)检查,readiness检测成功后,Pod状态改为Ready。
    3. 第三阶段是运行pre stop hook,这个阶段主要做容器即将退出前需要做的事,比如保存数据、做一些清理工作等。
  • 对于容器的健康状态检查和就绪状态检查,我们也可以定义开始检查的延迟时长;因为有些容器存在容器显示running状态,但内部程序还没有初始化,如果立即做健康状态检查,可能存在健康状态为不健康,从而导致容器重启的状况;

2. Pod相位状态值

  • 首先在介绍 Pod 的生命周期之前,我们先了解下 Pod 的状态,因为 Pod 状态可以反映出当前我们的 Pod 的具体状态信息,也是我们分析排错的一个必备的方式。
  • 我们可以通过命令kubectl explain pod.status查看到
    在这里插入图片描述
  1. Pending(挂起):Pod已被创建,但还未被调度至任何节点上。

  2. Running(运行中):Pod已经被调度至节点上,并且Pod中的所有容器都在运行中。

  3. Succeeded(成功):Pod中的所有容器都已经成功退出,并且不会再次启动。

  4. Failed(失败):Pod中的一个或多个容器已经失败并且已经退出。

  5. Unknown(未知):Pod的状态无法被获取,通常是由于控制器无法连接到Pod所在节点。

  • 除了Pod的相位,还有以下几种状态值,可以通过kubectl get pods查看以下的状态:

    1. ContainerCreating(容器创建):Pod中的一个或多个容器正在创建中。

    2. PodInitializing(pod正在初始化):Pod中的一个或多个init容器正在初始化中。

    3. Terminating(停止):Pod正在被删除,但是Pod中的容器仍在运行中。

    4. Running(运行中):所有容器都已经成功启动并正在运行中。

    5. Succeeded(成功):所有容器都已经成功退出,并且不会再次启动。

    6. Failed(失败):Pod中存在至少一个容器已经失败,并且容器无法重启。

    7. Unknown(未知):由于某种原因,Pod的状态无法被获取。

    3. Init Containers

  • 在Kubernetes中,Init Container是一种特殊类型的容器,它在Pod中的其他容器启动之前运行。Init Container的目的是在Pod中的其他容器启动之前执行一些预处理任务,例如初始化某些数据、检查依赖项是否可用等。Init Container和普通容器一样,可以使用Docker镜像,并且可以使用Kubernetes提供的各种资源和功能

  • 在一个Pod中可以定义多个Init Container,它们将按照定义的顺序依次运行。如果任何一个Init Container失败,Kubernetes将立即停止Pod中的所有容器,并将整个Pod标记为失败

  • 注意:Init Container和普通容器不同,它们的生命周期是独立的,即Init Container的生命周期结束后,Pod中的其他容器才会开始启动。因此,在编写Init Container时,需要确保它们的生命周期不会太长,否则会影响整个Pod的启动速度。

3.1. Init Containers的作用:

  • Init Containers是Kubernetes中的一种特殊容器,它们在Pod中的主容器(Main Container)启动之前运行,并且它们的生命周期是独立于主容器的。Init Containers通常用于在启动主容器之前执行某些初始化任务,例如:配置环境变量、检查依赖关系、预加载应用程序数据等。Init Containers可以帮助确保Pod中的主容器具有所需的运行环境,并且可以在主容器启动之前完成所有必要的准备工作,从而减少主容器启动失败的可能性。

4. Init Contianers实验

  • 下面我们通过实际例子来进一步认识init containers。
vim init-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: xiaoyu-pod
  namespace: default
  labels:
    app: xiaoyu-app
    version: v1
spec:
  containers:
    - name: xiaoyu-app-container
      image: nginx:latest
      command: ['sh', '-c', 'echo The pod is Running && sleep 3600']
      ports:
      - containerPort: 80
  initContainers:
    - name: init-xiaoyu-db
      image: nginx:latest
      command: ["sh", "-c","until  ping -W 2 -c 2 192.168.2.60; do echo waiting 192.168.2.60; sleep 2;done;"]
    - name: init-xiaoyu-service
      image: nginx:latest
      command: ["sh", "-c", "until ping -W 2 -c 2  192.168.2.70; do echo waiting 192.168.2.70; sleep 2;done;"]

  • 上面的yaml,运行了一个pod。里面有一个main container,有两个init container
kubectl apply -f init-pod.yaml
  • 查看容器状态:
[root@master1 test]# kubectl get pods
NAME                        READY   STATUS     RESTARTS   AGE
xiaoyu-pod                   0/1     Init:0/2   0          71s
nginx-dp-7f48769c58-48vl8   1/1     Running    0          152m
nginx-dp-7f48769c58-789tl   1/1     Running    0          6h46m
nginx-dp-7f48769c58-dx4ll   1/1     Running    0          6h46m

  • 此时无论多久,上面的容器也不会变成running状态,这是因为我这边写的两个init container的条件没有满足。
  • 第一个init container的条件是能ping通192.168.2.60,第二个条件是能ping通192.168.2.70才能满足条件。

在这里插入图片描述

此处补充个小知识点,便是Linux中until的用法。

until跟while类似,都是一个固定循环。

但是until跟while又有不同,则是它们的条件满足不同。

until是直到条件为真时,打破循环。而while是条件为真时一直循环,条件为假时打破循环。

  • 查看日志
kubectl logs xiaoyu-pod -n default -c init-xiaoyu-service

在这里插入图片描述

  • 打开60的主机让192.168.2.60网络打通,才能执行init-xiaoyu-db
NAME                        READY   STATUS     RESTARTS   AGE
nginx-dp-7f48769c58-48vl8   1/1     Running    0          2d19h
nginx-dp-7f48769c58-789tl   1/1     Running    0          2d23h
nginx-dp-7f48769c58-dx4ll   1/1     Running    0          2d23h
xiaoyu-pod                  0/1     Init:1/2   0          3m53s



kubectl logs xiaoyu-pod -n default -c init-xiaoyu-db

在这里插入图片描述

  • 接下来我这里直接打开70的主机即可网络通。
[root@master1 ~]# ping -c 2 192.168.2.60
PING 192.168.2.60 (192.168.2.60) 56(84) bytes of data.
64 bytes from 192.168.2.60: icmp_seq=1 ttl=64 time=1.13 ms
64 bytes from 192.168.2.60: icmp_seq=2 ttl=64 time=0.346 ms

--- 192.168.2.60 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.346/0.739/1.133/0.394 ms
[root@master1 ~]# ping -c 2 192.168.2.70
PING 192.168.2.70 (192.168.2.70) 56(84) bytes of data.
64 bytes from 192.168.2.70: icmp_seq=1 ttl=64 time=0.519 ms
64 bytes from 192.168.2.70: icmp_seq=2 ttl=64 time=0.373 ms

--- 192.168.2.70 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.373/0.446/0.519/0.073 ms

  • 可以看的出来网络已经通了,查看以下pod是否变为Running
    在这里插入图片描述
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。