「Kubernetes」- 部署 cert-manager 组件(v1.8)

  CREATED BY JENKINSBOT

问题描述

我们使用 Certbot 工具向 Let’s Encrypt 免费申请并自动续期证书。在 Kubernetes Cluster 中,我们使用 cert-manager 组件来实现。

该笔记将记录:在 Kubernetes Cluster 中,部署 cert-manager 组件,并用其来申请证书的方法,以及相关问题处理。

环境信息

Kuberntes Cluster v1.21
kubectl 1.20.15
cert-manager v1.8.2

解决方案

参考 cert-manager/Installation 文档,官方提供多种安装方法:
1)官方建议 cmctl 插件来安装,但是我们采用 HELM + CRD 的方式进行部署;

参考 Supported Releases 文档,查看不同版本对集群的支持情况:
1)cert-manger 1.8,该版本支持 Kuberntes Cluster v1.21 集群

第一步、安装 cert-manager 组件

服务部署

// ---------------------------------------------------------------------------- // 通过 cmctl 部署

// 最开始我们采用 cmctl 部署,但是后续我们将不再采用 cmctl 工具进行部署,原因是:
// 1)官方暂且未提供通过 cmctl 升级 cert-manager 的方法;
// 2)在升级实践中,仍旧需要通过 HELM 进行升级,而且需要单独升级 CRD 资源;

// 略……

// ---------------------------------------------------------------------------- // 通过 HELM 部署

// 第一步、下载并安装 CRD 资源

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

// 第二步、下载并安装 cert-manager 服务

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

helm pull jetstack/cert-manager --version v1.8.2                                # cert-manager-v1.8.2.tgz

helm show values ./cert-manager-v1.8.2.tgz > cert-manager-v1.8.2.helm-values.yaml

helm --namespace cert-manager                                                  \
    install cert-manager ./cert-manager-v1.8.2.tgz                             \
    -f cert-manager-v1.8.2.helm-values.yaml                                    \
    --create-namespace

helm --namespace cert-manager                                                  \
    upgrade cert-manager ./cert-manager-v1.8.2.tgz                             \
    -f cert-manager-v1.8.2.helm-values.yaml

颁证测试

检查服务运行正常(该部分演示手动测试的方法):
1)创建 Issuer 资源;
2)创建 Certificate 资源;

演示创建自签证书的步骤:

# cat <<EOF > test-resources.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: cert-manager-test
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: test-selfsigned
  namespace: cert-manager-test
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: selfsigned-cert
  namespace: cert-manager-test
spec:
  dnsNames:
    - example.com
  secretName: selfsigned-cert-tls
  issuerRef:
    name: test-selfsigned
EOF

# kubectl apply -f test-resources.yaml
...

# kubectl describe certificate -n cert-manager-test
...
Events:
  Type    Reason     Age   From                                       Message
  ----    ------     ----  ----                                       -------
  Normal  Issuing    20s   cert-manager-certificates-trigger          Issuing certificate as Secret does not exist
  Normal  Generated  20s   cert-manager-certificates-key-manager      Stored new private key in temporary Secret resource "selfsigned-cert-g866q"
  Normal  Requested  20s   cert-manager-certificates-request-manager  Created new CertificateRequest resource "selfsigned-cert-6d85c"
  Normal  Issuing    20s   cert-manager-certificates-issuing          The certificate has been successfully issued

# kubectl delete -f test-resources.yaml
...

第二步、申请 Let’s Encrypt 证书

前面步骤演示如何部署 cert-manager 组件,并成功地完成申请自签名证书的办法,但这并不是我们的实际应用场景。

我们希望通过 cert-manager 组件,在集群内完成 Let’s Encrypt 证书申请和管理。

DNS-01

参考 +Configuring Certificate (alidns) 笔记,获取该问题的解决方案。

HTTP-01

HTTP01 – cert-manager Documentation

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-account-key
    solvers:
    - http01:
        ingress:
          class: nginx

参考文献

cert-manager/Installation/Verifying/Manual verification
How to check TLS Cert Expiration Date
Kubernetes | cert-manager