开发手册 欢迎您!
软件开发者资料库

Kubernetes(K8s) kubectl cordon, drain, uncordon 常用命令

Kubernetes(K8s)中使用Kubectl 命令行工具管理 Kubernetes 集群。 kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。 可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。本文主要介绍Kubernetes(K8s)中kubectl cordon, drain, uncordon 常用命令。

1、Kubectl语法

kubectl cordon NODEkubectl drain NODEkubectl uncordon NODE

cordon, drain, uncordon:命令是正式release的1.2新加入的命令,三个命令需要配合使用可以实现节点的维护。

在1.2之前,由于没有相应的命令支持,如果要维护一个节点,只能stop该节点上的kubelet将该节点退出集群,是集群不在将新的pod调度到该节点上。如果该节点上本身就没有pod在运行,则不会对业务有任何影响。如果该节点上有pod正在运行,kubelet停止后,master会发现该节点不可达,而将该节点标记为notReady状态,不会将新的节点调度到该节点上。同时,会在其他节点上创建新的pod替换该节点上的pod。

如此虽能够保证集群的健壮性,但可能还有点问题,如果业务只有一个副本,而且该副本正好运行在被维护节点上的话,可能仍然会造成业务的短暂中断。

1.2中新加入的这3个命令可以保证维护节点时,平滑的将被维护节点上的业务迁移到其他节点上,保证业务不受影响。

如下是整个的节点维护的流程:

1)首先查看当前集群所有节点状态,例如共有四个节点都处于ready状态;

2)查看当前nginx两个副本分别运行在d-node1和k-node2两个节点上;

3)使用cordon命令将d-node1标记为不可调度;

4)再使用kubectl get nodes查看节点状态,发现d-node1虽然还处于Ready状态,但是同时还能被禁调度,代表新的pod将不会被调度到d-node1上。

5)再查看nginx状态,没有任何变化,两个副本仍运行在d-node1和k-node2上;

6)执行drain命令,将运行在d-node1上运行的pod平滑的赶到其他节点上;

7)再查看nginx的状态发现,d-node1上的副本已经被迁移到k-node1上;此时就可以对d-node1进行一些节点维护的操作,如升级内核,升级Docker等;

8)节点维护完后,使用uncordon命令解锁d-node1,使其重新变得可调度;

9)检查节点状态,发现d-node1重新变回Ready状态。

2、kubectl命令中的简写

kubectl命令中可以使用的缩写,具体如下:

certificatesigningrequests (缩写 csr)componentstatuses (缩写 cs)configmaps (缩写 cm)customresourcedefinition (缩写 crd)daemonsets (缩写 ds)deployments (缩写 deploy)endpoints (缩写 ep)events (缩写 ev)horizontalpodautocordon, drain, uncordonrs (缩写 hpa)ingresses (缩写 ing)limitranges (缩写 limits)namespaces (缩写 ns)networkpolicies (缩写 netpol)nodes (缩写 no)persistentvolumeclaims (缩写 pvc)persistentvolumes (缩写 pv)poddisruptionbudgets (缩写 pdb)pods (缩写 po)podsecuritypolicies (缩写 psp)replicasets (缩写 rs)replicationcontrollers (缩写 rc)resourcequotas (缩写 quota)serviceaccounts (缩写 sa)services (缩写 svc)statefulsets (缩写 sts)storageclasses (缩写 sc)

3、kubectl cordon, drain, uncordon 命令

1)将foo节点标记为不可调度

kubectl cordon foo

2)安全驱逐foo节点上面所有的 pod

kubectl drain foo

3)将节点foo标记为可调度的状态

kubectl uncordon foo