website/content/zh/docs/tasks/debug-application-cluster/debug-pod-replication-contr...

8.2 KiB
Raw Blame History

reviewers title content_template
bprashanth
调试 Pods 和 Replication Controllers templates/task

{{% capture overview %}}

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

{{% /capture %}}

{{% capture prerequisites %}}

{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}

{{% /capture %}}

{{% capture steps %}}

调试 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}

{{< note >}} -c ${CONTAINER_NAME} 是可选的,对于只包含一个容器的 pod 可以省略。 {{< /note >}}

例如要查看正在运行的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有关的事件。

{{% /capture %}}