K8S使用cert-manager自动续订SSL证书

安装cert-manager

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cert-manager.yaml


kubectl get pods --namespace cert-manager

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6866597-zw7kh               1/1     Running   0          2m
cert-manager-cainjector-577f6d9fd7-tr77l   1/1     Running   0          2m
cert-manager-webhook-787858fcdb-nlzsq      1/1     Running   0          2m

配置 Let's Encrypt 颁发者

Let's Encrypt 生产颁发者有非常严格的速率限制。 当进行实验和学习时,很容易达到这些极限。由于这种风险, 我们将从 Let's Encrypt 暂存颁发者开始,一旦我们对它的工作感到满意 我们将切换到生产颁发者。

请注意,你将看到有关暂存颁发者颁发的不受信任证书的警告,但这完全是意料之中的。

颁发者有两种,一种是`Issuer`,一种是`ClusterIssuer`,前者只能在单个命名空间使用,后者可以跨集群使用,yaml文件是一致的,只是在前面要声明`kink`是`Issuer`还是`ClusterIssuer`。

质询方式

使用Let's Encrypt 申请证书需要验证对域名的所有权,验证方式分两种,一种是http01一种是dns01

http01

http01在申请证书的过程中,cert-manager 会在你的 Kubernetes 集群中创建一个临时的 HTTP 服务,该服务用于响应 Let's Encrypt 的验证请求。Let's Encrypt 的服务器将尝试通过公开的 Internet 访问你指定的域名,以获取这个服务上的特定验证文件。如果它能成功访问并验证这个文件,证书发放过程就会继续。

dns01

如果你的环境不能公开访问互联网,则需要考虑使用 dns01 验证方式,这种方式通过 DNS 记录来验证域名所有权,不需要直接的外网访问。

支持dns01质询的有以下服务商

  • ACMEDNS

  • Akamai

  • AzureDNS

  • CloudFlare

  • Google

  • Route53

  • DigitalOcean

  • RFC2136

用CloudFlare平台进行示范

需要域名本身就在CloudFlare上注册的,或者将域名的DNS改到CloudFlare进行管理

申请API Token:

My Profile -- API Tokens

分配权限时,按下面列出的几项进行分配即可。

  • Permissions

    • Zone - DNS - Edit

    • Zone - Zone - Read

  • Zone Resources:

    • Include - All Zones

ClusterIssuer或Issuer的yaml配置文件示例

不支持直接通过DNS01质询的配置示例

有些域名服务商的DNS服务不支持直接通过DNS01质询的,服务则需要增加一个webhook服务进行中转。例如阿里云DNS。

alidns不支持直接使用dns01质询,需要先部署一个alidns webhook的服务来处理。

cert-manager-alidns-webhookarrow-up-right

这是Cert-Manager与阿里云DNS(又名 AliDNS)一起使用的Webhook实现方法。

申请API key/secret:

到阿里云账号的AccessKey页面中去申请。

分配权限时,给予DNS相关的所有权限

部署adlidns webhook

需要用到helm且是3版本,需要提前安装。

修改一下values.yaml中的几个参数。用来适配我们的环境

使用helm部署alidns webhook服务

配合alidns-webhook 使用dns01的ClusterIssuer yaml配置文件

dns的api secret所在的命名空间要保持跟cert-manager pod同一命名空间。否则会报“error getting secret: secrets "……" not found"”

配置Ingress TLS

在配置Ingress TLS之前,还要为对应的Ingress创建一个Certificate资源,用来自动管理签发的证书,并保存到对应的Secret

Certificate示例

Ingress示例

单域名配置

多域名配置

验证、排错

错误处理

这个错误是api认证的问题,检查一下token权限是否正确。

最后更新于