Kubernetes admission controller 的必要性
发布时间:
2024-07-26 18:00
1、什么是 Kubernetes Admission Controller?
如果你没有作为 Kubernetes 操作员或管理员的经验,Admission Controller 可能是你不太熟悉的一个功能。这些控制器主要在后台工作,许多是作为编译插件可用的,但它们可以强有力地提升部署的安全性。
Admission Controllers 会在 API 请求传递到 API 服务器之前拦截并处理这些请求。它们可以禁止或修改请求,这适用于除纯读取请求之外的大多数 Kubernetes 请求。Admission Controllers 在请求经过正确的身份验证和授权之后处理这些请求。本文将讨论 Kubernetes Admission Controllers 的引入原因,并强调熟悉其功能的优势。
2、默认启用的 Admission Controllers
Kubernetes 中有多个内置的 Admission Controllers。一个简单的例子是 DefaultIngressClass,它将默认的 ingress 类应用于尚未指定类的 ingress 对象。同样,DefaultStorageClass 将默认的存储类应用于尚未指定存储类的 PersistentVolumeClaims。这些控制器必须启用以允许基于存储类的动态存储配置。
Admission Controllers 在维护安全性方面非常有用。例如,它们可以减轻对多租户集群的拒绝服务 (DoS) 攻击。考虑 LimitRanger 插件,它强制执行资源使用范围,防止租户耗尽彼此的资源。
另一种情况是所谓的事件泛滥,集群充斥着事件,无法充分处理其他合法请求。EventRateLimit 控制器是应对此类情况的强大工具,能够限制每个命名空间或每个用户的事件速率。
此外,还有两个重要的控制器允许开发人员将其 Admission 插件作为 Webhooks 运行并在运行时进行配置。MutatingAdmissionWebhook 允许 Webhooks 修改提交的资源,通常用于强制执行自定义默认值。而 ValidatingAdmissionWebhook 控制器则允许注册的 Webhooks 决定 API 验证的资源是否可以继续传递链条或被完全丢弃。
3、Admission Controllers的目的
最初,在一台物理机上执行多个服务的方法是使用虚拟机共享同一主机,并由 Hypervisor 分隔它们的操作系统。云配置系统(例如 AWS 定义的系统)复杂地保持系统分离,并确保租户之间不会意外或故意地互相伤害。
Kubernetes 最初设计为单个组织或用户可以使用的协作系统,并且比其他云系统更依赖于互相考虑。然而,随着 Kubernetes 在可用部署种类和处理更大集群规模的能力方面的增长,实施确保单个用户无法干扰系统操作的策略变得越来越重要。
为了自动化这一过程,组织需要一个策略系统。Kubernetes 提供了一些内置支持,但它不具备一个完整的专用策略引擎的能力。
4、自定义 Admission Controller
你可以使用 Webhooks 编写自定义 Admission Controller 逻辑,任何能够处理 HTTP 请求并返回 JSON 的语言都是有效的选择,例如 Go、Python 或 Ruby。
下面是如何为自定义 Admission Controller 设置 Webhook 的示例。它类似于上文介绍的 LimitRanger,拒绝超过命名空间资源限制的 Pod 请求。注意,这个示例不包括控制器源代码的全部内容,你可以参考 Kubernetes 文档获取更多信息。
首先,使用配置对象注册 Webhook:
这告诉 ValidatingWebhookController 关于 Webhook 的信息,指定要访问的服务和要探测的容器路径,也指出哪些规则在决定是否调用 Webhook 时适用。
实际中,创建这个资源会在创建 Webhook 服务器的部署之后进行。部署包含一个匹配上述定义的服务:
以下是 Webhook 部署的示例。
新的 Pod 请求提交到 Kubernetes 并通过 ValidatingWebhook 后,相关信息作为 POST 请求发送到配置的 URL 路径,并包含一个 JSON 对象供 Webhook 处理。要肯定地验证请求,返回类似以下的响应和 200 状态码:
`uid` 字段从请求中获取,以匹配请求和响应。要阻止 Pod 创建,必须将 `allowed` 字段设置为 false 并发出 HTTP 错误码。
自定义 Admission Controller 可以像这个示例一样简单,也可以复杂得多。要深入了解,请参考 Admission Webhook 文档。
5、结论
Kubernetes Admission Controller可以在对象持久化之前修改或拒绝对API服务器的请求。Kubernetes包含多个内置控制器,包括一些预编译的插件和两种类型的Admission Controller Webhooks。编写独特的Webhooks和Controller可以提供更大的灵活性和精细控制。在软件开发生命周期的每个阶段都存在风险和漏洞,使用Admission Controller缓解这些风险可以不必中断整个工作流。
下一页
下一页