You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS上Kubernetes多域名暴露:Ingress与ELB方案咨询

绝对是!Ingress完全是你这种多域名暴露场景的最优解——比维护两个独立的LoadBalancer Service要高效太多,不管是从资源成本还是管理复杂度来看。

为什么Ingress比多ELB方案更好
  • 减少资源开销:每个LoadBalancer Service会触发AWS创建一个独立的ELB,而Ingress只需要一个ALB(由AWS Load Balancer Controller管理)就能处理多个域名的流量转发,直接降低ELB的使用成本。
  • 统一路由管理:所有域名的路由规则都集中在一个Ingress资源里,后续调整路径、新增域名都更方便,不需要单独维护多个Service和ELB配置。
  • 灵活的访问控制:可以针对不同域名/路径单独配置访问策略(比如你的staging域名限制),而多ELB方案要分别给每个ELB配置安全组或WAF,管理更分散。
具体配置步骤(基于AWS EKS)

首先你需要在集群里部署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统一转发。

Route53记录配置

等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上。

实现staging域名的访问限制

上面的Ingress配置里用了alb.ingress.kubernetes.io/conditions.staging注解来限制源IP,这是最简单的方式。如果需要更灵活的控制(比如允许特定IAM用户访问、阻止特定地区IP),可以结合AWS WAF:

  1. 在AWS控制台创建WAF WebACL,配置允许/阻止规则。
  2. 在Ingress的annotations里添加:
    alb.ingress.kubernetes.io/wafv2-acl-arn: arn:aws:wafv2:us-east-1:你的AWS账号ID:regional/webacl/你的staging限制规则/xxxxxx
    
    这样所有访问staging域名的流量都会经过WAF校验。

另外,你也可以配合Kubernetes的NetworkPolicy,进一步限制staging Service只能接收来自ALB所在节点的流量,增强安全性。

对比多ELB方案的优势总结

如果用两个LoadBalancer Service,你需要维护两个ELB、两个Route53记录,后续调整访问策略还要分别操作两个ELB的安全组/WAF,不仅繁琐,还会增加额外的AWS成本。而Ingress方案用一个ALB搞定所有,配置集中,管理成本低,完全符合Kubernetes的最佳实践。

内容的提问来源于stack exchange,提问作者pkaramol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:51:18