K8s系列之:Pod生命周期和重启策略

一、Pod状态

Pod在整个生命周期过程中被系统定义为各种状态。

Pod的状态:

状态值描述
PendingAPI Server已经创建该Pod,但Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程
RunningPod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态
SucceededPod内所有容器均成功执行退出,且不会再重启
FailedPod内所有容器均已退出,但至少有一个容器退出为失败状态
Unknown由于某种原因无法获取该Pod的状态,可能由于网络通信不畅导致

二、Pod的重启策略

Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,并且仅在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或者健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。

Pod的重启策略包括:

  • Always:当容器失效时,由kubelet自动重启该容器
  • OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器
  • Never:不论容器运行状态如何,kubelet都不会重启该容器
  • 默认值为Always

kubelet重启失效容器的时间间隔以sync-frequency乘以2n来计算,例如1、2、4、8倍等,最长延时5min,并且在成功重启后的10min后重置该时间。

Pod的重启策略与控制方式息息相关,当前可用于管理Pod的控制器包括ReplicationController、Job、DaemonSet及直接通过kubelet管理(静态Pod)。

每种控制器对Pod的重启策略要求如下:

  • RC和DaemonSet:必须设置为Always,需要保证该容器持续运行
  • Job:OnFailure或Never,确保容器执行完成后不再重启
  • kubelet:在Pod失效时自动重启它

三、Pod重启策略和状态转换场景关系

常见的状态转换场景:

Pod包含的容器数Pod当前的状态发生事件AlwaysOnFailureNever
包含一个容器Running容器成功退出RunningSucceededSucceeded
包含一个容器Running容器失败退出RunningRunningFailed
包含两个容器Running1个容器失败退出RunningRunningRunning
包含两个容器Running容器被OOM杀掉RunningRunningFailed

四、Pod健康检查

对Pod的健康状态检查可以通过两类探针来检查:

  • LivenessProbe和ReadinessProbe
  • LivenessProbe探针:用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是"Success"。
  • ReadinessProbe探针:用于判断容器是否启动完成(ready状态),可以接收请求。如果ReadinessProbe探针检测到失败,则Pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的Endpoint。

五、LivenessProbe探针

kubelet定期执行LivenessProbe探针来诊断容器的健康状况。LivenessProbe有以下三种实现方式:

1.ExecAction

  • 在容器内部执行一个命令,如果该命令的返回码为0,则表明容器健康。

在下面的例子中,通过执行"cat /tmp/health"命令来判断一个容器运行是否正常。而该Pod运行之后,在创建/tmp/health文件的10s之后将删除该文件,而LivenessProbe健康检查的初始探测时间(initialDelaySeconds)为15s,探测结果将是Fail,将导致kubelet杀掉该容器并重启它。

apiVersion: v1
kind: Pod
metadata: 
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: gcr.io/google_containers/busybox
    args:
    - /bin/sh
    - -c
    - echo ok > /tmp/health; sleep 10;rm -rf /tmp/health; sleep 600
    livenessProbe:
      exec: 
        command:
        - cat
        - /tmp/health
      initialDelaySeconds: 15
      timeoutSeconds: 1

2.TCPSocketAction

  • 通过容器的IP地址和端口号执行TCP检查,如果能够建立TCP连接,则表明容器健康。

在下面的例子中,通过与容器内的localhost:80建立TCP连接进行健康检查。

apiVersion: v1
kind: Pod
metadata: 
  name: pod-with-healthcheck
spec:
  containers:
 - name: nginx
    image: nginx
    ports: 
    - containerPort: 80
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 15
      timeoutSeconds: 1

3.HTTPGetAction

  • 通过容器的IP地址、端口号及路径调用HTTP Get方法,如果响应码大于等于200且小于400,则认为容器状态健康。

在下面的例子中,kubelet定时发送HTTP请求到localhost:80/_status/healthz来进行容器应用的健康检查。

apiVersion: v1
kind: Pod
metadata: 
  name: pod-with-healthcheck
spec:
  containers:
 - name: nginx
    image: nginx
    ports: 
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /_status/healthz
        port: 80
      initialDelaySeconds: 30
      timeoutSeconds: 1

六、initialDelaySeconds和timeoutSeconds参数含义

  • initialDelaySeconds:启动容器后进行首次健康检查的等待时间,单位为s
  • timeoutSeconds:健康检查发送请求后等待响应的超时时间,单位为s。当超时发生时,kubelet会认为容器已经无法提供服务,将会重启该容器。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一些针对 Kubernetes 系统生命周期的测试用例示例: 1. 创建和删除Pod: - 测试创建一个Pod,并验证它是否成功创建并处于运行状态。 - 测试删除一个Pod,并验证它是否成功删除。 2. 扩缩容: - 测试水平扩展一个Deployment,验证新的副本是否正确创建并加入服务负载均衡。 - 测试垂直扩展一个Pod的资源配额,验证资源是否被成功分配。 3. 故障恢复: - 模拟节点故障,验证Kubernetes是否能够自动将Pod重新调度到其他正常的节点上。 - 模拟容器崩溃,验证Kubernetes是否能够自动重启容器并保持服务的可用性。 4. 更新和回滚: - 测试通过更新Deployment的镜像版本来进行应用程序的更新,并验证新的版本是否正确部署。 - 测试回滚应用程序到先前的版本,并验证回滚是否成功并保持服务的连续性。 5. 服务发现和负载均衡: - 测试通过Service来访问多个Pod,并验证负载均衡是否正常工作。 - 测试通过DNS来解析Service名称,并验证服务发现是否正常。 6. 高可用性和容错性: - 模拟集群节点的故障,验证Kubernetes是否能够自动将工作负载迁移到其他正常节点上。 - 测试网络故障,验证Kubernetes是否能够自动修复网络问题并保持服务的连通性。 7. 资源管理和调度: - 测试通过资源配额和限制来确保Pod不会超出可用资源的范围。 - 测试通过Node Affinity和Pod Affinity来确保Pod被正确调度到指定的节点上。 这些测试用例覆盖了 Kubernetes 系统的主要功能和特性,可以帮助确保系统在不同场景下的正确性、稳定性和可靠性。根据实际情况,你可以进一步扩展和定制这些测试用例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最笨的羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值