使用cert-manager管理你k8s的证书

简介

cer-manager 是一个证书管理器,可以自动颁发和更新证书来保护ingress

安装

首先下载yaml文件

wget https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml

之后apply这个yaml文件

kubectl apply -f cert-manager.yaml

如果没有特殊情况就安装成功了

1
2
3
4
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-cainjector-78845d8846-426lh   1/1     Running   0          2d18h
cert-manager-webhook-578944d587-l4rnr      1/1     Running   0          2d18h
cert-manager-6945c55d49-cfbbh              1/1     Running   0          2d18h

配置ClusterIssuer

在申请证书之前我们要配置一个ClusterIssuer,ClusterIssuer可以签发所有namespace的证书,但是Issuers只可以签发对应namespace中的证书,为了方便那就直接配置一个ClusterIssuer

cert-manager 有两种验证你的域名是你的域名的方式,分别是dns和http验证,为了方便我就使用了dns的方式,使用dns的方式会给你添加一个txt的解析,目前cert-manager支持以下dns提供商

  • ACMEDNS
  • Akamai
  • AzureDNS
  • CloudFlare
  • Google
  • Route53
  • DigitalOcean
  • RFC2136

我使用的是cloudflare

首先需要创建一个secret去存放你的cloudflare token

cloudflare-token-secret.yaml

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
stringData:
  api-token: 您的token

cloudflare的api token需要下面两个权限

  • zone read权限
  • dns edit权限

之后创建ClusterIssuer

issuer.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  namespace: cert-manager
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - dns01:
        cloudflare:
          email: [email protected]
          apiTokenSecretRef:
            name: cloudflare-api-token-secret
            key: api-token

接着创建证书

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: www.xxx.com
  namespace: argocd
spec:
  dnsNames:
  - www.xxx.com # 要签发证书的域名
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt-dns01 # 引用 ClusterIssuer,指示采用 dns01 方式进行校验
  secretName: xxx-tls # 最终签发出来的证书会保存在这个 Secret 里面

创建ingress

 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
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: xxx-ingress
  namespace: xxx
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: "www.xxx.cn"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: xxx-server
            port:
              number: 443
  tls:
  - hosts:
    - www.xxx.cn
    secretName: xxx-tls

欢迎关注我的博客 www.bboy.app

Have Fun