部署在EDAS上的Kubernetes集群应用在运行期间出现的问题一般为Pod问题。本文介绍常见的Pod问题及其解决方法。

常见Pod问题

ImagePullBackOff

当Kubernetes无法获取Pod中某个容器的镜像时,将出现此错误。

可能原因:

  • 镜像名称无效,例如镜像名称拼写错误,或者镜像不存在。
  • 为镜像指定了不存在的标签。
  • 镜像在私有镜像仓库中,Kubernetes无法访问。

解决方法:

  • 对于前两种情况,可以通过修改镜像名称和标签来解决问题。
  • 对于第三种情况,您需要以Secret的形式将私有镜像仓库的访问凭证添加到Kubernetes中,并在Pod中引用该Secret。

CrashLoopBackOff

如果容器无法启动,则Kubernetes将显示此错误状态。

可能原因:

  • 应用程序中存在错误,导致应用无法启动。
  • 未正确配置容器。
  • Liveness探针失败次数太多。

解决方法:

您可以尝试从该容器中检索日志以调查失败原因。如果因为容器重新启动太快而看不到日志,则可以使用以下命令来查看日志:

$ kubectl logs <pod-name> --previous

RunContainerError

容器无法启动时可能出现此错误。

可能原因:

  • 挂载了不存在的卷,例如ConfigMap或Secrets。
  • 只读卷被安装为可读写卷。

解决方法:

请使用以下命令收集信息和分析错误。

kubectl describe pod

Pod处于Pending状态

创建应用过程中,Pod一直处于Pending状态。

可能原因:

  • 集群没有足够的资源(例如CPU和内存)来运行Pod。
  • 当前命名空间具有ResourceQuota对象,创建Pod将使命名空间超过配额。
  • 该Pod绑定了一个处于Pending状态的PersistentVolumeClaim。

解决方法:

  • 执行以下命令并查看输出的“事件”部分的内容,或者在控制台查看应用事件,详情请参见查看应用事件
    $ kubectl describe pod <pod name>
  • 对于因ResourceQuota导致的错误,可以执行以下命令来检查集群日志。
    $ kubectl get events --sort-by=.metadata.creationTimestamp

Pod处于未就绪状态

如果Pod正在运行但未就绪(Not Ready),则表示就绪探针失败。

可能原因:

当就绪探针失败时,Pod未连接到服务,并且没有流量转发到该实例。

解决方法:

就绪探针失败是应用程序的特定错误,请执行以下命令并查看输出的“事件”部分的内容,或者在控制台查看应用事件,详情请参见查看应用事件

$ kubectl describe pod <pod name>