Skip to content

Commit b8a8d87

Browse files
committed
Add new blog
1 parent 30d7513 commit b8a8d87

File tree

3 files changed

+134
-0
lines changed

3 files changed

+134
-0
lines changed
131 KB
Loading
157 KB
Loading
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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+
![架构设计概览](f1.png)
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+
![示意配置](f2.png)
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

Comments
 (0)