【问题标题】:About the traffic flow with 'service' type 'LoadBalancer'关于“服务”类型“LoadBalancer”的流量
【发布时间】:2022-06-20 20:47:51
【问题描述】:

我有一个问题找不到明确的解释。

如果我有服务:

apiVersion: v1
kind: Service
metadata:
  name: my-app-svc
  namespace: myns
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 8080
      targetPort: 8282
  selector:
    app: my-app

正如你在上面看到的,我明确声明了type: LoadBalancer。我明白这意味着什么。我正在使用 AWS EKS。我想从流量的角度来看,这是否意味着传入的http流量是:

Load Balancer --> Node port --> service port(8080) --> Pod port(8282)

或者:

Load Balancer --> service port(8080) --> Pod port(8282)

哪一个是正确的?如果两者都不正确,那么按照每个 k8s 组件参与的顺序,流量会是多少?

【问题讨论】:

    标签: kubernetes amazon-eks


    【解决方案1】:

    Load Balancer --> Node port --> service port(8080) --> Pod port(8282)

    您的图表对于实例模式是正确的:

    到达 ALB 的流量被路由到 NodePort 以提供服务,然后代理到您的 pod。这是默认的交通模式。

    在您安装了 AWS LB 控制器并设置 alb.ingress.kubernetes.io/target-type: ip 的情况下,可以选择使用 IP 模式:

    到达 ALB 的流量会直接路由到您的服务的 pod。

    更多详情请见here

    【讨论】:

      【解决方案2】:

      创建服务时,您可以选择自动创建云负载均衡器。这提供了一个可从外部访问的 IP 地址,可将流量发送到集群节点上的正确端口。

      默认情况下,spec.allocateLoadBalancerNodePorts 为 true,并且类型 LoadBalancer 服务将继续在集群中分配节点端口,因此负载平衡器将 trqaffic 路由到 nodeport 上的节点。

      您可以选择禁用类型=LoadBalancer 的服务的节点端口分配,方法是将字段 spec.allocateLoadBalancerNodePorts 设置为 false。这应该仅用于将流量直接路由到 pod 而不是使用节点端口的负载均衡器实现。

      如果在已分配节点端口的现有服务上将 spec.allocateLoadBalancerNodePorts 设置为 false,则不会自动取消分配这些节点端口。您必须显式删除每个服务端口中的 nodePorts 条目以取消分配这些节点端口

      【讨论】:

        【解决方案3】:

        作为旁注... 当 POD 返回带有什么源 IP 的流量时,它在出去时结束了吗? (工作节点 IP?负载均衡器 IP?其他?)

        【讨论】:

          猜你喜欢
          • 2019-01-30
          • 2018-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          • 2021-05-02
          • 2022-10-16
          • 2021-12-20
          相关资源
          最近更新 更多