解决k8s出现pod服务一直处于ContainerCreating状态的问题的过程

参考于:

https://blog.csdn.net/learner198461/article/details/78036854

https://liyang.pro/solve-k8s-pod-containercreating/

 

根据实际情况稍微做了修改和说明。

 

在创建Dashborad时,查看状态总是ContainerCreating

[root@MyCentos7 k8s]# kubectl get pod --namespace=kube-system
NAME                                    READY     STATUS              RESTARTS   AGE
kubernetes-dashboard-2094756401-kzhnx   0/1       ContainerCreating   0          10m

通过kubectl describe命令查看具体信息(或查看日志/var/log/message)

复制代码
[root@MyCentos7 k8s]# kubectl describe pod kubernetes-dashboard-2094756401-kzhnx --namespace=kube-system
Name:        kubernetes-dashboard-2094756401-kzhnx
Namespace:    kube-system
Node:        mycentos7-1/192.168.126.131
Start Time:    Tue, 05 Jun 2018 19:28:25 +0800
Labels:        app=kubernetes-dashboard
        pod-template-hash=2094756401
Status:        Pending
IP:        
Controllers:    ReplicaSet/kubernetes-dashboard-2094756401
Containers:
  kubernetes-dashboard:
    Container ID:    
    Image:        daocloud.io/megvii/kubernetes-dashboard-amd64:v1.8.0
    Image ID:        
    Port:        9090/TCP
    Args:
      --apiserver-host=http://192.168.126.130:8080
    State:            Waiting
      Reason:            ContainerCreating
    Ready:            False
    Restart Count:        0
    Liveness:            http-get http://:9090/ delay=30s timeout=30s period=10s #success=1 #failure=3
    Volume Mounts:        <none>
    Environment Variables:    <none>
Conditions:
  Type        Status
  Initialized     True 
  Ready     False 
  PodScheduled     True 
No volumes.
QoS Class:    BestEffort
Tolerations:    <none>
Events:
  FirstSeen    LastSeen    Count    From            SubObjectPath    Type        Reason        Message
  ---------    --------    -----    ----            -------------    --------    ------        -------
  11m        11m        1    {default-scheduler }            Normal        Scheduled    Successfully assigned kubernetes-dashboard-2094756401-kzhnx to mycentos7-1
  11m        49s        7    {kubelet mycentos7-1}            Warning        FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failede: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)"

  11m    11s    47    {kubelet mycentos7-1}        Warning    FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redh
复制代码
在工作节点(node)上执行
发现此时会pull一个镜像registry.access.redhat.com/rhel7/pod-infrastructure:latest,当我手动pull时,提示如下错误:
 
 
[root@MyCentos7 k8s]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ...
open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory

通过提示的路径查找该文件,是个软连接,链接目标是/etc/rhsm,查看没有rhsm

复制代码
[root@MyCentos7 ca]# cd /etc/docker/certs.d/registry.access.redhat.com/
[root@MyCentos7 registry.access.redhat.com]# ll
总用量 0
lrwxrwxrwx. 1 root root 27 5月  11 14:30 redhat-ca.crt -> /etc/rhsm/ca/redhat-uep.pem
[root@MyCentos7 ca]# cd /etc/rhsm
-bash: cd: /etc/rhsm: 没有那个文件或目录
复制代码

安装rhsm(node上):

复制代码
yum install *rhsm*
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.lzu.edu.cn
 * extras: mirror.lzu.edu.cn
 * updates: ftp.sjtu.edu.cn
base                                                                                                                                                                                  | 3.6 kB  00:00:00     
extras                                                                                                                                                                                | 3.4 kB  00:00:00     
updates                                                                                                                                                                               | 3.4 kB  00:00:00     
软件包 python-rhsm-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-1.20.11-1.el7.centos.x86_64 取代
软件包 subscription-manager-rhsm-1.20.11-1.el7.centos.x86_64 已安装并且是最新版本
软件包 python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 取代
软件包 subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 已安装并且是最新版本
复制代码

