使用 cert-manager 为 DNSPod 的域名签发免费证书

Cert Manager

Posted by BlueFat on Wednesday, September 16, 2020

cert-manager是一个云原生证书管理开源工具,用于在Kubernetes集群中提供HTTPS证书并自动续期。以下示例介绍了如何使用cert-manager申请免费证书并自动续期。

1. 安装 cert-manager

安装 cert-manager,详情可参见 使用 cert-manager 签发免费证书

通常使用 yaml 方式一键安装 cert-manager 到集群,可参考官网文档 Installing with regular manifests。

执行以下命令,部署cert-manager。

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

执行以下命令,查看Pod状态。

kubectl get pods -n cert-manager

预期输出:

NAME                     READY   STATUS    RESTARTS   AGE
cert-manager-1           1/1     Running   0          2m11s
cert-manager-cainjector  1/1     Running   0          2m11s
cert-manager-webhook     1/1     Running   0          2m10s

执行以下命令,创建ClusterIssuer。

可跳过,此操作只适合公网http验证且不支持泛域名,下面步骤使用cert-manager-webhook-dnspod

cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
 name: letsencrypt-prod-http01
spec:
 acme:
   server: https://acme-v02.api.letsencrypt.org/directory
   email: <your_email_name@gmail.com>  #替换为您的邮箱名。
   privateKeySecretRef:
     name: letsencrypt-http01
   solvers:
   - http01: 
       ingress:
         class: nginx
EOF

执行以下命令,查看ClusterIssuer。

kubectl get clusterissuer

预期输出:

NAME                         READY   AGE
letsencrypt-prod-http01      True    17s

2. 创建 DNSPod 密钥

登录 DNSPod 控制台,在 密钥管理 中创建密钥,复制自动生成的 IDToken 并保存。如下图所示:

3. 安装 cert-manager-webhook-dnspod

使用 HELM 来安装 cert-manager-webhook-dnspod,需准备 HELM 配置文件。 dnspod-webhook-values.yaml 示例如下:

groupName: example.your.domain # 写一个标识 group 的名称,可以任意写

secrets: # 将前面生成的 id 和 token 粘贴到下面
  apiID: "<ID>"
  apiToken: "<Token>"

clusterIssuer:
  enabled: true # 自动创建出一个 ClusterIssuer
  email: your@email.com # 填写你的邮箱地址

完整配置请参见 values.yaml

使用 HELM 进行安装:

git clone --depth 1 https://github.com/qqshfox/cert-manager-webhook-dnspod.git
helm upgrade --install -n cert-manager -f dnspod-webhook-values.yaml cert-manager-webhook-dnspod ./cert-manager-webhook-dnspod/deploy/cert-manager-webhook-dnspod

4. 创建证书

使用如下所示 YAML 文件创建 Certificate 对象来签发免费证书:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com-crt
  namespace: default
spec:
  secretName: example-com-crt-secret # 证书保存在这个 secret 中
  issuerRef:
    name: cert-manager-webhook-dnspod-cluster-issuer # 这里使用自动生成出来的 ClusterIssuer
    kind: ClusterIssuer
    group: cert-manager.io
  dnsNames: # 填入需要签发证书的域名列表,确保域名是使用 dnspod 管理的
  - example.com
  - *.example.com

等待状态变成 Ready 表示签发成功:

$ kubectl -n default get certificates.cert-manager.io
NAME              READY   SECRET                   AGE
example-com-crt   True    example-com-crt-secret   25d

执行以下命令,查看Secret。

kubectl get secret

若签发失败可通过 describe 查看原因:

kubectl -n istio-system describe certificates.cert-manager.io example-com-crt

5. 使用证书

证书签发成功后会保存到指定的 Secret 中,可参考以下使用示例:

在 Ingress 中使用

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-prod
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: test.example.com
    http:
      paths:
      - backend:
          service:
            name: web-prod
            port:
              number: 80
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - test.example.com
    secretName: example-com-crt-secret

参考

使用 cert-manager 签发免费证书
使用 cert-manager 为 DNSPod 的域名签发免费证书