Pod 的重启策略

Pod 的重启策略

在 K8s 中,Pod 重启策略restartPolicy)定义了容器在退出时是否重新启动。它是 Pod 的一部分,并且与容器的生命周期管理紧密相关。重启策略指定了容器退出时的行为,以确保 Pod 达到所需的状态。

1. 重启策略的三种类型

重启策略有三种类型,每种类型会影响容器退出后的行为:

  • Always: 无论容器是正常退出(退出状态码为 0)还是异常退出(退出状态码非 0),Kubernetes 都会自动重启容器。这是默认的重启策略,适用于希望容器始终保持运行的情况。

  • OnFailure: 只有当容器非正常退出(退出状态码非 0)时,才会重启容器。如果容器正常退出(退出状态码为 0),Kubernetes 不会重启该容器。适用于执行任务时,只有遇到错误时才希望重新启动容器的场景。

  • Never: 容器无论是正常退出还是异常退出,都不会被重启。适用于一些一次性任务,或者不希望容器在退出后重新启动的场景。

2. 参考案例

我们通过一个配置文件来演示三种不同的重启策略,文件中包含了三个不同的 Pod 配置,分别指定了不同的重启策略。

2.1 master231 测试

以下是一个配置文件示例,定义了三种不同的重启策略:

apiVersion: v1
kind: Pod
metadata:
  name: restartpolicy-always
spec:
  restartPolicy: Always
  containers:
  - image: harbor.oldboyedu.com/oldboyedu-troubleshooting/stress:v0.1
    name: stress
    command: ["sleep", "60"]
    imagePullPolicy: Always

---

apiVersion: v1
kind: Pod
metadata:
  name: restartpolicy-onfailure
spec:
  restartPolicy: OnFailure
  containers:
  - image: harbor.oldboyedu.com/oldboyedu-troubleshooting/stress:v0.1
    name: stress
    command: ["sleep", "120"]
    imagePullPolicy: Always

---

apiVersion: v1
kind: Pod
metadata:
  name: restartpolicy-never
spec:
  restartPolicy: Never
  containers:
  - image: harbor.oldboyedu.com/oldboyedu-troubleshooting/stress:v0.1
    name: stress
    command: ["sleep", "120"]
    imagePullPolicy: Always

通过以下命令应用该配置文件:

kubectl apply -f 19-pods-restartPolicy.yaml

这将创建三个 Pod,分别使用 AlwaysOnFailureNever 重启策略。

2.2 worker232 测试

worker232 节点上测试容器的重启行为。首先,查看 restartpolicy-always 容器状态:

docker ps -a | grep restartpolicy-always

然后,手动杀掉容器并观察容器是否会根据重启策略进行重启:

docker kill 712c557476d8
docker ps -a | grep restartpolicy-always

对于 restartpolicy-always,容器在退出后会自动重启。

同样地,查看 restartpolicy-never 容器:

docker ps -a | grep restartpolicy-never
docker kill a4f4f9eeb993
docker ps -a | grep restartpolicy-never

对于 restartpolicy-never,容器在退出后不会重启。

2.3 worker233 测试

worker233 节点上测试 restartpolicy-onfailure 容器。首先查看容器状态:

docker ps -a | grep restartpolicy-onfailure

然后杀掉容器并观察容器是否会根据重启策略进行重启:

docker kill bbb26d604dcd
docker ps -a | grep restartpolicy-onfailure

对于 restartpolicy-onfailure,容器只有在异常退出时才会重启。

2.4 master231 测试

最后,在 master231 节点查看 Pod 的状态,确保重启策略正确应用:

kubectl get pods -o wide

通过输出,你将看到:

  • restartpolicy-always: 无论容器是正常退出还是异常退出,都会重新启动。
  • restartpolicy-never: 无论容器是正常退出还是异常退出,都不会重新启动。
  • restartpolicy-onfailure: 容器只有在异常退出时才会重新启动。

3. 总结

通过测试我们可以得出以下结论:

  • Always: 每当容器退出(无论是正常退出还是异常退出),都会被重启。常用于保证关键服务持续运行的场景。
  • OnFailure: 容器正常退出时不会重启,但如果容器因异常退出(退出状态码非 0),Kubernetes 会自动重启容器。适用于需要容器执行任务的场景,但只在任务失败时需要重启。
  • Never: 容器无论是正常退出还是异常退出,都不会被重启。适用于一次性任务或不希望容器继续运行的场景。

通过合理选择重启策略,用户可以根据应用的特点和需求来控制容器的生命周期,确保集群的健康和稳定运行。

posted on 2025-01-19 22:22  Leo-Yide  阅读(135)  评论(0)    收藏  举报