文档首页> 云容器引擎 CCE> 常见问题> 工作负载> 工作负载异常> 工作负载异常:实例调度失败
更新时间:2022-05-06 GMT+08:00
分享

工作负载异常:实例调度失败

问题定位

当Pod状态为“Pending”,事件中出现“实例调度失败”的信息时,可根据具体事件信息确定具体问题原因。事件查看方法请参见工作负载状态异常定位方法

排查思路

根据具体事件信息确定具体问题原因,如表1所示。

表1 实例调度失败

事件信息

问题原因与解决方案

no nodes available to schedule pods.

集群中没有可用的节点。

排查项一:集群内是否无可用节点

0/2 nodes are available: 2 Insufficient cpu.

0/2 nodes are available: 2 Insufficient memory.

节点资源(CPU、内存)不足。

排查项二:节点资源(CPU、内存等)是否充足

0/2 nodes are available: 1 node(s) didn't match node selector, 1 node(s) didn't match pod anfinity rules, 1 node(s) didn't match pod anfinity/anti-anfinity.

节点与Pod亲和性配置互斥,没有满足Pod要求的节点。

排查项三:检查工作负载的亲和性配置

0/2 nodes are available: 2 node(s) had volume node affinity conflict.

Pod挂载云硬盘存储卷与节点不在同一个可用区。

排查项四:挂载的存储卷与节点是否处于同一可用区

0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.

节点存在污点Tanits,而Pod不能容忍这些污点,所以不可调度。

排查项五:检查Pod污点容忍情况

0/7 nodes are available: 7 Insufficient ephemeral-storage.

节点临时存储不足。

排查项六:检查临时卷使用量

排查项一:集群内是否无可用节点

登录CCE控制台,检查节点状态是否为可用。或使用如下命令查看节点状态是否为Ready。

$ kubectl get node
NAME           STATUS   ROLES    AGE   VERSION
192.168.0.37   Ready    <none>   21d   v1.19.10-r1.0.0-source-121-gb9675686c54267
192.168.0.71   Ready    <none>   21d   v1.19.10-r1.0.0-source-121-gb9675686c54267

如果状态都为不可用(Not Ready),则说明集群中无可用节点。

解决方案:

排查项二:节点资源(CPU、内存等)是否充足

“实例资源的申请量”超过了“实例所在节点的可分配资源总量”时,节点无法满足实例所需资源要求导致调度失败。

如果节点可分配资源小于Pod的申请量,则节点无法满足实例所需资源要求导致调度失败。

解决方案:

资源不足的情况主要解决办法是扩容,建议在集群中增加节点数量。

排查项三:检查工作负载的亲和性配置

当亲和性配置出现如下互斥情况时,也会导致实例调度失败:

例如:

workload1、workload2设置了工作负载间的反亲和,如workload1部署在Node1,workload2部署在Node2。

workload3部署上线时,既希望与workload2亲和,又希望可以部署在不同节点如Node1上,这就造成了工作负载亲和与节点亲和间的互斥,导致最终工作负载部署失败。

0/2 nodes are available: 1 node(s) didn't match node selector, 1 node(s) didn't match pod anfinity rules, 1 node(s) didn't match pod anfinity/anti-anfinity.

  • node selector 表示节点亲和不满足。
  • pod anfinity rules 表示Pod亲和没不满足。
  • pod anfinity/anti-anfinity 表示Pod亲和/反亲和没不满足。

解决方案:

  • 在设置“工作负载间的亲和性”和“工作负载和节点的亲和性”时,需确保不要出现互斥情况,否则工作负载会部署失败。
  • 若工作负载配置了节点亲和性,需确保亲和的节点标签中supportContainer设置为true,否则会导致pod无法调动到节点上,查看事件提示如下错误信息:
    No nodes are available that match all of the following predicates: MatchNode Selector, NodeNotSupportsContainer

    节点标签为false时将会调度失败

排查项四:挂载的存储卷与节点是否处于同一可用区

0/2 nodes are available: 2 node(s) had volume node affinity conflict.

存储卷与节点之间存在亲和性冲突,导致无法调度。这是因为云硬盘不能跨可用区挂载到节点。例如云硬盘存储卷在可用区1,节点在可用区2,则会导致无法调度。

CCE中创建云硬盘存储卷,默认带有亲和性设置,如下所示。

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pvc-c29bfac7-efa3-40e6-b8d6-229d8a5372ac
spec:
  ...
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: failure-domain.beta.kubernetes.io/zone
              operator: In
              values:
                - cn-east-3a

解决方案:

重新创建存储卷,可用区选择与节点同一分区,或重新创建工作负载,存储卷选择自动分配。

排查项五:检查Pod污点容忍情况

查看节点的上污点的情况。如下则说明节点上存在污点。

$ kubectl describe node 192.168.0.37
Name:               192.168.0.37
...
Taints:             key1=value1:NoSchedule
...

要想把Pod调度到这个节点上,有两种方法:

  • 删除节点上的污点。
  • Pod的定义中容忍这个污点,如下所示。详细内容请参见污点和容忍
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
      tolerations:
      - key: "key1"
        operator: "Equal"
        value: "value1"
        effect: "NoSchedule" 

排查项六:检查临时卷使用量

检查Pod是否限制了临时卷的大小,如下所示,当应用程序需要使用的量超过节点已有容量时会导致无法调度,修改临时卷限制或扩容节点磁盘可解决此问题。

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  volumes:
    - name: ephemeral
      emptyDir: {}
分享:

工作负载异常所有常见问题

more

close