安装cert-manager
安装cert-manager
kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml卸载 cert-manager
kubectl delete -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yamlDNS-01 校验方式签发证书
- 登录 cloudflare,点到 My Profile > API Tokens > Create Token 来创建 Token:
复制 Token 并妥善保管 - 将 Token 保存到 Secret 中:
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: cert-manager
type: Opaque
stringData:
api-token: <API Token> # 粘贴 Token 到这里,不需要 base64 加密。- 创建 ClusterIssuer
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-dns01
spec:
acme:
privateKeySecretRef:
name: letsencrypt-dns01
email: [email protected]
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- dns01:
cloudflare:
email: [email protected]
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token- 创建 Certificate
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mydomain-com
namespace: default
spec:
dnsNames:
- mydomain.com
- "*.mydomain.com"
issuerRef:
kind: ClusterIssuer
name: letsencrypt-dns01 # 引用 ClusterIssuer,指示采用 dns01 方式进行校验
secretName: mydomain-com-tls # 最终签发出来的证书会保存在这个 Secret 里面获取和使用证书
创建好 Certificate 后,等一小会儿,我们可以 kubectl 查看是否签发成功
kubectl get certificate
NAME READY SECRET AGE
mydomain-com True test-mydomain-com-tls 1m如果 READY 为 False 表示失败,可以通过 describe 查看 event 来排查失败原因:
kubectl describe certificate mydomain-com如果为 True 表示签发成功,证书就保存在我们所指定的 Secret 中 (上面的例子是 default/mydomain-com-tls),可以通过 kubectl 查看:
kubectl get secret mydomain-com-tls -n default
...
data:
tls.crt: <cert>
tls.key: <private key>其中 tls.crt 就是证书,tls.key 是密钥。
你可以将它们挂载到你需要证书的应用中,或者使用自建的 Ingress,可以直接在 Ingress 中引用 secret,示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
# 添加指示要使用的issuer的注释。
cert-manager.io/cluster-issuer: letsencrypt-dns01
name: myIngress
namespace: myIngress
spec:
rules:
- host: mydomain-com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: myservice
port:
number: 80
tls:
- hosts:
- mydomain-com
secretName: mydomain-com-tls 