在云原生环境中,通过  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)  和部署环境(公有云或私有云),我们可以提供更具体的配置展示流程。