kube-controller-manager驅逐主要依靠NodeLifecycleController
以及其中的TaintManager
;
(1)開啟了汙點驅逐:node上有NoExecute
汙點後,立馬驅逐不能容忍汙點的pod,對於能容忍該汙點的pod,則等待pod上設定的汙點容忍時間裡的最小值後,pod會被驅逐;
(2)未開啟汙點驅逐:當node的ready Condition
值為false或unknown且已經持續了一段時間(通過kcm啟動引數--pod-eviction-timeout
設定,預設5分鐘)時,對該node上的pod做驅逐操作;
NodeLifecycleController
主要負責以下工作:
(1)定期檢查node的心跳上報,某個node間隔一定時間都沒有心跳上報時,更新node的ready condition
值為false或unknown,開啟了汙點驅逐的情況下,給該node新增NoExecute
的汙點;
(2)未開啟汙點驅逐時的pod驅逐工作;
(3)根據kcm啟動引數設定,決定是否啟動TaintManager
;
TaintManager
負責pod的汙點驅逐工作,當node上有NoExecute
汙點後,立馬驅逐不能容忍汙點的pod,對於能容忍該汙點的pod,則等待pod上設定的汙點容忍時間裡的最小值後,pod會被驅逐;
(1)--pod-eviction-timeout
:預設值5分鐘,當不開啟汙點驅逐時該引數起效,當node的ready condition值變為false或unknown並持續了5分鐘後,將驅逐該node上的pod;
(2)--enable-taint-manager
:預設值true,代表啟動taintManager
,當已經排程到該node上的pod不能容忍node的 NoExecute
汙點時,由TaintManager
負責驅逐此類pod,若為false即不啟動taintManager
,則根據--pod-eviction-timeout
來做驅逐操作;
(3)--feature-gates=TaintBasedEvictions=xxx
:預設值true,配合--enable-taint-manager
共同作用,兩者均為true,才會開啟汙點驅逐;
(4)--node-monitor-grace-period
:預設值40秒,代表在距離上一次上報心跳時間超過40s後,將該node的conditions值更新為unknown(kubelet通過更新node lease來上報心跳);
(5)--feature-gates=NodeLease=xxx
:預設值true,使用lease物件上報node心跳資訊,替換老的更新node的status的方式,能大大減輕apiserver的負擔;
更多其他設定引數會在後面做原始碼分析時進行分析;
需要設定kcm相關的引數,來開啟kcm汙點驅逐,taint
和toleration
才會發揮作用;
給node設定,打了taint的node節點可能會影響pod的排程和執行;
taint有三種Effect
:
(1)PreferNoSchedule
:不容忍該汙點的pod,排程器kube-scheduler
會盡量避免把pod排程到具有該汙點的節點上,如果不能避免(如其他節點資源不足等),pod也能排程到具有該汙點的節點上,而對於已存在於具有該汙點的節點上的pod不會被驅逐;
(2)NoSchedule
:不容忍該汙點的pod一定不會被排程到具有該汙點的節點上,而對於已存在於具有該汙點的節點上的pod不會被驅逐;
(3)NoExecute
:不容忍該汙點的pod一定不會被排程到具有該汙點的節點上,同時會將已排程到該節點上但不容忍該汙點的node節點上的pod驅逐掉;
給pod設定,設定了Toleration的pod,根據匹配條件可以容忍node的taint;
Toleration
設定的屬性值解析如下:
(1)Key
:匹配node汙點的Key;
(2)Operator
:表示Toleration
中Key與node汙點的Key相同時,其Value與node汙點的Value的關係,預設值Equal
,代表相等,Exists
則代表Toleration
中Key與node汙點的Key相同即可,不用比較其Value值;
(3)Value
:匹配node汙點的Value;
(4)Effect
:匹配node汙點的Effect;
(5)TolerationSeconds
:node汙點容忍時間;
設定範例:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
上述設定表示如果該pod正在執行,同時一個匹配的汙點被新增到其所在的node節點上,那麼該pod還將繼續在節點上執行3600秒,然後會被驅逐(如果在此之前其匹配的node汙點被刪除了,則該pod不會被驅逐);