GKE通过Helm安装Vault时vault-k8s:0.16.1镜像拉取失败
问题定位
从Pod事件日志可以直接判定故障原因:GKE集群节点无法连通Docker Hub官方镜像仓库(443端口连接超时),导致vault-agent-injector组件依赖的hashicorp/vault-k8s:0.16.1镜像拉取失败,和执行的Helm参数、Vault HA配置本身没有关系。
此前Helm安装运行正常,大概率是当时网络连通性正常,或是之前安装版本拉取的镜像已经存在节点本地缓存,不需要重新从公网拉取。
排查步骤
- 启动临时调试Pod验证网络连通性:执行
kubectl run net-test --image=busybox:latest --rm -it --restart=Never -- sh,进入容器后执行wget -T 10 https://registry-1.docker.io/v2/,确认是否触发超时,复现拉取失败的网络问题 - 检查集群网络配置:如果是私有GKE集群,确认节点所在子网是否绑定了可用的Cloud NAT,没有公网IP的工作节点默认无法直接访问公网镜像源
- 检查VPC出口防火墙规则:确认没有规则拦截节点到公网443端口的出站流量,同时检查Cloud NAT的端口配额、公网IP配额是否耗尽,导致新连接无法建立
可落地方案
- 最快修复方案:使用私有镜像仓库缓存镜像
提前将hashicorp/vault-k8s:0.16.1以及对应版本的Vault服务端镜像同步到可正常访问的私有镜像仓库,安装Helm时通过参数覆盖默认镜像地址,示例命令:helm install vault hashicorp/vault \ --set='server.ha.enabled=true' \ --set='server.ha.raft.enabled=true' \ --set='injector.image.repository=你的私有镜像仓库地址/hashicorp/vault-k8s' \ --set='injector.image.tag=0.16.1' \ --set='server.image.repository=你的私有镜像仓库地址/hashicorp/vault'注意:不要使用无运营主体的公共镜像代理拉取生产环境镜像,存在供应链投毒风险,务必使用自己可控的私有镜像仓库完成镜像同步
该方案不依赖公网连通性,稳定性最高,生产环境推荐使用。 - 网络修复方案:打通公网出口
给私有GKE集群节点配置可用的Cloud NAT,放开到Docker Hub等必要镜像仓库的443端口出站规则;若NAT配额耗尽则扩容公网IP池、调整单节点端口分配上限,修复后节点可正常拉取公网镜像。 - 小规模临时方案:手动导入镜像
集群节点数量少时,可以在有公网的环境提前pull对应镜像,导出后传输到所有GKE节点,通过crictl load命令导入到节点本地镜像缓存,kubelet检测到本地存在对应镜像就不会再去公网拉取。
内容的提问来源于stack exchange,提问作者RobTheRobot16
相关产品推荐
相关产品推荐

