AWS EKS中ALB Ingress单配置实现多域名SSL配置咨询
结论
完全可以通过单个Ingress配置实现两个独立域名绑定各自独立SSL证书的需求,AWS ALB Ingress Controller(现升级命名为AWS Load Balancer Controller)原生适配ALB的多SNI证书能力,不需要拆分多个Ingress资源。
实现原理
AWS Application Load Balancer本身支持在同一个HTTPS监听器上挂载多个SSL证书,客户端发起TLS握手时会携带SNI(Server Name Indication)信息标记要访问的域名,ALB会自动匹配返回对应证书,不会出现证书不匹配的问题。ALB Ingress Controller会自动把你在Ingress里声明的证书配置同步到ALB监听器上,不需要手动去AWS控制台调整ALB配置。
配置步骤
- 提前准备好两个域名对应的SSL证书,推荐导入到ALB所在区域的AWS Certificate Manager(ACM)中,也可以上传到IAM供ALB调用,记录好两个证书的ARN。
- 编写Ingress配置,两种常用证书声明方式选其一即可:
- 方式一:在
tls字段中为每个域名单独声明配置,每个tls块对应一个域名和它的证书引用 - 方式二:直接在Ingress注解中传入多个证书ARN,路由规则按域名正常编写即可
- 方式一:在
配置示例
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-domain-ing annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]' alb.ingress.kubernetes.io/ssl-redirect: '443' # 方式二可直接在这里写多个证书ARN,用逗号分隔 # alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:cn-north-1:123456789012:certificate/xxx-foo,arn:aws:acm:cn-north-1:123456789012:certificate/xxx-bar" spec: tls: # 第一个域名foo.example.com对应配置 - hosts: - foo.example.com # secretName引用提前创建的、存储了对应证书ARN的K8s Secret secretName: foo-domain-cert # 第二个域名bar.example.com对应配置 - hosts: - bar.example.com secretName: bar-domain-cert rules: - host: foo.example.com http: paths: - path: / pathType: Prefix backend: service: name: foo-svc port: number: 80 - host: bar.example.com http: paths: - path: / pathType: Prefix backend: service: name: bar-svc port: number: 80
注:如果选择注解直接传证书ARN的方式,不需要在tls块里关联Secret,只需要把两个域名写入tls块的hosts列表即可。
注意事项
- 证书必须部署在ALB所在的AWS区域,跨区域的ACM证书或者IAM证书ALB无法正常调用
- 配置完成后可以通过openssl命令验证证书是否正确匹配:
openssl s_client -connect <ALB公网地址>:443 -servername <对应域名>,查看返回的证书链是否和访问域名匹配 - v1版本的AWS ALB Ingress Controller需要升级到1.1.5及以上版本才支持多证书SNI配置,v2版本的AWS Load Balancer Controller全版本支持该能力
内容的提问来源于stack exchange,提问作者raghunath
相关产品推荐
相关产品推荐

