Kubernets 调度常用的命令-马哥教育

发布时间 2023-06-16 09:05:05作者: beawh

taints 内容包括 key、value、effect:

key 就是配置的键值
value 就是内容
effect 是标记了这个 taints 行为是什么
目前 Kubernetes 里面有三个 taints 行为:

NoSchedule 禁止新的 Pod 调度上来
PreferNoSchedul 尽量不调度到这台

k8s的master节点本身就带有effect类型为NoSchedule的污点,这也是为什么k8s在调度Pod时,不会调度到master节点的原因,具体查看如下:(Kubeadm在安装初始化init的时候给master打上了污点,其余节点是没有该污点的。Master节点主要任务是管理集群的,不应该跑具体的业务应用。所以不允许pod落在master节点)

[root@k8s-master ~]# kubectl describe node k8s-master
Taints: node-role.kubernetes.io/master:NoSchedule
kubectl taint nodes k8s-master node-role.kubernetes.io/master=:NoSchedule

注意⚠️ : 为master设置的这个taint中, node-role.kubernetes.io/masterkeyvalue为空, effectNoSchedule

 

驱逐节点是一种有损操作,驱逐的原理 :
  1. 封锁节点 (设为不可调度,避免新的 Pod 调度上来)。
  2. 将该节点上的 Pod 删除。
  3. ReplicaSet 控制器检测到 Pod 减少,会重新创建一个 Pod,调度到新的节点上。

设置节点不可以调度

[root@k8s-master ~]# kubectl cordon k8s-node1
[root@k8s-master ~]# kubectl describe node k8s-node1
node.kubernetes.io/unschedulable:NoSchedule

设置将节点上pod驱逐

# kubectl drain node2 --force --ignore-daemonsets

kubectl drain操作会将相应节点上的旧Pod删除,并在可调度节点上面起一个对应的Pod。当旧Pod没有被正常删除的情况下,新Pod不会起来。

例如:旧Pod一直处于Terminating状态。

对应的解决方式是通过重启相应节点的kubelet,或者强制删除该Pod。

# 重启发生`Terminating`节点的kubelet
systemctl restart kubelet
# 强制删除`Terminating`状态的Pod
kubectl delete pod <PodName> --namespace=<Namespace> --force --grace-period=0

#节点恢复正常后, 设置节点为可调度

kubectl uncordon k8s-node1