Skip to main content

Command Palette

Search for a command to run...

可扩展 Admission 进入 Beta 阶段

Updated
2 min read

原文:Extensible Admission is Beta

Kubernetes API Server 中有一个功能,能让用户(对工作负载)进行决策,这一功能在 1.9 中已经走入成熟期。

Admission 是 Kubernetes 中最强大的工具之一,可以通过限制创建对象的方式来增强 Kubernetes 集群的安全性,这部分一直是编译在代码之中的。在 1.9 中,我们将 Admission 的 Webhook 升级成 Beta,让用户可以在 API Server 之外对 Admission 施加影响。

Admission 是什么?

Admission(注1),是在认证之后,资源持久化之前 的一个处理 API Server 请求的步骤。Admission 能获取到和认证过程一致的信息(用户、URL 等),以及绝大多数 API 请求的完整报文。

Admission 阶段由不同插件组成,每个 Admission 都会对一个侧面进行观察和操作。例如:影响调度决策的PodNodeSelector、阻止恶意容器的PodSecurityPolicy以及实现 Namespace 资源分配的ResourceQuota

Admission 内部分为两个阶段:

  1. 变更(Mutation,突变?):能够修改 API 请求的报文,还可以拒绝 API 请求。

  2. 验证:允许进行查询,以及拒绝 API 请求。

Admission 插件可以在这两个阶段起作用,但是变更总是在验证之前。

Mutation

Admission 的变更功能可以在资源生成之前进行修改。在 Admission 链条上可以多次修改同一个字段,因此插件不是无序的。

PodNodeSelector就是一个例子,他使用 Namespace 的一个注解namespace.annotations[“scheduler.alpha.kubernetes.io/node-selector”],在其中查找标签选择器,并将其加入pod.spec.nodeselector字段。这一功能限制某个 Namespace 的 Pod,只能运行在指定节点上,同 Taint 的功能正好相反(也是 Admission 插件)。

验证

Admission 的验证阶段用来对特定 API 资源进行验证。这一阶段会在所有变更执行结束之后,API 资源不再发生变化的情况下进行。

PodNodeSelector插件同样演示了这一活动,他确保 Pod 的spec.nodeSelector字段符合该 Namespace 的限制。如果变更链上有其他 Admission 尝试在PodNodeSelector之后修改了资源的spec.nodeSelector,就会在验证阶段因为不符合限制而被拒绝创建。

Admission Webhook 是什么?

Admission webhook 允许 Kubernetes 安装者或集群管理员无需重新编译就可以加入 Admission 插件,像其他基于 k8s.io/apiserver 1.9 的扩展 API Server(例如 metrics(注 2), service-catalog(注 3) 、以及 kube-projects(注 4))一样。两种 Admission Webhook 都在各自的链条尾端运行,和编译的 Admission 插件具有同样的能力和限制。

有什么好处?

Webhook Admission 插件允许对任何 API Server 的任何资源进行变更和验证,所以可能有多种形态的应用,比较普通的用例包括:

  1. 修改 Pod 这样的资源。Istio 使用这一功能来把 Sidecar 注入到 Pod 之中。当然也可以编写插件强制把 Image Tag 改写为 Image SHA。

  2. 在多租户系统中,保留命名空间是一个常见情况。

  3. 复杂的 CustomResource 校验。对插件来说,整个资源都是可见的,因此可以对依赖字段甚至外部依赖资源进行复杂的校验(例如 LimitRanges)。

  4. 安全响应。可以编写一个插件,强制将 Image Tag 转换为 Image SHA,并阻止特定的 Image 运行。

注册

Webhook Admission 插件需要注册,所有的 API Server(Kube API server 以及所有扩展 API Server)都共享一个配置。在注册过程中插件需要提供如下信息:

  1. 如何连接到 Webhook Admission 服务。

  2. 如何验证 Webhook Admission Server。

  3. 把请求发送到这个服务器的哪里(URL)。

  4. 处理哪些资源和 HTTP 动词。

  5. 如果连接失败,API Server 怎么办。

apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
  name: namespacereservations.admission.online.openshift.io
