1. 程式人生 > >Kubernetes1.6新特性:POD高階排程-汙點和容忍特性/報告節點問題特性

Kubernetes1.6新特性:POD高階排程-汙點和容忍特性/報告節點問題特性

(一)  核心概念

Pod是kubernetes中的核心概念,kubernetes對於Pod的管理也就是對Pod生命週期的管理以及對Pod進行排程管理。

Kubernetes早期版本使用系統預設排程器來對Pod進行統一排程管理,在1.2版本中增加了多個排程器特性,多個排程器可以並行排程不同的Pod,並且可以允許使用者自己定義新的排程器並以外掛的方式供kubernetes使用。

在1.6版本中對POD排程進行了增強,這裡稱之為“高階排程”,涉及到多個排程器配置變化、節點親和性/反親和性特性、Pod親和性/反親和性特性、汙點和容忍特性、報告節點問題特性。

在1.6版本這些“高階排程”特性中,多個排程器配置變化、節點親和性/反親和性特性、Pod親和性/反親和性特性、汙點和容忍特性,這四個特性屬於β特性,可以報告節點問題特性屬於α特性,所以大家在使用的時候應該注意。

(二)  汙點和容忍特性(Taints and tolerations)和報告節點問題特性介紹

我們先來看看1.6版本中Pod相關的幾個核心結構體:


在1.6版本中,PodSpec結構體中新增了四個屬性,分別是AutomountServiceAccountToken、Affinity、SchedulerName、Tolerations。其中Affinity屬性對應結構體Affinity,負責節點親和性/反親和性特性和Pod親和性/反親和性特性;Tolerations屬性對應結構體Toleration,負責汙點和容忍特性以及可以給每個Pod單獨配置逃離行為特性;SchedulerName屬性就是這篇文章要介紹的多個排程器配置變化。其中結構體Affinity和結構體Toleration在1.5版本中已經存在了,但是並不是通過PodSpec結構體中Affinity和Tolerations兩個屬性進行關聯的。

1、汙點和容忍特性介紹

我們先來看看1.5版本中,是如何配置汙點和容忍特性的:

annotations:

  scheduler.alpha.kubernetes.io/tolerations:……

我們在看看現在1.6版本中,是如何配置節點親和性/反親和性的:

spec:

  tolerations:……

通過上面兩個例子可以看出來,多個排程器這個特性從α版本變成β版本後,由原先使用annotations方式定義Pod變成了直接在spec中定義Pod。

節點親和性的作用是讓Pod部署在相關聯的節點上,但是汙點(Taints)的含義是相反的,汙點(Taints)用來讓節點不滿足Pod要求。

汙點和容忍(Taints and tolerations)在一起工作,目的是確保Pod不會被排程到不正確的節點上。通過給節點設定汙點,可以標識出這些節點不接受任何Pod,這些Pod不能容忍任何汙點。也可以通過給Pod設定容忍,讓這些Pod部署到能夠容忍汙點的節點上。

2、報告節點問題特性介紹

在1.6中新增加了一個α特性,當把引數TaintBasedEvictions設定成true的時候,表示啟動這個α特性。當啟動了這個α特性後,汙點會被自動增加到所有節點上,同時普通的Pod逃離邏輯會被設定成失效狀態。目前這個α特性只支援node unreachable和node not ready兩種節點問題。

對於1.6中Toleration結構體:


可以看到在1.6版本中新增加了一個屬性TolerationSeconds,通過這個屬性並且結合上述α特性,就可以給每個Pod單獨配置逃離行為。

下面的例子展示了系統要進行一段時間網路維護,在網路維護時間100分鐘內,不允許Pod進行逃離。

tolerations:

- key:"node.alpha.kubernetes.io/unreachable"

 operator: "Exists"

 effect: "NoExecute"

 tolerationSeconds: 6000

(三)  汙點和容忍使用示例

1、給節點配置汙點:

kubectl taint nodes node1key=value:NoSchedule

上面的例子給節點node1配置了一個汙點,汙點有一個key,對應的值是value,這個汙點作用於NoSchedule。這表示沒有Pod會被排程到node1節點上,除非Pod配置了容忍,而且這些容忍的配置同node1上汙點配置相匹配。

下面配置的Pod可以被排程到node1節點上:

tolerations:

- key: "key"

 operator: "Equal"

 value: "value"

 effect: "NoSchedule"

下面是通過另一種方式配置的Pod,也可以被排程到node1節點上:

tolerations:

- key: "key"

 operator: "Exists"

  effect:"NoSchedule"

對於torelations配置,如果不設定operator具體的取值,那麼系統預設設定成“Equal”。

2、下面是兩種特殊的配置方法:

tolerations:

- operator: "Exists"

這個配置表示匹配所有的key、value和effect,也就是意味著Pod可以容忍任何汙點。

tolerations:

- key: "key"

 operator: "Exists"

這個配置表示Pod匹配所有effect。

3、effect的取值

effect的取值包括NoSchedule、PreferNoSchedule和NoExecute三個值。其中每個取值的含義如下:

1)       NoSchedule:除非Pod配置了容忍,否則不允許Pod被排程到節點上。需要注意的是:kubernetes允許通過Kubelet命令繞過排程器,直接在這些節點上啟動Pod,即使這些Pod沒有配置容忍。Kubernetes允許已經執行的Pod繼續執行,及時這些Pod不滿足容忍條件。

2)       PreferNoSchedule:這個配置相比NoSchedule來說,在功能作用上是一樣的,只不過不是強制執行的,只是參考執行。

3)       NoExecute:對已經執行的Pod,當這些Pod不容忍節點上的汙點時,強制逃離到其他滿足容忍條件的節點上。如果配置了NoExecute,那麼可以選擇是否配置tolerationSeconds引數。也就是說Pod會在tolerationSeconds時間過後進行逃離。