k8s不可调度

如果节点设置为不可调度(unschedulable),将阻止新 Pod 调度到该 Node 之上, 在主机发生故障的时候。设置不可调度是避免其他pod调度到主机失败的一种手段。设置不可调度的方案有两种形式。cordon 和 drain两种方式。那么我们来谈谈这两种方式的区别是什么?

  • 语法结构
kubectl cordon   node1 #设置不可调度
kubectl uncordon node1 #恢复可调度
kubectl drain node1 --force --ignore-daemonsets #设置不可调度
  • cordon 和 drain的区别
cordon:不可调度,临时从K8S集群隔离,不会对节点上的pod有任何影响。官方提示:(被 DaemonSet 控
制器创建的 Pod 能够容忍节点的不可调度属性。 DaemonSet 通常提供节点本地的服务,即使节点上的负载
应用已经被腾空, 这些服务也仍需运行在节点之上。)

drain:“kubectl drain  主机ip --force --ignore-daemonsets”后台强制剔除问题主机上所有pod,
并置不可调度。

参数解释:
--force 当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 
StatefulSet 管理的时候就需要用--force来强制执行 (例如:kube-proxy)
--ignore-daemonsets 无视DaemonSet管理下的Pod。即--ignore-daemonsets往往需要指定的,这是
因为deamonset会忽略unschedulable标签(使用kubectl drain时会自动给节点打上不可调度标签),
因此deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,这样就会成为死循环.因此
这里忽略daemonset。
--delete-local-data 如果有mount local volumn的pod,会强制杀掉该pod。
  • uncordon 设置可调度
节点维修完后,使用uncordon命令节点重新变得可调度;
检查节点状态,节点就会重新变回Ready状态。

主机故障的情况下,比如宕机、CPU高、内存oom、磁盘过高、连接数高等因素。都有可能影响到节点无法拉起、
生产中我们一定要注意对资源的设定。生产中也可能会出现主机存在孤儿pod、执行了命令依然不能就绪状态
也要考虑到docker、kubelet的状态以及日志查询。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