webhooks:
- name: namespacereservations.admission.online.openshift.io
  clientConfig:
    service:
      namespace: default
     name: kubernetes
    path: /apis/admission.online.openshift.io/v1alpha1/namespacereservations
   caBundle: KUBE_CA_HERE
 rules:
 - operations:
   - CREATE
   apiGroups:
   - ""
   apiVersions:
   - "*"
   resources:
   - namespaces
 failurePolicy: Fail

name:Webhook 的名称。变更类的 Hook 会使用名称进行排序。 clientConfig:如何连接,证书信任,以及如何向 Webhook Admission 服务器发送数据。 rules:API Server 应该在什么时机调用 Webhook。这里只有创建 Namespace 的时候才触发。这里可以指定任何资源,例如serviceinstances.servicecatalog.k8s.iocreate操作也是可以定义的。 failurePolicy:如果 Webhook Admission 服务器无法连接,如何处置?有两个选项分别是 ”Ignore“(失败就通过) 和 ”Fail“(失败就拒绝)。失败则通过的设置,可能会导致无法预测的行为。

认证和信任

因为 Webhoo Admission 插件能够获取任何发送过来的请求资源的内容,并且能进行变更,所以很有必要回答下面的问题:

  • API Server 如何检验 Webhook Admission Server。

  • Webhook Server 如何精确认证接入进来的 API Server。

  • 接入的 API Server 是否被授权发送请求。

连接主要分为三种:

  1. 从 Kube API Server 以及扩展 API Server 到外部的 Admission Webhook(可能是部署在集群之外)。

  2. 从 Kube API Server 到自有 Admission Webhooks。

  3. 从扩展 API Server 到自有 Admission Webhooks。

要支持这些类别,Webhook Admission 插件可以用一个 kubeconfig 文件来得知如何连接到独立的服务器。为了和外部的 Admission Webook 进行通信,因为认证、授权都是外部服务器处理的,因此只能手工指定,别无他法。

自有服务来说,一个明智的插件会提供缺省的安全设施,提供简单、安全、可移植、零配置,并可以在各个 API Server 运行的能力。

简单、安全、可移植、零配置

如果把 Webhook Admission 服务器构建成扩展 API Server 的模式,就有可能把它聚合为一个普通的 API 服务器,会收到如下益处:

  • 你的 Webhook 会和其他 API 一样,以类似 kube-apiserver kubernetes.default.svc (例如 https://kubernetes.default.svc/apis/admission.example.com/v1/mymutatingadmissionreviews)服务的面目出现。可以使用kubectl进行测试。

  • 无需任何配置,你的 Webhook 自动具有了集群内置的认证和授权能力,可以使用 RBAC 规则进行访问控制。

  • API Server 和 Webhook 之间可以直接使用内置认证进行通信。

  • 因为通过 Kube API Server 代理通信,因此扩展 API Server 不会泄露 Service Account Token。

简单说来,这一安全拓扑可以使用 API Server 的所有安全机制,并且无需额外配置。

其他用法也是可以的,不过就需要附加的手工配置,以及大量的额外工作来完成同等目标。

如何开发 Webhook admission 服务器?

编写一个具有认证和鉴权能力的完整的服务是个令人生畏的任务。为简化这一工作,有些基于 Kubernetes 1.9 的项目提供了库支持,能把代码量缩减到两百行甚至更少。可以参考 generic-admission-apiserver(注 5)以及 kubernetes-namespace-reservation(注 6)作为创建自己的安全、可移植的 Webhook Server 的示例。

在 1.9 中有了 Admission Webhook,让 Kubernetes 更加贴近用户需求,我们希望 Red Hat 和 Google 的这一工作能让支持更多的工作负载,为整体生态贡献更多(例如 Istio),现在是时候试一试了!

如果有兴趣做出贡献或者反馈,请加入 SIG API machinery(注 7)

注:

  1. https://kubernetes.io/docs/admin/admission-controllers/#what-are-they

  2. https://github.com/kubernetes/metrics

  3. https://github.com/kubernetes-incubator/service-catalog

  4. https://github.com/openshift/kube-projects

  5. https://github.com/openshift/generic-admission-server

  6. https://github.com/openshift/kubernetes-namespace-reservation

  7. https://github.com/kubernetes/community/tree/master/sig-api-machinery

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts