在云原生环境中,通过 Cert-manager 自动化管理 Kubernetes Ingress 证书是最佳实践应用,它能确保 HTTPS 证书的自动签发、续期和部署,避免因SSL证书过期导致的服务中断。
下面我为你梳理一套从基础到实践的管理方案。
1. Ingress 证书管理:核心挑战与方案对比
管理 Ingress 证书主要面临证书申请、自动续期、在集群内安全分发三大挑战。以下是几种常见方案的对比:
方案 核心工具 优点 缺点 适用场景
手动管理 openssl, 云平台控制台 完全可控,流程简单 易过期,操作繁复,不安全 测试环境、极少量的静态证书
半自动管理 certbot + 脚本 免费(Let‘s Encrypt),部分自动化 需自行集成更新和部署,可靠性一般 有运维能力的小型团队
全自动管理(推荐) Cert-manager 全生命周期自动化,与K8s原生集成,支持多种CA 学习与配置成本 生产环境的绝对主流选择
2. 全自动管理实践:使用 Cert-manager
Cert-manager 是 Kubernetes 上事实标准的证书管理控制器。它通过与 Let‘s Encrypt 等证书颁发机构(CA)集成,自动处理证书的签发和续订。
第一步:安装 Cert-manager
bash
使用 Helm(推荐)
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.14.4 \
--set installCRDs=true
第二步:配置 Let‘s Encrypt 签发者(Issuer)
创建一个 ClusterIssuer (集群范围) 或 Issuer (命名空间范围)。
yaml
示例:一个使用 Let's Encrypt 生产环境(ACME v2)的 ClusterIssuer
文件:letsencrypt-prod.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com 用于紧急通知的邮箱
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
选择 HTTP-01 挑战方式(适用于大多数Ingress)
- http01:
ingress:
class: nginx 请替换为你的 Ingress Controller 类型,如 traefik, haproxy
应用配置:
bash
kubectl apply -f letsencrypt-prod.yaml
检查状态
kubectl get clusterissuer letsencrypt-prod -o wide
第三步:为 Ingress 资源自动签发证书
在 Ingress 注解中申明证书需求,Cert-manager 会自动创建 Certificate 资源并完成签发。
yaml
示例:带证书注解的 Ingress
文件:my-app-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
关键注解:指定使用哪个 Issuer/ClusterIssuer
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls: TLS 配置块
- hosts:
- myapp.yourdomain.com 你的域名
secretName: myapp-tls-secret Cert-manager 将证书存入这个 Secret
rules:
- host: myapp.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
应用 Ingress 后,Cert-manager 会观测到请求,并自动完成验证、签发,将证书(tls.crt 和 tls.key)存入 myapp-tls-secret。整个过程通常在一两分钟内完成。
3. 进阶配置与最佳实践
选择正确的挑战方式:
HTTP-01:最通用,需确保域名解析到集群且 ingressClassName 配置正确。
DNS-01:更安全,适用于私有环境或通配符(*.yourdomain.com)证书。需配置云服务商(如 AWS Route53, Alibaba Cloud DNS)的 API 密钥。
证书轮换与更新策略:
Cert-manager 默认在证书到期前 30 天自动续期。你可以通过以下方式监控:
bash
查看证书状态和到期时间
kubectl get certificate
kubectl describe certificate myapp-tls-secret
备份与恢复:
最重要的资产是 ClusterIssuer 的 privateKeySecretRef(账户私钥)。务必将其纳入集群备份(如 Velero)范围。
多集群与多租户:
对于多集群,在每个集群独立安装 Cert-manager。多租户场景下,使用命名空间隔离的 Issuer,而非全局的 ClusterIssuer,并为每个租户配置不同的 ACME 账户邮箱。
监控与告警:
为 Cert-manager 的 Certificate 资源状态和证书到期时间设置 Prometheus 监控和告警(如证书剩余天数少于15天触发警告)。
4. 故障排查清单
遇到证书未签发的常见检查点:
Issuer/ClusterIssuer 状态:kubectl get issuer/clusterissuer 状态是否为 Ready。
Certificate 资源状态:kubectl describe certificate <name> 查看事件(Events)。
挑战(Challenge)状态:kubectl describe challenge 查看 ACME 验证是否被阻塞。
域名解析与网络:确保域名正确解析到 Ingress Controller 的公网 IP,且 80/443 端口可被 Let‘s Encrypt 服务器访问。
资源配额与限制:检查是否有资源配额(ResourceQuota)或网络策略(NetworkPolicy)阻止了挑战过程。
最后总结一下,使用 Cert-manager 进行自动化SSL证书管理是生产环境的标准答案。初始配置后基本无需人工干预,能极大提升安全性与运维效率。
如果有具体使用的 Ingress Controller 类型(如 Nginx, Traefik) 和部署环境(公有云或私有云),我们可以提供更具体的配置展示流程。