Shell脚本如何等待Kubernetes Pod运行后再执行后续kubectl、helm命令
实现等待cert-manager Pod就绪的三种可用方案
方案1:使用helm内置等待参数
helm本身提供--wait参数,开启后命令会阻塞到所有关联资源(Deployment、Pod、Service等)全部进入就绪状态才会退出,同时可以搭配--timeout自定义最大等待时长,是成本最低的解决方案。
修改后的安装命令如下:
helm install \ cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.5.4 \ --set installCRDs=true \ --wait \ --timeout 10m
方案2:使用kubectl wait命令精确控制等待逻辑
如果需要更细粒度的等待控制(比如只等待核心组件就绪、跳过非核心资源),可以在helm安装完成后调用kubectl wait命令指定等待的资源类型和条件:
# 等待cert-manager三个核心Deployment全部就绪 kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=5m kubectl wait --for=condition=available deployment/cert-manager-webhook -n cert-manager --timeout=5m kubectl wait --for=condition=available deployment/cert-manager-cainjector -n cert-manager --timeout=5m
也可以直接批量等待匹配标签的Pod全部处于就绪状态:
kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=cert-manager -n cert-manager --timeout=5m
方案3:自定义bash轮询逻辑(兼容低版本kubectl)
如果你的kubectl版本低于1.11(无内置wait命令),可以自己写轮询逻辑实现状态检查:
#!/bin/bash # 最大重试100次,每次间隔3秒,总等待时长5分钟 MAX_RETRY=100 INTERVAL=3 count=0 while [[ $count -lt $MAX_RETRY ]]; do # 过滤未就绪的Pod数量 unready_num=$(kubectl get po -n cert-manager -l app.kubernetes.io/name=cert-manager --no-headers | grep -vE '[0-9]+/[0-9]+.*Running' | wc -l) if [[ $unready_num -eq 0 ]]; then echo "所有cert-manager Pod已就绪" break fi echo "仍有${unready_num}个Pod未就绪,${INTERVAL}秒后重试..." sleep $INTERVAL count=$((count+1)) done # 超时退出处理 if [[ $count -eq $MAX_RETRY ]]; then echo "等待Pod就绪超时,脚本终止" exit 1 fi
额外注意:cert-manager的webhook组件就绪后还需要几秒完成证书签发同步,建议等待逻辑完成后额外加5~10秒的sleep再执行ClusterIssuer的创建,避免偶发的APIService调用失败。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

