Skip to content

Commit 82ac925

Browse files
qingsenLichenopis
authored andcommitted
ZTE-SH-CN-debug-pod-replication-controller-2017-09-14-14
1 parent fc7ea44 commit 82ac925

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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

Comments
 (0)