安装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.yaml
DNS-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