跳转至

18-k8s-域名签发免费证书

使用 cert-manager 为 dnspod 的域名签发免费证书

1. 安装 cert-manager

添加 cert-manager 仓库

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

生成 values.yaml

helm show values jetstack/cert-manager > values.yaml

修改 values.yaml

installCRDs: true

prometheus:
  enabled: false

webhook:
  timeoutSeconds: 10

查看生成的清单,可以使用

helm install cert-manager --namespace cert-manager --version v1.16.1 jetstack/cert-manager -f values.yaml

等待

kubectl wait --for=condition=Ready pods --all -n cert-manager

2. 安装 cert-manager-webhook-dnspod

准备 dnspod-webhook-values.yaml 配置文件

clusterIssuer:
  enabled: true
  name: dnspod # 自动创建的 ClusterIssuer 名称
  ttl: 600
  staging: false
  secretId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 替换成你的 SecretId
  secretKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # 替换成你的 SecretKey
  email: test@test.com # 用于接收证书过期的邮件告警。如果cert-manager和webhook都正常工作,证书会自动续期不会过期

使用 helm 进行安装

helm repo add roc https://charts.imroc.cc
helm upgrade --install -f 2-dnspod-webhook-values.yaml cert-manager-webhook-dnspod roc/cert-manager-webhook-dnspod -n cert-manager

3. 创建证书

创建 Certificate 对象来签发免费证书:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-crt
  namespace: cert-manager
spec:
  secretName: example-crt-secret # 证书保存在这个 secret 中
  issuerRef:
    name: dnspod # 这里使用自动生成出来的 ClusterIssuer
    kind: ClusterIssuer
    group: cert-manager.io
  dnsNames: # 填入需要签发证书的域名列表,支持泛域名,确保域名是使用 dnspod 管理的
  - "example.com"
  - "*.example.com"

等待状态变成 Ready 表示签发成功:

$ kubectl -n cert-manager get certificates.cert-manager.io
NAME          READY   SECRET               AGE
example-crt   True    example-crt-secret   25d

若签发失败可 describe 一下看下原因:

#查看状态
kubectl get Certificate --all-namespaces

#查看错误信息
kubectl describe Certificate -n cert-manager

#深查看深层错误原因
kubectl describe CertificateRequest -n cert-manager

#深查看更深层错误原因
kubectl describe challenges -n cert-manager

4.配置证书复制到其他 namespace

安装 kubed

helm repo add appscode https://charts.appscode.com/stable/

helm repo update

helm install kubed appscode/kubed --version v0.13.2 --namespace cert-manager

修改 Certificated 文件,为 certificated 对象设置 secretTemplate, 设置需要同步到哪些 namespace。

# ipincloud-crt.yaml

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: ipincloud-crt
spec:
  secretName: ipincloud-crt
  issuerRef:
    name: dnspod
    kind: ClusterIssuer
    group: cert-manager.io
  dnsNames:
  - "*.xxx.xxx"
  secretTemplate:
    annotations:
      kubed.appscode.com/sync: "cert-manager-tls=ipincloud-crt" 

给需要同步的目标 namespace 打 label

上一步的 secretTemplate 里指定了同步的目标 namespace 的 label 过滤条件 cert-manager-tls=ipincloud-crt , 因此,我们需要对接收同步 secret 的 namespace 打上相应的 label。

kubectl label ns default cert-manager-tls=ipincloud-crt
kubectl label ns jiaogong-rc cert-manager-tls=ipincloud-crt

查看目标 namespace 是否复制 secret 成功。

kubectl get secret ipincloud-crt