kubectl批量重启deployment中容器

在 Kubernetes 中,如果你想批量重启多个 Deployment 的容器,可以通过多种方式实现(比如 kubectl rollout restartpatch、或者循环脚本)。


bf00a4135d5dd34417cb3c38f5c6e8db.png

方法一:推荐方式 — 使用 rollout restart

Kubernetes 1.15+ 提供的命令,最直接、安全。

1.1批量重启某个命名空间下所有 Deployment

1
kubectl rollout restart deployment -n <namespace>

1.2重启所有命名空间下所有 Deployment

1
2
3
for ns in $(kubectl get ns --no-headers | awk '{print $1}'); do
kubectl rollout restart deployment -n "$ns"
done

1.3仅重启名称匹配的 Deployment(例如带 “api” 的)

1
2
3
kubectl get deploy -A | grep api | awk '{print $1, $2}' | while read ns name; do
kubectl rollout restart deployment "$name" -n "$ns"
done

法二:使用 kubectl patch 手动触发滚动更新

如果你的集群较老(<1.15),或者想精确控制触发条件,可通过修改 spec.template.metadata.annotations 来“刷新” Pod。

1
2
kubectl patch deployment <deploy-name> -n <namespace> \
-p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$(date +'%Y-%m-%dT%H:%M:%S')\"}}}}}"

批量执行

1
2
3
4
for d in $(kubectl get deploy -n <namespace> -o name); do
kubectl patch "$d" -n <namespace> \
-p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$(date +'%Y-%m-%dT%H:%M:%S')\"}}}}}"
done

方法三:重启选定命名空间中所有容器(无差别重启)

适用于你想“一键重启整个业务环境”的情况:

1
2
3
4
for ns in backend frontend core; do
echo "==> Restarting deployments in $ns ..."
kubectl rollout restart deployment -n "$ns"
done

查看滚动重启状态

重启后可以监控滚动过程:

1
kubectl rollout status deployment/<deploy-name> -n <namespace>

或批量监控:

1
2
3
kubectl get deploy -A | grep -v NAME | while read ns name rest; do
kubectl rollout status deployment "$name" -n "$ns"
done