Kubernetes 中的 Admission Controller 是什么?

在 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 的工作流程是:

  1. API 服务器启动时,会检测安装哪些 Admission Controller。
  2. 每个 Controller 定义了所操作的资源以及执行的动作。
  3. 用户发起 API 请求创建/更新资源时,相应的 Admission Controller 会对其进行截获。
  4. Controller 会对资源执行定义的策略或修改,如果违反则返回错误而操作不会执行。
  5. 如果所有 Controller 执行成功,则最终 API 操作会执行。

例如:
启用了 DefaultStorageClass 和 PodSecurityPolicy 两个 Controller,其工作流程是:

  1. 用户创建一个 PVC,DefaultStorageClass Controller 截获操作。
  2. 检查 PVC 是否指定存储类,如果没有则添加默认存储类后继续流程。
  3. 用户创建一个 Pod,PodSecurityPolicy Controller 截获操作。
  4. 检查 Pod 是否符合任一 PSP 策略,如果不符合则返回错误,操作终止。
  5. 如果 Pod 符合,则继续流程,直至所有 Controller 执行完毕,最终 Pod 创建操作执行。

所以总结来说,Admission Controller 的主要作用是在 API 请求执行前执行预检查和策略控制,其主要特征是:

  1. 在 API 请求处理前拦截请求并执行控制操作。
  2. 确保集群内策略或约束得到执行。
  3. 可以修改对象以符合策略。
  4. 有许多内置的 Controller,也支持自定义 Controller。
  5. 需要在 API 服务器启动时配置要启用的 Controller。

它的工作流程是:

  1. API 服务器启动时检测启用的 Controller。
  2. 用户发起 API 请求时,相关的 Controller 拦截请求。
  3. Controller 执行定义的验证或修改操作。
  4. 如果违反,API请求返回错误,否则继续流程。
  5. 所有 Controller 成功后最终 API 请求被处理。