最近在升级服务网格 Istio,升级后有个必要的流程就是需要重启数据面的所有的 Pod,也就是业务的 Pod,这样才能将这些 Pod 的 sidecar 更新为新版本。方案 1因为我们不同环境的 Pod 数不少,不可能手动一个个重启;之前也做过类似的操作:kubectl delete --all pods --namespace=dev这样可以一键将 dev 这个命名空间下的 Pod 删掉,kubernetes 之后会自动将这些 Pod 重启,保证和应用的可用性。但这有个大问题是对kubernetes的调度压力较大,一般一个namespace下少说也是几百个 Pod,全部需要重新调度启动对kubernetes的负载会很高,稍有不慎就会有严重的后果。所以当时我的第一版方案是遍历所有的 deployment,删除一个 Pod 后休眠 5 分钟再删下一个,伪代码如下:deployments, err := clientSet.AppsV1().Deployments(ns).List(ctx, metav1.ListOptions{})
if err != nil {
return err
}
for _, deployment := range deployments.Items {
podList, err := clientSet.CoreV1().P
...
继续阅读
(88)