解决kubernetes启动容器时,容器一直是ContainerCreating不能running

本文记录了一个Kubernetes Pod启动过程中遇到的问题及其解决过程。Pod状态长时间停留在ContainerCreating,原因是无法拉取所需的镜像。通过安装python-rhsm-certificates解决了证书问题,最终成功启动Pod。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表象

kubectl -f create redis.yaml

kubectl get pod redis

NAME                 READY     STATUS              RESTARTS   AGE
kubetest-8s1rt1   0/1       ContainerCreating   0          12s

pod的状态一直是ContainerCreating ,久久不能变成Running的状态。

分析

查看pod的日志kubectl describe pod kubetest-8s1rt1,里边有一个错误事件

Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

看这个错误是由于pull时出错了。看着网上的思路也试着手工pull了一下,提示错误/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory.
进入到/etc/docker/certs.d/registry.access.redhat.com/看到有一个redhat-ca.crt文件,使用ll命令查看,发现是个link文件,lrwxrwxrwx. 1 root root 27 Mar 27 05:22 redhat-ca.crt -> /etc/rhsm/ca/redhat-uep.pem还一直闪啊闪,说明没有这个真正链接的文件。
cd /etc/rhsm 发现没有这个文件夹

解决

看样子应该是有东西没安装。
先更新下源yum update
然后查询yum search rhsm

python-rhsm.x86_64 : A Python library to communicate with a Red Hat Unified Entitlement Platform
python-rhsm-certificates.x86_64 : Certificates required to communicate with a Red Hat Unified Entitlement Platform

看着python-rhsm-certificates这个比较像,所以就安装了这个yum install python-rhsm-certificates
之后发现有了/etc/rhsm/这个目录,之前的redhat-ca.crt这个link也有了真正的指向。

回过头来重新查看kubectl get pod,仍然是ContainerCreating的状态。
于是又执行了docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest,这个时候开始自动下载镜像。等镜像下载完成后,在查看pod已经是Running的状态了。

后记

通过docker ps命令查看如下

[root@localhost registry.access.redhat.com]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
6b1409d4214b        192.168.1.130:5000/kubetest:9                                "java -jar kubetes..."   35 minutes ago      Up 35 minutes                           k8s_kubetest.49006d1_kubetest-8s1rt_default_ccc51f1f-4416-11e8-a44c-000c2978035a_578a705e
bcc967e615ca        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           35 minutes ago      Up 35 minutes                           k8s_POD.24f70ba9_kubetest-8s1rt_default_ccc51f1f-4416-11e8-a44c-000c2978035a_b36c03dc

发现启动了两个容器,一个是使用的镜像是192.168.1.130:5000/kubetest:9,一个使用的镜像是
registry.access.redhat.com/rhel7/pod-infrastructure:latest。也就是我们刚刚启动时一直报错的。其实这个容器是没个Pod的pause根容器,是Pod启动时自动启动的。整个pod的网络和卷都是共享这个Pod里同一个pause容器的。

至此大概推断如下:k8s启动pod需要拉取服务镜像,和pause根容器镜像。pause容器需要到registry.access.redhat.com/rhel7下边拉取,而这个地方需要CA凭证,操作系统里默认不带,所以需要手工安装一个,也就是上边的python-rhsm-certificates,安装后在拉去下来,images都有了,所以就都起来了,Running

### Kubernetes 容器状态为 `ContainerCreating` 的解决方案 当 Kubernetes 中的 Pod 或容器间处于 `ContainerCreating` 状态,通常表明在创建容器的过程中遇到了某些问题。以下是可能的原因及其对应的解决方法: #### 1. **镜像拉取失败** 如果指定的容器镜像无法被正确拉取,则可能导致容器停留在 `ContainerCreating` 状态。 - 检查是否有正确的镜像地址配置: ```bash KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.2.11:5000/pod-infrastructure:latest" ``` 如果自定义了私有仓库,请确认该路径可用并能正常访问[^1]。 - 验证节点上的 Docker 是否能够成功拉取所需镜像: ```bash docker pull <image-name> ``` #### 2. **CNI 插件未初始化或冲突** CNI(Container Network Interface)插件未能正确初始化或者与其他组件发生冲突也可能导致此问题。例如: - Flannel 下载失败的情况可以参考以下命令重新安装 flannel 并验证其运行状况[^3]: ```bash kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` - 若 CNI 网络接口已存在但 IP 地址不匹配,可尝试清理旧网络设置后再重试[^4]: ```bash ip link delete cni0 systemctl restart kubelet ``` #### 3. **资源不足** 内存或其他硬件资源短缺会阻碍新沙盒环境(`sandbox`)的成功建立。具体表现为日志中出现类似错误消息: > "failed to start sandbox container..." 此应检查当前系统的实际负载情况以及是否存在严重的内存碎片化现象[^2]。 #### 4. **认证文件缺失** 对于依赖外部注册表的应用程序来说,缺少必要的证书同样会造成类似的困境。比如 RedHat Registry 访问受限的情形下会有如下提示信息: > details:(open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt:no such file or directory) 对此类事件处理方式包括但不限于导入所需的 CA 文件到目标位置以便顺利完成身份验证过程[^5]. 通过以上分析可以看出造成此类故障的因素众多且复杂多样;因此,在面对具体实例之前很难确切指出唯一原因所在。建议按照上述思路逐一排查直至找到根本症结为止。 ```python def check_container_status(pod_name): import subprocess try: result = subprocess.run(['kubectl', 'get', 'pods', pod_name, '-o', 'jsonpath={..status.phase}'], capture_output=True, text=True) status = result.stdout.strip() if status != "Running": print(f"The pod {pod_name} is not running yet.") logs_result = subprocess.run(['kubectl', 'logs', '--previous', pod_name], stderr=subprocess.PIPE, stdout=subprocess.DEVNULL) if logs_result.returncode != 0: describe_info = subprocess.check_output(['kubectl', 'describe', 'po', pod_name]).decode('utf-8') print(describe_info) except Exception as e: print(e) check_container_status("example-pod") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值