安装cert-manager

安装cert-manager

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

卸载 cert-manager

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

DNS-01 校验方式签发证书

  1. 登录 cloudflare,点到 My Profile > API Tokens > Create Token 来创建 Token:

    复制 Token 并妥善保管
  2. 将 Token 保存到 Secret 中:
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
stringData:
  api-token: <API Token> # 粘贴 Token 到这里,不需要 base64 加密。
  1. 创建 ClusterIssuer
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dns01
spec:
  acme:
    privateKeySecretRef:
      name: letsencrypt-dns01
    email: [email protected]
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - dns01:
        cloudflare:
          email: [email protected] 
          apiTokenSecretRef:
            name: cloudflare-api-token-secret
            key: api-token
  1. 创建 Certificate
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
 name: mydomain-com
 namespace: default
spec:
 dnsNames:
  - mydomain.com
  - "*.mydomain.com" 
 issuerRef:
   kind: ClusterIssuer
   name: letsencrypt-dns01 # 引用 ClusterIssuer,指示采用 dns01 方式进行校验
 secretName: mydomain-com-tls # 最终签发出来的证书会保存在这个 Secret 里面

获取和使用证书

创建好 Certificate 后,等一小会儿,我们可以 kubectl 查看是否签发成功

kubectl get certificate 
NAME                READY   SECRET                  AGE
mydomain-com   True    test-mydomain-com-tls   1m

如果 READYFalse 表示失败,可以通过 describe 查看 event 来排查失败原因:

kubectl describe certificate mydomain-com

如果为 True 表示签发成功,证书就保存在我们所指定的 Secret 中 (上面的例子是 default/mydomain-com-tls),可以通过 kubectl 查看:

kubectl get secret mydomain-com-tls -n default
...
data:
  tls.crt: <cert>
  tls.key: <private key>

其中 tls.crt 就是证书,tls.key 是密钥。

你可以将它们挂载到你需要证书的应用中,或者使用自建的 Ingress,可以直接在 Ingress 中引用 secret,示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # 添加指示要使用的issuer的注释。
    cert-manager.io/cluster-issuer: letsencrypt-dns01
  name: myIngress
  namespace: myIngress
spec:
  rules:
  - host: mydomain-com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: myservice
            port:
              number: 80
  tls: 
  - hosts:
    - mydomain-com
    secretName: mydomain-com-tls 
最后修改:2022 年 04 月 18 日
感谢您的支持