1

例如 istio 服务

istio-ingressgateway   LoadBalancer   10.103.19.83   10.160.32.41   15021:30943/TCP,80:32609/TCP,443:30341/TCP,3306:30682/TCP,15443:30302/TCP

这导致了 TCP 内部负载平衡器。前端是端口 15021、80、443、3306 和 15443。

后端基本上是集群的实例组。

负载均衡器如何知道前端的 443 会转发到后端的 30341?据我所知,TCP负载均衡器正在做端口转发?魔术是如何/在哪里发生的

4

2 回答 2

0

Servicekubernetes中创建a 时,会随之创建相应的Endpoints对象。它也适用于LoadBalancer服务类型。

如果您创建一个简单的 nginx 部署,例如通过运行:

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

然后将其公开为LoadBalancer服务:

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

除了服务本身,您还将看到lb-nginx Endpoints对象。您可以检查其详细信息:

kubectl 获取 ep lb-nginx -o yaml

如您所见,它跟踪所有暴露的 pod(在本例中是 a 的一部分) ,因此负责将流量转发到特定 pod 的Deployment相应iptables规则可以始终保持最新,甚至如果他们的数量或他们的 ip chages。

例如,您可以将部署扩展到 5 个副本:

kubectl scale deployment nginx-deployment --replicas=5

并再次检查Endpoints对象:

kubectl get ep lb-nginx -o yaml

您会看到,在您的 5 个 pod 启动并运行后,它也会立即更新。

正如您subsets在 yaml 部分中看到的:

subsets:
- addresses:
  - ip: 10.12.0.3
    nodeName: gke-gke-default-pool-75259266-oauz
    targetRef:
      kind: Pod
      name: nginx-deployment-66b6c48dd5-dw9mt
      namespace: default
      resourceVersion: "22394113"
      uid: 8d7e1d3e-64e2-4891-b567-61ee48f61ed1

除了 ip 地址之外,Pod它还维护有关它正在运行的节点的信息。

让我们回到Service

kubectl get svc lb-nginx -o yaml

正如您所看到LoadBalancer的,除了其外部 IP 地址之外的服务与ClusterIP其他Service服务一样(好吧,几乎所有无头服务都没有 ClusterIP):

spec:
  clusterIP: 10.16.6.236
  clusterIPs:
  - 10.16.6.236
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31935
    port: 80
    protocol: TCP
    targetPort: 80

因此,您可以想象这个外部 IP 以某种方式映射到集群 ip,因此它将流量进一步路由到集群中的各个端点。这种映射是如何完成的并不重要,因为它是由云提供商完成的,并且这些实施细节不是公开共享知识的一部分。您唯一需要知道的是,当您的云提供商提供外部负载均衡器以满足您ServiceLoadBalancer类型,除了创建一个外部负载均衡器之外,它还负责此外部 IP 和分配给它的一些标准端口之间的映射,以及一个 kubernetes 服务,该服务具有将流量进一步路由到相应 pod 所需的所有信息。如果您想知道这在 GCP 端是如何完成的,即外部(或内部)负载均衡器和 kubernetesLoadBalancer服务之间的映射/绑定,我担心这些实现细节不会公开披露。

于 2021-08-03T14:42:30.940 回答
0

LoadBalancer Service 类型是 NodePort 类型的扩展,NodePort 类型是 ClusterIP 类型的扩展。nodePort 只是在每个工作节点上打开一个 30000-32767 范围内的端口,并使用标签选择器来识别将流量发送到哪些 Pod。

这意味着内部客户端通过使用节点的内部 IP 地址以及 nodePort 指定的 TCP 端口来调用服务。请求被转发到 targetPort 字段指定的 TCP 端口上的成员 Pod 之一。

这是一个例子

于 2021-07-20T23:10:27.183 回答