一、 报错信息
完成k8s单节点部署后,创建了一个pod进行测试,后续该pod出现以下报错:
Warning FailedScheduling 3h7m (x3 over 3h18m) default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..
二、 原因
[root@k8s-master ~]# kubectl describe nodes k8s-master | grep Taints #查看node污点
Taints: node-role.kubernetes.io/control-plane:NoSchedule
提供的污点信息中,可以看到有一个污点被添加到了节点 k8s-master
上,这个污点的键是 node-role.kubernetes.io/control-plane
,它的值是 NoSchedule
。这意味着,Kubernetes调度器将不会将任何新的Pod调度到这个节点上。
这个污点的主要影响有以下几点:
防止新Pod调度到该节点:由于这个节点被标记(tainted)为控制平面节点,不应该在其上调度新的Pod,以防止与现有控制平面组件发生冲突。不影响现有Pod的运行:已经在这个节点上运行的Pod不会受到这个污点的影响,它们将继续在该节点上运行。在单节点环境中,将节点标记为控制平面节点是有利的,因为这样可以确保该节点只用于运行控制平面组件(如API服务器、控制器管理器、Scheduler等),从而确保单节点环境的基本功能正常。
然而,这种设置也有一些潜在的风险:
单点故障:如果这个节点发生故障,整个集群可能会受到影响,因为没有任何其他节点可以接管控制平面的角色。扩展性限制:由于这个节点被专门用于运行控制平面组件,因此在需要扩展集群容量时可能会受到限制。例如,如果你需要添加更多的工作节点,你可能需要重新配置这个节点,这可能会增加复杂性。因此,在单节点环境中使用这种设置需要谨慎考虑其利弊和潜在风险。在生产环境中,建议使用更复杂的集群设置,例如具有多个节点和多个控制平面组件的集群。
# 解决
[root@k8s-master ~]# kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule-
node/k8s-master untainted
[root@k8s-master ~]# kubectl describe nodes k8s-master | grep Taints
Taints: <none>
[root@k8s-master ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default nginx-deployment-7c79c4bf97-v8w8d 1/1 Running 0 3h21m
#pod状态变为Running ,报错解决完成