K8s-kube-apiserver(准入控制器)
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 |
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被拒绝 |
…. | …. |
内部实现原理
-
...
// 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准入器
插件式准入验证器
……
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joohwan!
评论