K8S使用Cert-Manager签发证书

K8s使用Cert-Manager签发证书

概念

Cert-Manager配置列表

Issuer/ClusterIssuer 用于指示 cert-manager 用什么方式签发证书,本文主要讲解签发免费证书的 ACME 方式。ClusterIssuer 与 Issuer 的唯一区别就是 Issuer 只能用来签发自己所在 namespace 下的证书,ClusterIssuer 可以签发任意 namespace 下的证书。

Certificate 用于告诉 cert-manager 我们想要什么域名的证书以及签发证书所需要的一些配置,包括对 Issuer/ClusterIssuer 的引用。

CertificateRequests 用于从颁发者请求 X.509 证书。该资源包含 PEM 编码证书请求的 base64 编码字符串,该请求被发送到引用的颁发者。根据证书签名请求,成功颁发将返回签名证书。通常该资源由控制器或其它系统使用的管理。

安装

K8S的版本必须高于v1.19.0。否则请参见其他文章。

方式1

Bash
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.11.0 \

方式2

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

查看安装情况:

Bash
kubectl get pods -n cert-manager -w

卸载

Bash
helm uninstall cert-manager -n cert-manager
kubectl delete ns cert-manager

创建 ACME ClusterIssuer

YAML
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    # 你需要在这里替换为你的EMAIL地址
    email: user@example.com
    privateKeySecretRef:
      # 签发机构的私钥存储的Secret名称
      name: letsencrypt-account-key
    solvers:  
    # 有多种可选项,见下文
    - http01:
        ingress:
          class: nginx

将文件保存为cluster-issuer.yaml,然后执行命令

Bash
kubectl apply -f cluster-issuer.yaml

关于solvers的官方手册:

此文在这里使用DNS01进行验证。所以要将上文的HTTP01替换为下文:

YAML
- dns01:
    cloudflare:
        serviceAccountSecretRef:
            name: cloudflare-api-token-secret
            key: api-token

笔者使用了Cloudflare来托管域名,使用DNS01方式认证必须在Cloudflare上创建域名访问的API Key。创建API Key的方法可以点击此处找到。

执行apply后确认状态:

Bash
kubectl get ClusterIssuer

创建 ClusterIssuer Secret

YAML
apiVersion: v1
kind: Secret
metadata:
  # 名称必须与上文的serviceAccountSecretRef.name相同
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
data:
  # 在这里需要设置你的cloudflare的Token
  # 名称必须与上文的serviceAccountSecretRef.key相同
  api-token: <API Token>

将文件保存为issuer-secret.yaml,然后执行命令:

Bash
kubectl apply -f issuer-secret.yaml

执行apply后确认状态:

Bash
kubectl get secret cloudflare-api-token-secret  -n cert-manager

配置POD

在你需要使用ingress的pod中加入以下配置:

YAML
  hosts:
    - host: example.com
      paths:
        - path: /
          pathType: Prefix
  tls: 
    - secretName: example-ssl-cert
      hosts:
        - example.com

通常情况下,等待一段时间就可以伸成证书,并存储在secretName指定的Secrets中。

qrcode

创建时间:2023-06-18 09:12:55

最后修改:2023-06-18 09:30:17