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