准入控制器(Admission Controller)
准入控制器(Admission Controller)位於 API Server 中,在對象被持久化之前,准入控制器攔截對 API Server 的請求,一般用來做身份驗證和授權。其中包含兩個特殊的控制器:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。分別作為配置的變異和驗證准入控制 webhook。
變更(Mutating)准入控制:修改請求的對象
驗證(Validating)准入控制:驗證請求的對象
准入控制器是在 API Server 的啟動參數重配置的。一個准入控制器可能屬於以上兩者中的一種,也可能兩者都屬於。當請求到達 API Server 的時候首先執行變更准入控制,然后再執行驗證准入控制。
我們在部署 Kubernetes 集群的時候都會默認開啟一系列准入控制器,如果沒有設置這些准入控制器的話可以說你的 Kubernetes 集群就是在裸奔,應該只有集群管理員可以修改集群的准入控制器。
例如我會默認開啟如下的准入控制器。
--admission-control=ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota,MutatingAdmissionWebhook,ValidatingAdmissionWebhook
准入控制器列表
Kubernetes 目前支持的准入控制器有:
- AlwaysPullImages:此准入控制器修改每個 Pod 的時候都強制重新拉取鏡像。
- DefaultStorageClass:此准入控制器觀察創建
PersistentVolumeClaim時不請求任何特定存儲類的對象,並自動向其添加默認存儲類。這樣,用戶就不需要關注特殊存儲類而獲得默認存儲類。 - DefaultTolerationSeconds:此准入控制器將Pod的容忍時間
notready:NoExecute和unreachable:NoExecute默認設置為5分鍾。 - DenyEscalatingExec:此准入控制器將拒絕
exec和附加命令到以允許訪問宿主機的升級了權限運行的pod。 - EventRateLimit (alpha):此准入控制器緩解了 API Server 被事件請求淹沒的問題,限制時間速率。
- ExtendedResourceToleration:此插件有助於創建具有擴展資源的專用節點。
- ImagePolicyWebhook:此准入控制器允許后端判斷鏡像拉取策略,例如配置鏡像倉庫的密鑰。
- Initializers (alpha):Pod初始化的准入控制器,詳情請參考動態准入控制。
- LimitPodHardAntiAffinityTopology:此准入控制器拒絕任何在
requiredDuringSchedulingRequiredDuringExecution的AntiAffinity字段中定義除了kubernetes.io/hostname之外的拓撲關鍵字的 pod 。 - LimitRanger:此准入控制器將確保所有資源請求不會超過 namespace 的
LimitRange。 - MutatingAdmissionWebhook (1.9版本中為beta):該准入控制器調用與請求匹配的任何變更 webhook。匹配的 webhook是串行調用的;如果需要,每個人都可以修改對象。
- NamespaceAutoProvision:此准入控制器檢查命名空間資源上的所有傳入請求,並檢查引用的命名空間是否存在。如果不存在就創建一個命名空間。
- NamespaceExists:此許可控制器檢查除
Namespace其自身之外的命名空間資源上的所有請求。如果請求引用的命名空間不存在,則拒絕該請求。 - NamespaceLifecycle:此准入控制器強制執行正在終止的命令空間中不能創建新對象,並確保
Namespace拒絕不存在的請求。此准入控制器還防止缺失三個系統保留的命名空間default、kube-system、kube-public。 - NodeRestriction:該准入控制器限制了 kubelet 可以修改的
Node和Pod對象。 - OwnerReferencesPermissionEnforcement:此准入控制器保護對
metadata.ownerReferences對象的訪問,以便只有對該對象具有“刪除”權限的用戶才能對其進行更改。 - PodNodeSelector:此准入控制器通過讀取命名空間注釋和全局配置來限制可在命名空間內使用的節點選擇器。
- PodPreset:此准入控制器注入一個pod,其中包含匹配的PodPreset中指定的字段,詳細信息見Pod Preset。
- PodSecurityPolicy:此准入控制器用於創建和修改pod,並根據請求的安全上下文和可用的Pod安全策略確定是否應該允許它。
- PodTolerationRestriction:此准入控制器首先驗證容器的容忍度與其命名空間的容忍度之間是否存在沖突,並在存在沖突時拒絕該容器請求。
- Priority:此控制器使用
priorityClassName字段並填充優先級的整數值。如果未找到優先級,則拒絕Pod。 - ResourceQuota:此准入控制器將觀察傳入請求並確保它不違反命名空間的
ResourceQuota對象中列舉的任何約束。 - SecurityContextDeny:此准入控制器將拒絕任何試圖設置某些升級的SecurityContext字段的pod 。
- ServiceAccount:此准入控制器實現serviceAccounts的自動化。
- 用中的存儲對象保護:該
StorageObjectInUseProtection插件將kubernetes.io/pvc-protection或kubernetes.io/pv-protection終結器添加到新創建的持久卷聲明(PVC)或持久卷(PV)。在用戶刪除PVC或PV的情況下,PVC或PV不會被移除,直到PVC或PV保護控制器從PVC或PV中移除終結器。有關更多詳細信息,請參閱使用中的存儲對象保護。 - ValidatingAdmissionWebhook(1.8版本中為alpha;1.9版本中為beta):該准入控制器調用與請求匹配的任何驗證webhook。匹配的webhooks是並行調用的;如果其中任何一個拒絕請求,則請求失敗。
推薦配置
Kubernetes 1.10+
對於Kubernetes 1.10及更高版本,我們建議使用--enable-admission-plugins標志運行以下一組准入控制器(順序無關緊要)。
注意:
--admission-control在1.10中已棄用並替換為--enable-admission-plugins。
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota
對於Kubernetes 1.9及更早版本,我們建議使用--admission-control標志(順序有關)運行以下一組許可控制器。
Kubernetes 1.9
--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota
值得重申的是,在1.9中,這些發生在變更階段和驗證階段,並且例如ResourceQuota在驗證階段運行,因此是運行的最后一個准入控制器。 MutatingAdmissionWebhook在此列表中出現在它之前,因為它在變更階段運行。
對於早期版本,沒有驗證准入控制器和變更准入控制器的概念,並且准入控制器以指定的確切順序運行。
Kubernetes 1.6 - 1.8
--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds
