问题描述
在部署 cert-manager 成功后,便能够使用它申请 Let’s Encrypt 证书。
该笔记将记录:在 Kubernetes 中,如何使用 cert-mananager 申请 TLS 证书。
解决方案
前置条件
完成 cert-manager 部署;
背景知识
需要阅读如下文档:
cert-manager/Configuration/ACME
—- cert-manager/Configuration/ACME/DNS01
——– cert-manager/Configuration/ACME/DNS01/Webhook
我们使用实现 ACME 的 Let’s Encrypt 服务来申请证书,并使用 DNS01 完成质询,所以应该创建类似如下 ClusterIssuer 资源文件:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: example-issuer spec: acme: email: user@example.com server: https://acme-staging-v02.api.letsencrypt.org/directory privateKeySecretRef: name: example-issuer-account-key solvers: - dns01: cloudDNS: project: my-project serviceAccountSecretRef: name: prod-clouddns-svc-acct-secret key: service-account.json
但是,我们使用阿里云 DNS 服务,而不是 cloudDNS 服务,所以上述配置是不行的(无法完成 DNS01 质询)。并且官方仅支持 ACMEDNS、Akamai、AzureDNS、CloudFlare、Google、Route53、DigitalOcean、RFC2136 这些服务,并不包含我们所使用的阿里云服务商。
好在 cert-manager 支持 Webhook 以允许定义自己的 DNS provider(这些便是 out-of-tree DNS provider),而这里便有开源的 AliDNS-Webhook 供我们使用。参考 alidns-webhook/README.md at master 文档,获取详细的配置使用方法。
第一步、部署 AliDNS-Webhook 实现
结合 AliDNS-Webhook 文档,我们所使用的资源文件及部署过程如下:
./01-bundle.yaml
替换文件的 acme.yourcompany.com 修改为公司域名,比如 acme.example.com 域名;
./02-alidns-secret.yaml
填写阿里云 API 访问的 Access ID 与 Access Key 参数;
./03-letsencrypt-clusterissuer.yaml
文件的 groupName 要与 ./01-bundle.yaml 的 group 要保持一致。这里设置为 acme.example.com 参数。
./04-examplexyz-certificate.yaml
kubectl apply -f ./01-bundle.yaml kubectl apply -f ./02-alidns-secret.yaml kubectl apply -f ./03-letsencrypt-clusterissuer.yaml kubectl apply -f ./04-examplexyz-certificate.yaml
第二步、检查证书是否申请成功
# kubectl describe -n default certificates.cert-manager.io example-xyz ... Status: Conditions: Last Transition Time: 2021-05-07T01:30:33Z Message: Certificate is up to date and has not expired Observed Generation: 1 Reason: Ready Status: True Type: Ready Not After: 2021-08-05T00:30:32Z Not Before: 2021-05-07T00:30:32Z Renewal Time: 2021-07-06T00:30:32Z Revision: 1 Events: <none> # kubectl get certificates.cert-manager.io NAME READY SECRET AGE example-xyz True example-xyz 2m // 此时,证书申请成功
第三步、切换到 Let’s Encrypt 生产环境
证书申请成功之后,还有最后一件事情:我们这里仅是在 Let’s Encrypt 的 Staging 环境中完成申请证书的测试,还需要切换到 Let’s Encrypt 生产环境。
修改 ./03-letsencrypt-clusterissuer.yaml 的 server: 为 https://acme-v02.api.letsencrypt.org/directory 以使用生产环境来申请真正的证书。
第四步、配置 Ingress 证书
参考 Securing Ingress Resources 笔记。
补充说明
更多 DNS 服务商,参考 cert-manager-webhook · GitHub Topics 页面。
参考文献
alidns-webhook/README.md at master · pragkent/alidns-webhook
DNS01 | cert-manager
Boulder: The Let’s Encrypt CA
Staging Environment – Let’s Encrypt