创建基于后端服务的外部负载均衡器


本页面介绍了如何部署外部 LoadBalancer Service,以构建基于后端服务的外部直通式网络负载均衡器。在阅读本页面之前,请确保您熟悉以下概念:

基于后端服务的外部直通网络负载均衡器

作为集群管理员,您可以创建外部 LoadBalancer 服务,以便集群外部的客户端可以将数据包发送到服务的 Pod。下图展示了为两个外部 LoadBalancer 服务(store-v1-lb-svcstore-v2-lb-svc)创建的两个基于后端服务的外部直通网络负载均衡器。这两个负载均衡器都将数据包分发到集群中的节点,之后这些节点便会将数据包路由到服务 Pod。

由基于区域级后端服务的外部直通式网络负载均衡器提供支持的外部 LoadBalancer Service。

本指南介绍了如何按照以下步骤设置名为 store-v1-lb-svc 的外部 LoadBalancer Service:

  1. 创建一个启用了 HttpLoadBalancing 插件的集群。
  2. 创建一个包含 cloud.google.com/l4-rbs 注释的服务。 该注释会指示 GKE 创建使用区域级后端服务的基于后端服务的外部直通网络负载均衡器。
  3. 验证负载均衡器是否能够成功将数据包传送到 store-v1-lb-svc 服务的 Pod。此外,验证 GKE 是否创建了基于后端服务的外部直通网络负载均衡器的各个组件:

    • 转发规则
    • 区域级后端服务
    • 实例组
    • 健康检查
    • VPC 防火墙规则
  4. 删除 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 更新现有集群,以使集群支持创建基于后端服务的外部直通网络负载均衡器。

  1. 将控制平面升级到 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 服务

  1. 将以下示例 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
    
  2. 将清单应用于集群:

    kubectl apply -f store-deployment.yaml
    
  3. 验证该 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
    
  4. 将以下服务清单保存为 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.ipFamilyPolicyipFamilies 以定义 GKE 如何将 IP 地址分配给该服务。使用 ipFamilyPolicyipFamilies 规范时,请考虑以下条件:

    • 当您创建基于后端服务的外部直通网络负载均衡器时,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 流量。如需了解详情,请参阅服务
  5. 将清单应用于集群:

    kubectl apply -f store-v1-lb-svc.yaml
    
  6. 验证您的服务是否正在运行:

    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

  7. 测试与负载均衡器之间的连接:

    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 服务及其组件

  1. 检查您的 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-ruleservice.kubernetes.io/udp-forwarding-rule 注释指示负载均衡器的转发规则的名称。

    • service.kubernetes.io/firewall-rule 注释指示为允许流向集群节点的流量而创建的防火墙规则的名称。此防火墙规则的来源范围可使用 spec.loadBalancerSourceRanges[] 进行自定义。如需详细了解 LoadBalancer 服务的防火墙规则,请参阅防火墙规则和来源 IP 地址许可名单

    • service.kubernetes.io/firewall-rule-for-hc 注释指示负载均衡器健康检查所需的防火墙规则的名称。

  2. 验证是否已为外部 LoadBalancer 服务创建负载均衡器资源和防火墙规则:

  • 如需查看转发规则,请运行以下命令:

      gcloud compute forwarding-rules describe FWD_RULE_NAME \
        --region=REGION_NAME
    

    替换以下内容:

    • FWD_RULE_NAME:由 service.kubernetes.io/tcp-forwarding-ruleservice.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 不需要将这些后端用作集群创建的其他负载均衡器的后端。

后续步骤