6.3 Admission Control (准入控制)
2023年5月21日...大约 7 分钟
突破了之前所说的认证和鉴权两道关卡后,客户端的调用请求就能得到API Server的真正响应了吗?答案是:不能!。这个请求还需要通过Admission Control (准入控制 )所控制的一个准入控制链的层层考验。Kubernetes 官方标准的“关卡”有30多个,还允许用户自定义扩展
Admission Control 配备了一个准入控制器的插件列表,发送给API Server 的任何请求都需要通过列表中的每个准入控制器的检查。准入控制器的插件能够修改请求参数以完成一些自动化任务,比如ServiceAccount这个控制插件。当前可配置的准入器插件如下:
- AlwaysAdmit:已弃用,允许所有请求
- AlwaysPullImages:在启动容器之前总是尝试重新下载镜像。这对于多租户共享一个集群的场景非常有用,系统在启动容器之前可以保证问题使用租户的密钥去下载镜像。如果不设置这个控制器,则在Node 上下载的镜像的安全性将被削弱,只要知道该镜像的名称,任何人都可以使用它们了。
- AlwaysDeny:已弃用,禁止所有请求,用于测试。
- DefaultStorageClass:会关注PersistentVolumeClaim资源对象的创建,如果其他没有包含任何针对特定Storage class的请求,则为其指派指定的Storage class。用户无须在PVC中设备任何特定的Storage class就能完成PVC的创建了。如果没有设置默认的Storage class 该控制器就不会进行任何操作;如果设置超过一个的默认Storage class,该控制器就会拒绝所有PVC对象的创建申请。并返回错误信息。管理员必须检查StorageClass对象的配置,确保只有一个默认值。
- DefaultTolerationSeconds:针对没有设置容忍 node.kubernetes.io/not-ready:NoExecute 或者node.alpha.kubernetes.io/unreachable:NoExecute 的Pod ,设置5min 的默认容忍时间。
- DenyExecOnPrivileged:已弃用,功能已经被合并到DenyEscalatingExec中。
- DenyEscalatingExec:拦截所有exec 和 attach 到具有特权的Pod 上的请求。如果你的集群支持运行有escalated privilege 权限的容器,又希望限制用户在这些容器内执行命令,强烈推荐使用
- EventReateLimit: Alpha 版本,用于应对事件密集情况下对API Server 造成的洪水攻击。
- ExtendedResourceToleration:如果运维人员要创建带有特定资源(例如GPU,FPGA等)的独立节点,则可能会对节点进行Taint 处理来进行特别配置。该控制器能够自动为申请这些特别资源的Pod加入Toleration(容忍)定义,无须人工干预。
- ImagePolicyWebhook :这个插件将允许后端的一个Webhook程序来完成admission controller的功能。ImagePolicyWebhook需要使用一个配置文件(通过Kube-apiserver的参数 --admission-control-config-file设置,定义后端Webhook的参数。
- Initalizers: Alpha 。用于为动态准入控制提供支持,通过修改等创建的资源的元数据来完成对该资源的修改。
- LimitPodHardAntiAffinityTopology:该插件启用了Pod的反亲和性调度策略设置,在设置亲和性策略参数requiredDuringSchedulingRequiredDuringExecution 时要求将topologyKey的值设置为"kubernetes.io/hostname",否则Pod会拒绝创建。
- LimitRanger:这个插件会监控进入的请求,确保请求的内容符合在Namespace中定义的LimitRange对象里的资源限制。如果要在Kubernetes集群使用 LimitRange对象,则必须启用该插件才能实施这一限制。LimitRanger还能用于为没有设置资源请求的Pod自动设置默认的资源请求。该插件会为default命名空间中的所有Pod设置 0.1CPU的资源请求。
- MutatingAdmissionWebhook:Beta。这一插件会变更符合要求的请求的内容,Webhook以串行的方式顺序执行。
- NamespaceAutoProvision:这一插件会检测所有进入的具备命名空间的资源请求,如果其中引用的命名空间不存在,就会自动创建命名空间。
- NamespaceExists:这一插件会检测所有进入的具备命名空间的资源请求,如果其中引用的命名空间不存在,就会拒绝这一创建过程。
- NamespaceLifecycle:如果尝试在一个不存在的Namespace中创建资源对象,则该创建请求将被拒绝。当删除一个Namespace时,系统将会删除该Namespace所有对象,包括Pod、Service等,并阻止删除default、kube-system 和 kube-pulic 这三个命名空间。
- NodeRestriction:该插件会限制kubelet 对Node和Pod的修改行为。为了实现这一限制,kubelet必须使用system:nodes 组中的用户名为 system:node:<nodeName> 的Token 来运行。符合条件的kubelet只能修改自己的Node对象。也只能修改分配到各自Node上的Pod对象。
- OwnerReferencesPermissionEnforcement:在该插件启用后,一个用户想要修改对象的metadata.ownerReferences,就必须具备 delete权限,该插件不会保护对象的metadata.ownerReferences[x].blockOwnerDeletion 字段。用户只有在对finalizers子资源拥有update权限的时候才能进行修改。
- PersistentVolumeLabel :弃用,该插件正在在被 Cloud controller manager替换
- PodNodeSelector:该插件会读取命名空间的annotation字段及全局配置,来对一个命名空间中对象的节点选择器设置默认值或限制其取值。
- PersistentVolumeClaimResize:该插件实现了对对PersistentVolumeClaim发起的resize请求的额外校验。
- PodPreset:该插件会使用PodSelector选择Pod,为符合条件的Pod进行注入。
- PodSecurityPolicy:在创建或修改Pod时决定是否根据Pod的 security context 和可用的PodSecurityPolicy对Pod的安全策略进行控制。
- PodTolerationRestrication :该插件首先会在Pod和其命名空间的Toleration中进行冲突检测,如果其中存在冲突,则拒绝该Pod创建,它会把命名空间和Pod的Toleration进行合并,然后将合并的结果与命名空间中的白名单进行比较,如果和并的结果不在白名单内,则拒绝创建,如果不存在命名空间级的默认Toleration和白名单,则会采用集群级别的默认Toleration和白名单。
- Priority:这一插件使用priorityClassName字段来确定优先级,如果没有找到对应的Priority Class,该Pod就会被拒绝。
- ResourceQuota:用于资源配额管理目的,作用于Namespace 。该插件拦截所有请求,以确保在Namespace上的资源配额使用不会超标。推荐在Admission Control参数列表中将这个插件排最后一个,以免可能被其他插件拒绝的Pod过早的分配资源 。
- SecurityContextDeny: 这个插件将在Pod中定义的SecurityContext选项全部失效。SecurityContext 在Container 中定义了操作系统级别是的安全设定(uid、gid、capabilities、SELinux等)在未设置PodSecurityPolicy的集群中建议启用该插件,以禁用有容器设置的非安全访问权限。
- ServiceAccount:这个插件将ServiceAccount实现了自动化,如果想使用ServiceAccount对象,那么强烈推荐使用它。
- StorageObjectInUseProtection: 这一插件会在新创建的PVC或者PV中加入kubernetes.io/pvc-protection 或 kubernetes.io/pv-protection 的finalizer 。如果想删除PVC或PV,则直到所有finalizer 的工作都完成,删除动作才会执行。
- ValidatingAdmissionwebhook:该插件会针对符其选择要求的请求调用校验Webhook 。目标 Webhook会以并行方式运行;如果其中任何一个Webhook拒绝了该请求,该请求就会失败。
在API Server上设置参数即可定制我们需要的准入控制链,如果启用多种准入控制选项,则建议设置:在Kubernetes 1.9及之前的版本中使用的参数是 --admission-control ,并且其中的内容是顺序相关的;在Kubernetes 1.10 及之后的版本中,该参数为 --enable-admission-plugins ,并且与顺序无关。
对Kubernetes 1.10 及以上版本设置如下
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,Resourcequota
对Kubernetes 1.9 及以下版本设置如下 :
--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccout,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota
贡献者
changelichangyangccm@163.com