|
| 1 | +--- |
| 2 | +title: "Istio 在 GKE 上的无缝 TLS 体验:使用自定义 Admission Controller 自动签发证书" |
| 3 | +summary: "在GKE上使用Istio时,TLS证书管理复杂,cert - manager无法基于注解自动配置。本文介绍通过FastAPI等构建自定义Kubernetes准入控制器,拦截Istio Gateway请求,自动创建证书,实现无缝TLS证书自动配置。 " |
| 4 | +authors: ["Sayed Imran"] |
| 5 | +translators: ["云原生社区"] |
| 6 | +categories: ["Istio"] |
| 7 | +tags: ["TLS","Istio","GKE"] |
| 8 | +draft: false |
| 9 | +date: 2025-04-10T20:54:00+08:00 |
| 10 | +links: |
| 11 | + - icon: language |
| 12 | + icon_pack: fa |
| 13 | + name: 阅读英文版原文 |
| 14 | + url: https://medium.com/google-cloud/seamless-tls-for-istio-on-gke-auto-provisioning-certificates-with-a-custom-admission-controller-b7968053d226 |
| 15 | +--- |
| 16 | + |
| 17 | +Istio 已经成为 Kubernetes 中服务间通信管理的事实标准,提供了强大的流量治理、安全防护和可观测性能力。然而,当我们在 **Google Kubernetes Engine (GKE)** 上通过 Istio Gateway 暴露服务时,TLS 证书的管理仍然是一项挑战。 |
| 18 | + |
| 19 | +尽管 **cert-manager** 在 Kubernetes 中简化了证书的签发过程,但目前它并不支持基于注解自动为 Istio Gateway 签发证书。这使得用户需要手动创建 `Certificate` 和 `Issuer` 等资源,不仅繁琐,还容易产生配置不一致,增加了运维负担。 |
| 20 | + |
| 21 | +为了填补这一空缺,本文提出了一种基于 **Kubernetes Admission Controller** 的自动化方案,实现证书的自动签发与注入。 |
| 22 | + |
| 23 | +## GKE 用户为何需要关注? |
| 24 | + |
| 25 | +对于在 GKE 上运行 Istio 的团队而言,尤其是在大规模多微服务场景下,手动管理证书效率低下。虽然 GKE 支持 Google 托管证书,但出于灵活性和对多种 CA 支持的考虑,许多团队依然倾向于使用 **cert-manager**。本文介绍的解决方案,正是为了让 cert-manager 能无缝与 Istio Gateway 集成,在保持安全性与可靠性的前提下,实现自动化证书管理。 |
| 26 | + |
| 27 | +## 技术栈 |
| 28 | + |
| 29 | +Admission Controller 采用以下技术实现: |
| 30 | + |
| 31 | +- **FastAPI**:高性能 Python Web 框架,作为 Webhook 服务的主干。 |
| 32 | +- **Uvicorn**:轻量级 ASGI 服务器,用于部署 FastAPI 应用。 |
| 33 | +- **Kubernetes Python SDK**:用于与 K8s API 交互,动态创建证书资源。 |
| 34 | +- **Docker**:用于容器化 webhook 服务,方便部署与交付。 |
| 35 | +- **Google Kubernetes Engine (GKE)**:控制器的运行平台。 |
| 36 | + |
| 37 | +项目地址:[Istio-Cert Admission Controller](https://github.com/Sayed-Imran/istio-cert-manager-webhook) |
| 38 | + |
| 39 | +在进入具体实现前,我们先了解一下 Kubernetes 中的 webhook 机制。 |
| 40 | + |
| 41 | +## Kubernetes Admission Webhook:验证与修改 |
| 42 | + |
| 43 | +Admission Webhook 可拦截 Kubernetes API 请求,在资源落库前进行校验或修改,是实现策略控制与自动化的关键机制。Kubernetes 支持两种主要类型的 Webhook: |
| 44 | + |
| 45 | +### 1. Validating Webhook(验证型) |
| 46 | + |
| 47 | +用于在资源创建或修改前进行校验,若不符合预期规范可直接拒绝该请求。 |
| 48 | + |
| 49 | +**典型场景**:校验每个 Istio Gateway 是否包含合法的 `host` 字段。 |
| 50 | + |
| 51 | +### 2. Mutating Webhook(变更型) |
| 52 | + |
| 53 | +可对资源进行修改,如注入默认值或自动添加注解。 |
| 54 | + |
| 55 | +**典型场景**:为 Istio Gateway 自动添加 `cert-manager.io/issuer` 注解,触发证书自动签发。 |
| 56 | + |
| 57 | +在本文中,我们实现的是一个 **Validating Webhook**,它不仅校验 `issuer` 是否存在,还在条件满足时自动创建对应的 `Certificate` 资源;若 `issuer` 不存在,则直接拒绝请求。 |
| 58 | + |
| 59 | +## 架构设计概览 |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +Admission Controller 主要分为三个层次: |
| 64 | + |
| 65 | +### **API 层** |
| 66 | + |
| 67 | +负责接收来自 K8s API Server 的 AdmissionReview 请求,提取 JSON Payload 并转交给 Handler 层进行处理。 |
| 68 | + |
| 69 | +### **Handler 层** |
| 70 | + |
| 71 | +核心校验逻辑所在,判断 Istio Gateway 是否包含以下注解: |
| 72 | + |
| 73 | +- `cert-manager.io/issuer` |
| 74 | +- `cert-manager.io/cluster-issuer` |
| 75 | + |
| 76 | +#### 场景 1:未包含注解 |
| 77 | + |
| 78 | +直接返回允许响应(`allowed: true`),跳过进一步处理: |
| 79 | + |
| 80 | +```json |
| 81 | +{ |
| 82 | + "apiVersion": "admission.k8s.io/v1", |
| 83 | + "kind": "AdmissionReview", |
| 84 | + "response": { |
| 85 | + "allowed": true, |
| 86 | + "uid": "xxx-xxx", |
| 87 | + "status": { |
| 88 | + "message": "Validation passed" |
| 89 | + } |
| 90 | + } |
| 91 | +} |
| 92 | +``` |
| 93 | + |
| 94 | +> 注意:返回响应的 `uid` 字段必须与请求中的完全一致。 |
| 95 | +
|
| 96 | +#### 场景 2:包含注解 |
| 97 | + |
| 98 | +Webhook 会进一步查询指定的 `Issuer` 或 `ClusterIssuer` 是否存在: |
| 99 | + |
| 100 | +- 若存在:放行请求。 |
| 101 | +- 若不存在:返回 `allowed: false`,并提示该 Issuer 不存在,防止错误引用导致证书无法生成。 |
| 102 | + |
| 103 | +这一机制确保了 Gateway 不会引用不存在的 CA,提高配置安全性。 |
| 104 | + |
| 105 | +## Kubernetes 工具层:实现证书自动创建 |
| 106 | + |
| 107 | +不同于传统 webhook 仅验证请求,该层进一步实现了 **资源创建功能**。一旦校验通过,将自动创建 `Certificate` 资源,并配置以下特性: |
| 108 | + |
| 109 | +- 根据注解设定 `issuerRef`。 |
| 110 | +- 支持注解配置有效期(`duration`)、续期时间(`renewBefore`)等字段。 |
| 111 | +- 自动注入 `ownerReference`,绑定到原始 Gateway 对象上,实现生命周期联动,当 Gateway 删除时自动清理证书。 |
| 112 | + |
| 113 | +通过这一机制,原本繁琐的证书配置过程被自动化处理,极大减少人为错误: |
| 114 | + |
| 115 | +1. 无需手动创建 Gateway 后再手动生成证书。 |
| 116 | +2. 不需手动填写各种元数据或维护引用关系。 |
| 117 | + |
| 118 | +## 与 Kubernetes 对接:注册 ValidatingWebhookConfiguration |
| 119 | + |
| 120 | +最后一步是将 Admission Controller 注册为 Kubernetes 的 Validating Webhook,配置拦截哪些操作。具体设置为监听对 Istio Gateway 的 `CREATE` 与 `UPDATE` 操作。 |
| 121 | + |
| 122 | +示意配置如下: |
| 123 | + |
| 124 | + |
| 125 | + |
| 126 | +> 注意:Webhook 服务必须通过 HTTPS 提供服务,K8s API Server 仅支持加密通信。 |
| 127 | +
|
| 128 | +## 总结 |
| 129 | + |
| 130 | +通过扩展传统 Admission Controller 的功能,实现了与 Istio Gateway 紧密集成的 TLS 自动签发方案。它兼具自动化与生命周期感知,不仅提升了配置一致性,也减少了证书管理的复杂性。 |
| 131 | + |
| 132 | +尽管此方案主要面向 Istio + cert-manager,但该模式也适用于其他资源的自动创建与治理场景。只需结合合理的校验逻辑、资源绑定策略与安全机制,Admission Controller 就能成为 Kubernetes 中强大的自动化利器。 |
| 133 | + |
| 134 | +如果你对云原生安全治理、证书生命周期管理或 Istio Gateway 的自动化感兴趣,可以进一步参考项目代码并进行实践部署:https://github.com/Sayed-Imran/istio-cert-manager-webhook |
0 commit comments