更新Ingress Nginx Controller的ACM SSL证书致HTTPS连接故障
环境配置
我们的Nginx Ingress Controller与AWS负载均衡器配置如下:
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60" service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: xxxx service.beta.kubernetes.io/aws-load-balancer-ssl-ports: https service.beta.kubernetes.io/aws-load-balancer-type: nlb labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx-controller namespace: ingress-nginx spec: externalTrafficPolicy: Local ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - appProtocol: http name: http port: 80 protocol: TCP targetPort: http - appProtocol: https name: https port: 443 protocol: TCP targetPort: https selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: LoadBalancer
Ingress资源示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test annotations: kubernetes.io/ingress.class: nginx namespace: dev spec: rules: - host: test.domain.com http: paths: - path: /main pathType: Prefix backend: service: name: main port: number: 8000
问题描述
更新LoadBalancer配置(修改Kubernetes Service的service.beta.kubernetes.io/aws-load-balancer-ssl-cert注解更换ACM SSL证书)后,新证书已成功关联到AWS Network Load Balancer,但HTTPS连接仍无法正常工作。只有删除并重建所有Ingress相关资源(控制器Pod、关联Job、负载均衡器)才能恢复正常。
尝试过重启Nginx Controller Pod,但问题依旧,怀疑ACM证书在Ingress Nginx Controller初始化时被缓存,导致负载均衡器更新证书后,控制器仍引用旧证书。
正确的ACM证书更新方式与后续操作
1. 证书更新的正确步骤
- 直接修改Ingress Controller对应的LoadBalancer Service注解,把
service.beta.kubernetes.io/aws-load-balancer-ssl-cert的值换成新ACM证书的ARN:kubectl annotate service ingress-nginx-controller -n ingress-nginx service.beta.kubernetes.io/aws-load-balancer-ssl-cert=<新证书ARN> --overwrite - 等待AWS自动完成NLB的证书更新,这个过程通常1-5分钟,可通过AWS控制台或CLI确认NLB监听器已关联新证书。
2. 解决控制器缓存问题的操作
当NLB证书更新完成但HTTPS仍异常时,无需删除重建所有资源,执行以下操作即可:
- 强制滚动重启Ingress Controller Pod:重启Pod会让控制器重新加载配置,清除可能存在的证书缓存。
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx - 验证Nginx配置:进入控制器Pod查看当前SSL配置是否正确,确认新证书已被加载:
注意:使用NLB时,Nginx控制器实际处理的是NLB转发的HTTP流量(NLB已完成SSL终止),但如果配置了SSL直通或其他特殊场景,需确保控制器的SSL配置同步更新。kubectl exec -n ingress-nginx <controller-pod-name> -- nginx -T | grep -E 'ssl_certificate|ssl_certificate_key'
3. 避免缓存问题的额外建议
- 确保Ingress Controller使用官方稳定版本,旧版本可能存在证书缓存的已知问题。
- 若使用了自定义Nginx模板,检查模板中是否存在硬编码的证书路径或缓存逻辑。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

