基于AWS ACM终止TLS的ALB Ingress Controller如何实现端到端加密?
AWS ALB Ingress Controller配置后端HTTPS加密后出现502错误
背景与问题
当前环境使用AWS ALB Ingress Controller作为Ingress入口,通过AWS ACM证书在负载均衡器层终止SSL,运行正常。为实现负载均衡器到集群内部的流量加密,执行以下操作后出现502网关错误:
- 安装并配置Cert Manager
- 为Ingress添加TLS Secret
- 修改Ingress注解,将后端协议设为HTTPS:
alb.ingress.kubernetes.io/backend-protocol: HTTPS
当前配置信息
Ingress配置(相关部分)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/backend-protocol: HTTP alb.ingress.kubernetes.io/certificate-arn: real-cert-arn alb.ingress.kubernetes.io/group.name: public.monitor alb.ingress.kubernetes.io/group.order: "40" alb.ingress.kubernetes.io/healthcheck-path: / alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]' alb.ingress.kubernetes.io/load-balancer-name: monitoring-public-qa alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-FS-1-2-Res-2020-10 cert-manager.io/cluster-issuer: cert-manager-r53-qa kubernetes.io/ingress.class: alb spec: rules: - host: goldilocks.qa.realdomain.com http: paths: - backend: service: name: goldilocks-dashboard port: name: http path: /* pathType: ImplementationSpecific tls: - hosts: - goldilocks.qa.realdomain.com secretName: goldilocks-qa-cert status: loadBalancer: ingress: - hostname: real-lb-address.us-gov-west-1.elb.amazonaws.com
证书状态(正常)
[ec2-user@ip-10-17-2-102 ~]$ kubectl get cert -n goldilocks goldilocks-qa-cert -o yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: goldilocks-qa-cert namespace: goldilocks ownerReferences: - apiVersion: networking.k8s.io/v1 blockOwnerDeletion: true controller: true kind: Ingress name: goldilocks-dashboard uid: 2494e5be-e624-471b-afd3-c8d56f5dc853 resourceVersion: "81003934" uid: d494a1ec-7509-474e-b154-d5db8ceb86c0 spec: dnsNames: - goldilocks.qa.realdomain.com issuerRef: group: cert-manager.io kind: ClusterIssuer name: cert-manager-r53-qa secretName: goldilocks-qa-cert usages: - digital signature - key encipherment status: conditions: - lastTransitionTime: "2023-02-08T16:06:56Z" message: Certificate is up to date and has not expired
排查方向与解决方法
1. 后端Service端口不匹配
当前Ingress的service端口指向http,但后端协议改为HTTPS后,Service需对应提供HTTPS端口(如443),且Pod内部服务需监听该端口。
- 检查Service配置:
kubectl get svc goldilocks-dashboard -n goldilocks -o yaml - 若Service无HTTPS端口,需添加端口定义,或修改Ingress的
service.port.name指向HTTPS端口。
2. 健康检查未适配HTTPS
后端协议改为HTTPS后,ALB默认健康检查仍用HTTP,会导致检查失败触发502。需修改健康检查协议:
在Ingress注解中添加:
alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS
若Pod的HTTPS端口非默认值,需额外指定:
alb.ingress.kubernetes.io/healthcheck-port: "443"
3. 后端服务未加载TLS证书
即使Cert Manager生成了Secret,Pod内部服务需加载该Secret中的证书/密钥以提供HTTPS服务。若不想依赖Let's Encrypt有效证书,可改用自签名证书:
- 创建自签名ClusterIssuer,生成自签名证书
- 将Secret挂载到Pod容器中,配置服务使用证书文件开启HTTPS
4. 网络访问限制
- 检查ALB安全组是否允许访问集群内部的HTTPS端口(如443)
- 检查Pod所在命名空间的网络策略,是否允许ALB节点IP访问Pod的HTTPS端口
5. 验证Ingress注解配置
确保已将alb.ingress.kubernetes.io/backend-protocol修改为HTTPS,原配置中该值仍为HTTP,需确认修改已生效。
内容的提问来源于stack exchange,提问作者Justin S
相关产品推荐
相关产品推荐

