天天看點

Kubernetes API Server 準入控制

前面說了k8s如何做認證,如何做鑒權,分别判斷你是誰,你有什麼樣的操作權限,你有某個對象的操作權限但是并不代表這個對象是合法的,是以apiserver裡面會有更加深層次的一個行為,它還是需要去校驗你的對象,這個環節叫做準入。

為資源增加自定義屬性

  • 作為多租戶叢集方案中的一環,我們需要在 namespace的準入控制中,擷取使用者資訊,并将使用者資訊更新的namespace的annotation。
  • 隻有當namespace中有有效使用者資訊時,我們才可以在namespace建立時,自動綁定使用者權限,namespace才可用。

準入控制通常有兩種主要的目的,一個是你給了我request,這個request長的這個樣子,是你填的所有的屬性,但是我從平台的一個層面,我希望給它添加一些附加屬性。比如說有些值你沒有指派,我希望給它預設值,或者對其中某些值做調整,那麼需要對原始對象去做變形的,也就是增加自定義屬性。

還有一種方式就是做完變形之後,或者不變形,不管變不變行我都要去校驗你這個對象是否是合法的,包括你自身是不是合法,同時在叢集内部的請求是不是合法的。

準入控制使用場景

一個最常用的場景就是配額管理,為什麼要做配額管理呢?通常一個叢集的管理規模和承受能力是有上線的,叢集的計算資源也是有限的。如果将叢集給出去,不可能讓使用者無休止的建立對象,這個是需要管控的,将資源均分。 

作為多租戶的叢集,希望使用配額來做管控來控制誰能夠使用多少計算資源。

其次etcd裡面有存儲配額,它有自己的存儲上限,那麼就不能讓每個使用者都無休止的建立對象,建立100w,200w個的話,那麼etcd的配額很快就會用完。

Kubernetes API Server 準入控制

超出了配額和認證鑒權沒有關系,是準入控制環節出現了問題。

如果對每個namespace都建立resourcequota,那麼就能夠精确的控制namespace建立多少個對象。這樣就能夠合理的配置設定叢集的資源。

準入控制(Admission Control)在授權後對請求做進一步的驗證或添加預設參數。不同于授權和認證隻關心請求的使用者和操作,準入控制還處理請求的内容,并且僅對建立、更新、删除或連接配接(如代理)等有效,而對讀操作無效。

準入控制支援同時開啟多個插件,它們依次調用,隻有全部插件都通過的請求才可以放過進入系統。

準入插件

Kubernetes API Server 準入控制

AlwaysPullImages:總是拉取最新鏡像,這個準入控制插件自動的更改你的ImagePullPolicy,隻要你的pod一建立就将其改為always。

ImagePolicyWebhook:webhook來決定這個image是不是合法的,這個用于場景通常容器鏡像要去做安全掃描,基于安全軟體來掃描容器鏡像是不是安全的,掃描完之後會出一個結果,這個結果存放在系統裡面說這個鏡像是否安全,ImagePolicyWebhook就是在建立pod的時候來看容器鏡像掃描是不是過了,它的結果通過還是失敗,失敗就攔截下來。

Kubernetes API Server 準入控制

LimitRanger:一個pod我希望去限制你某個namespace pod所申請的最高資源,限制申請資源的上線和下線,以及它的預設值。

當你建立pod的時候就會去校驗你的pod裡面資源指定的情況,然後和LimitRanger對象做個整合,是給你塞一個預設值呢還是已經塞好的資源是不是合法。

可以看到有些插件是enable的,有些插件是disable的

Kubernetes API Server 準入控制

準入控制插件的開發

如果預設的插件沒有辦法滿足我的需求,希望在此基礎之上做額外的配置,我有自定義的邏輯,有沒有什麼樣的擴充方法。 kubernetess認證,鑒權都支援webhook,那麼準入的環節也支援webhook的。

除預設的準入控制插件以外,Kubernetes 預留了準入控制插件的擴充點,使用者可自定義準入控制插件實作自定義準入功能。

準入插件有兩種,如下:

MutatingWebhookConfiguration∶變形插件,支援對準入對象的修改。(給對象的屬性做修改的,它可以修改你的對象)

ValidatingWebhookConfiguration∶校驗插件,隻能對準入對象合法性進行校驗,不能修改。(不修改對象,隻做校驗,)

Kubernetes API Server 準入控制

當一個對象結果認證鑒權之後,到了apiserver這裡,apiserver會去看admission的配置了,這個配置發現有對應的webhook,它就會往webhook發起一個admission review的request,你要去解析這個admission review,将request拿出來。

如果是mutating webhook,你可能要在原始對象基礎上面,它admissionreview基本上就是把整個request都發個你了,比如說是一個pod,那麼你就在pod基礎上面做一些屬性的修改。

修改完之後就要真正的去做校驗,是以mutating會先運作,validating會後運作,會去校驗變形之後的對象是否合法,validating傳回一個是否通過這樣的結果給apiserver,apiserver通過之後将這個請求往下傳遞。

Kubernetes API Server 準入控制

現在k8s支援了MutatingWebHookConfiguration和ValidatingWebHookConfiguration 這兩個對象,在這個對象裡面就可以定義告訴apiserver我要去mutating,正真要去做mutating的時候這個請求應該發送到哪裡去,rules是針對什麼樣的對象什麼操作,比如針對node的create操作去做mutating。

繼續閱讀