【问题标题】:AWS VPC - k8s - load balancingAWS VPC - k8s - 负载均衡
【发布时间】:2019-07-14 00:45:54
【问题描述】:

抱歉新手问题;我是 k8s 世界的新手。目前的部署方式是在 EC2 上部署应用程序。我尝试将容器化应用程序部署到 VPC 的新方法。

在旧的方式中,AWS 会将 aaa.bbb.com 的流量路由到 vpc-ip:443 ELB,这将进一步将其路由到 private subnet:443 上的 ASG,并且应用程序可以正常工作。

图中有了k8s,流量怎么看?

我正在尝试确定是否可以在 ELB 上使用具有各自 dns 的多个端口,并将流量路由到工作节点上的某个端口。

xxx.yyy.com -> vpc-ip:443/ -> ec2:443/
aaa.bbb.com -> vpc-ip:9000/ -> ec2:9000/ 

在同一个 VPC 上使用 k8s 是否可行?任何指导和文档链接都会有很大帮助。

【问题讨论】:

    标签: amazon-web-services kubernetes amazon-eks


    【解决方案1】:

    通常,您将拥有一个 AWS 负载均衡器实例,该实例将具有多个 K8s 工作人员作为具有特定端口的后端服务器。流量进入工作节点后,K8s 内部的网络将接手这项工作。

    假设您为两个域分别设置了两个 K8S 服务作为负载均衡器,端口为 38473 和 38474:

    xxx.yyy.com -> AWS LoadBalancer1 -> Node1:38473 -> K8s service1 -> K8s Pod1
                                     -> Node2:38473 -> K8s service1 -> K8s Pod2
    aaa.bbb.com -> AWS LoadBalancer2 -> Node1:38474 -> K8s service2 -> K8s Pod3
                                     -> Node2:38474 -> K8s service2 -> K8s Pod4
    

    上面这个简单的解决方案需要您创建不同的服务作为负载均衡器,这会增加您的成本,因为它们是实际的 AWS 负载均衡器实例。为了降低成本,您可以在集群中有一个ingress-controller 实例并编写ingress 配置。这只需要一个实际的 AWS 负载均衡器来完成您的网络:

    xxx.yyy.com -> AWS LoadBalancer1 -> Node1:38473 -> Ingress-service -> K8s service1 -> K8s Pod1
                                     -> Node2:38473 -> Ingress-service -> K8s service1 -> K8s Pod2
    aaa.bbb.com -> AWS LoadBalancer1 -> Node1:38473 -> Ingress-service -> K8s service2 -> K8s Pod3
                                     -> Node2:38473 -> Ingress-service -> K8s service2 -> K8s Pod4
    

    有关更多信息,您可以在此处参考更多信息:

    【讨论】:

    • Ingress-service 如何知道要路由到哪个 k8s 服务?我对 Node1:port 和 Node2:port 感到困惑。它们似乎是同一个端口。
    • Ingress-server 根据入口配置选择要做什么:kubernetes.io/docs/concepts/services-networking/ingress。 Ingress-service 在所有节点上具有相同的端口。所有流量都将通过入口服务,入口服务将为您路由。
    • 入口的唯一限制是它仅适用于默认的 http/https 端口。这意味着您不能在以下位置公开应用程序:xxx.yyy.com:1234 & xxx.yyy.com:5678
    【解决方案2】:

    这取决于您如何设置 K8s 服务。

    如果您在 AWS 中设置了负载均衡器,那么您可以创建一个具有负载均衡器类型的服务来将服务公开到互联网。但这将花费很多钱,因为它将为每项服务拥有一个 ELB。更多参考https://kubernetes.io/docs/concepts/services-networking/service/

    另一个选项是 ingress,但如果您不熟悉 K8s,它会更复杂,但 ingress 是一种更流行的将您的 K8S 暴露在互联网上的方式

    本文可以让您更好地了解 ELB K8s。
    https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

    【讨论】:

      【解决方案3】:

      您尝试做的并不是在 EKS 上执行此操作的成本最优和标准方法。 kubernetes 集群中的 LoadBalancer 资源映射到 AWS 中的 Classic Load Balancer。这种方法将为您使用类型负载均衡器创建的每个 k8s 服务启动一个新的 ELB。 有多种方法可以做到这一点,以最适合您的用例为准。

      • 您可以使用带有 EKS 的 Application Load Balancer 来处理集群内的入口。您必须部署一个 ALB 入口控制器,该控制器将管理将配置的 ALB 分配给您在 K8s 集群中创建的每个入口资源。尽管将 ALB 集成到 EKS 中仍然相对较新,但现在将 ALB 与 EKS 结合使用存在某些缺点。一个是它不能跨集群中的命名空间工作,即对于新命名空间中的每个入口资源,ALB 入口控制器将启动一个新的 ALB,如果集群中有多个命名空间,这不是很划算.

      • 您可以使用单个负载均衡器公开您的集群,并将所有传入请求路由到内部入口代理。 nginx 很容易实现,并且与 k8s 入口资源配合得很好。您必须在集群中部署一个 nginx 入口控制器。控制器将处理将 elb 分配给入口资源。 (奖励:与 ALB 不同,nginx 入口跨命名空间工作)。

      • 如果您想使用 VPC 专用链接进行连接,也可以使用网络负载均衡器。一个示例用例是 API。您可以在私有子网内运行集群工作负载并使用面向内部的 NLB。然后通过 VPC Private Link 将该 NLB 连接到 API Gateway 服务。

      这是一个 git 存储库,其中包含一些有关使用 EKS 部署 ALB 的帮助代码:

      https://github.com/pahud/eks-alb-ingress

      有大量可用于 nginx 方法的资源。

      【讨论】:

      • 今天检查,仓库不再可用
      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2020-05-29
      • 2018-04-14
      相关资源
      最近更新 更多