但是在/etc/rhsm/ca/目录下依旧没有证书文件,于是反复卸载与安装都不靠谱,后来发现大家所谓yum install *rhsm*其实安装的的是python-rhsm-1.19.10-1.el7_4.x86_64python-rhsm-certificates-1.19.10-1.el7_4.x86_64,但是在实际安装过程中会有如下提示:

软件包 python-rhsm-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-1.20.11-1.el7.centos.x86_64 取代
软件包 subscription-manager-rhsm-1.20.11-1.el7.centos.x86_64 已安装并且是最新版本
软件包 python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 取代
软件包 subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 已安装并且是最新版本

罪魁祸首在这里。原来我们想要安装的rpm包被取代了。而取代后的rpm包在安装完成后之创建了目录,并没有证书文件redhat-uep.pem。于是乎,手动下载以上两个包

wget ftp://ftp.icm.edu.pl/vol/rzm6/linux-scientificlinux/7.4/x86_64/os/Packages/python-rhsm-certificates-1.19.9-1.el7.x86_64.rpm
wget ftp://ftp.icm.edu.pl/vol/rzm6/linux-scientificlinux/7.4/x86_64/os/Packages/python-rhsm-1.19.9-1.el7.x86_64.rpm

注:在此处有时会报错,提示找不到这两个rpm文件,此时需要手动登录到此FTP进行下载,文件要稍等会才会加载出来,然后下载所需的这两个rpm(可能是网络原因,有时不稳定)

注意版本要匹配,卸载安装错的包

yum remove *rhsm*

然后执行安装命令

rpm -ivh *.rpm
复制代码
rpm -ivh *.rpm
警告:python-rhsm-1.19.9-1.el7.x86_64.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID 192a7d7d: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:python-rhsm-certificates-1.19.9-1################################# [ 50%]
   2:python-rhsm-1.19.9-1.el7         ################################# [100%]
复制代码

我在这一步有出错了


[root@neal registry.access.redhat.com]# rpm -ivh *.rpm
警告:python-rhsm-1.19.9-1.el7.x86_64.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID 192a7d7d: NOKEY
错误:依赖检测失败:
        python-rhsm <= 1.20.3-1 被 (已安裝) subscription-manager-rhsm-1.20.11-1.el7.centos.x86_64 取代
        python-rhsm-certificates <= 1.20.3-1 被 (已安裝) subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 取代

此时跳到分割线之下,用分割线下面的文章的方法remove掉已经有的包,再重新用上面的命令安装。

接着验证手动pull镜像

复制代码
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ... 
latest: Pulling from registry.access.redhat.com/rhel7/pod-infrastructure
26e5ed6899db: Pull complete 
66dbe984a319: Pull complete 
9138e7863e08: Pull complete 
Digest: sha256:92d43c37297da3ab187fc2b9e9ebfb243c1110d446c783ae1b989088495db931
Status: Downloaded newer image for registry.access.redhat.com/rhel7/pod-infrastructure:latest
复制代码

问题解决。

 












--------------------------------------------------------------------------------------------------------------------------------


在《kubernetes权威指南》入门的一个例子中,发现pod一直处于ContainerCreating的状态,用kubectl describe pod mysql的时候发现如下报错:

Events:
  FirstSeen    LastSeen    Count   From            SubObjectPath   Type        Reason      Message
  ---------    --------    -----   ----            -------------   --------    ------      -------
  1h        24m     17  {kubelet 127.0.0.1}         Warning     FailedSync  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)"
  1h    19m 291 {kubelet 127.0.0.1}     Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
  15m    15m 1   {kubelet 127.0.0.1}             Warning MissingClusterDNS   kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  15m    15m 1   {kubelet 127.0.0.1} spec.containers{mysql}  Normal  Pulling         pulling image "mysql"
  7m    7m  1   {kubelet 127.0.0.1}             Warning MissingClusterDNS   kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  7m    7m  1   {kubelet 127.0.0.1} spec.containers{mysql}  Normal  Pulling         pulling image "mysql"

