在日常的 Kubernetes 运维场景中,有时我们会遇到这样的需求:定时重启某些 Pod。这可能是为了释放内存、规避某些潜在问题,或确保定时刷新配置等场景。本文将介绍如何通过 Kubernetes 原生的 CronJob 配合 kubectl rollout restart
命令,优雅实现定时重启。
一、为什么不直接“重启 Pod”?
Kubernetes 的设计哲学中,Pod 是不可变的实体,K8s 没有 kubectl restart pod
的命令。要“重启”一个 Pod,最常用的方式就是:
-
删除 Pod:Kubernetes 会根据其控制器(Deployment、StatefulSet 等)重新拉起新的 Pod。
-
更新 Deployment 模板:这会触发新的 Pod 滚动更新。
二、方案思路:CronJob + kubectl rollout restart
Kubernetes 提供了 CronJob 资源,可以让我们按照计划定时运行一个 Job。而 kubectl rollout restart
是一个触发 Deployment 滚动重启的简洁方式。
所以我们可以创建一个 CronJob,定时执行
kubectl rollout restart deployment my-app
,从而重启对应的 Pod。
三、实战演示
1. 准备 kubeconfig Secret(可选)
为了让 CronJob 内部容器能调用 kubectl
,我们需要提供 kubeconfig(你也可以选择配置好 ServiceAccount
权限)。
假设你已有 kubeconfig 文件,可用以下命令生成 Secret:
kubectl create secret generic my-kubeconfig-secret \ --from-file=config=/root/.kube/config \ -n default
2. 编写 CronJob YAML
apiVersion: batch/v1 kind: CronJob metadata: name: restart-my-app namespace: default spec: schedule: "0 3 * * *" # 每天凌晨 3 点 jobTemplate: spec: template: spec: containers: - name: kubectl image: bitnami/kubectl:latest command: - /bin/sh - -c - kubectl rollout restart deployment my-app -n default volumeMounts: - name: kubeconfig mountPath: /root/.kube env: - name: KUBECONFIG value: /root/.kube/config restartPolicy: OnFailure volumes: - name: kubeconfig secret: secretName: my-kubeconfig-secret
字段说明:
-
schedule
: 定时表达式,这里表示每天凌晨 3 点运行。 -
kubectl rollout restart
: 会修改 Deployment 模板的 annotation,从而触发滚动重启。 -
bitnami/kubectl
: 容器镜像,自带kubectl
,体积小。 -
KUBECONFIG
: 设置环境变量,使kubectl
访问 API Server。 -
volumeMounts + secret
: 挂载 kubeconfig 到容器内部。
四、部署与验证
应用 CronJob:
kubectl apply -f restart-cronjob.yaml
查看运行结果:
kubectl get cronjob kubectl get job --watch kubectl logs job/<job-name> # 查看具体 Job 输出
如果配置正确,你应该能看到类似的日志:
deployment.apps/my-app restarted
五、进阶建议
多 Deployment 同时重启
修改 command,例如:
command: ["/bin/sh", "-c", "kubectl rollout restart deployment app1 && kubectl rollout restart deployment app2"]
使用 ServiceAccount 自动访问 API Server
如不希望挂载 kubeconfig,可为 CronJob 创建具有适当权限的 ServiceAccount,并绑定角色,例如:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: restart-role rules: - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "patch"]
六、总结
通过结合 Kubernetes 的 CronJob 与 kubectl rollout restart
,我们可以实现稳定、可靠、自动化的 Pod 重启机制,适用于如下场景:
-
定时释放资源
-
定期应用配置变更
-
覆盖临时 Pod 异常状态
这是一个非侵入式、Kubernetes 原生的解决方案,便于维护与审计。
如果你有更多应用场景(例如只在非业务高峰期重启、多集群批量操作等),也可以拓展为更复杂的自动化运维体系,欢迎进一步交流!
如需我帮你根据你当前的集群和服务生成一份完整配置,也可以告诉我
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