记录一次真实的维护过程
k8s节点维护过程记录
背景:因某些原因,在博客中不好阐述!因此,在下面简单的说一下维护节点的过程及经历,那废话不多说,直接上操作过程!
整体思路:
- 把维护的节点标记为
不可调度
- 驱逐节点上
已经运行的pod
- 节点重启操作(维护的具体行为)
- 恢复至初始状态
说明:我这里分两种方式演示:第一种适合没有维护过节点的新手人员(比如我,哈哈小白种子一号选手) 第二种在熟练了之后可以直接拿来操作,省时省力。
方式一
- 先标记节点进入维护状态,这一步会自动给节点打上
taint
kubectl cordon node1
# 通过如下命令查看该节点是否有taint
kubectl describe node node1
# 此时node的taint显示:
Taints: node.kubernetes.io/unschedulable:NoSchedule
# 通过如下命令查看是否标记成功
kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready etcd,master 112d v1.15.1
node1 Ready,SchedulingDisabled worker 112d v1.15.1
node2 Ready worker 112d v1.15.1
- 驱逐该节点上的pod
kubectl taint node node1 key=node1:NoExecute
# 通过如下命令查看该节点是否有taint
kubectl describe node node1
此时node的taint显示:
Taints: key=node1:NoExecute
node.kubernetes.io/unschedulable:NoSchedule
接下来去node节点使用docker ps 查看pod是否都被驱逐走了 剩下的都是ds控制器的了 就不用管了 后面会详细说明
- 进行重启操作(这里指的是对节点维护的具体内容)
- 在master节点上会看到该节点处于
NotReady
状态
- 重启动完成后,
NotReady
状态会自动变成Ready
状态
至此维护已完成。取消标记节该点维护状态
kubectl uncordon node1
通过describe查看发现该node节点taint如下:
Taints: key=node1:NoExecute
只剩下刚才标记驱逐的字样(通过event事件查看如下:kubelet, node1 Node node1 status is now: NodeSchedulable)说明节点可以被调度 只不过现在有一个taint在node上
- 取消node上的taint
kubectl taint node node1 key-
通过describe查看发现该node节点taint如下:
Taints: <none>
方式二
kubectl drain node1 --delete-local-data --ignore-daemonsets
reboot
kubectl uncordon node1
讲解:drain
的意思是驱逐pod
并标记节点进入维护状态
简单的说, drain = NoExecute + cordon
--delete-local-data 的意思是:即使存在使用emptyDir的Pod(节点耗尽后将删除的本地数据)也要继续。
--ignore-daemonsets 的意思是:忽略daemonsets控制器
关于ds控制器讲解:ds
控制器的特性是在每一个节点上面去运行一个pod
,ds
控制器所运行的pod
,驱逐也驱逐不走,也不受cordon
的控制,只能中断,后面重启后,它会自己启动。
关于驱逐讲解:
NoSchedule
:新的pod不许调度过来 已经运行的依旧在该节点上运行
NoExecute
:新的pod不许调度过来 已经运行的pod也驱逐走
PreferNoSchedule
:尽量不要调度
参考文章:
http://kubernetes.kansea.com/docs/user-guide/kubectl/kubectl_cordon/
http://kubernetes.kansea.com/docs/user-guide/kubectl/kubectl_drain/