准入控制器

发布时间 2023-04-17 15:33:58作者: 滴滴滴
准入控制器
准入控制器是一段代码,它会在请求通过认证和授权之后、对象被持久化之前拦截到达 API 服务器的请求。

启用和禁用准入控制器:

kube-apiserver --enable-admission-plugins=NamespaceLifecycle,LimitRanger ...
kube-apiserver --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...

两个特殊的控制器:

MutatingAdmissionWebhook:执行变更准入控制的 webhook
ValidatingAdmissionWebhook:执行验证准入控制的 webhook
准入控制过程分为两个阶段,任何一个阶段控制器拒绝请求,则整个请求将立即被拒绝,并向终端返回一个错误:

运行变更准入控制器
运行验证准入控制器
常见准入控制器:

AlwaysPullImages:修改 Pod 时,强制重新拉取镜像
DefaultStorageClass:创建 PersistentVolumeClaim 时,不请求任何特定存储类的对象,并自动向其添加默认存储类
DefaultTolerationSeconds:将Pod的容忍时间notready:NoExecute和unreachable:NoExecute 默认设置为5分钟
DenyEscalatingExec:拒绝 exec 和附加命令到以允许访问宿主机的升级了权限运行的pod
LimitPodHardAntiAffinityTopology:拒绝任何在 requiredDuringSchedulingRequiredDuringExecution 的 AntiAffinity 字段中定义除了kubernetes.io/hostname 之外的拓扑关键字的 pod
LimitRanger:确保所有资源请求不会超过 namespace 的 LimitRange。
MutatingAdmissionWebhook:调用与请求匹配的任何变更 webhook。匹配的 webhook是串行调用的;如果需要,每个人都可以修改对象
NamespaceAutoProvision:检查命名空间资源上的所有传入请求,并检查引用的命名空间是否存在。如果不存在就创建一个命名空间
NamespaceExists:此检查除 Namespace 其自身之外的命名空间资源上的所有请求。如果请求引用的命名空间不存在,则拒绝该请求
NamespaceLifecycle:强制执行正在终止的命令空间中不能创建新对象,并确保Namespace拒绝不存在的请求。它还防止缺失三个系统保留的命名空间default、kube-system、kube-public
NodeRestriction:限制 kubelet 可以修改的Node和Pod对象
OwnerReferencesPermissionEnforcement:保护对metadata.ownerReferences对象的访问,以便只有对该对象具有“删除”权限的用户才能对其进行更改
PodNodeSelector:通过读取命名空间注释和全局配置来限制可在命名空间内使用的节点选择器
PodPreset:注入一个pod,其中包含匹配的PodPreset中指定的字段
PodSecurityPolicy:用于创建和修改pod,并根据请求的安全上下文和可用的Pod安全策略确定是否应该允许它
PodTolerationRestriction:验证容器的容忍度与其命名空间的容忍度之间是否存在冲突,并在存在冲突时拒绝该容器请求
Priority:使用priorityClassName字段并填充优先级的整数值。如果未找到优先级,则拒绝Pod
ResourceQuota:观察传入请求并确保它不违反命名空间的ResourceQuota对象中列举的任何约束
SecurityContextDeny:拒绝任何试图设置某些升级的 SecurityContext 字段的pod
ServiceAccount:实现 ServiceAccounts 的自动化。
StorageObjectInUseProtection:将 kubernetes.io/pvc-protection 或 kubernetes.io/pv-protection finalizers 添加到新创建的持久化卷声明(PVC) 或持久化卷(PV)中。 如果用户尝试删除 PVC/PV,除非 PVC/PV 的保护控制器移除 finalizers,否则 PVC/PV 不会被删除
ValidatingAdmissionWebhook:调用与请求匹配的任何验证webhook。匹配的webhooks是并行调用的;如果其中任何一个拒绝请求,则请求失败。