有没有办法等待 k8s 部署中的所有 pod 停止?

Is there a way to wait for all pod from a k8s deployment to be stopped?

手动删除 pod 时 kubectl delete 等待 pod 被删除,可以在脚本中包含 kubectl wait --for.... 条件以等待 pod 被删除。

我想执行相同的等待条件,但在缩减(副本数:0)部署时。

从部署 json 开始,available/unavailable 副本不计入“终止” pods 并且正如预期的那样 kubectl wait --for=delete deployment test-dep 不等待 pod 终止但是用于部署删除。

所以我想在我的脚本上执行:

kubectl scale --replicas=0 deployment foo-bar
kubectl wait --for=deletion-of-pod-from-deploymenent=foo-bar

有办法吗?

备注:我希望代码尽可能通用,这样就无需硬写部署标签。

最简单的方法是使用标签并根据标签发布 kubectl wait

kubectl wait --for delete pod --selector=<label>=<value>

但是,既然你不想那样,你可以使用下面的脚本

#!/bin/bash

deployment_uid=$(kubectl get deployments  -o=jsonpath='{.metadata.uid}')
rs_uids=$(kubectl get rs -o=json | jq -r '.items[] | select(.metadata.ownerReferences[].uid=='\"${deployment_uid}\"') | .metadata.uid')

PODS=""

for i in $rs_uids; do
    PODS+=$(kubectl get pods -o=json | jq -r '.items[] | select(.metadata.ownerReferences[].uid=='\"$i\"') | "pod/" + .metadata.name')
done

[ -z "$PODS" ] && echo "Pods not found" || kubectl wait --for=delete --timeout=-1s ${PODS}

这使用部署名称(作为第一个参数)来获取 ownerRefereces UID,链接到 Pods 个名称。

它比仅仅使用标签要复杂得多,而且容易失败。