在 Kubernetes 中,Admission Controller 是用于拦截 API 请求并执行某些校验操作的插件。它截获 API 请求并根据定义的规则对其执行校验和更改。
Admission Controller 的主要作用是:
- 验证用户提交的资源是否符合预期状态。
- 保证集群设置的策略或约束生效。
- 修改 API 对象以使其符合策略。
Kubernetes 内置了许多Admission Controller,主要有:
- DefaultStorageClass:为没有指定 StorageClass 的 PVC 设置默认 StorageClass。
- DefaultTolerationSeconds:为没有指定 tolerationSeconds 的 toleration 设置默认值。
- MutatingAdmissionWebhook和
ValidatingAdmissionWebhook
:调用外部验证服务。 - PodSecurityPolicy:执行 Pod 安全策略检查。
- NodeRestriction:限制 kubelet 可以修改的 Node 和 Pod。
- ResourceQuota:执行资源配额限制。
Admission Controller 的工作流程是:
- API 服务器启动时,会检测安装哪些 Admission Controller。
- 每个 Controller 定义了所操作的资源以及执行的动作。
- 用户发起 API 请求创建/更新资源时,相应的 Admission Controller 会对其进行截获。
- Controller 会对资源执行定义的策略或修改,如果违反则返回错误而操作不会执行。
- 如果所有 Controller 执行成功,则最终 API 操作会执行。
例如:
启用了 DefaultStorageClass 和 PodSecurityPolicy 两个 Controller,其工作流程是:
- 用户创建一个 PVC,DefaultStorageClass Controller 截获操作。
- 检查 PVC 是否指定存储类,如果没有则添加默认存储类后继续流程。
- 用户创建一个 Pod,PodSecurityPolicy Controller 截获操作。
- 检查 Pod 是否符合任一 PSP 策略,如果不符合则返回错误,操作终止。
- 如果 Pod 符合,则继续流程,直至所有 Controller 执行完毕,最终 Pod 创建操作执行。
所以总结来说,Admission Controller 的主要作用是在 API 请求执行前执行预检查和策略控制,其主要特征是:
- 在 API 请求处理前拦截请求并执行控制操作。
- 确保集群内策略或约束得到执行。
- 可以修改对象以符合策略。
- 有许多内置的 Controller,也支持自定义 Controller。
- 需要在 API 服务器启动时配置要启用的 Controller。
它的工作流程是:
- API 服务器启动时检测启用的 Controller。
- 用户发起 API 请求时,相关的 Controller 拦截请求。
- Controller 执行定义的验证或修改操作。
- 如果违反,API请求返回错误,否则继续流程。
- 所有 Controller 成功后最终 API 请求被处理。