在 Kubernetes 集群中,应用长时间运行可能会出现 资源泄漏、内存溢出、连接阻塞 等问题,影响服务稳定性。为了解决这些问题,我们可以使用 Kubernetes CronJob 定期 自动重启 Pod,确保服务持续稳定运行。
本文将介绍如何使用 Kubernetes CronJob 来 定时重启 nginx Deployment,并通过 RBAC(基于角色的访问控制) 限制 kubectl 命令的权限,避免安全隐患。
🔹 特点:
✅ 定时重启:每天自动执行 kubectl rollout restart 命令
✅ 最小权限:仅赋予 patch 权限,确保安全
✅ 自动清理:不保留执行历史,防止资源浪费
✅ 无缝更新:滚动重启,保证业务不中断
适用于 微服务应用、定期重启任务、K8s 运维自动化 等场景。 🚀
# 定义一个 CronJob 定时任务
apiVersion: batch/v1
kind: CronJob
metadata:
name: restart-my-pod # CronJob 名称
spec:
schedule: "58 10 * * *" # 每天 10:58 执行一次(UTC 时间)
successfulJobsHistoryLimit: 0 # 不保留成功执行的 Job 记录
# failedJobsHistoryLimit: 0 # 可选,不保留失败的 Job 记录
jobTemplate:
spec:
template:
spec:
serviceAccountName: restart-sa # 绑定 ServiceAccount,以便有权限执行 kubectl 命令
containers:
- name: kubectl # 容器名称
image: xxx.service.xxx.cn/sre-paas/bitnami/kubectl:latest # 选择 Bitnami 的 kubectl 镜像
command: ["/bin/sh", "-c"] # 运行 Shell 命令
args:
- kubectl rollout restart deployment nginx -n default && sleep 30
# 1. 运行 `kubectl rollout restart` 命令重启 nginx 部署
# 2. `sleep 30` 确保命令执行完毕,防止 Job 过快退出
restartPolicy: Never # 任务执行一次后不重启
imagePullSecrets:
- name: xxx-registry # 需要拉取私有镜像时使用的镜像密钥
---
# 定义 ServiceAccount,供 CronJob 使用
apiVersion: v1
kind: ServiceAccount
metadata:
name: restart-sa # ServiceAccount 名称
namespace: default # 作用于 default 命名空间
---
# 定义 Role,授权操作 Deployment 的权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: restart-role # 角色名称
namespace: default # 仅作用于 default 命名空间
rules:
- apiGroups: ["apps"] # 作用于 apps 组(用于管理 Deployment 资源)
resources: ["deployments"] # 目标资源:Deployment
verbs: ["get", "list", "patch"] # 允许执行 get、list、patch 操作(patch 用于 rollout restart)
---
# 绑定 ServiceAccount 与 Role,授予权限
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: restart-rolebinding # 绑定名称
namespace: default # 作用域仍然是 default 命名空间
subjects:
- kind: ServiceAccount
name: restart-sa # 绑定上面创建的 ServiceAccount
namespace: default
roleRef:
kind: Role
name: restart-role # 绑定上面创建的 Role
apiGroup: rbac.authorization.k8s.io