cert-manager 组件说明

作者:小橙子🍊 发布时间: 2026-02-27 阅读量:2 评论数:0

cert-manager 是 Kubernetes 中最流行的证书管理工具,它将 X.509 证书的签发、续期和生命周期管理自动化。它通过自定义资源定义来扩展 Kubernetes API,使得用户可以像管理 Pod、Service 一样管理证书。
以下是关于 cert-manager 的组件、功能详解以及工作流程图。

一、 cert-manager 的核心组件

cert-manager 部署在 Kubernetes 集群中,通常安装在 cert-manager 命名空间下。它主要由以下三个核心组件(Pods)组成:

1. cert-manager-controller (核心控制器)

这是 cert-manager 的“大脑”。它是一个典型的 Kubernetes 控制器,负责:

  • 监控资源:监听 Certificate, Issuer, Challenge 等 CRD 资源的变化。
  • 协调状态:根据用户定义的期望状态(YAML 文件),执行逻辑以确保证书被签发、更新或修复。
  • 密钥对生成:生成私钥和 CSR(证书签名请求)。
  • 与 Issuer 交互:调用具体的签发者(如 Let's Encrypt、Vault 或 CA)进行证书签发。

2. cert-manager-webhook (Webhook 组件)

这是一个动态准入控制组件,主要功能包括:

  • 验证:在用户创建或更新 IssuerCertificate 等资源时,校验 YAML 内容的合法性(例如检查域名格式、必填字段)。
  • 注入 CA:在某些特定场景下(如 CAInjector 功能),将 CA 证书注入到 Kubernetes 资源中(例如将 CA 注入到 ValidatingWebhookConfiguration 中,实现自签名证书的闭环)。

3. cert-manager-cainjector (CA 注入器)

  • 功能:主要负责将 CA 证书自动注入到 Kubernetes 的 Webhook 配置或 APIService 资源中。这使得 cert-manager 自身以及其他依赖 Webhook 的组件能够正常通过 TLS 通信。

二、 cert-manager 的核心功能

1. 自动化证书签发

这是最核心的功能。支持多种签发来源:

  • ACME 协议:支持 Let's Encrypt 等公开 CA,自动签发免费的可信证书。
  • 私有 CA:使用企业内部的自建 CA 签发证书。
  • Vault:集成 HashiCorp Vault 进行证书管理。
  • 自签名:生成自签名证书,常用于开发测试。

2. 证书自动续期

  • cert-manager 会监控证书的有效期。在证书即将过期前(默认过期前 30 天),它会自动触发续期流程,重新签发新证书并更新对应的 Kubernetes Secret,实现“永不过期”的体验。

3. DNS/HTTP 域名验证

对于 Let's Encrypt 等公开 CA,需要证明你对域名的所有权。cert-manager 支持两种验证方式:

  • HTTP01:通过自动创建 Ingress 路由,让 CA 服务器访问 http://your-domain/.well-known/acme-challenge/... 来验证。
  • DNS01:通过调用云厂商 API(如阿里云 DNS、AWS Route53、Cloudflare)自动添加 TXT 解析记录来验证。支持通配符证书。

4. 信任管理

管理集群内的信任根,将 CA 证书分发到不同的命名空间,供应用程序挂载使用。

三、 核心概念(CRD 资源)

为了理解流程,必须了解几个关键概念:

  • Issuer / ClusterIssuer: 签发者。定义了证书从哪里来(例如 Let's Encrypt 的账号信息)。Issuer 是命名空间级别的,ClusterIssuer 是集群级别的。
  • Certificate: 证书定义。用户创建的资源,描述了我要什么域名、用什么 Issuer 签发、证书存放在哪个 Secret 中。
  • Secret: Kubernetes 原生资源。最终生成的证书文件和私钥会存放在这里。Ingress 或 Pod 会挂载这个 Secret。
  • Order & Challenge: 在 ACME 流程中自动生成的中间资源,用于处理签发请求和域名验证挑战。

四、 cert-manager 工作流程图

以下是一个典型的 ACME (Let's Encrypt) DNS01 验证流程

流程说明:

  1. 用户创建一个 Certificate 资源。
  2. Controller 检测到资源,生成私钥和 CSR,并创建一个 Order(订单)。
  3. CA 返回挑战内容,Controller 创建 Challenge 资源。
  4. Controller 调用 DNS 提供商 API 设置 TXT 记录。
  5. CA 服务器验证 DNS 解析。
  6. 验证通过,CA 签发证书。
  7. Controller 获取证书,存入 K8s Secret。
  8. Ingress 或应用挂载 Secret,HTTPS 生效。

Mermaid 流程图:

graph TD %% 参与者定义 User[用户] API_Server[K8s API Server] CM_Controller[cert-manager Controller] DNS_Provider[DNS 服务商<br>e.g. Cloudflare/阿里云] ACME_Server[ACME CA 服务<br>e.g. Let's Encrypt] K8s_Secret[K8s Secret] Ingress[Ingress 控制器] %% 步骤流程 User -->|1. 创建 Certificate CRD| API_Server API_Server -->|2. 通知事件| CM_Controller subgraph cert-manager 内部逻辑 CM_Controller -->|3. 检查并生成私钥/CSR| CM_Controller CM_Controller -->|4. 创建 Order & Challenge 资源| API_Server end CM_Controller -->|5. 调用 API 设置 TXT 记录| DNS_Provider DNS_Provider -.->|6. DNS 记录生效| DNS_Provider ACME_Server -->|7. 轮询 DNS 验证所有权| DNS_Provider ACME_Server -- DNS验证成功 --> ACME_Server CM_Controller -->|8. 请求签发证书| ACME_Server ACME_Server -->|9. 返回签发证书| CM_Controller CM_Controller -->|10. 将证书和私钥存入 Secret| API_Server API_Server -->|11. 更新 Secret| K8s_Secret K8s_Secret -.->|12. 挂载/引用| Ingress Ingress -->|13. HTTPS 服务就绪| User

五、 详细工作步骤解析(结合上图)

  1. 资源创建:用户编写 YAML 文件,定义一个 Certificate 对象,指定域名(如 example.com)、引用的 Issuer(如 Let's Encrypt 生产环境)以及存储 Secret 的名称。
  2. 控制器感知cert-manager-controller 通过 Informer 机制监听到新的 Certificate 对象创建。
  3. 生成请求:Controller 检查是否已有对应的 Secret。如果没有,它会生成私钥,并据此创建 CSR(证书签名请求)。同时,它会创建一个 Order 资源。
  4. 处理挑战:如果是首次签发或配置变更,Order 会触发 Challenge 资源的创建。Controller 读取 Issuer 中配置的 DNS 凭证,调用云厂商 API 在域名解析中添加一条 _acme-challenge.example.com 的 TXT 记录。
  5. 等待验证:Let's Encrypt 服务器会尝试查询该 TXT 记录。Controller 会轮询状态,一旦检测到 DNS 记录传播成功,它会通知 ACME 服务器进行验证。
  6. 签发证书:验证通过后,ACME 服务器签发证书并返回给 Controller。
  7. 存储结果:Controller 将获得的证书公钥和之前生成的私钥打包,存入 Kubernetes 的 Secret 资源中。
  8. 应用生效:用户的 Ingress 控制器(如 Nginx Ingress)配置了引用该 Secret 的 TLS 规则,检测到 Secret 更新后,自动加载新证书,HTTPS 服务正式对外提供访问。

总结

cert-manager 通过将复杂的 PKI(公钥基础设施)操作转化为 Kubernetes 原生资源管理,极大地降低了 HTTPS 部署的门槛。它的核心价值在于自动化声明式配置,让开发者无需关心证书过期和手动更新证书的繁琐流程。

评论