「cert-manager」- 申请免费证书 | CERT-MANAGER | KUBERNETES-ADDONS

该笔记将记录:在 Kubernetes Cluster 中,如何使用 Cert Manager 来管理 Let’s Encrypt 证书,以及相关问题的处理方法。在 Kubernetes Cluster 中,部署 cert-manager 组件,并用其来申请证书的方法,以及相关问题处理;

认识

官网:https://cert-manager.io/
文档:https://cert-manager.io/docs/
仓库:https://github.com/cert-manager/cert-manager

以前,我们使用 ACME 脚本来申请 Let’s Encrypt 证书,享受着免费证书和脚本自动化的便利,部署 HTTPS 是那么简单。现在,我们切换到 Kubernetes 环境后,我们该怎样处理呢?最简单最直接的方法就是继续使用 ACME 申请证书,然后使用这个证书创建 Secret 对象,最后在 Ingress 中应用该 Secret 对象。但是 Let’s Encrypt 证书三个月到期,届时我们则需要继续证书续期,然后更新 Secret 信息,这绝对是项繁琐且易失误的工作。

我们能够将 ACME 搬到 Kubernetes 集群中,实现证书的管理。但是,现在已有 cert-manager 组件,它将负责完成证书申请、自动续期等等系列任务,让我们从繁琐的工作中解脱出来。

简而言之,我们使用 Certbot 工具向 Let’s Encrypt 免费申请并自动续期证书。在 Kubernetes Cluster 中,我们使用 cert-manager 组件来实现同样的诉求。

组成

整体架构以及各资源的作用

—— 该部分将介绍在 cert-manager 中需要知晓的基本概念及其技术架构。

Certificate -> CertificateRequest -> Order -> Challenge

Issuer

在 cert-manager 中,术语 Issuer 能够理解为“证书颁发机构(CA)”。支持以下类型:
1)SelfSigned,自签名证书;
2)CA,此类似代表证书及私钥在集群中的证书颁发机构;
3)Vault,第三方证书颁发机构;
4)Venafi,第三方证书颁发机构;
5)ACME,使用 ACME 协议获取证书。当然不限于 Let’s Encrypt 机构;
5)External,除了上述类型外,通过该方法能够自定义证书机构,以处理 CertificateRequest 资源;

Issuer 分为两种:命名空间级别的 Issuer 资源;集群级别的 ClusterIssuer 资源;

Certificate

当定义 CA(Issuer)之后,便能够申请证书,此时使用 Certificate 资源。

该对象引用 Issuer 或 ClusterIssuer 资源:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: acme-crt
spec:
  secretName: acme-crt-secret
  dnsNames:
  - foo.example.com
  - bar.example.com
  issuerRef:
    name: letsencrypt-prod
    # We can reference ClusterIssuers by changing the kind here.
    # The default value is Issuer (i.e. a locally namespaced Issuer)
    kind: Issuer
    group: cert-manager.io

CertificateRequest

当创建 Certificate 资源,cert-manager 将创建 CertificateRequest 资源来申请证书。

注意事项:通常 CertificateRequest 资源无需我们手动创建,也不应该由用户手动创建。

Order and Challenge

Order 与 Challenge 资源是为了完成“ACME 质询”而引入的资源。

ACME issuer 将使用 Order 资源来管理签发的 TLS 证书的生命周期。Order 资源为该 “acme order(订单?)” 封装多个“ACME 质询”,因此将管理一个或多个 Challenge 资源。

ACME issuer 将使用 Challenge 资源来管理“必须完成的 ACME 质询”的生命周期,以验证域名的所有权。

注意事项:
1)Order 资源永远都无需我们手动创建;

其他术语

OLM – Operator Lifecycle Manager,根据 Google: k8s what is olm 结果输出比例,该术语目前(09/17/2021)与 OpenShift 有关,因此我们的场景无需理会该内容。

性质

1)简化证书管理,实现证书申请与自动化需其;
2)具有与多个证书颁发机构(CA)进行交互的标准化 API;
3)证书的管理更加安全;
4)支持 ACME(Let’s Encrypt),HashiCorp Vault,Venafi,自签名,内部 CA;
5)可扩展以支持其他 CA;

构建

安装 cert-manager 组件 | 该笔记将记录:在 Kubernetes Cluster 中,部署 cert-manager 组件来申请证书,以及相关问题的解决办法。

版本选择

参考文档,以获取详细细节:https://cert-manager.io/docs/releases/

1.18 | Kubernetes 1.29 → 1.33 / 4.16 → 4.18 | 1.29 → 1.33
1.17 | Kubernetes 1.29 → 1.33 / 4.16 → 4.18 | 1.29 → 1.32

部署方式

Kubernetes | cert-manager

官方提供多种安装方式,从最早的 kubectl appply 方式,再到 kubectl cert-manager 扩展,再到现在(04/01/2022)的 cmctl 专用命令行工具。

最开始我们采用 cmctl 部署,但是后续我们将不再采用 cmctl 工具进行部署,原因是:

  • 官方暂且未提供通过 cmctl 升级 cert-manager 的方法;
  • 在升级实践中,仍旧需要通过 HELM 进行升级,而且需要单独升级 CRD 资源;

现在(05/26/23),我们多以 Helm 进行部署,以便于相关配置文件的管理及维护;
Installing with Helm | https://cert-manager.io/docs/installation/helm/

服务升级

Upgrading from v0.15 to v0.16 | cert-manager

应用

1)在 Ingress 中,自动申请证书,以提供 HTTPS 连接

kube-cert-manager 与 kube-lego 是相同的项目,但是现在都处于维护模式,推荐使用 cert-manager 项目。

申请 Let’s Encrypt 证书

前面步骤演示如何部署 cert-manager 组件,并成功地完成申请自签名证书的办法,但这并不是我们的实际应用场景;

我们希望通过 cert-manager 组件,在集群内完成 Let’s Encrypt 证书申请和管理;

DNS-01 | 参考 Solutions to Scenarios (04):Request Certificate (alidns) 笔记,获取该问题的解决方案;

HTTP-01 | HTTP01 – cert-manager Documentation

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-account-key
    solvers:
    - http01:
        ingress:
          class: nginx

在 ACK 中,鉴于集群网络特性,需要修改 nginx-ingress-lb 这个 svc 的 internalTrafficPolicy 改成 Cluster,否则 Order 的 selftest 将失败;

改进

中心化的证书管理 Centralized Secret Management

Let’s Ecnrypt 证书频率限制;

参考 Using wildcard certificates with cert-manager in Kubernetes and replicating across all namespaces 文章,以获得详细说明。

其大致过程如下:
1)通过 Issuer 资源,集中申请泛域名证书,保存在 cert-manager 命名空间;
2)通过 kubernetes-replicator(或其他同类)服务,进行 Secret 资源复制;
3)在 Ingress 中,引用该 Secret 资源;

参考

Welcome to cert-manager
PalmStoneGames/kube-cert-manager: Manage Lets Encrypt certificates for a Kubernetes cluster.
jetstack/kube-lego: DEPRECATED: Automatically request certificates for Kubernetes Ingress resources from Let’s Encrypt
cert-manager/Issuer/Supported Issuers
Concepts | cert-manager