Pending
狀态說明
Pod
還沒有被排程到某個節點上,需要看下
Pod
事件進一步判斷原因,比如
:
下面列舉下可能原因和解決方法。
節點資源不夠
節點資源不夠有以下幾種情況:
- CPU 負載過高
- 剩餘可以被配置設定的記憶體不夠
- 剩餘可用 GPU 數量不夠 (通常在機器學習場景,GPU 叢集環境)
如果判斷某個 Node
資源是否足夠? 通過
kubectl describe node <node-name>
檢視
node
資源情況,關注以下資訊:
- Allocatable : 表示此節點能夠申請的資源總和
- Allocated resources : 表示此節點已配置設定的資源 (Allocatable 減去節點上所有 Pod 總的 Request)
Capacity:
cpu: 2
ephemeral-storage: 9217Mi
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 2031912Ki
pods: 110
Allocatable:
cpu: 1600m
ephemeral-storage: 9217Mi
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 1452355993
pods: 110
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 350m (21%) 0 (0%)
memory 70Mi (5%) 170Mi (12%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
前者與後者相減,可得出剩餘可申請的資源。如果這個值小于 Pod
的
request
,就不滿足
Pod
的
資源要求, Scheduler
在
Predicates (預選) 階段就會剔除掉這個 Node
,也就不會排程上去。
不滿足 nodeSelector 與 affinity
如果 Pod 包含 nodeSelector 指定了節點需要包含的 label,排程器将隻會考慮将 Pod 排程到包含這些 label 的 Node 上,如果沒有 Node 有這些 label 或者有這些 label 的 Node 其它條件不滿足也将會無法排程。參考官方文檔:https://kubernetes.io/docs/concepts/configuration/assign-pod- node/#nodeselector
- nodeAffinity: 節點親和性,可以看成是增強版的 nodeSelector,用于限制 Pod 隻允許被排程到某一部分 Node。
- podAffinity: Pod 親和性,用于将一些有關聯的 Pod 排程到同一個地方,同一個地方可以是指同一個節點或同一個可用區的節點等。
- podAntiAffinity: Pod 反親和性,用于避免将某一類 Pod 排程到同一個地方避免單點故障,比如将叢集 DNS 服務的 Pod 副本都排程到不同節點,避免一個節點挂了造成整個叢集DNS 解析失敗,使得業務中斷。
[root@master ~]# kubectl get pod -n kube-system -o wide
coredns-674d655c65-k8x88 1/1 Running 0 19d 10.233.70.1 master <none> <none>
coredns-674d655c65-lg66w 1/1 Running 0 6m11s 10.233.90.1 node1 <none> <none>
coredns-674d655c65-v5hjn 1/1 Running 0 19d 10.233.70.2 master <none> <none>
[root@master ~]# kubectl get pod -n kube-system --show-labels
coredns-674d655c65-k8x88 1/1 Running 0 19d k8s-app=kube-dns,pod-template-hash=674d655c65
coredns-674d655c65-lg66w 1/1 Running 0 77s k8s-app=kube-dns,pod-template-hash=674d655c65
coredns-674d655c65-v5hjn 1/1 Running 0 19d k8s-app=kube-dns,pod-template-hash=674d655c65
template:
metadata:
creationTimestamp: null
labels:
k8s-app: kube-dns
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
k8s-app: kube-dns
topologyKey: kubernetes.io/hostname
[root@master ~]# kubectl get pod -n kube-system -o wide
kube-system coredns-76b666bbdb-kg8lp 1/1 Running 0 64s 10.233.96.1 node2 <none> <none>
kube-system coredns-76b666bbdb-lzm2x 1/1 Running 0 53s 10.233.70.4 master <none> <none>
kube-system coredns-76b666bbdb-ptzw6 1/1 Running 0 63s 10.233.90.2 node1 <none> <none>