本页面显示如何部署外部 LoadBalancer 服务,以构建基于后端服务的外部直通网络负载均衡器。在阅读本页面之前,请确保您熟悉以下概念:
基于后端服务的外部直通网络负载均衡器
作为集群管理员,您可以创建外部 LoadBalancer 服务,以便集群外部的客户端可以将数据包发送到服务的 Pod。下图展示了为两个外部 LoadBalancer 服务(store-v1-lb-svc
和 store-v2-lb-svc
)创建的两个基于后端服务的外部直通网络负载均衡器。这两个负载均衡器都将数据包分发到集群中的节点,之后这些节点便会将数据包路由到服务 Pod。
本指南介绍了如何通过以下步骤设置名为 store-v1-lb-svc
的外部 LoadBalancer 服务:
- 创建一个启用了
HttpLoadBalancing
插件的集群。 - 创建一个包含
cloud.google.com/l4-rbs
注释的服务。 该注释会指示 GKE 创建使用区域级后端服务的基于后端服务的外部直通网络负载均衡器。 验证负载均衡器是否能够成功将数据包传送到
store-v1-lb-svc
服务的 Pod。此外,验证 GKE 是否创建了基于后端服务的外部直通网络负载均衡器的各个组件:- 转发规则
- 区域级后端服务
- 实例组
- 健康检查
- VPC 防火墙规则
删除
store-v1-lb-svc
外部 LoadBalancer 服务。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
设置集群
创建集群
使用 gcloud CLI 创建一个新集群,该集群应支持创建基于后端服务的外部直通网络负载均衡器:
gcloud container clusters create-auto CLUSTER_NAME \
--release-channel=RELEASE_CHANNEL \
--cluster-version=VERSION \
--location=COMPUTE_LOCATION
请替换以下内容:
CLUSTER_NAME
:新集群的名称。RELEASE_CHANNEL
:集群的 GKE 发布渠道的名称。VERSION
:集群的 GKE 版本,必须为 1.24.9 或更高版本。COMPUTE_LOCATION
:集群的 Compute Engine 区域。
您的新集群默认启用 HttpLoadBalancing
插件。此插件是必需的,以便控制平面可以创建和管理基于后端服务的外部直通网络负载均衡器。
升级现有集群
使用 gcloud CLI 更新现有集群,以使集群支持创建基于后端服务的外部直通网络负载均衡器。
将控制平面升级到 GKE 1.24.9 或更高版本:
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=VERSION \ --master \ --location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME
:您的集群的名称。VERSION
:GKE 版本,必须为 1.24.9 或更高版本。版本必须是集群发布渠道中的有效次要版本。如需了解详情,请参阅手动升级控制平面。COMPUTE_LOCATION
:新集群的 Compute Engine 位置。
创建外部 LoadBalancer 服务
将以下示例 Deployment 保存为
store-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: store spec: replicas: 2 selector: matchLabels: app: store template: metadata: labels: app: store spec: containers: - image: gcr.io/google_containers/echoserver:1.10 imagePullPolicy: Always name: echoserver ports: - name: http containerPort: 8080 readinessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP
将清单应用于集群:
kubectl apply -f store-deployment.yaml
验证该 Deployment 是否有两个服务 Pod:
kubectl get pods
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE store-cdb9bb4d6-s25vw 1/1 Running 0 10s store-cdb9bb4d6-vck6s 1/1 Running 0 10s
将以下服务清单保存为
store-v1-lb-svc.yaml
:apiVersion: v1 kind: Service metadata: name: store-v1-lb-svc annotations: cloud.google.com/l4-rbs: "enabled" spec: type: LoadBalancer externalTrafficPolicy: Cluster selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080
此外部 LoadBalancer 服务使用
Cluster
的默认externalTrafficPolicy
。如需详细了解externalTrafficPolicy
如何定义节点分组、有哪些节点通过了负载均衡器的健康检查以及数据包的处理方式,请参阅 LoadBalancer 服务概念。如果您使用的是 IPv4/IPv6 双栈集群,请添加
spec.ipFamilyPolicy
和ipFamilies
以定义 GKE 如何将 IP 地址分配给该服务。使用ipFamilyPolicy
和ipFamilies
规范时,请考虑以下条件:- 当您创建基于后端服务的外部直通网络负载均衡器时,GKE 会自动将
cloud.google.com/l4-rbs
注解添加到在 IPv4/IPv6 双栈集群上创建的新服务中。但是,如果您将cloud.google.com/l4-rbs: "enabled"
注解添加到现有服务清单,则集群中已存在的 LoadBalancer 服务将继续使用基于目标池的外部直通网络负载均衡器(仅 IPv4)。如需了解详情,请参阅节点分组。 - GKE 可以分配单栈(仅 IPv4 或仅 IPv6)或双栈 LoadBalancer 服务。双栈 LoadBalancer 服务由两个单独的外部直通网络负载均衡器转发规则实现:一个用于处理基于 IPv4 的 TCP 流量,另一个用于处理基于 IPv6 的 TCP 流量。如需了解详情,请参阅服务。
- 当您创建基于后端服务的外部直通网络负载均衡器时,GKE 会自动将
将清单应用于集群:
kubectl apply -f store-v1-lb-svc.yaml
验证您的服务是否正在运行:
kubectl get svc store-v1-lb-svc
输出类似于以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-v1-lb-svc LoadBalancer 10.44.196.160 35.193.28.231 8080:32466/TCP 11m
GKE 为外部直通网络负载均衡器分配了一个
EXTERNAL_IP
。测试与负载均衡器之间的连接:
curl EXTERNAL_IP:PORT
替换以下内容:
EXTERNAL_IP
:为外部直通式网络负载均衡器分配的 IP 地址。PORT
:为外部直通网络负载均衡器分配的端口号。
输出类似于以下内容:
Hostname: store-v1-lb-svc-cdb9bb4d6-hflxd Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=10.128.0.50 method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=EXTERNAL_IP Request Headers: accept=*/* host=EXTERNAL_IP user-agent=curl/7.81.0 Request Body: -no body in request-
验证外部 LoadBalancer 服务及其组件
检查您的 LoadBalancer 服务以及描述其 Google Cloud 资源的一组注释:
kubectl describe svc store-v1-lb-svc
输出类似于以下内容:
Name: store-v1-lb-svc Namespace: default Labels: <none> Annotations: cloud.google.com/l4-rbs: enabled service.kubernetes.io/backend-service: k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x service.kubernetes.io/firewall-rule: k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x service.kubernetes.io/firewall-rule-for-hc: k8s2-c086604n-l4-shared-hc-fw service.kubernetes.io/healthcheck: k8s2-c086604n-l4-shared-hc service.kubernetes.io/tcp-forwarding-rule: a683373f85bfe433ba929a50ca8d72e2 Selector: app=store Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.44.196.160 IPs: 10.44.196.160 LoadBalancer Ingress: 35.193.28.231 Port: tcp-port 8080/TCP TargetPort: 8080/TCP NodePort: tcp-port 32466/TCP Endpoints: 10.48.0.5:8080,10.48.2.8:8080 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 2m42s loadbalancer-controller default/store-v1-lb-svc Normal EnsuringLoadBalancer 102s (x2 over 2m42s) service-controller Ensuring load balancer Normal Annotations 102s loadbalancer-controller map[cloud.google.com/l4-rbs:enabled kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"Service","metadata":{"annotations": {"cloud.google.com/l4-rbs":"enabled"},"name":"store-v1-lb-svc","namespace":"default"} ,"spec":{"externalTrafficPolicy":"Cluster","ports": [{"name":"tcp-port","port":8080,"protocol":"TCP","targetPort":8080}], "selector":{"app":"store"},"type":"LoadBalancer"}} ] -> map[cloud.google.com/l4-rbs:enabled kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind": "Service","metadata":{"annotations":{"cloud.google.com/l4-rbs":"enabled"}, "name":"store-v1-lb-svc","namespace":"default"},"spec":{"externalTrafficPolicy" :"Cluster","ports":[{"name":"tcp-port","port":8080,"protocol":"TCP","targetPort" :8080}],"selector":{"app":"store"},"type":"LoadBalancer"}} service.kubernetes.io/backend-service:k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x service.kubernetes.io/firewall-rule:k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x service.kubernetes.io/firewall-rule-for-hc:k8s2-c086604n-l4-shared-hc-fw service.kubernetes.io/healthcheck:k8s2-c086604n-l4-shared-hc service.kubernetes.io/tcp-forwarding-rule:a683373f85bfe433ba929a50ca8d72e2] Normal SyncLoadBalancerSuccessful 16s (x3 over 102s) loadbalancer-controller Successfully ensured L4 External LoadBalancer resources
有几个字段表明已成功创建基于后端服务的外部直通网络负载均衡器及其 Google Cloud 资源:
Events
字段。如果 LoadBalancer 服务及其资源创建成功,则该字段为空。如果发生错误,则会在该字段列出。已启用
Annotations
的列表:GKE 会将以下只读注释的列表添加到服务清单。名称以service.kubernetes.io/
开头的每个注释都用于指示作为负载均衡器的一部分创建或为了支持负载均衡器而创建的 Google Cloud 资源的名称。service.kubernetes.io/backend-service
注释指示负载均衡器的后端服务的名称。service.kubernetes.io/healthcheck
注释指示后端服务使用的负载均衡器健康检查的名称。service.kubernetes.io/tcp-forwarding-rule
或service.kubernetes.io/udp-forwarding-rule
注释指示负载均衡器的转发规则的名称。service.kubernetes.io/firewall-rule
注释指示为允许流向集群节点的流量而创建的防火墙规则的名称。此防火墙规则的来源范围可使用spec.loadBalancerSourceRanges[]
进行自定义。如需详细了解 LoadBalancer 服务的防火墙规则,请参阅防火墙规则和来源 IP 地址许可名单。service.kubernetes.io/firewall-rule-for-hc
注释指示负载均衡器健康检查所需的防火墙规则的名称。
验证是否已为外部 LoadBalancer 服务创建负载均衡器资源和防火墙规则:
如需查看转发规则,请运行以下命令:
gcloud compute forwarding-rules describe FWD_RULE_NAME \ --region=REGION_NAME
替换以下内容:
FWD_RULE_NAME
:由service.kubernetes.io/tcp-forwarding-rule
或service.kubernetes.io/udp-forwarding-rule
只读注释提供的转发规则名称。如需查看这些注释,请运行kubectl describe svc SERVICE_NAME
。REGION_NAME
:包含集群的 Google Cloud 区域。对于可用区级集群,该区域包含集群使用的可用区。
如需查看后端服务,请运行以下命令:
gcloud compute backend-services describe BACKEND_SERVICE_NAME \ --region=REGION_NAME
替换以下内容:
BACKEND_SERVICE_NAME
:由service.kubernetes.io/backend-service
只读注释提供的后端服务名称。如需查看此只读注释,请运行kubectl describe svc SERVICE_NAME
。REGION_NAME
:包含集群的 Google Cloud 区域。对于可用区级集群,该区域包含集群使用的可用区。
如需查看负载均衡器健康检查,请运行以下命令:
gcloud compute health-checks describe HEALTH_CHECK_NAME \ --region=REGION_NAME
替换以下内容:
HEALTH_CHECK_NAME
:负载均衡器健康检查的名称。健康检查的名称由service.kubernetes.io/healthcheck
只读注释提供。如需查看此只读注释,请运行kubectl describe svc SERVICE_NAME
。REGION_NAME
:包含集群的 Google Cloud 区域。对于可用区级集群,该区域包含集群使用的可用区。
如需查看防火墙规则,请运行以下命令:
gcloud compute firewall-rules describe FIREWALL_RULE_NAME \ gcloud compute firewall-rules describe HEALTH_CHECK_FIREWALL_RULE_NAME
替换以下内容:
FIREWALL_RULE_NAME
:允许流量流向负载均衡器的防火墙规则的名称。此防火墙规则的名称由service.kubernetes.io/firewall-rule
只读注释提供。如需查看此只读注释,请运行kubectl describe svc SERVICE_NAME
。HEALTH_CHECK_FIREWALL_RULE_NAME
:允许对负载均衡器后端(集群节点)进行健康检查的防火墙规则的名称。此防火墙规则的名称由service.kubernetes.io/firewall-rule-for-hc
只读注释提供。如需查看此只读注释,请运行kubectl describe svc SERVICE_NAME
。
删除外部 LoadBalancer 服务及其组件
删除 store-v1-lb-svc
外部 LoadBalancer 服务。
kubectl delete service store-v1-lb-svc
GKE 会删除以下资源:
- 负载均衡器的转发规则。
- 负载均衡器的后端服务。
- 负载均衡器的健康检查。
- 负载均衡器及其健康检查的流量所需的 VPC 防火墙规则。
- 可用区级非代管式实例组后端,前提是 GKE 不需要将这些后端用作集群创建的其他负载均衡器的后端。
后续步骤
- 如需大致了解负载均衡器服务,请参阅 LoadBalancer 服务。
- 如需了解负载均衡器服务参数,请参阅 LoadBalancer 服务参数。
- 排查 GKE 中的负载均衡问题。