问题是比较明显的,就是没有/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt文件,用ls -l查看之后发现是一个软链接,链接到/etc/rhsm/ca/redhat-uep.pem,但是这个文件不存在,使用yum search *rhsm*命令:

  • 安装python-rhsm-certificates包:
# yum install python-rhsm-certificates -y

这里又出现问题了:

python-rhsm-certificates <= 1.20.3-1 被 (已安裝) subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 取代

那么怎么办呢,我们直接卸载掉subscription-manager-rhsm-certificates包,使用yum remove subscription-manager-rhsm-certificates -y命令,然后下载python-rhsm-certificates包:

# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

然后手动安装该rpm包:

# rpm -ivh python-rhsm-certificates

这时发现/etc/rhsm/ca/redhat-uep.pem文件已存在。

  • 使用docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest命令下载镜像,但是可能会很慢,可以到https://dashboard.daocloud.io网站上注册账号,然后点击加速器,然后复制代码执行,之后重启docker就会进行加速,如果重启docker服务的时候无法启动,使用systemctl status docker:
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 一 2018-05-28 22:13:37 CST; 13s ago
     Docs: http://docs.docker.com
  Process: 79849 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
 Main PID: 79849 (code=exited, status=1/FAILURE)
528 22:13:37 kube.example.com systemd[1]: Starting Docker Application Container Engine...
528 22:13:37 kube.example.com dockerd-current[79849]: unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '}' loo...y string
528 22:13:37 kube.example.com systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
528 22:13:37 kube.example.com systemd[1]: Failed to start Docker Application Container Engine.
528 22:13:37 kube.example.com systemd[1]: Unit docker.service entered failed state.
528 22:13:37 kube.example.com systemd[1]: docker.service failed.
Hint: Some lines were ellipsized, use -l to show in full

这时将/etc/docker/seccomp.json删除,再次重启即可

  • 这时将之前创建的rc、svc和pod全部删除重新创建,过一会就会发现pod启动成功

原因猜想:根据报错信息,pod启动需要registry.access.redhat.com/rhel7/pod-infrastructure:latest镜像,需要去红帽仓库里下载,但是没有证书,安装证书之后就可以了


