|
| 1 | +--- |
| 2 | +title: 调试Pods和Replication Controllers |
| 3 | +--- |
| 4 | + |
| 5 | +* TOC |
| 6 | +{:toc} |
| 7 | + |
| 8 | +## 调试Pods |
| 9 | + |
| 10 | +调试一个pod的第一步是观察它。使用下面的命令检查这个pod的当前状态和最近事件: |
| 11 | + |
| 12 | + $ kubectl describe pods ${POD_NAME} |
| 13 | + |
| 14 | +看看pod中的容器的状态。他们都是`Running`吗?有最近重启了吗? |
| 15 | + |
| 16 | +根据pod的状态继续调试。 |
| 17 | + |
| 18 | +### 我的Pod保持Pending |
| 19 | + |
| 20 | +如果一个pod被卡在`Pending`中,就意味着它不能调度在某个节点上。一般来说,这是因为某种类型的资源不足 |
| 21 | +阻止调度。 看看上面的命令`kubectl describe ...`的输出。调度器的消息中应该会包含无法调度Pod的原因。 |
| 22 | +理由包括: |
| 23 | + |
| 24 | +#### 资源不足 |
| 25 | + |
| 26 | +您可能已经耗尽了集群中供应的CPU或内存。在这个情况下你可以尝试几件事情: |
| 27 | + |
| 28 | +* [添加更多节点](/docs/admin/cluster-management/#resizing-a-cluster) 到集群。 |
| 29 | + |
| 30 | +* [终止不需要的pod](/docs/user-guide/pods/single-container/#deleting_a_pod) |
| 31 | + 为pending中的pods提供空间。 |
| 32 | + |
| 33 | +* 检查该pod是否不大于您的节点。例如,如果全部节点具有`cpu:1`容量,那么具有`cpu: 1.1`请求的pod永远不会被调度。 |
| 34 | + |
| 35 | + 您可以使用`kubectl get nodes -o <format>`命令来检查节点容量。 |
| 36 | + 下面是一些能够提取必要信息的命令示例: |
| 37 | + |
| 38 | + kubectl get nodes -o yaml | grep '\sname\|cpu\|memory' |
| 39 | + kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, cap: .status.capacity}' |
| 40 | + |
| 41 | + 可以考虑配置[资源配额](/docs/concepts/policy/resource-quotas/)来限制可耗用的资源总量。如果与命名空间一起使用,它可以防止一个团队吞噬所有的资源。 |
| 42 | + |
| 43 | +#### 使用hostPort |
| 44 | + |
| 45 | +当你将一个pod绑定到一个`hostPort`时,这个pod能被调度的位置数量有限。 |
| 46 | +在大多数情况下,`hostPort`是不必要的; 尝试使用服务对象来暴露您的pod。 |
| 47 | +如果你需要`hostPort`,那么你可以调度的Pod数量不能超过集群的节点个数。 |
| 48 | + |
| 49 | +### 我的Pod一直在Waiting |
| 50 | + |
| 51 | +如果一个pod被卡在`Waiting`状态,那么它已被调度在某个工作节点,但它不能在该机器上运行。 |
| 52 | +再次,来自`kubectl describe ...`的内容应该是可以提供信息的。 |
| 53 | +最常见的原因`Waiting`的pod是无法拉取镜像。有三件事要检查: |
| 54 | + |
| 55 | +* 确保您的镜像的名称正确。 |
| 56 | +* 您是否将镜像推送到存储库? |
| 57 | +* 在您的机器上手动运行`docker pull <image>`,看看是否可以拉取镜像。 |
| 58 | + |
| 59 | +### 我的Pod一直Crashing或者有别的不健康状态 |
| 60 | + |
| 61 | +首先,查看当前容器的日志: |
| 62 | + |
| 63 | + $ kubectl logs ${POD_NAME} ${CONTAINER_NAME} |
| 64 | + |
| 65 | +如果您的容器先前已崩溃,则可以访问上一个容器的崩溃日志: |
| 66 | + |
| 67 | + $ kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME} |
| 68 | + |
| 69 | +或者,您可以使用`exec`在该容器内运行命令: |
| 70 | + |
| 71 | + $ kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN} |
| 72 | + |
| 73 | +请注意,`-c ${CONTAINER_NAME}`是可选的,对于pod只包含一个容器可以省略。 |
| 74 | + |
| 75 | +例如,要查看正在运行的Cassandra pod的日志,可以运行: |
| 76 | + |
| 77 | + $ kubectl exec cassandra -- cat /var/log/cassandra/system.log |
| 78 | + |
| 79 | +如果这些方法都不起作用,您可以找到该运行pod所在的主机并SSH到该主机。 |
| 80 | + |
| 81 | +## 调试Replication Controllers |
| 82 | + |
| 83 | +Replication Controllers相当简单。他们能或不能创建pod。如果他们无法创建pod,那么请参考 |
| 84 | +[上面的说明](#debugging_pods)来调试你的pod。 |
| 85 | + |
| 86 | +您也可以使用`kubectl describe rc ${CONTROLLER_NAME}`来检查和Replication Controllers有关的事件。 |
| 87 | + |
0 commit comments