cert-manager 为您的 Kubernetes 或 OpenShift 集群中的工作负载创建 TLS 证书,并在证书到期前自动续期。
cert-manager#
申请创建一个 Certificate 资源后,cert-manager 会自动执行以下操作
核心概括:
- 生成私钥:在集群内部创建一个加密密钥。
- 向 CA 申请:通过 Issuer(之前配置的 Cloudflare DNS-01)向 Let’s Encrypt 证明你拥有 uat.artoio.com 域名。
- 保存为 Secret:验证通过后,将签署好的证书和私钥存入 gitlab-tls-secret。
- 自动续期:在证书过期前(通常是 90 天内的最后 30 天),自动重新触发验证逻辑。
证书申请#
- Certificate (合同):你填写的申请表,声明你想要哪个域名的证书。
- CertificateRequest (审批件):系统自动生成的内部请求,负责向 CA 发起申请。
- Order (订单):如果是 ACME(如 Let’s Encrypt),CA 会生成一个订单。
- Challenge (挑战/验证):为了证明域名是你的,CA 给出的 “考卷”(比如要求你在 DNS 加条记录)。
排查思路#
第一步:检查 Certificate (入口)
kubectl get certificate
kubectl describe certificate <name>
第二步:检查 CertificateRequest (请求层)
kubectl get certificaterequest
kubectl describe certificaterequest <name>
第三步:检查 Order (订单层)
kubectl get orders.acme.cert-manager.io
kubectl describe order <name>
第四步:检查 Challenge (最底层/验证层) —— 核心报错点
kubectl get challenges.acme.cert-manager.io
kubectl describe challenge <name>
部署安装#
- 安装
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.2/cert-manager.yaml
- 验证
root@kubernetes01:~/cert-manager# kubectl get pods -n cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-7b8b89f89d-tt7ng 1/1 Running 0 3h21m
cert-manager-cainjector-7f9fdd5dd5-44drh 1/1 Running 0 3h21m
cert-manager-webhook-769f6b94cb-cdkbk 1/1 Running 0 3h21m
发行商#
- HTTP01: https://cert-manager.io/docs/configuration/acme/http01/
- DNS01: https://cert-manager.io/docs/configuration/acme/dns01/
一、Cloudflare#
Cloudflare 支持 Token 、API Key 授权方式;创建方式参考: cert-manager cloudflare;本次演示使用 API Key 方式。
- 创建 secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-key-secret
namespace: cert-manager
type: Opaque
stringData:
api-key: {your-api-key}
运行: kubectl apply -f secret.yaml
- 创建 cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-cloudflare
spec:
acme:
email: {your-email}
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-cloudflare-account-key
solvers:
- dns01:
cloudflare:
email: {your-email}
apiKeySecretRef:
name: cloudflare-api-key-secret
key: api-key
运行: kubectl apply -f cluster-issuer.yaml
- 检查状态
#
root@kubernetes01:~/cert-manager# kubectl get secrets -n cert-manager
NAME TYPE DATA AGE
cert-manager-webhook-ca Opaque 3 3h29m
cloudflare-api-key-secret Opaque 1 3h8m
letsencrypt-cloudflare-account-key Opaque 1 3h1m
#
root@kubernetes01:~# kubectl get clusterissuers.cert-manager.io
NAME READY AGE
letsencrypt-cloudflare True 158m
示例#
- 创建 certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: gitlab-cert
namespace: istio-system
spec:
secretName: gitlab-tls-secret
issuerRef:
name: letsencrypt-cloudflare
kind: ClusterIssuer
dnsNames:
- gitlab.artoio.com
运行: kubectl apply -f certificate.yaml
- 验证
#
root@kubernetes01:~/gitlab# kubectl get certificate -n istio-system
NAME READY SECRET AGE
gitlab-cert True gitlab-tls-secret 159m
#
root@kubernetes01:~/gitlab# kubectl get certificaterequests.cert-manager.io -n istio-system
NAME APPROVED DENIED READY ISSUER REQUESTER AGE
gitlab-cert-1 True True letsencrypt-cloudflare system:serviceaccount:cert-manager:cert-manager 160m
#
root@kubernetes01:~/gitlab# kubectl get orders.acme.cert-manager.io -n istio-system
NAME STATE AGE
gitlab-cert-1-298491017 valid 161m
# 查看日志
kubectl logs -f -n cert-manager -l app.kubernetes.io/name=cert-manager
结语#
参考:


