cordon、drain和delete三个命令都会使node停止被调度,后期创建的pod不会继续被调度到该节点上,但操作的暴力程度却不一样。
一、cordon 停止调度(不可调度,临时从K8S集群隔离)
二、drain 驱逐节点(先不可调度,然后排干)
需要注意:
一般线上K8S的PDB(PodDisruptionBudgets)配置的也是符合Pod驱逐的理想情况的,即maxUnavailable设置为0,maxSurge设置为1:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
默认情况下,kubectl drain 会忽略那些不能杀死的系统类型的 pod。drain命令中需要添加三个参数:--force、--ignore-daemonsets、--delete-local-data
drain禁止调度的操作步骤:
确定要排空的节点的名称
# kubectl get nodes
查看pod
# kubectl get po
命令node节点开始释放所有pod,并且不接收新的pod进程
# kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data
此时可以对该node节点进行平滑维护,后续需要恢复到k8s集群中:
# kubectl uncordon [node-name]
三、delete 删除节点
恢复调度(即重新加入到K8S集群中)
k8s-vm02节点重启后,系统时间变了,跟其他node节点系统时间不一致,导致该节点的集群证书失效!
[root@k8s-vm01 ingress]# kubectl exec -ti test-finhub-app-56df548879-ghlb2 -n wiseco -- /bin/bash
Error from server: error dialing backend: x509: certificate is valid for k8s-vm01, not k8s-vm02
[root@k8s-vm01 ingress]# kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-7zt2w 50m system:node:k8s-vm02 Pending
csr-8sw6k 36m system:node:k8s-vm02 Pending
csr-9jv7z 21m system:node:k8s-vm02 Pending
需要手动approve签发TLS认证
[root@k8s-vm01 ingress]# kubectl certificate approve csr-7zt2w
[root@k8s-vm01 ingress]# kubectl certificate approve csr-8sw6k
[root@k8s-vm01 ingress]# kubectl certificate approve csr-9jv7z
四、Node节点平滑维护
通常情况下,如果要对K8S集群中的一台Node节点进行平滑维护,如升级或调整配置。正确的操作:
同时注意:为了确保drain驱逐pod的时候,容器应用服务不中断,必须满足: