k8s命令對node調度 cordon,drain,delete 區別

此三個命令都會使node停止被調度,後期創建的pod不會繼續被調度到該節點上,但操作的暴力程度不一

cordon 停止調度
影響最小,只會將node調爲SchedulingDisabled
之後再發創建pod,不會被調度到該節點
舊有的pod不會受到影響,仍正常對外提供服務

恢復調度
kubectl uncordon node_name
================================================
drain 驅逐節點
首先,驅逐node上的pod,其他節點重新創建
接着,將節點調爲** SchedulingDisabled**

恢復調度
kubectl uncordon node_name


對節點執行維護操作之前(例如:內核升級,硬件維護等),您可以使用 kubectl drain 安全驅逐節點上面所有的 pod。
安全驅逐的方式將會允許 pod 裏面的容器遵循指定的 PodDisruptionBudgets 執行優雅的中止。
注: 默認情況下,kubectl drain 會忽略那些不能殺死的系統類型的 pod,如果您想了解更多詳細的內容,請參考kubectl drain

kubectl drain 返回成功表明所有的 pod (除了前面排除的那些)已經被安全驅逐(遵循期望優雅的中止期,並且沒有違反任何應用程序級別的中斷預算)。
然後,通過對物理機斷電或者在雲平臺上刪除節點所在的虛擬機,都能安全的將節點移除。

# 確定要排空的節點的名稱
kubectl get nodes 
# 查看獲取pod名字
kubectl get po 
# 命令node節點開始釋放所有pod,並且不接收新的pod進程
kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data 
# 這時候把需要做的事情做一下。比如上面說的更改docker文件daemon.json或者說node節點故障需要進行的處理操作 
# 然後恢復node,恢復接收新的pod進程
kubectl uncordon [node-name]

================================================
delete 刪除節點
首先,驅逐node上的pod,其他節點重新創建
然後,從master節點刪除該node,master對其不可見,失去對其控制,master不可對其恢復

恢復調度,需進入node節點,重啓kubelet
基於node的自注冊功能,節點重新恢復使用
systemctl restart kubelet

delete是一個比較粗暴的命令,它會將被刪node上的pod直接驅逐,由其他node創建(針對replicaset),然後將被刪節點從master管理範圍內移除,master對其失去管理控制,若想使node重歸麾下,必須在node節點重啓kubelet

================================================
drain的參數
--force
當一些pod不是經 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的時候
就需要用--force來強制執行 (例如:kube-proxy)
 
--ignore-daemonsets
無視DaemonSet管理下的Pod
 
--delete-local-data
如果有mount local volumn的pod,會強制殺掉該pod並把料清除掉
另外如果跟本身的配置訊息有衝突時,drain就不會執行

================================================

[root@ouou-210 ~]# kubectl drain ouou-212
node/ouou-212 already cordoned
error: unable to drain node "ouou-212", aborting command...

There are pending nodes to be drained:
 ouou-212
cannot delete Pods with local storage (use --delete-local-data to override): default/nginx-deployment-test-557d8b6448-bmgl5, default/nginx-deployment-test-557d8b6448-ggd8d, default/nginx-deployment-test-557d8b6448-h675g, default/nginx-deployment-test-557d8b6448-lhqzz, default/nginx-deployment-test-557d8b6448-s94d4
cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/kube-flannel-ds-amd64-djgjx, kube-system/kube-proxy-qj5wn
[root@ouou-210 ~]# kubectl drain ouou-212 --delete-local-data --ignore-daemonsets

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章