什么是Admission Controllers(準(zhǔn)入控制器)
Admission Controllers(準(zhǔn)入控制器)
攔截對(duì) k8s API
的請(qǐng)求, 攔截時(shí)刻點(diǎn)是在請(qǐng)求被認(rèn)證和授權(quán)之后.
Admission Controllers(準(zhǔn)入控制器)
有很多, 被編譯到了 kube-apiserver二進(jìn)制程序
中, 且只能被集群管理員配置.
Admission Controllers(準(zhǔn)入控制器)
中有兩個(gè)特殊的 controllers
, 沒(méi)錯(cuò), 就是 MutatingAdmissionWebhook
和 ValidatingAdmissionWebhook
.
Admission Controllers(準(zhǔn)入控制器)
可以執(zhí)行 validating
或 mutating
或二者都執(zhí)行.
Admission Controllers(準(zhǔn)入控制器)
對(duì) create
癞尚、 delete
闸婴、 modify
、 connect to(proxy)
請(qǐng)求有效, 對(duì) read
請(qǐng)求無(wú)效
Admission Controllers(準(zhǔn)入控制器)
控制過(guò)程分2個(gè)階段, 第一個(gè)階段為 mutating
, 然后是SchemaValidation(這步不是 Admission Controllers(準(zhǔn)入控制器)
的工作), 然后是 validating
. 再次提醒, 有些 Admission Controllers(準(zhǔn)入控制器)
是即執(zhí)行 validating
也執(zhí)行 mutating
的
有時(shí), 執(zhí)行 mutating
的控制器會(huì)有 "side effects" , 例如 增加quota就是個(gè)典型的例子. 這種 "side effects" 需要相應(yīng)的 reclamation or reconciliation process(回收或調(diào)諧過(guò)程)
, 因?yàn)榭刂破鞑恢勒?qǐng)求是否會(huì)通過(guò)后續(xù)的控制器
通過(guò)后面的介紹, 我們會(huì)看到 Admission Controllers(準(zhǔn)入控制器)
不只是 MutatingAdmissionWebhook
和 ValidatingAdmissionWebhook
, 除了這兩個(gè)最常見(jiàn)的控制器, 還有許多其他控制器
例如 LimitRanger
, 為什么我們創(chuàng)建的 LimitRange
對(duì)象能生效, 就是因?yàn)檫@個(gè)控制器
例如 ResourceQuota
, 為什么我們創(chuàng)建的 ResourceQuota
對(duì)象能生效, 就是因?yàn)檫@個(gè)控制器
例如 NamespaceAutoProvision
, 為什么我們創(chuàng)建的對(duì)象所在的 namespace 不存在會(huì)自動(dòng)被創(chuàng)建, 就是因?yàn)檫@個(gè)控制器
例如 NamespaceExists
, 為什么我們創(chuàng)建的對(duì)象所在的 namespace 不存在, 請(qǐng)求會(huì)被拒絕, 就是因?yàn)檫@個(gè)控制器
例如 DefaultStorageClass
, 為什么我們創(chuàng)建的 PVC
會(huì)觸發(fā)自動(dòng)創(chuàng)建 StorageClass
, 就是因?yàn)檫@個(gè)控制器
如何開(kāi)啟/關(guān)閉Admission Controllers(準(zhǔn)入控制器)
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...
查看啟用了哪些admission plugins
kube-apiserver -h | grep enable-admission-plugins
# In the current version, the default ones are:
NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota
Admission Controllers(準(zhǔn)入控制器)做了些什么
不同的 Admission Controllers(準(zhǔn)入控制器)
執(zhí)行的功能不一樣, 這里只介紹一些常見(jiàn)的
DefaultStorageClass
該控制器會(huì) observe
PVC
的創(chuàng)建請(qǐng)求, 如果 PVC
沒(méi)有指定特定的 storage class
, 該控制器會(huì)自動(dòng)增加為其增加一個(gè) default storage class
LimitRanger
該控制器會(huì) observe
請(qǐng)求并確保它沒(méi)有違背 Namespace
中的 LimitRange對(duì)象
枚舉的任何約束.
該控制器還可以用于將應(yīng)用默認(rèn)的 resource requests
到 Pod(如果Pod沒(méi)有指定 resource requests
). 當(dāng)前的默認(rèn)值為 0.1 CPU
MutatingAdmissionWebhook
該控制器 依次調(diào)用 匹配請(qǐng)求的 MutatingWebhookConfiguration
該控制器只工作于 mutating 階段
如果你禁用了該控制器, 你需要同時(shí)禁用 apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration
(通過(guò) --runtime-config
參數(shù))
ValidatingAdmissionWebhook
該控制器 并行調(diào)用 匹配請(qǐng)求的 ValidatingWebhookConfiguration
該控制器只工作于 validating 階段
如果你禁用了該控制器, 你需要同時(shí)禁用 apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration
(通過(guò) --runtime-config
參數(shù))