Kubernetes的汙點和容忍(上篇)

程式設計一生發表於2019-03-19

背景

搭建了一個k8s(Kubernetes)的事件監聽服務,監聽事件之後對資料做處理。有天報了一個問題經調查是新版本的k8s叢集新增會把unschedule等資訊通過汙點的方式反映。而這些汙點是隻有key沒有value的。我的服務中只對value不會空的進行了處理就不對了。

發現這個問題,我跟leader解釋了一下。解釋的時候我就把k8s官方文件https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ 拿出來。但是我當時只能給leader指一下是哪一行。現場翻譯不能優雅的表達出來。

靜兒是翻譯出身的,很慚愧啊。所以今天把這篇文章筆譯一下,也順便加深一下理解。為避免篇幅過長,分成兩篇。上篇是概念,下篇是使用場景。

 

譯文

node(宿主機)的affinity,是pod(容器)用來關聯到一組node的屬性(不管是作為preference還是強需求)。汙點是相反的,他們允許一個node排斥一組pod。

汙點和容忍一起協作來確保pod不被排程到不合適的node上。一個或者多個汙點如果被應用於一個node,這個標誌著這個node不應該接收任何不容忍這個汙點的pod。

容忍被應用於pod,允許這個pod被排程到相對應的汙點上。

概念

新增一個汙點到一個node上,使用kubectl taint。例如:


在一個node上打上汙點node1。汙點有key「key」,value「value」,汙點effect「NoSchedule」。這意味著除非有相應的容忍,沒有pod能夠排程到node1上。想刪除這個汙點,可以執行下面的命令

在PodSpec可以指定一個容忍到一個pod上。下面的兩個容忍都能匹配上面node上的汙點,因此帶有下面任意一個容忍的pod都能排程到node1上。


一個匹配汙點容忍的條件是:key相同、effect相同,並且滿足 operator 是Exists(這時候不應該指定value)或者operator是Equal並且value相同。

注意:有兩種特殊的場景

1.一個空的key,operator是Exists 匹配所有的key、value、effect。就是說容忍任何汙點

2. 一個空的effect 匹配所有的key為「key」的effect

上面的例子使用了effect=NoSchedule。也可以使用effect=PreferNoSchedule。這是一個preference或者soft版本的NoSchedule。系統會盡量避免將沒有容忍的pod排程到這臺node上,但是不是必須的。還有第三種effect叫NoExcute,一會兒講。

一個node可以有多個汙點,一個pod可以有多個node。k8s執行多個汙點和容忍方法類似於過濾器:從node的所有汙點開始,忽略pod所帶的相應容忍,剩餘不能被忽略的汙點顯式的作用到pod上。

注意:

  • 如果至少有一個不能被忽略的汙點帶有effect=NoSchedule,k8s就不會排程pod到這臺node上。

  • 如果沒有不能被忽略的汙點帶有effect=NoSchedule,但是至少有一個不能被忽略的汙點帶有effect=PreferNoShedule,這時候k8s會努力不要排程這個pod到這個node上。

  • 如果至少有一個不能被忽略的汙點effect=NoExecute,這個已經在node上執行的pod會被從node上驅逐掉。沒有執行在node的pod不能被排程到這個node上。

舉個例子:如果一個node被打了下面的汙點


一個pod有兩個容忍。

 

在這種場景下,pod就不能被排程到這個node上。因為沒有容忍能夠匹配第三個汙點。但是新增這個汙點的時候,如果pod已經在這個node上執行了,這個pod不會被踢掉,仍然可以繼續執行。因為第三個汙點是這個pod唯一沒有容忍的汙點。

正常情況下,如果一個汙點帶有effect=NoExecute被新增到了這個node。那麼不能容忍這個汙點的所有pod就會立即被踢掉。而帶有容忍標籤的pod就不會踢掉。然而,一個帶有effect=Noexecute的容忍可以指定一個tolerationSeconds來指定當這個汙點被新增的時候在多長時間內不被踢掉。例如:

意思是如果這個pod已經在有一個對應的汙點上跑了。這個pod可以一直跑3600s後再被踢掉。如果這時候node的汙點被移除了,這個pod就不會被踢掉。

 

總結

感悟

最近靜兒釋出程式碼的質量越來越高。在工作中也有了更大的靈活性。發現一個特別舒服的現象:我們leader從來路過我的工位不看我在幹什麼。這是基於一種信任:能進美團基礎架構部的,都是有技術追求和職業素養的。另外也是基於一種理念和文化:活兒幹好了管你在幹什麼呢。

技術人員沒有上班時間和下班時間,有空就多為工作思考。

相關閱讀

《兩地書》--K8s基礎知識

Kubernetes的汙點和容忍(上篇)

Kubernetes的汙點和容忍(下篇)

作者是一個有美國矽谷、日本東京工作經驗,十二年堅持一線寫程式碼的程式媛。堅持原創文章。歡迎技術交流!

 

相關文章