首页 > 解决方案 > 在弹性 beantalk 和 kubernetes 之间分配的应用程序负载均衡器

问题描述

我们需要能够根据 url 路径将请求指向不同的应用程序。在我们的例子中,我们有一个用于一个服务的弹性 beanstalk 应用程序和一个用于另一个服务的 kubernetes 集群。我们需要能够将请求作为 api.example.com/service1 路由到弹性 beanstalk 和 api.example.com/service2 到 kubernetes。

我们在 SO 上遇到了这个问题/答案: 跨不同 Elastic Beanstalk 应用程序的负载平衡

按照步骤将我们创建的新应用程序负载均衡器指向的目标组关联到 EB 环境的 Auto Scaling 组后,对 /service1 的请求实际上可以工作,但只有大约一半的时间。另一次请求只是超时并且没有收到响应。

为了排除安全组问题,我们暂时向所有流量开放了 Elastic Beanstalk 实例安全组,但此问题仍然存在。

这是向“每个人”目标组显示全部转发的应用程序负载均衡器规则。“everbody”目标组是附加到 EB 环境的 Auto Scaling 组的新目标组。 显示全部转发到的应用程序负载均衡器规则

这是目标组下的注册目标,显示了 3 个健康的实例。 注册目标

是否有人能够看到我们可能做错了导致这些间歇性问题的事情?

标签: amazon-web-serviceskubernetesamazon-elastic-beanstalk

解决方案


您需要一个全局负载均衡器来管理两个集群。您可以使用代理作为全局负载均衡器,例如 haproxy、envoy。现在在这种情况下,您的 dns 将指向代理,然后代理将在弹性 beanstalk 和 Kubernetes 集群之间路由流量。

特使.yml

  static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/service/1"
                route:
                  cluster: service1
              - match:
                  prefix: "/service/2"
                route:
                  cluster: service2
          http_filters:
          - name: envoy.router
            typed_config: {}
  clusters:
  - name: service1
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    load_assignment:
      cluster_name: service1
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service1
                port_value: 80
  - name: service2
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    load_assignment:
      cluster_name: service2
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service2
                port_value: 80
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

Dockerfile

FROM envoyproxy/envoy-dev:98c35eff10ad170d550fb5ecfc2c6b3637418c0c

COPY envoy.yaml /etc/envoy/envoy.yaml

Google 刚刚推出了 Traffic Director,Traffic Director 也可以作为全局负载均衡器。观看交通主管的这个会议


推荐阅读