调试Pods

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

$ kubectl describe pods ${POD_NAME}

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

根据pod的状态继续调试。

我的Pod保持Pending

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

资源不足

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

使用hostPort

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

我的Pod一直在Waiting

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

我的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 Controllers

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

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