使用 Kubernetes CronJob 定时重启 Deployment 中的 Pod

avatar 2025年7月16日18:11:23 评论 7 次浏览

在日常的 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 原生的解决方案,便于维护与审计。


如果你有更多应用场景(例如只在非业务高峰期重启、多集群批量操作等),也可以拓展为更复杂的自动化运维体系,欢迎进一步交流!

如需我帮你根据你当前的集群和服务生成一份完整配置,也可以告诉我

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: