cert-manager 企业证书自动化
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| ACME | Automatic Certificate Management Environment | 自动化证书管理协议 |
| API | Application Programming Interface | 应用程序编程接口 |
| ARN | Amazon Resource Name | AWS 资源名称,用于唯一标识资源 |
| AWS | Amazon Web Services | 亚马逊云服务 |
| CA | Certificate Authority | 证书颁发机构 |
| CRD | Custom Resource Definition | Kubernetes 自定义资源定义 |
| DNS | Domain Name System | 域名系统 |
| EKS | Elastic Kubernetes Service | AWS 托管 Kubernetes 服务 |
| GKE | Google Kubernetes Engine | Google 托管 Kubernetes 服务 |
| IAM | Identity and Access Management | 身份与访问管理 |
| IRSA | IAM Roles for Service Accounts | 通过 Kubernetes 服务账号关联 AWS IAM 角色 |
| PDB | Pod Disruption Budget | Pod 中断预算,约束自愿驱逐 |
| TLS | Transport Layer Security | 传输层安全协议 |
| TXT | Text record | DNS 文本记录;这是记录类型名 |
| URL | Uniform Resource Locator | 统一资源定位符,通常指访问地址 |
场景:为 Gateway 的订单域名自动签发/续期证书。前置:基线、公网 DNS 委派、DNS-01 出口;本例 EKS + Route 53 + ACME。内部域名使用企业 CA/Vault issuer,不要求公网 ACME 为私有名称签发。
身份与安装#
按 IRSA创建 cert-manager/cert-manager 专属角色。IAM 只允许指定 hosted zone 的 ChangeResourceRecordSets、ListResourceRecordSets,以及 GetChange 的 change ARN;指定 hostedZoneID 可避免全局 zone 查询。进一步用 Route 53 条件限制 TXT 与 _acme-challenge 记录名,包含通配符域名对应的挑战名称。Route 53 solver
export CM_VERSION='vREPLACE_VERSION'
helm show values oci://quay.io/jetstack/charts/cert-manager --version "$CM_VERSION" > cm-defaults.yaml保存 cm-values.yaml,替换角色;使用完整 values,避免升级时丢失自定义项:
crds:
enabled: true
replicaCount: 2
serviceAccount:
name: cert-manager
annotations:
eks.amazonaws.com/role-arn: REPLACE_CERT_MANAGER_ROLE_ARN
webhook:
replicaCount: 3
cainjector:
replicaCount: 2helm upgrade --install cert-manager oci://quay.io/jetstack/charts/cert-manager --version "$CM_VERSION" -n cert-manager --create-namespace -f cm-values.yaml --wait --timeout 10m
cmctl check api --wait=2m给 webhook 配置跨节点放置、requests/limits/PDB,确认 API Server 到 webhook 的网络。可用性测试失败会阻塞 Certificate 等资源准入;不要通过全局关闭校验解决网络问题。Helm 安装
Hands-on:签发、验证、续期#
保存 orders-certificate.yaml,先用 ACME staging 验证 DNS 流程:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata: {name: acme-staging}
spec:
acme:
email: platform@example.com
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef: {name: acme-staging-account}
solvers:
- selector:
dnsZones: [staging.example.com]
dns01:
route53:
region: REPLACE_REGION
hostedZoneID: REPLACE_ZONE_ID
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata: {name: orders, namespace: edge}
spec:
secretName: orders-tls
dnsNames: [orders.staging.example.com]
privateKey: {rotationPolicy: Always}
issuerRef: {name: acme-staging, kind: ClusterIssuer}kubectl create namespace edge --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f orders-certificate.yaml
kubectl -n edge get certificate,certificaterequest,orders.acme.cert-manager.io,challenges
kubectl -n edge wait --for=condition=Ready certificate/orders --timeout=10m
cmctl status certificate orders -n edgestaging 证书不受浏览器信任。流程通过后创建另一个 acme-production issuer,使用正式 ACME URL/独立 account Secret,再修改 Certificate 的 issuerRef;确认信任链正常才接入 Gateway,不以 curl -k 作为验收。
# 验证一次受控续期,不要循环调用触发 CA 限流。
cmctl renew orders -n edge
cmctl status certificate orders -n edge
openssl s_client -connect orders.staging.example.com:443 -servername orders.staging.example.com -verify_return_error </dev/null记录 Secret resourceVersion、证书序列号和线上证书变化;不打印私钥。确认 Gateway 能热加载,续期期间订单无失败。GKE 使用 Cloud DNS solver + Workload Identity,角色仅绑定验证域对应 zone;不复制 AWS solver 配置。
企业运维#
告警覆盖证书剩余时间(例如 21/7 天)、Ready=False、Challenge 超时和 CA 限流。演练撤销预生产挑战 zone写权限,确认旧证书继续可用且续期失败告警;恢复权限后恢复签发。
平台限制谁能创建 ClusterIssuer/引用高权限 issuer;能申请任意域证书也是权限风险。备份 ACME account、issuer 配置和必要 TLS Secrets,私钥加密管理。卸载 cert-manager 前确认所有证书归属、续期替代方案和 CRD 生命周期,不能直接删除 CRD。