参考

Edit This Page

动态准入控制

admission 控制器文档 介绍如何使用标准的插件式 admission 控制器。然而, 由于以下原因插件 admission 控制器对于所有用例来说都不够灵活:

*Admission Webhooks*(1.9 版中的 beta)解决了这些限制。 它允许 admission 控制器能被独立开发以及在运行时配置。

本页介绍如何使用 Admission Webhooks。

什么是 admission webhook?

Admission webhooks 是 HTTP 回调,它接收 admission 请求并对它们做一些事情。 您可以定义两种类型的 admission webhook, validating admission Webhookmutating admission webhook。 通过 validating admission Webhook,您可以拒绝请求以执行自定义的 admission 策略。 通过 mutating admission webhook,您可以更改请求以执行自定义的默认值。

尝试 admission webhook

admission webhook 本质上是集群控制平面的一部分。 您应该非常谨慎地编写和部署它们。 如果您打算编写/部署生产级 admission webhook,请阅读用户指南以获取相关说明。 在下文中,我们将介绍如何快速试验 admission webhook。

先决条件

编写一个admission webhook 服务器

请参阅 Kubernetes e2e 测试中的 admission webhook 服务器实现。 webhook 处理由 apiservers 发送的 admissionReview 请求,并将其决定包含在 admissionResponse 中发回。

admissionReview 请求可以有不同的版本(例如,v1beta1 或未来版本中的 v1)。 webhook 可以使用 admissionReviewVersions 字段定义它们接受的版本。 API 服务器将尝试在其支持的列表中使用第一个版本。 如果 API 服务器不支持此列表中指定的任何版本,则此对象的验证将失败。 如果 webhook 配置依然如此,则对 we​​bhook 的调用将失败并受到失败策略的控制。

示例 admission webhook 服务器置 ClientAuth 字段为 , 默认为 NoClientCert 。这意味着 webhook 服务器不会验证客户端的身份,认为其是 apiservers。 如果您需要双向 TLS 或其他方式来验证客户端,请参阅如何验证 apiservers

部署 admission webhook 服务

e2e 测试中的 webhook 服务器部署在 Kubernetes 集群中,通过 deployment API。 该测试还创建了 service 作为 webhook 服务器的前端。 参见代码

您还可以在集群外部署 Webhook, 这需要相应地更新 webhook 客户端配置

动态配置 admission webhook

您可以通过 ValidatingWebhookConfigurationMutatingWebhookConfiguration 动态配置哪些资源通过哪些 admission webhook

以下是 validatingWebhookConfiguration 的示例,Mutating Webhook Configuration 类似。

apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
  name: <name of this configuration object>
webhooks:
- name: <webhook name, e.g., pod-policy.example.io>
  rules:
  - apiGroups:
    - ""
    apiVersions:
    - v1
    operations:
    - CREATE
    resources:
    - pods
    scope: "Namespaced"
  clientConfig:
    service:
      namespace: <namespace of the front-end service>
      name: <name of the front-end service>
    caBundle: <pem encoded ca cert that signs the server cert used by the webhook>
  admissionReviewVersions:
  - v1beta1
  timeoutSeconds: 1

scope 字段指定是否只有集群范围的资源(“Cluster”)或命名空间范围的资源(“Namespaced”)才匹配此规则。 “*” 表示没有范围限制。

Note: 使用clientConfig.service时,服务器证书必须对<svc_name>.<svc_namespace>.svc有效。
Note: webhook 调用的默认超时为 30 秒,但从 kubernetes 1.14 开始,您可以设置超时,并鼓励对 webhook 使用非常小的超时时间。 如果 webhook 调用超时,则根据 webhook 的失败策略处理请求。

当一个 apiserver 收到一个与 rules 之一匹配的请求时,apiserver 会向 clientConfig 中指定的 webhook 发送一个 admissionReview 请求。

创建 webhook 配置后,系统将花费几秒钟来完成新配置的生效。

验证 apiservers

如果您的 webhooks 需要身份验证,您可以将 apiservers 配置为使用基本身份验证,不记名令牌或证书来对 webhook 进行身份验证。 完成配置有三个步骤。

admissionConfiguration 的 shcema 在 这里.

当然,您需要设置 webhook 服务器来处理这些身份验证。

反馈