You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:54:01