<think>好的,用户让我介绍一下KubernetesPod的异常状态,需要按照系统级指令来组织回答。首先,我需要确保所有的行内数学表达式都用$...$,独立公式用$$...$$,不过这个问题可能用不到数学公式,但得注意其他格式要求。然后结构要清晰,分步骤解决问题,用中文回答。 首先,我应该回忆一下Kubernetes Pod的常见异常状态Pod状态通常在kubectl get pods时显示,比如Pending、Running、Succeeded、Failed、Unknown,还有一些其他情况比如CrashLoopBackOff、ImagePullBackOff、ErrImagePull、ContainerCreating、Terminating等。可能需要详细解释每个状态的原因和解决办法。 接下来,需要组织这些信息,确保结构清晰。可能需要分为几个部分,比如核心状态和其他常见异常状态,每个状态下面分原因和解决办法。这样用户容易理解。 要注意使用正确的LaTeX格式,如果有变量或代码可能需要用行内公式,不过Kubernetes的术语一般不用数学符号,但如果有的话要处理。例如,如果提到资源限制,可能需要写$100m$表示100毫核,不过可能用户的问题里不太涉及这些。暂时先确保没有使用错误的LaTeX格式。 另外,要使用中文,避免专业术语直接使用英文,可能需要适当翻译,但有些术语在中文社区常用英文,比如Pod本身通常不翻译。需要保持术语的一致性。 然后检查每个异常状态是否准确,比如CrashLoopBackOff是因为容器不断崩溃,ImagePullBackOff是镜像拉取失败,等等。需要确认这些状态的原因和处理方法是否正确,避免给出错误信息。 可能还需要提到如何排查这些状态,比如使用kubectl describe pod和kubectl logs命令,这能帮助用户实际解决问题。需要确保步骤详细,但不过于冗长。 最后,总结一下常见的异常状态,帮助用户有一个整体的认识。可能还需要提醒用户查看官方文档或者其他资源,确保信息的可靠性。 现在把这些整理成结构化的回答,分点列出,每个状态给出原因和解决方法,使用适当的标题和子标题,确保层次分明。同时,注意用词准确,比如“CrashLoopBackOff”和“ImagePullBackOff”的正确写法,避免拼写错误。 可能还需要注意用户的实际使用场景,比如开发或运维人员遇到Pod异常时需要快速诊断,因此回答需要实用,提供具体的命令和排查步骤。例如,当Pod处于ImagePullBackOff状态时,检查镜像名称、权限等。 总之,目标是提供一个结构清晰、内容准确、易于理解的回答,符合用户的需求,同时遵循给定的格式要求。</think>KubernetesPod 异常状态通常反映其生命周期中的问题,以下是常见异常状态、原因及排查方法: --- ### 一、核心状态(由 Kubernetes 控制面定义) 1. **`Pending`** - **原因**: Pod 已被调度到节点,但未能启动容器。 - **常见问题**: - 资源不足(如 CPU/内存不足,检查 `kubectl describe node`) - 未绑定持久卷(PVC/PV 配置错误) - 镜像拉取中(需结合事件日志分析) 2. **`Running` 但容器异常** - **现象**: Pod 显示 `Running`,但内部容器未就绪。 - **排查**: - 检查 `kubectl get pods -o wide` 中的 `READY` 列(如 `1/2` 表示 1 个容器就绪) - 使用 `kubectl describe pod <pod-name>` 查看事件日志 3. **`Failed`** - **原因**: 所有容器已终止且至少一个容器非正常退出(退出码 ≠ 0)。 - **常见问题**: - 应用代码崩溃(检查日志 `kubectl logs <pod-name> --previous`) - 资源限制触发 OOM(检查内存请求/限制配置) 4. **`Unknown`** - **原因**: 节点与控制面通信中断(如节点宕机或网络故障)。 - **排查**: - 检查节点状态 `kubectl get nodes` - 登录节点查看 `kubelet` 服务状态 --- ### 二、常见扩展异常状态(由容器运行时或控制器触发) 1. **`CrashLoopBackOff`** - **原因**: 容器反复崩溃后,Kubernetes 逐步增加重启间隔。 - **排查步骤**: 1. 查看崩溃日志: ```bash kubectl logs <pod-name> --previous ``` 2. 检查容器启动命令(如 `command`/`args` 配置错误) 3. 验证依赖服务(如数据库未就绪导致应用崩溃) 2. **`ImagePullBackOff`/`ErrImagePull`** - **原因**: 镜像拉取失败。 - **排查方向**: - 镜像名称拼写错误(如标签不存在) - 私有仓库认证问题(检查 `imagePullSecrets`) - 网络限制(如仓库域名解析失败或防火墙拦截) 3. **`ContainerCreating` 长时间阻塞** - **原因**: 容器创建流程卡顿。 - **常见问题**: - 镜像体积过大导致下载缓慢 - 存储卷挂载失败(如 NFS 服务不可用) 4. **`Terminating` 卡住** - **原因**: Pod 无法正常终止。 - **解决方案**: - 强制删除(慎用): ```bash kubectl delete pod <pod-name> --grace-period=0 --force ``` - 检查 Finalizers 配置或节点状态 --- ### 三、排查工具与命令 1. **查看详细事件** ```bash kubectl describe pod <pod-name> ``` - 重点关注 `Events` 部分的错误提示(如 `FailedScheduling`/`FailedMount`) 2. **查看容器日志** ```bash kubectl logs <pod-name> [-c <container-name>] ``` 3. **进入容器调试** ```bash kubectl exec -it <pod-name> -- sh ``` --- ### 四、总结 常见异常状态的核心解决思路: 1. **日志优先**: 通过日志定位应用层问题 2. **资源验证**: 检查 CPU/内存/存储配额 3. **依赖检查**: 确保网络、存储卷、服务依赖正常 4. **配置复查**: 核对 Deployment/Service 等资源配置的合法性 建议结合 Kubernetes 官方文档和集群监控工具(如 Prometheus)进行深度排查。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值