ᕕ( ᐛ )ᕗ Jimyag's Blog

k8s 不允许 pod 调度到某个 node 上

cordon、drain 和 delete 三个命令都会使 node 停止被调度,后期创建的 pod 不会继续被调度到该节点上,但操作的暴力程度却不一样。

cordon 停止调度(不可调度,临时从 K8S 集群隔离)

drain 驱逐节点(先不可调度,然后排干)

需要注意:

一般线上 K8S 的 PDB(PodDisruptionBudgets)配置的也是符合 Pod 驱逐的理想情况的,即 maxUnavailable 设置为 0,maxSurge 设置为 1:

默认情况下,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]

推荐使用姿势

通常情况下,如果要对 K8S 集群中的一台 Node 节点进行平滑维护,如升级或调整配置。正确的操作:

同时注意:为了确保 drain 驱逐 pod 的时候,容器应用服务不中断,必须满足:

#k8s