Pod处于ContainerCreating状态,拉取镜像TLS握手超时求助
解决Pod卡在ContainerCreating状态的问题
从你提供的Pod事件日志来看,核心问题是kubelet在节点centos-minion-2上无法拉取registry.access.redhat.com/rhel7/pod-infrastructure:latest镜像,报错显示TLS握手超时,导致Pod的基础容器(pause容器)无法启动,进而你的Nginx容器也无法创建。下面是具体的解决方法:
方法一:更换为可访问的Pause容器镜像(推荐)
这个rhel7/pod-infrastructure是老版本Kubernetes依赖的Red Hat基础容器镜像,现在官方已经改用pause镜像,而且国内有很多稳定的镜像源,步骤如下:
- 登录到出问题的节点
centos-minion-2 - 修改kubelet的配置,替换默认的基础容器镜像:
- 如果kubelet是通过启动参数配置的,找到kubelet的服务配置文件(通常是
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf),找到--pod-infra-container-image参数,将其替换为国内镜像,比如:
注意:镜像版本要和你的Kubernetes版本匹配,比如K8S 1.14-1.17用--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.13.1,1.18-1.20用3.2,更高版本可以对应更新的pause版本。 - 如果是用yaml配置的kubelet(比如
/var/lib/kubelet/config.yaml),找到podInfraContainerImage字段修改为上述镜像地址。
- 如果kubelet是通过启动参数配置的,找到kubelet的服务配置文件(通常是
- 重启kubelet服务:
systemctl daemon-reload systemctl restart kubelet - 删除原来的异常Pod,让Deployment重新创建:
kubectl delete pod my-nginx-2723453542-5s33f
方法二:修复节点的网络/代理问题
如果你坚持使用原镜像,需要解决节点访问RedHat镜像仓库的网络问题:
- 首先测试节点的网络连通性:
如果无法ping通或者curl报错,检查节点的防火墙、路由配置,确保能正常访问外网。ping registry.access.redhat.com curl https://registry.access.redhat.com/v1/_ping - 如果节点使用了代理,确认代理配置正确,并且kubelet也继承了代理环境变量:
在kubelet的服务配置文件中添加代理环境变量,比如:
然后重启kubelet:Environment="HTTP_PROXY=http://your-proxy-ip:port" Environment="HTTPS_PROXY=http://your-proxy-ip:port" Environment="NO_PROXY=localhost,127.0.0.1,cluster.local"systemctl daemon-reload systemctl restart kubelet
补充说明
pod-infrastructure是Pod的基础容器,负责为Pod内的所有容器提供网络命名空间和IPC共享等基础功能,这个容器启动失败会导致整个Pod无法正常创建。更换为官方的pause镜像不仅能解决当前的拉取问题,也能避免后续RedHat仓库访问不稳定带来的隐患。
内容的提问来源于stack exchange,提问作者merrykinger




