K8s-kube-apiserver(准入控制器)

基于1.25

准入控制器会通过在请求经过认证、授权等前置检查后,对象被真正持久化前行最后的拦截,对请求的资源对象进行存储前的变更或验证

  • 准入控制器以插件的形式,支持有命令行参数动态启用(–enable-adminssion-plugins)或禁用(–disable-adminssion-pkugins)指定准入控制器插件

内置插件介绍

名称 说明
AlwaysAdmit 已弃用,允许所有的请求
NamespaceAutoProvsion 检查所有进入的具备命名空间的资源请求,如果引用的命令空间不存在,则自动创建命名空间
NamespaceLifecycle 禁止在一个正在被终止的空间中创建新对象,确保对不存在的命名空间的请求被拒绝。在删除一个命名空间时,触发删除该命名空间下的所有对象(如Pod、Service等)的操作。同时,禁止删除系统保留的命令空间(default、kube-system、kube-public)
NamespaceExists 检查所有进入的具备命名空间的资源请求,如果其引用的命令空间不存在,则拒绝请求
SecurityContextDeny 拒绝任何试图修改Pid Security Context某些敏感字段的请求
LimitPodHardAntiffinityTopolpy 在启用Pod反亲和策略时,要求设置requiredDuringScheduingIngnoredDuringExecution所使用的topologyKey必须kubernetes.io/hostname,则拒绝Pod的创建请求
ServiceAccount 实现了ServiceAccount的自动化。如果使用ServiceAccount权限控制,则需要启用该插件
NodeRestriction 限制kubelet对Node和Pod对象的修改。kubelet必须使用system:nodes组中形式为system:node的用户名,只能修改自己的Node API对象和绑定到自身节点的Pod对象,无法更新或删除Node对象的污点,限制kubelet对kubernetes.io或k8s.io为前缀的标签的使用,以确保kubelet具备正常运行所需的最小权限集
TaintNodesByCondition 为新创建的节点添加NotReady和NoSchedule污点,以避免一些竟态条件的发生,而这些竟态条件可能条件可能导致Pod在更新节点污点准确反映报告之前的情况,就被调度到新节点上
AlwaysPull Image 修改每个新创建的Pod,其镜像拉取策略设置为Always。这在多租户共享一个集群的场景中非常有用,这样用户的私有镜像只有那些凭证的人使用。如果没有这个准入控制器,一旦镜像被拉取到节点上,任何用户都可以通过已了解到镜像名来使用它,而不需要对镜像进行鉴权检查。启用这个准入控制器之后,启用容器之前必须拉取镜像,这意向中有效的镜像拉取凭证
ImagePolicyWebhook 允许后端Webhook作出决策,检查Pod中设置的镜像是否被允许,需要使用一个配置文件定义后端Webhook的相关参数(通过–adminssion-control-config-file)。kube-apiserver通过Webhook服务器发送Image ReviewPost请求,读取返回的状态来确定决策结果
PodSecurity 已废弃的PodSecurityPolicy准入控制器的替代品
PodNodeSelector 读取命名空间的annotation字段和全局配置来对一个命名空间中对象的节点选择器设置默认值或限制其取值
Priority 使用priorityClassName字段来确定优先级,如果没有找到对应的PriorityClass,则该Pod被拒绝
…. ….

内部实现原理

  • Ref:https://github.com/kubernetes/apiserver/blob/ba592e4ccd41a320ceb91bab90eebee3bb4a4f33/pkg/endpoints/installer.go#L190

    ...
    // what verbs are supported by the storage, used to know what verbs we support per path
    creater, isCreater := storage.(rest.Creater)
    namedCreater, isNamedCreater := storage.(rest.NamedCreater)
    lister, isLister := storage.(rest.Lister)
    getter, isGetter := storage.(rest.Getter)
    getterWithOptions, isGetterWithOptions := storage.(rest.GetterWithOptions)
    gracefulDeleter, isGracefulDeleter := storage.(rest.GracefulDeleter)
    collectionDeleter, isCollectionDeleter := storage.(rest.CollectionDeleter)
    updater, isUpdater := storage.(rest.Updater)
    patcher, isPatcher := storage.(rest.Patcher)
    watcher, isWatcher := storage.(rest.Watcher)
    connecter, isConnecter := storage.(rest.Connecter)
    storageMeta, isMetadata := storage.(rest.StorageMetadata)
    storageVersionProvider, isStorageVersionProvider := storage.(rest.StorageVersionProvider)
    gvAcceptor, _ := storage.(rest.GroupVersionAcceptor)
    if !isMetadata {
    storageMeta = defaultStorageMetadata{}
    }
    ...

MutatingAdmissionWebhook准入控制器

除了内置的已经固化处理逻辑的准入控制器,为了提升拓展醒,kube-apiserver提供了俩种动态准入控制器,同时分别提供了俩种资源

  • MutatingAdmissionWebhook:通过Webhook拓展的变更准入控制器,可以通过Webhook自定义变更逻辑,该准入控制器使用MutatingAdmissionWebhookConfiguration资源对象进行配置
  • ValidatingAdmissionWebhook:通过Webhook拓展的变更准入控制器,可以通过Webhook自定义变更逻辑,该准入控制器使用ValidatingWebhookConfiguration资源对象
  • 在执行顺序上,默认的内置类型的准入控制器一般具有更高优先级

ValidatingAdmissionWebhook准入器

插件式准入验证器

……