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