什么是Admission Controllers(准入控制器)
Admission Controllers(准入控制器)
拦截对 k8s API
的请求, 拦截时刻点是在请求被认证和授权之后.
Admission Controllers(准入控制器)
有很多, 被编译到了 kube-apiserver二进制程序
中, 且只能被集群管理员配置.
Admission Controllers(准入控制器)
中有两个特殊的 controllers
, 没错, 就是 MutatingAdmissionWebhook
和 ValidatingAdmissionWebhook
.
Admission Controllers(准入控制器)
可以执行 validating
或 mutating
或二者都执行.
Admission Controllers(准入控制器)
对 create
、 delete
、 modify
、 connect to(proxy)
请求有效, 对 read
请求无效
Admission Controllers(准入控制器)
控制过程分2个阶段, 第一个阶段为 mutating
, 然后是SchemaValidation(这步不是 Admission Controllers(准入控制器)
的工作), 然后是 validating
. 再次提醒, 有些 Admission Controllers(准入控制器)
是即执行 validating
也执行 mutating
的
有时, 执行 mutating
的控制器会有 "side effects" , 例如 增加quota就是个典型的例子. 这种 "side effects" 需要相应的 reclamation or reconciliation process(回收或调谐过程)
, 因为控制器不知道请求是否会通过后续的控制器
通过后面的介绍, 我们会看到 Admission Controllers(准入控制器)
不只是 MutatingAdmissionWebhook
和 ValidatingAdmissionWebhook
, 除了这两个最常见的控制器, 还有许多其他控制器
例如 LimitRanger
, 为什么我们创建的 LimitRange
对象能生效, 就是因为这个控制器
例如 ResourceQuota
, 为什么我们创建的 ResourceQuota
对象能生效, 就是因为这个控制器
例如 NamespaceAutoProvision
, 为什么我们创建的对象所在的 namespace 不存在会自动被创建, 就是因为这个控制器
例如 NamespaceExists
, 为什么我们创建的对象所在的 namespace 不存在, 请求会被拒绝, 就是因为这个控制器
例如 DefaultStorageClass
, 为什么我们创建的 PVC
会触发自动创建 StorageClass
, 就是因为这个控制器
如何开启/关闭Admission Controllers(准入控制器)
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(准入控制器)做了些什么
不同的 Admission Controllers(准入控制器)
执行的功能不一样, 这里只介绍一些常见的
DefaultStorageClass
该控制器会 observe
PVC
的创建请求, 如果 PVC
没有指定特定的 storage class
, 该控制器会自动增加为其增加一个 default storage class
LimitRanger
该控制器会 observe
请求并确保它没有违背 Namespace
中的 LimitRange对象
枚举的任何约束.
该控制器还可以用于将应用默认的 resource requests
到 Pod(如果Pod没有指定 resource requests
). 当前的默认值为 0.1 CPU
MutatingAdmissionWebhook
该控制器 依次调用 匹配请求的 MutatingWebhookConfiguration
该控制器只工作于 mutating 阶段
如果你禁用了该控制器, 你需要同时禁用 apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration
(通过 --runtime-config
参数)
ValidatingAdmissionWebhook
该控制器 并行调用 匹配请求的 ValidatingWebhookConfiguration
该控制器只工作于 validating 阶段
如果你禁用了该控制器, 你需要同时禁用 apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration
(通过 --runtime-config
参数)