天天看點

Pod 一直處于 Pending 狀态

Pending

狀态說明

Pod

還沒有被排程到某個節點上,需要看下

Pod

事件進一步判斷原因,比如

:

Pod 一直處于 Pending 狀态

下面列舉下可能原因和解決方法。

節點資源不夠

節點資源不夠有以下幾種情況:

  • 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>