告别手动配置:Kubernetes微服务中TLS证书自动化管理实践
在Kubernetes上部署微服务架构,随着服务数量的增长和业务复杂度的提升,TLS证书的管理往往成为运维团队的一大痛点。我们团队就曾深陷其中:每次新增服务、扩缩容,或证书即将过期时,都得手动配置Ingress和Service的TLS证书。这个过程不仅耗时费力,还极易因人为失误导致线上故障。为了解决这一难题,我们深入研究并引入了cert-manager,它彻底改变了我们在Kubernetes中管理TLS证书的方式,实现了自动化,显著提升了安全性和开发效率。
一、TLS证书管理面临的挑战
在没有自动化工具的情况下,传统的TLS证书管理流程通常包括:
- 手动申请和配置:需要为每个域名或子域名手动向CA机构申请证书,然后将证书文件(
.crt,.key)手动创建为Kubernetes Secret,并配置到Ingress或Service资源中。 - 续期复杂:TLS证书通常有90天的有效期。这意味着每隔一段时间,你就需要手动检查、申请新证书并替换旧证书,这个循环在微服务数量庞大时变得异常繁琐。
- 易出错:手动操作极易导致路径错误、权限问题、证书/私钥不匹配等错误,影响服务的可用性。
- 安全隐患:私钥的存储和传输不当可能造成泄露;过期证书未及时更新会引发安全警告甚至服务中断。
- 效率低下:大量的重复性工作占用了开发和运维团队宝贵的时间,拖慢了新服务上线和迭代的速度。
二、cert-manager:Kubernetes证书管理的利器
cert-manager是一个功能强大且高度可扩展的Kubernetes附加组件,它旨在为Kubernetes集群内的服务自动化管理TLS证书。它可以从各种CA(如Let's Encrypt、Vault等)获取证书,并将它们存储为Kubernetes Secret。当证书即将过期时,它还能自动续期,极大地简化了证书管理的复杂度。
cert-manager的核心工作原理:
- Issuer/ClusterIssuer:定义证书的签发者。
Issuer作用于单个命名空间,而ClusterIssuer作用于整个集群。通常,我们会配置一个ClusterIssuer来连接Let's Encrypt。 - Certificate:这是一个自定义资源(CRD),用于声明你希望
cert-manager为你管理的证书。它会指定证书的域名、有效期、使用的Issuer以及存储证书的Secret名称。 - Ingress/Service集成:
cert-manager可以监听Ingress资源的变化,自动为带有特定注解的Ingress创建或更新Certificate资源,进而管理其TLS证书。
三、使用cert-manager自动化TLS证书管理的实践
1. 安装cert-manager
通过Helm是安装cert-manager最推荐的方式:
# 添加cert-manager Helm仓库
helm repo add jetstack https://charts.jetstack.io
helm repo update
# 创建cert-manager命名空间
kubectl create namespace cert-manager
# 安装cert-manager
# 注意:生产环境请检查最新版本并使用具体的版本号
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v1.12.0 \
--set installCRDs=true # 关键:确保安装CRD
安装完成后,可以通过kubectl get pods -n cert-manager确认所有组件都已正常运行。
2. 配置ClusterIssuer (Let's Encrypt)
ClusterIssuer是告诉cert-manager如何获取证书的配置。这里我们以Let's Encrypt为例,使用HTTP-01挑战方式。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod # 命名为生产环境的Issuer
spec:
acme:
# Let's Encrypt 生产环境 API
server: https://acme-v02.api.letsencrypt.org/directory
# 你的邮箱地址,Let's Encrypt会通过此邮箱发送通知
email: your_email@example.com
# 私钥Secret的名称,cert-manager会为你创建
privateKeySecretRef:
name: letsencrypt-prod-key
# ACME 挑战配置
solvers:
- http01:
# cert-manager会创建一个临时Ingress来完成HTTP-01挑战
ingress:
class: nginx # 你的Ingress Controller的类名,例如nginx、traefik等
将上述配置保存为clusterissuer.yaml,然后执行 kubectl apply -f clusterissuer.yaml。
你可以通过kubectl get clusterissuer letsencrypt-prod查看状态,确保它处于Ready状态。
3. 配置Ingress以使用cert-manager
现在,当你在创建Ingress资源时,只需要添加特定的注解,cert-manager就会自动为你处理TLS证书。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-microservice-ingress
namespace: default
annotations:
# 关键注解:指定使用哪个ClusterIssuer来签发证书
cert-manager.io/cluster-issuer: letsencrypt-prod
# 如果你的Ingress Controller需要指定Ingress Class
kubernetes.io/ingress.class: nginx
spec:
tls:
- hosts:
- api.example.com # 你的服务域名
secretName: my-microservice-tls # cert-manager将证书存储到此Secret中
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-microservice-service # 你的微服务名称
port:
number: 80
当这个Ingress被创建后:
cert-manager会检测到带有cert-manager.io/cluster-issuer注解的Ingress。- 它会自动创建一个名为
my-microservice-tls的Certificate资源(如果不存在)。 Certificate资源会请求letsencrypt-prod这个ClusterIssuer为api.example.com域名签发证书。cert-manager会启动ACME HTTP-01挑战过程,利用Ingress Controller完成域名所有权验证。- 一旦验证成功,Let's Encrypt签发的证书就会被
cert-manager获取,并存储在default命名空间下的my-microservice-tlsSecret中。 - Ingress Controller会自动使用这个Secret中的证书来提供HTTPS服务。
- 当证书临近过期时,
cert-manager会自动处理续期流程,确保你的服务始终使用有效的TLS证书。
四、优势与总结
通过引入cert-manager,我们的团队获得了以下显著优势:
- 完全自动化:证书的申请、签发、续期和撤销全程自动化,无需人工干预。
- 降低错误率:消除了手动操作带来的潜在错误,提高了系统的稳定性和可靠性。
- 提高安全性:确保证书始终有效且及时更新,避免因证书过期造成的安全风险和服务中断。
- 提升开发效率:开发人员和运维团队可以将精力集中在核心业务逻辑和基础设施优化上,而不是繁琐的证书管理。
- 与云原生生态无缝集成:作为Kubernetes的原生组件,与Ingress Controller等其他组件配合默契。
cert-manager不仅解决了我们在Kubernetes微服务环境中TLS证书管理的痛点,更是一种拥抱云原生自动化理念的实践。如果你也正饱受手动证书管理之苦,我强烈推荐你尝试它,它将是你在Kubernetes旅程中不可或缺的伙伴。