使用 kubectl apply 或者 create 命令创建/更新部署后,其 pod 需要时间完成创建/更新。 如果在 CI 中不等待所有 pod 更新完成,下一步流程很有可能使用更新前的环境。
正确方法 kubectl rollout status
根据实际情况kubectl rollout status
命令,能够正确的获取 rollout status。
ATTEMPTS=0
ROLLOUT_STATUS_CMD="kubectl rollout status deployment/myapp -n namespace"
until $ROLLOUT_STATUS_CMD || [ $ATTEMPTS -eq 60 ]; do
$ROLLOUT_STATUS_CMD
ATTEMPTS=$((attempts + 1))
sleep 10
done
以上 shell 脚本经过轮询kubectl rollout status
可以很好的解决实际问题。
错误方法 kubectl wait
注意kubectl wait
命令不能适用于更新部署。
kubectl wait --for=condition=available --timeout=600s deployment/myapp -n namespace
该命令只能判断 deployment 是否 available,不能用来判断 rollout,即 available 状态的 deployment,很可能老的 pod 还在 terminating,新的 pod 还没创建好。