K8S集群运维过程中可能会有维护Node节点的需求,例如Node操作系统软件存在漏洞,需要对系统进行更新和维护。这里我们以K8S集群节点的操作系统进行更新操作为例。
Kubernetes
中的三个命令:cordon
、drain
以及delete
都可以实现 node 的停止调度,也就是后面再创建的 pod 不会继续被调度到该节点上,他们之间最大的区别是暴力程度不一样。
命令格式:
kubectl cordon [node name]
- 临时将节点从Kubernets集群隔离
- 影响最小,只会将node节点标识为
SchedulingDisabled
,也就是禁止调度- 后面创建的Pod,将不会调度到这个节点
- 原来节点运行的Pod不受影响,继续对外服务
首先将节点标记为不可调度,避免新的Pod在此节点创建和运行
kubectl cordon k8s-node2
查看节点状态:
root@k8s-master:~# kubectl get node k8s-node2
NAME STATUS ROLES AGE VERSION
k8s-node2 Ready,SchedulingDisabled <none> 5d v1.28.2
可以看到 k8s-node2为 SchedulingDisabled 表示不可调度。新创建的pod不会调度到这个k8s-node2节点上,原来在k8s-node2的pod依然正常运行。
由于k8s-node2节点上还运行Pod,这样是不能直接对节点上的进行关机升级操作的,需要把这些pod驱逐到其他的节点上。
kubectl drain k8s-node2 --delete-local-data --ignore-daemonsets --force
这里有3个参数:
--ignore-daemonsets
, 忽略DaemonSet 管理的 Pod(避免删除,创建这样的死循环)。--delete-local-data
,使用 emptyDir 数据卷的 Pod 也要删除。--force
,不是由 ReplicationController 、ReplicaSet 、Job 、DaemonSet 、StatefulSet 管理的Pod(没有绑定任何控制器)也要删除。
等完全把k8s-node2上的Pod驱逐完,就可以对该节点进行软件的升级或硬件的升级。
apt update && apt upgrade
。节点维护结束后,回复可调度状态
kubectl uncordon k8s-node2
root@k8s-master:~# kubectl uncordon k8s-node2
node/k8s-node2 uncordoned
root@k8s-master:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 6d19h v1.28.2
k8s-node1 Ready <none> 6d19h v1.28.2
k8s-node2 Ready <none> 5d1h v1.28.2
不建议使用kubectl delete node [node name]
,Node 节点删除,Master 将会失去对其的控制,该节点从集群去除,delete 是一种非常暴力的删除节点方式,驱逐时都是强制干掉容器的进程,并没有做到优雅终止 Pod,相比较而言,drain 相对比较安全。
切换 k8s 集群环境:
kubectl config use-context ek8s
Task
将 ek8s-node-1 节点设置为不可用,然后重新调度该节点上的所有 Pod。
kubectl config use-context ek8s
kubectl cordon ek8s-node-1
kubectl drain cka-node1 --delete-local-data --ignore-daemonsets --force