问题
kubectl create -f test.yaml 命令创建资源后,pod处于pending状态。
kubectl describe描述如下:
Events:
Type Reason Age From Message
Warning FailedScheduling 60s (x8 over 8m16s) default-scheduler 0/7 nodes are available: 1 node(s) were unschedulable, 6 node(s) didn’t match Pod’s node affinity/selector.
原因
根据 kubectl describe 输出信息,Pod 处于 Pending 原因是调度器无法找到合适的节点来部署Pod。
具体的原因有两个:
- 1 个节点不可调度:意味着一个节点被标记为不可调度(
unschedulable),通常是因为节点已经被标记为cordoned或drained,也可能是主节点(默认是不可调度)。 - 6 个节点不符合 Pod 的节点亲和性/选择器要求:意味着 Pod 的节点亲和性或节点选择器规则不匹配这 6 个节点的标签或其他属性。
解决
检查节点状态
- 查看节点列表:
kubectl get nodes,看看是否有节点被标记为SchedulingDisabled。 - 如果有,可以使用命令使节点可调度:
kubectl uncordon <node-name> - 注意,主节点(master)默认是不可调度的,例如:
[root@k8s-master01]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-01 Ready,SchedulingDisabled master 112d v1.23.8
node-01 Ready node 112d v1.23.8
node-02 Ready node 112d v1.23.8
node-03 Ready node 112d v1.23.8
检查节点亲和性和选择器
-
检查 Pod 的节点亲和性和选择器:
-
查看
test.yaml文件中是否定义了nodeSelector或nodeAffinity。 -
确保这些规则与集群中节点的标签匹配。
-
例如,检查
test.yaml中的以下部分:spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: <label-key> operator: In values: - <label-value> nodeSelector: <label-key>: <label-value>
-
-
检查节点标签:
kubectl get nodes --show-labels,例如:NAME STATUS ROLES LABELS master-01 Ready,SchedulingDisabled master ...,kubernetes.io/role=master node-01 Ready node ...,feature2=web,feature=app,...,kubernetes.io/role=node node-02 Ready node ...,feature2=db,feature=app,...,kubernetes.io/role=node node-03 Ready node ...feature2=edge,feature=app,...,kubernetes.io/role=node -
确保节点标签与 Pod 的
nodeSelector或nodeAffinity匹配。 -
如果
nodeSelector或nodeAffinity不必要,可以暂时移除这些规则以便进行测试。
其他检查
- 资源限制:检查是否有资源限制导致无法调度,比如 CPU 或内存需求超过节点可用资源。
- 调度器策略:确认调度器策略没有限制 Pod 的调度。
- 调度器日志:如果问题依然存在,可以查看 Kubernetes 调度器的日志以获得更多信息。

被折叠的 条评论
为什么被折叠?



