ALB Ingress与cert-manager实现K8s证书自签方案

📅 2026/7/26 8:00:38
ALB Ingress与cert-manager实现K8s证书自签方案
1. 项目背景与核心价值在云原生架构中Ingress作为Kubernetes集群的入口网关承担着流量路由和负载均衡的重要职责。阿里云ALB Ingress是基于阿里云应用型负载均衡(ALB)实现的Ingress控制器相比传统的Nginx Ingress具有更高的性能上限和更丰富的路由能力。而cert-manager作为Kubernetes生态中广泛使用的证书管理工具能够自动化证书的签发、续期和部署流程。将两者结合实现证书自签的方案主要解决以下痛点问题传统手动申请和部署SSL证书效率低下无法适应敏捷开发需求证书过期导致的业务中断风险长期存在在混合云或多集群环境下难以统一管理证书生命周期对Lets Encrypt等免费CA的依赖可能带来速率限制问题2. 环境准备与前置条件2.1 基础环境要求已部署的Kubernetes集群ACK或自建集群均可集群版本不低于1.16支持cert-manager v1.0已安装并配置kubectl和helm工具阿里云账号开通ALB服务权限已备案的域名用于证书签发2.2 网络拓扑规划建议在实际部署前建议规划好以下网络配置VPC网络划分确保ALB实例与工作节点网络互通安全组规则开放ALB所需的80/443端口域名解析准备测试用的子域名如test.example.com节点资源至少2个4核8G的工作节点重要提示生产环境建议为ALB Ingress单独规划一个专有VPC避免与其他服务产生网络冲突3. 组件安装与配置3.1 安装ALB Ingress Controller使用Helm进行安装是最佳实践helm repo add alibaba https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts helm install alb-ingress alibaba/alb-ingress-controller \ --set clusterNamemy-cluster \ --set regionIdcn-hangzhou \ --set vpcIdvpc-xxxxxx \ --set zoneMappingsvsw-xxxxxx:cn-hangzhou-b \ --namespace kube-system关键参数说明regionId: 必须与集群所在地域一致vpcId: 通过阿里云控制台获取zoneMappings: 指定虚拟交换机与可用区的映射关系clusterName: 自定义的集群标识符安装后验证kubectl get pods -n kube-system | grep alb-ingress3.2 部署cert-manager推荐使用cert-manager v1.7版本helm repo add jetstack https://charts.jetstack.io helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.7.1 \ --set installCRDstrue验证安装kubectl get pods -n cert-manager4. 自签名证书配置4.1 创建根CA证书首先生成自签名的根CAopenssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \ -subj /CNmy-root-ca4.2 创建Cert-Manager Issuer将CA证书存入Kubernetes Secretkubectl create secret tls my-ca-key-pair \ --certca.crt \ --keyca.key \ --namespacecert-manager创建ClusterIssuer资源apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: my-selfsigned-issuer spec: ca: secretName: my-ca-key-pair验证Issuer状态kubectl get clusterissuer my-selfsigned-issuer -o wide5. ALB Ingress集成配置5.1 创建证书请求定义Certificate资源apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: demo-certificate namespace: default spec: secretName: demo-tls-secret duration: 2160h # 90天 renewBefore: 360h # 15天前开始续期 issuerRef: name: my-selfsigned-issuer kind: ClusterIssuer commonName: test.example.com dnsNames: - test.example.com5.2 配置Ingress资源创建带TLS的IngressapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress annotations: alb.ingress.kubernetes.io/certificate-id: auto alb.ingress.kubernetes.io/ssl-policy: TLS_1_2 spec: ingressClassName: alb tls: - hosts: - test.example.com secretName: demo-tls-secret rules: - host: test.example.com http: paths: - path: / pathType: Prefix backend: service: name: demo-service port: number: 80关键注解说明certificate-id: auto: 启用自动证书发现ssl-policy: 指定TLS协议版本ingressClassName: alb: 指定使用ALB控制器6. 高级配置与优化6.1 证书轮换策略通过修改Certificate资源实现spec: rotationPolicy: Always privateKey: rotationPolicy: Always algorithm: RSA size: 20486.2 ALB性能调优在Ingress注解中添加annotations: alb.ingress.kubernetes.io/load-balancer-spec: slb.s2.medium alb.ingress.kubernetes.io/connection-idle-timeout: 60 alb.ingress.kubernetes.io/health-check-enabled: true6.3 多证书支持可以为同一个Ingress配置多个TLS证书tls: - hosts: - test1.example.com secretName: cert1 - hosts: - test2.example.com secretName: cert27. 监控与运维7.1 证书状态监控查看证书状态kubectl get certificate -w7.2 事件排查查看cert-manager日志kubectl logs -n cert-manager deploy/cert-manager查看ALB控制器日志kubectl logs -n kube-system deploy/alb-ingress-controller7.3 证书过期告警配置Prometheus监控规则- alert: CertificateExpiringSoon expr: certificate_expiration_timestamp_seconds - time() 86400 * 15 for: 5m labels: severity: warning annotations: summary: Certificate expiring soon (instance {{ $labels.instance }}) description: Certificate {{ $labels.name }} will expire in {{ $value | humanizeDuration }}8. 常见问题与解决方案8.1 证书签发失败可能原因及解决方案Issuer配置错误检查ClusterIssuer状态是否为Ready验证CA证书Secret是否存在且有效DNS解析问题确保域名解析已指向ALB实例IP检查网络策略是否允许外部访问资源配额不足检查cert-manager Pod资源限制查看ALB实例规格是否满足需求8.2 ALB无法关联证书排查步骤检查Ingress事件kubectl describe ingress demo-ingress验证Secret是否存在kubectl get secret demo-tls-secret检查ALB控制台证书列表8.3 证书续期异常处理方法手动触发续期kubectl annotate certificate demo-certificate cert-manager.io/force-renewaltrue检查cert-manager日志中的续期事件验证新证书是否已同步到ALB9. 安全最佳实践CA私钥保护将根CA私钥存储在安全的密钥管理系统限制对cert-manager命名空间的访问权限证书策略设置合理的证书有效期建议不超过90天启用自动轮换rotationPolicy: Always网络隔离为cert-manager组件配置网络策略限制ALB Ingress控制器的API访问权限审计日志开启cert-manager的审计日志定期检查证书签发记录