有没有办法等待 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 个名称。
它比仅仅使用标签要复杂得多,而且容易失败。
手动删除 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 个名称。
它比仅仅使用标签要复杂得多,而且容易失败。