AWS上Kubernetes多域名暴露:Ingress与ELB方案咨询
绝对是!Ingress完全是你这种多域名暴露场景的最优解——比维护两个独立的LoadBalancer Service要高效太多,不管是从资源成本还是管理复杂度来看。
- 减少资源开销:每个LoadBalancer Service会触发AWS创建一个独立的ELB,而Ingress只需要一个ALB(由AWS Load Balancer Controller管理)就能处理多个域名的流量转发,直接降低ELB的使用成本。
- 统一路由管理:所有域名的路由规则都集中在一个Ingress资源里,后续调整路径、新增域名都更方便,不需要单独维护多个Service和ELB配置。
- 灵活的访问控制:可以针对不同域名/路径单独配置访问策略(比如你的staging域名限制),而多ELB方案要分别给每个ELB配置安全组或WAF,管理更分散。
首先你需要在集群里部署AWS Load Balancer Controller(替代旧的ALB Ingress Controller),它负责和AWS API交互,自动创建和配置ALB。可以用Helm快速部署,确保控制器正常运行即可。
接下来创建Ingress资源,把两个域名的流量路由到对应的Service:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-domain-ingress annotations: # 指定ALB为面向公网的类型 alb.ingress.kubernetes.io/scheme: internet-facing # 可选:自定义ALB名称前缀 alb.ingress.kubernetes.io/load-balancer-name: multi-domain-alb # 为staging域名配置源IP访问限制(示例允许特定IP段) alb.ingress.kubernetes.io/conditions.staging: | [{"field":"source-ip","operator":"In","values":["192.168.1.0/24", "203.0.113.5/32"]}] spec: ingressClassName: alb # 对应AWS Load Balancer Controller的ingressClass rules: # Production域名路由到prod服务 - host: production.somesite.com http: paths: - path: / pathType: Prefix backend: service: name: prod-service port: number: 80 # Staging域名路由到staging服务 - host: staging.somesite.com http: paths: - path: / pathType: Prefix backend: service: name: staging-service port: number: 80
注意:这里的prod-service和staging-service都应该是ClusterIP类型,不需要设置成LoadBalancer,因为流量会通过ALB统一转发。
等Ingress创建完成后,AWS Load Balancer Controller会自动生成一个ALB,你可以通过kubectl get ingress命令找到ALB的DNS名称(类似multi-domain-alb-xxxxxx.us-east-1.elb.amazonaws.com)。
接下来在Route53的托管区里创建两个A类型的别名记录:
- 记录集名称:
production.somesite.com,选择“别名”选项,然后指向刚才获取的ALB DNS名称。 - 记录集名称:
staging.somesite.com,同样配置别名指向同一个ALB DNS。
这样两个域名都会指向同一个ALB,ALB会根据请求的Host头,把流量转发到Ingress规则对应的Service上。
上面的Ingress配置里用了alb.ingress.kubernetes.io/conditions.staging注解来限制源IP,这是最简单的方式。如果需要更灵活的控制(比如允许特定IAM用户访问、阻止特定地区IP),可以结合AWS WAF:
- 在AWS控制台创建WAF WebACL,配置允许/阻止规则。
- 在Ingress的annotations里添加:
这样所有访问staging域名的流量都会经过WAF校验。alb.ingress.kubernetes.io/wafv2-acl-arn: arn:aws:wafv2:us-east-1:你的AWS账号ID:regional/webacl/你的staging限制规则/xxxxxx
另外,你也可以配合Kubernetes的NetworkPolicy,进一步限制staging Service只能接收来自ALB所在节点的流量,增强安全性。
如果用两个LoadBalancer Service,你需要维护两个ELB、两个Route53记录,后续调整访问策略还要分别操作两个ELB的安全组/WAF,不仅繁琐,还会增加额外的AWS成本。而Ingress方案用一个ALB搞定所有,配置集中,管理成本低,完全符合Kubernetes的最佳实践。
内容的提问来源于stack exchange,提问作者pkaramol

