准入控制器参考
本页概述了准入控制器。
它们是什么?
准入控制器是一段代码,它在对象持久化之前但请求经过身份验证和授权之后拦截对 Kubernetes API 服务器的请求。
准入控制器可以是验证、变异或两者兼而有之。变异控制器可以修改与它们准入的请求相关的对象;验证控制器则不能。
准入控制器限制对创建、删除、修改对象的请求。准入控制器还可以阻止自定义动词,例如通过 API 服务器代理连接到 Pod 的请求。准入控制器不会(也不能)阻止对读取(get、watch 或 list)对象的请求。
Kubernetes 1.31 中的准入控制器包括以下列表,被编译到 kube-apiserver
二进制文件中,并且只能由集群管理员配置。在该列表中,有两个特殊的控制器:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。它们分别执行在 API 中配置的准入控制 Webhook。
准入控制阶段
准入控制过程分两个阶段进行。在第一个阶段,运行变异准入控制器。在第二个阶段,运行验证准入控制器。再次注意,其中一些控制器是同时进行的。
如果任一阶段的任何控制器拒绝请求,则整个请求将立即被拒绝,并向最终用户返回错误。
最后,除了有时会变异所讨论的对象外,准入控制器有时还会产生副作用,即在请求处理过程中变异相关资源。增加配额使用量是这种做法的典型例子。任何此类副作用都需要相应的回收或协调过程,因为给定的准入控制器无法确定给定请求是否能通过所有其他准入控制器。
为什么我需要它们?
Kubernetes 的一些重要功能需要启用准入控制器才能正确支持该功能。因此,没有正确配置了正确准入控制器的 Kubernetes API 服务器是不完整的服务器,将不支持您期望的所有功能。
如何启用准入控制器?
Kubernetes API 服务器标志 enable-admission-plugins
接受一个逗号分隔的准入控制插件列表,这些插件将在修改集群中的对象之前调用。例如,以下命令行启用了 NamespaceLifecycle
和 LimitRanger
准入控制插件
kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
注意
根据 Kubernetes 集群的部署方式以及 API 服务器的启动方式,您可能需要以不同的方式应用设置。例如,如果 API 服务器作为 systemd 服务部署,您可能需要修改 systemd 单元文件,如果 Kubernetes 以自托管方式部署,您可能需要修改 API 服务器的清单文件。如何禁用准入控制器?
Kubernetes API 服务器标志 disable-admission-plugins
接受一个逗号分隔的准入控制插件列表,这些插件将被禁用,即使它们在默认启用的插件列表中。
kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...
哪些插件默认启用?
要查看启用了哪些准入插件
kube-apiserver -h | grep enable-admission-plugins
在 Kubernetes 1.31 中,默认的插件为
CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, LimitRanger, MutatingAdmissionWebhook, NamespaceLifecycle, PersistentVolumeClaimResize, PodSecurity, Priority, ResourceQuota, RuntimeClass, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionPolicy, ValidatingAdmissionWebhook
注意
ValidatingAdmissionPolicy
准入插件默认启用,但仅在您启用 ValidatingAdmissionPolicy
功能网关 和 admissionregistration.k8s.io/v1alpha1
API 时才处于活动状态。每个准入控制器的作用是什么?
AlwaysAdmit
Kubernetes v1.13 [已弃用]
类型:验证。
此准入控制器允许所有 Pod 进入集群。它已弃用,因为它的行为与根本没有准入控制器相同。
AlwaysDeny
Kubernetes v1.13 [已弃用]
类型:验证。
拒绝所有请求。AlwaysDeny 已弃用,因为它没有实际意义。
AlwaysPullImages
类型:变异和验证。
此准入控制器修改每个新的 Pod 以强制图像拉取策略为 Always
。这在多租户集群中很有用,这样用户可以确保他们的私有图像只能被具有拉取这些图像凭据的人使用。如果没有此准入控制器,一旦图像被拉取到节点,任何用户的任何 Pod 都可以通过知道图像的名称来使用它(假设 Pod 被调度到正确的节点),而无需对图像进行任何授权检查。启用此准入控制器后,将在启动容器之前始终拉取图像,这意味着需要有效的凭据。
CertificateApproval
类型:验证。
此准入控制器观察批准 CertificateSigningRequest 资源的请求,并执行额外的授权检查以确保批准用户有权批准对 CertificateSigningRequest 资源上请求的 spec.signerName
的证书请求。
有关执行 CertificateSigningRequest 资源的不同操作所需的权限的更多信息,请参阅证书签名请求。
CertificateSigning
类型:验证。
此准入控制器观察对 CertificateSigningRequest 资源的 status.certificate
字段的更新,并执行额外的授权检查以确保签名用户有权签名对 CertificateSigningRequest 资源上请求的 spec.signerName
的证书请求。
有关执行 CertificateSigningRequest 资源的不同操作所需的权限的更多信息,请参阅证书签名请求。
CertificateSubjectRestriction
类型:验证。
此准入控制器观察创建具有 spec.signerName
为 kubernetes.io/kube-apiserver-client
的 CertificateSigningRequest 资源。它拒绝任何指定“组”(或“组织属性”)为 system:masters
的请求。
DefaultIngressClass
类型:变异。
此准入控制器观察创建没有请求任何特定入口类的 Ingress
对象,并自动向它们添加一个默认入口类。这样,没有请求任何特殊入口类的用户就不需要关心它们,他们将获得默认入口类。
当没有配置默认入口类时,此准入控制器不会执行任何操作。当多个入口类被标记为默认类时,它会拒绝创建任何 Ingress
,并返回错误,管理员必须重新检查他们的 IngressClass
对象,并将只有一个标记为默认类(带有注释“ingressclass.kubernetes.io/is-default-class”)。此准入控制器忽略任何 Ingress
更新;它只对创建进行操作。
有关入口类以及如何将一个入口类标记为默认类的更多信息,请参阅入口 文档。
DefaultStorageClass
类型:变异。
此准入控制器观察创建没有请求任何特定存储类的 PersistentVolumeClaim
对象,并自动向它们添加一个默认存储类。这样,没有请求任何特殊存储类的用户就不需要关心它们,他们将获得默认存储类。
当没有配置默认存储类时,此准入控制器不会执行任何操作。当多个存储类被标记为默认类时,它会拒绝创建任何 PersistentVolumeClaim
,并返回错误,管理员必须重新检查他们的 StorageClass
对象,并将只有一个标记为默认类。此准入控制器忽略任何 PersistentVolumeClaim
更新;它只对创建进行操作。
有关持久卷声明和存储类以及如何将存储类标记为默认类的更多信息,请参阅持久卷 文档。
DefaultTolerationSeconds
类型:变异。
此准入控制器根据 k8s-apiserver 输入参数 default-not-ready-toleration-seconds
和 default-unreachable-toleration-seconds
为 Pod 设置默认容忍期限,以容忍污点 notready:NoExecute
和 unreachable:NoExecute
,前提是 Pod 不已具有对污点 node.kubernetes.io/not-ready:NoExecute
或 node.kubernetes.io/unreachable:NoExecute
的容忍。default-not-ready-toleration-seconds
和 default-unreachable-toleration-seconds
的默认值为 5 分钟。
DenyServiceExternalIPs
类型:验证。
此准入控制器拒绝所有对 Service
字段 externalIPs
的新增使用。此功能非常强大(允许网络流量拦截),并且没有得到策略的有效控制。启用后,集群用户可能无法创建使用 externalIPs
的新服务,也可能无法在现有 Service
对象上添加新值到 externalIPs
。现有的 externalIPs
使用不受影响,用户可以从现有 Service
对象的 externalIPs
中删除值。
大多数用户根本不需要此功能,集群管理员应考虑禁用它。确实需要使用此功能的集群应考虑使用一些自定义策略来管理它的使用。
此准入控制器默认禁用。
EventRateLimit
Kubernetes v1.13 [alpha]
类型:验证。
此准入控制器缓解了 API 服务器被存储新事件的请求淹没的问题。集群管理员可以通过以下方式指定事件速率限制:
- 启用
EventRateLimit
准入控制器; - 从提供给 API 服务器命令行标志
--admission-control-config-file
的文件中引用EventRateLimit
配置文件
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: EventRateLimit
path: eventconfig.yaml
...
在配置中可以指定四种类型的限制
Server
:API 服务器接收到的所有事件请求(创建或修改)共享一个桶。Namespace
:每个命名空间都有一个专用桶。User
:每个用户都分配一个桶。SourceAndObject
: 事件的每个源和涉及的对象组合都会分配一个桶。
以下是一个用于此类配置的 eventconfig.yaml
示例
apiVersion: eventratelimit.admission.k8s.io/v1alpha1
kind: Configuration
limits:
- type: Namespace
qps: 50
burst: 100
cacheSize: 2000
- type: User
qps: 10
burst: 50
有关更多详细信息,请参见 事件速率限制配置 API (v1alpha1)。
此准入控制器默认禁用。
ExtendedResourceToleration
类型:变异。
此插件有助于创建具有扩展资源的专用节点。如果运营商想要创建具有扩展资源(如 GPU、FPGA 等)的专用节点,则应 用扩展资源名称作为键对节点进行污点。此准入控制器(如果已启用)会自动为请求扩展资源的 Pod 添加对这些污点的容忍度,因此用户无需手动添加这些容忍度。
此准入控制器默认禁用。
ImagePolicyWebhook
类型:验证。
ImagePolicyWebhook 准入控制器允许后端 Webhook 进行准入决策。
此准入控制器默认禁用。
配置文件格式
ImagePolicyWebhook 使用配置文件来设置后端行为的选项。此文件可以是 json 或 yaml,并具有以下格式
imagePolicy:
kubeConfigFile: /path/to/kubeconfig/for/backend
# time in s to cache approval
allowTTL: 50
# time in s to cache denial
denyTTL: 50
# time in ms to wait between retries
retryBackoff: 500
# determines behavior if the webhook backend fails
defaultAllow: true
从提供给 API 服务器命令行标志 --admission-control-config-file
的文件中引用 ImagePolicyWebhook 配置文件
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: ImagePolicyWebhook
path: imagepolicyconfig.yaml
...
或者,您可以将配置直接嵌入到文件中
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: ImagePolicyWebhook
configuration:
imagePolicy:
kubeConfigFile: <path-to-kubeconfig-file>
allowTTL: 50
denyTTL: 50
retryBackoff: 500
defaultAllow: true
ImagePolicyWebhook 配置文件必须引用一个 kubeconfig 格式的文件,该文件设置与后端的连接。后端必须通过 TLS 进行通信。
kubeconfig 文件的 cluster
字段必须指向远程服务,user
字段必须包含返回的授权者。
# clusters refers to the remote service.
clusters:
- name: name-of-remote-imagepolicy-service
cluster:
certificate-authority: /path/to/ca.pem # CA for verifying the remote service.
server: https://images.example.com/policy # URL of remote service to query. Must use 'https'.
# users refers to the API server's webhook configuration.
users:
- name: name-of-api-server
user:
client-certificate: /path/to/cert.pem # cert for the webhook admission controller to use
client-key: /path/to/key.pem # key matching the cert
有关其他 HTTP 配置,请参阅 kubeconfig 文档。
请求有效负载
在面临准入决策时,API 服务器会 POST 一个 JSON 序列化的 imagepolicy.k8s.io/v1alpha1
ImageReview
对象,该对象描述了正在被准入的操作。此对象包含描述正在被准入的容器以及与 *.image-policy.k8s.io/*
匹配的任何 Pod 注释的字段。
注意
Webhook API 对象受与其他 Kubernetes API 对象相同的版本兼容性规则约束。实施者应该意识到 alpha 对象的兼容性承诺较为宽松,并检查请求的apiVersion
字段以确保正确反序列化。此外,API 服务器必须启用 imagepolicy.k8s.io/v1alpha1
API 扩展组(--runtime-config=imagepolicy.k8s.io/v1alpha1=true
)。一个示例请求体
{
"apiVersion": "imagepolicy.k8s.io/v1alpha1",
"kind": "ImageReview",
"spec": {
"containers": [
{
"image": "myrepo/myimage:v1"
},
{
"image": "myrepo/myimage@sha256:beb6bd6a68f114c1dc2ea4b28db81bdf91de202a9014972bec5e4d9171d90ed"
}
],
"annotations": {
"mycluster.image-policy.k8s.io/ticket-1234": "break-glass"
},
"namespace": "mynamespace"
}
}
预期远程服务会填充请求的 status
字段,并响应允许或拒绝访问。响应体的 spec
字段将被忽略,可以省略。一个许可响应将返回
{
"apiVersion": "imagepolicy.k8s.io/v1alpha1",
"kind": "ImageReview",
"status": {
"allowed": true
}
}
要拒绝访问,服务将返回
{
"apiVersion": "imagepolicy.k8s.io/v1alpha1",
"kind": "ImageReview",
"status": {
"allowed": false,
"reason": "image currently blacklisted"
}
}
有关更多文档,请参阅 imagepolicy.v1alpha1
API。
使用注释进行扩展
与 *.image-policy.k8s.io/*
匹配的 Pod 上的所有注释都将发送到 Webhook。发送注释允许了解图像策略后端的用户向其发送额外的信息,并且不同的后端实现可以接受不同的信息。
以下是一些您可能在这里放置的信息示例
- 请求“打破玻璃”以在紧急情况下覆盖策略。
- 记录“打破玻璃”请求的工单系统的工单号。
- 向策略服务器提供有关提供的图像的 imageID 的提示,以节省查找。
在任何情况下,注释均由用户提供,Kubernetes 不会以任何方式对其进行验证。
LimitPodHardAntiAffinityTopology
类型:验证。
此准入控制器会拒绝在 requiredDuringSchedulingRequiredDuringExecution
中定义除 kubernetes.io/hostname
以外的 AntiAffinity
拓扑键的任何 Pod。
此准入控制器默认禁用。
LimitRanger
类型:变异和验证。
此准入控制器将观察传入的请求,并确保其不违反 Namespace
中 LimitRange
对象中枚举的任何约束。如果您在 Kubernetes 部署中使用 LimitRange
对象,则 MUST 使用此准入控制器来强制执行这些约束。LimitRanger 还可以用于向未指定任何资源请求的 Pod 应用默认资源请求;目前,默认 LimitRanger 会对 default
命名空间中的所有 Pod 应用 0.1 CPU 需求。
有关更多详细信息,请参见 LimitRange API 参考 和 LimitRange 示例。
MutatingAdmissionWebhook
类型:变异。
此准入控制器会调用任何与请求匹配的变异 Webhook。匹配的 Webhook 按顺序调用;如果需要,每个 Webhook 都可以修改对象。
此准入控制器(顾名思义)仅在变异阶段运行。
如果此调用的 Webhook 具有副作用(例如,减少配额),它必须具有一个协调系统,因为它不能保证后续 Webhook 或验证准入控制器会允许请求完成。
如果您禁用了 MutatingAdmissionWebhook,则还必须通过 --runtime-config
标志禁用 admissionregistration.k8s.io/v1
组/版本中的 MutatingWebhookConfiguration
对象,两者默认都已启用。
在创作和安装变异 Webhook 时要谨慎
- 用户在尝试创建的对象与他们获得的对象不同时可能会感到困惑。
- 内置控制循环在尝试创建的对象在读回时不同时可能会中断。
- 设置最初未设置的字段不太可能导致问题,而不是覆盖原始请求中设置的字段。避免执行后者。
- 对内置资源或第三方资源的控制循环的未来更改可能会破坏今天运行良好的 Webhook。即使 Webhook 安装 API 已经最终确定,也无法保证所有可能的 Webhook 行为都将无限期地得到支持。
NamespaceAutoProvision
类型:变异。
此准入控制器检查命名空间资源上的所有传入请求,并检查引用的命名空间是否存在。如果找不到命名空间,它会创建一个命名空间。此准入控制器在不想限制在使用之前创建命名空间的部署中很有用。
NamespaceExists
类型:验证。
此准入控制器检查除 Namespace
本身以外的所有命名空间资源上的所有请求。如果请求中引用的命名空间不存在,则会拒绝该请求。
NamespaceLifecycle
类型:验证。
此准入控制器强制执行以下规则:正在终止的 Namespace
不能在其中创建新对象,并确保拒绝在不存在的 Namespace
中的请求。此准入控制器还阻止删除三个系统保留的命名空间 default
、kube-system
、kube-public
。
Namespace
删除会启动一系列操作,这些操作会删除该命名空间中的所有对象(Pod、服务等)。为了强制执行该过程的完整性,我们强烈建议运行此准入控制器。
NodeRestriction
类型:验证。
此准入控制器限制 kubelet 可以修改的 Node
和 Pod
对象。为了受到此准入控制器的限制,kubelet 必须使用 system:nodes
组中的凭据,用户名格式为 system:node:<nodeName>
。此类 kubelet 仅被允许修改其自己的 Node
API 对象,并且仅修改与其节点绑定的 Pod
API 对象。kubelet 不允许更新或删除其 Node
API 对象的污点。
NodeRestriction
准入插件会阻止 kubelet 删除其 Node
API 对象,并强制执行 kubelet 对以下 kubernetes.io/
或 k8s.io/
前缀下的标签的修改
- 阻止 kubelet 添加/删除/更新带有
node-restriction.kubernetes.io/
前缀的标签。此标签前缀保留给管理员,以便他们为工作负载隔离目的对Node
对象进行标记,kubelet 不允许修改带有该前缀的标签。 - 允许 kubelet 添加/删除/更新以下标签和标签前缀
kubernetes.io/hostname
kubernetes.io/arch
kubernetes.io/os
beta.kubernetes.io/instance-type
node.kubernetes.io/instance-type
failure-domain.beta.kubernetes.io/region
(已弃用)failure-domain.beta.kubernetes.io/zone
(已弃用)topology.kubernetes.io/region
topology.kubernetes.io/zone
kubelet.kubernetes.io/
- 前缀的标签node.kubernetes.io/
- 前缀的标签
kubelet 对 kubernetes.io
或 k8s.io
前缀下的任何其他标签的使用是保留的,将来可能会被 NodeRestriction
准入插件禁止或允许。
将来版本可能会添加其他限制,以确保 kubelet 具有正常运行所需的最低权限集。
OwnerReferencesPermissionEnforcement
类型:验证。
此准入控制器保护对对象 metadata.ownerReferences
的访问,以便只有对该对象具有删除权限的用户才能更改它。此准入控制器还会保护对对象 metadata.ownerReferences[x].blockOwnerDeletion
的访问,以便只有对引用所有者的 finalizers
子资源具有更新权限的用户才能更改它。
PersistentVolumeClaimResize
Kubernetes v1.24 [稳定]
类型:验证。
此准入控制器实现了额外的验证,以检查传入的 PersistentVolumeClaim
调整大小请求。
建议启用 PersistentVolumeClaimResize
准入控制器。默认情况下,此准入控制器会阻止调整所有声明的大小,除非声明的 StorageClass
通过将 allowVolumeExpansion
设置为 true
明确启用了调整大小。
例如:从以下 StorageClass
创建的所有 PersistentVolumeClaim
都支持卷扩展
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gluster-vol-default
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://192.168.10.100:8080"
restuser: ""
secretNamespace: ""
secretName: ""
allowVolumeExpansion: true
有关持久卷声明的更多信息,请参见 持久卷声明。
PodNodeSelector
Kubernetes v1.5 [alpha]
类型:验证。
此准入控制器通过读取命名空间注释和全局配置来默认和限制命名空间内可以使用哪些节点选择器。
此准入控制器默认禁用。
配置文件格式
PodNodeSelector
使用配置文件来设置后端行为的选项。请注意,配置文件格式将在将来的版本中迁移到版本化的文件。此文件可以是 json 或 yaml,并具有以下格式
podNodeSelectorPluginConfig:
clusterDefaultNodeSelector: name-of-node-selector
namespace1: name-of-node-selector
namespace2: name-of-node-selector
从提供给 API 服务器命令行标志 --admission-control-config-file
的文件中引用 PodNodeSelector
配置文件
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodNodeSelector
path: podnodeselector.yaml
...
配置注释格式
PodNodeSelector
使用注释键 scheduler.alpha.kubernetes.io/node-selector
将节点选择器分配给命名空间。
apiVersion: v1
kind: Namespace
metadata:
annotations:
scheduler.alpha.kubernetes.io/node-selector: name-of-node-selector
name: namespace3
内部行为
此准入控制器具有以下行为
- 如果
Namespace
具有带有键scheduler.alpha.kubernetes.io/node-selector
的注释,则使用其值作为节点选择器。 - 如果命名空间缺少此类注释,则使用
PodNodeSelector
插件配置文件中定义的clusterDefaultNodeSelector
作为节点选择器。 - 根据命名空间节点选择器评估 Pod 的节点选择器是否存在冲突。冲突会导致拒绝。
- 根据插件配置文件中定义的特定于命名空间的允许选择器评估 Pod 的节点选择器。冲突会导致拒绝。
注意
PodNodeSelector 允许将 Pod 强制运行在特定标记的节点上。另请参见 PodTolerationRestriction 准入插件,该插件允许阻止 Pod 运行在特定污点的节点上。PodSecurity
Kubernetes v1.25 [稳定]
类型:验证。
PodSecurity 准入控制器会在 Pod 被准入之前检查新 Pod,根据请求的安全上下文和 Pod 所在命名空间的允许 Pod 安全标准 上的限制来确定是否应该准入 Pod。
有关更多信息,请参阅Pod 安全准入文档。
PodSecurity 替换了名为 PodSecurityPolicy 的旧准入控制器。
PodTolerationRestriction
Kubernetes v1.7 [alpha]
类型:变异和验证。
PodTolerationRestriction 准入控制器会验证 Pod 的容忍度与其命名空间的容忍度之间是否存在冲突。如果存在冲突,它将拒绝 Pod 请求。然后,它将合并到命名空间中注释的容忍度到 Pod 的容忍度中。将生成的容忍度与注释到命名空间的允许容忍度列表进行比较。如果检查成功,则允许 Pod 请求;否则,将拒绝该请求。
如果 Pod 的命名空间没有关联任何默认的容忍度或注释的允许容忍度,则如果指定了集群级别的默认容忍度或集群级别的允许容忍度列表,则使用它们。
可以通过 scheduler.alpha.kubernetes.io/defaultTolerations
注释键将容忍度分配给命名空间。可以通过 scheduler.alpha.kubernetes.io/tolerationsWhitelist
注释键添加允许的容忍度列表。
命名空间注释示例
apiVersion: v1
kind: Namespace
metadata:
name: apps-that-need-nodes-exclusively
annotations:
scheduler.alpha.kubernetes.io/defaultTolerations: '[{"operator": "Exists", "effect": "NoSchedule", "key": "dedicated-node"}]'
scheduler.alpha.kubernetes.io/tolerationsWhitelist: '[{"operator": "Exists", "effect": "NoSchedule", "key": "dedicated-node"}]'
此准入控制器默认禁用。
优先级
类型:变异和验证。
优先级准入控制器使用 priorityClassName
字段并填充优先级的整数值。如果找不到优先级类,则会拒绝 Pod。
ResourceQuota
类型:验证。
此准入控制器将观察传入的请求并确保它不会违反 Namespace
中 ResourceQuota
对象中枚举的任何约束。如果您在 Kubernetes 部署中使用 ResourceQuota
对象,则必须使用此准入控制器来强制执行配额约束。
有关更多详细信息,请参阅ResourceQuota API 参考和Resource Quota 示例。
RuntimeClass
类型:变异和验证。
如果您使用配置了Pod 开销的 RuntimeClass,此准入控制器会检查传入的 Pod。启用后,此准入控制器会拒绝任何已设置开销的 Pod 创建请求。对于在 .spec
中配置了 RuntimeClass 并已选定的 Pod,此准入控制器会根据相应 RuntimeClass 中定义的值在 Pod 中设置 .spec.overhead
。
有关更多信息,另请参阅Pod 开销。
ServiceAccount
类型:变异和验证。
此准入控制器实现了对serviceAccounts的自动化。Kubernetes 项目强烈建议启用此准入控制器。如果您打算使用任何 Kubernetes ServiceAccount
对象,则应启用此准入控制器。
关于注释 kubernetes.io/enforce-mountable-secrets
:虽然注释的名称表明它只关注 Secrets 的挂载,但其强制执行也扩展到 Secrets 在 Pod 上下文中使用的其他方式。因此,务必确保在 ServiceAccount 中正确指定所有引用的 secrets。
StorageObjectInUseProtection
类型:变异。
StorageObjectInUseProtection
插件会将 kubernetes.io/pvc-protection
或 kubernetes.io/pv-protection
终结器添加到新创建的持久卷声明 (PVC) 或持久卷 (PV)。如果用户删除了 PVC 或 PV,则在 PVC 或 PV 保护控制器从 PVC 或 PV 中删除终结器之前,不会删除 PVC 或 PV。有关更多详细信息,请参阅正在使用的存储对象保护。
TaintNodesByCondition
类型:变异。
此准入控制器会将新创建的节点标记为 NotReady
和 NoSchedule
。这种标记可以避免出现这样的竞态条件:Pod 在节点的标记更新为准确反映其报告的条件之前就被调度到新节点上。
ValidatingAdmissionPolicy
类型:验证。
此准入控制器实现了对传入匹配请求的 CEL 验证。当功能开关 validatingadmissionpolicy
和 admissionregistration.k8s.io/v1alpha1
组/版本都启用时,它会启用。如果任何 ValidatingAdmissionPolicy 失败,则请求失败。
ValidatingAdmissionWebhook
类型:验证。
此准入控制器会调用任何与请求匹配的验证 Webhook。匹配的 Webhook 将并行调用;如果任何一个拒绝请求,则请求失败。此准入控制器仅在验证阶段运行;它调用的 Webhook 不会修改对象,这与 MutatingAdmissionWebhook
准入控制器调用的 Webhook 不同。
如果此准入控制器调用的 Webhook 具有副作用(例如,减少配额),则它必须具有协调系统,因为它不能保证后续 Webhook 或其他验证准入控制器会允许请求完成。
如果您禁用 ValidatingAdmissionWebhook,则还必须使用 --runtime-config
标志禁用 admissionregistration.k8s.io/v1
组/版本中的 ValidatingWebhookConfiguration
对象。
是否有一套推荐使用的准入控制器?
是的。推荐的准入控制器默认启用(显示此处),因此您无需显式指定它们。您可以使用 --enable-admission-plugins
标志启用默认集之外的其他准入控制器(顺序无关紧要)。