1. 说明

项目地址: cert-manager

CertManager 需要以下镜像:

1
2
3
quay.io/jetstack/cert-manager-cainjector:v1.9.1
quay.io/jetstack/cert-manager-controller:v1.9.1
quay.io/jetstack/cert-manager-webhook:v1.9.1

2. 导入资源

由于 CertManager 的配置过于庞大,不便于在此展示,可将文件 conf/cert-manager.yaml 推送到控制节点,再使用 kubectl apply -f cert-manager.yaml 导入资源。

或者你可以使用以下命令在线导入资源:

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

导入完成后使用以下命令查看结果:

1
kubectl get pods -n cert-manager

3. 创建证书

此次测试需要有一个域名,同时需要 Cert-Manager 支持此域名服务商的 DNS API。

3.1. 创建ApiKey

添加 Cloudflare ApiSecret

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Secret
metadata:
  name: secret-cert-manager-cloudflare-api-token
  namespace: cert-manager
type: Opaque
stringData:
  # 需要修改为实际数据
  api-token: '<请填写你的 CloudFlare 账户的Token值>' (1)
其中:
1 此处填写你 CloudFlare API Token

将此文件保存至 api.yaml 后执行 kubectl apply -f api.yaml 即可。

3.2. 绑定 Issuer

将 Cloudflare API 绑定至 ClusterIssuer。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: issuer-dns01-cloudflare-1
  namespace: cert-manager
spec:
  acme:
    privateKeySecretRef:
      name: lets-encrypt-dns01
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
      - dns01:
          cloudflare:
            email: '<请填写你的 CloudFlare 账户邮箱信息>' (1)
            apiTokenSecretRef:
              name: secret-cert-manager-cloudflare-api-token (2)
              key: api-token
1 此处填写你的 Cloudflare Email
2 关联的 Cloudflare Token

将此文件保存至 issuer.yaml 后执行 kubectl apply -f issuer.yaml 即可。

3.3. 签发证书

接下来使用测试域名 d7z.net 签发证书。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: 'cert-d7z-net'
  namespace: cert-manager
spec:
  secretTemplate:
    annotations:
      reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops" (1)
      reflector.v1.k8s.emberstack.com/reflection-allowed: "true"  (2)
      reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"  (3)
      reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops"  (4)
  privateKey:
    algorithm: RSA
    size: 4096
  dnsNames: (5)
    - 'd7z.net'
    - '*.d7z.net' # 通用公开地址
    - '*.pages.d7z.net' # gitlab pages 相关地址
  issuerRef:
    kind: ClusterIssuer
    name: issuer-dns01-cloudflare-1  (6)
  secretName: 'tls-pub-d7z'
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: 'cert-internal-d7z-net'
  namespace: cert-manager
spec:
  secretTemplate:
    annotations:
      reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops" (1)
      reflector.v1.k8s.emberstack.com/reflection-allowed: "true"  (2)
      reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"  (3)
      reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: "kube-system,default,core-system,core-middleware,core-app,share-app,monitor-app,dev-ops"  (4)
  privateKey:
    algorithm: RSA
    size: 4096
  dnsNames: (5)
    - 'internal.d7z.net'
    - '*.internal.d7z.net' # 通用私有地址
  issuerRef:
    kind: ClusterIssuer
    name: issuer-dns01-cloudflare-1  (6)
  secretName: 'tls-pri-d7z'
其中:
1 reflector 相关配置:管理的命名空间
2 reflector 相关配置:允许镜像
3 reflector 相关配置:自动镜像
4 reflector 相关配置:自动镜像的命名空间
5 配置证书下的 dns.01 内容,可添加通配符证书
6 选择对应的 Issuer

3.4. 验证

执行以下命令,查看对应证书的签发状态

1
2
# 查看证书签发状态
kubectl get certificate -n cert-manager

如果 READY 项为 True,则表明证书签发成功。

1
2
3
NAME               READY   SECRET                 AGE
cert-d7z-net       True    tls-pub-d7z            18h
cert-internal-d7z-net       True    tls-pri-d7z            18h
注意,需要填充的内容必须真实有效,否则将导致签发失败。如果没有可用的域名可参考 笔记 中的自签名证书。