任务

任务
管理集群
Debug DNS 方案
Enabling Service Topology (EN)
IP Masquerade Agent 用户指南
Kubernetes 云管理控制器
Safely Drain a Node while Respecting the PodDisruptionBudget (EN)
为 Kubernetes 运行 etcd 集群
为系统守护进程预留计算资源
为节点发布扩展资源
使用 CoreDNS 进行服务发现
使用 KMS 提供商进行数据加密
使用 Kubernetes API 访问集群
关键插件 Pod 的调度保证
启用端点切片
命名空间演练
在 Kubernetes 集群中使用 NodeLocal DNSCache
在 Kubernetes 集群中使用 sysctl
在实时集群上重新配置节点的 Kubelet
声明网络策略
开发云控制器管理器
控制节点上的 CPU 管理策略
控制节点上的拓扑管理策略
搭建高可用的 Kubernetes Masters
改变默认 StorageClass
更改 PersistentVolume 的回收策略
自定义 DNS 服务
访问集群上运行的服务
通过命名空间共享集群
通过配置文件设置 Kubelet 参数
配置 API 对象配额
配置多个调度器
配置资源不足时的处理方式
限制存储消耗
集群 DNS 服务自动伸缩
集群安全
集群管理
静态加密 Secret 数据
用插件扩展 kubectl
管理巨页(HugePages)
调度 GPUs

Edit This Page

调试 Pods 和 Replication Controllers

此页面告诉您如何调试 Pod 和 ReplicationController。

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

要获知版本信息,请输入 kubectl version.

调试 Pod

调试一个 pod 的第一步是观察它。使用下面的命令检查这个 pod 的当前状态和最近事件:

kubectl describe pods ${POD_NAME}

看看 pod 中的容器的状态。他们都是 Running 吗?有最近重启了吗?

根据 pod 的状态继续调试。

我的 Pod 卡在 Pending

如果一个 pod 被卡在 Pending 状态,就意味着它不能调度在某个节点上。一般来说,这是因为某种类型的资源不足而 阻止调度。 看看上面的命令 kubectl describe ... 的输出。调度器的消息中应该会包含无法调度 Pod 的原因。 原因包括:

资源不足

您可能已经耗尽了集群中供应的 CPU 或内存。在这个情况下你可以尝试几件事情:

  • 添加更多节点 到集群。

  • 终止不需要的 pod 为 pending 中的 pod 提供空间。

  • 检查该 pod 是否不大于您的节点。例如,如果全部节点具有 cpu:1 容量,那么具有 cpu: 1.1 请求的 pod 永远不会被调度。

    您可以使用 kubectl get nodes -o <format> 命令来检查节点容量。 下面是一些能够提取必要信息的命令示例:

    kubectl get nodes -o yaml | egrep '\sname:|cpu:|memory:'
    kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, cap: .status.capacity}'

可以考虑配置 资源配额 来限制可耗用的资源总量。如果与命名空间一起使用,它可以防止一个团队吞噬所有的资源。

使用hostPort

当你将一个 pod 绑定到一个 hostPort 时,这个 pod 能被调度的位置数量有限。 在大多数情况下,hostPort 是不必要的; 尝试使用服务对象来暴露您的 pod。 如果你需要 hostPort,那么你可以调度的 Pod 数量不能超过集群的节点个数。

我的 Pod 一直在 Waiting

如果一个 pod 被卡在 Waiting 状态,那么它已被调度在某个工作节点,但它不能在该机器上运行。 再次,来自 kubectl describe ... 的内容应该是可以提供信息的。 最常见的原因 Waiting 的 pod 是无法拉取镜像。有三件事要检查:

  • 确保您的镜像的名称正确。
  • 您是否将镜像推送到存储库?
  • 在您的机器上手动运行 docker pull <image>,看看是否可以拉取镜像。

我的 Pod 一直 Crashing 或者有别的不健康状态

首先,查看当前容器的日志:

$ kubectl logs ${POD_NAME} ${CONTAINER_NAME}

如果您的容器先前已崩溃,则可以访问上一个容器的崩溃日志:

$ kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}

或者,您可以使用 exec 在该容器内运行命令:

$ kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}
注意: -c ${CONTAINER_NAME} 是可选的,对于只包含一个容器的 pod 可以省略。

例如,要查看正在运行的Cassandra pod的日志,可以运行:

kubectl exec cassandra -- cat /var/log/cassandra/system.log

如果这些方法都不起作用,您可以找到该运行 pod 所在的主机并 SSH 到该主机。

调试 Replication Controller

Replication Controller 相当简单。他们只会能或不能创建 pod。如果他们无法创建 pod,那么请参考 上面的说明 来调试你的pod。

您也可以使用kubectl describe rc ${CONTROLLER_NAME}来检查和Replication Controllers有关的事件。

反馈