Skip to main content

在 K8S 中使用 cert-manager 签发免费的 HTTPS 证书

cert-manager 是 Kubernetes 上的全能证书管理工具,支持利用 cert-manager 基于 ACME 协议与 Let's Encrypt 签发免费证书并为证书自动续期,实现永久免费使用证书。

准备条件

  • Kubernetes 1.28+
  • Helm 3.8.0+

版本选择

本地 K8S 集群版本为 v1.28.3 ,根据 Supported Releases 选择 cert-manager v1.16.4

Helm 快速安装 cert-manager

在安装 Chart 之前,必须先安装 CustomResourceDefinition 资源,此操作在单独的步骤中执行。

wget -c https://github.com/cert-manager/cert-manager/releases/download/v1.16.4/cert-manager.crds.yaml

添加仓库:

helm repo add jetstack https://charts.jetstack.io --force-update
helm repo update

查看版本:

$ helm search repo jetstack/cert-manager  --versions
NAME CHART VERSION APP VERSION DESCRIPTION
jetstack/cert-manager v1.17.1 v1.17.1 A Helm chart for cert-manager
jetstack/cert-manager v1.17.0 v1.17.0 A Helm chart for cert-manager
jetstack/cert-manager v1.16.4 v1.16.4 A Helm chart for cert-manager
jetstack/cert-manager v1.16.3 v1.16.3 A Helm chart for cert-manager
jetstack/cert-manager v1.16.2 v1.16.2 A Helm chart for cert-manager
jetstack/cert-manager v1.16.1 v1.16.1 A Helm chart for cert-manager
jetstack/cert-manager v1.16.0 v1.16.0 A Helm chart for cert-manager
....

获取 Chart v1.16.4

# 获取离线 Chart
helm pull jetstack/cert-manager --version v1.16.4

# 获取 values
helm show values cert-manager-v1.16.4.tgz > values-cert-manager.yaml

查看目录结构:

$ ls -l
total 1116
-rw-r--r-- 1 root root 948285 Feb 13 20:12 cert-manager.crds.yaml
-rw-r--r-- 1 root root 136958 Mar 12 11:00 cert-manager-v1.16.4.tgz
-rw-r--r-- 1 root root 52411 Mar 12 11:10 values-cert-manager.yaml

创建名称空间

kubectl create namespace cert-manager

安装

$ helm -n cert-manager install cert-manager cert-manager-v1.16.4.tgz -f values-cert-manager.yaml
NAME: cert-manager
LAST DEPLOYED: Wed Mar 12 11:24:14 2025
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
cert-manager v1.16.4 has been deployed successfully!

In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).

More information on the different types of issuers and how to configure them
can be found in our documentation:

https://cert-manager.io/docs/configuration/

For information on how to configure cert-manager to automatically provision
Certificates for Ingress resources, take a look at the `ingress-shim`
documentation:

https://cert-manager.io/docs/usage/ingress/

安装提示中了解到 Issuer Configuration,安装完成后需要配置 ClusterIssuerIssuer 来签发 SSL 证书

Issuer 和 ClusterIssuer

Issuer/ClusterIssuer:用于指示 cert-manager 签发证书的两种方式

  • ClusterIssuer 可以签发所有 namespace 的 SSL 证书
  • Issuers 只可以签发对应 namespace 中的 SSL 证书

校验方式

在了解签发方式后,还需要知道两种校验域名所有权方式:

  • HTTP-01 校验方式的优点是配置简单通用,不同 DNS 提供商均可使用相同的配置方法。缺点是需要依赖 Ingress,若仅适用于服务支持 Ingress 暴露流量,不支持泛域名证书。
  • DNS-01 校验方式的优点是不依赖 Ingress,并支持泛域名。缺点是不同 DNS 提供商的配置方式不同,DNS 提供商过多而 cert-manager 的 Issuer 不能全部支持。部分可以通过部署实现 cert-manager 的 Webhook 服务来扩展 Issuer 进行支持。例如 DNSPod 和 阿里 DNS,详情请参见 Webhook 列表。

本文使用 DNS-01 方式,其限制较少,功能较全。

查看部署状态

$ kubectl -n cert-manager get pods
NAME READY STATUS RESTARTS AGE
cert-manager-76df74df6d-4sr99 1/1 Running 0 12m
cert-manager-cainjector-56889765c6-k2zxt 1/1 Running 0 12m
cert-manager-webhook-84f6d5b45c-nw9h5 1/1 Running 0 12m

cert-manager 本身是不支持国内 DNS解析服务商的,但官方给出了一些社区的提供方案:cert-manager Webhook

在接下来的文章中,将介绍为腾讯云 DnsPort 和 阿里云云解析 管理的域名签发免费的 SSL 证书。

参考文档