配置外部负载平衡器

外部负载平衡器 (ELB) 会公开服务,以便组织外部的用户可以通过分配给组织(从更大的实例外部 IP 池中)的池 IP 地址访问这些服务。

ELB 虚拟 IP (VIP) 地址在组织之间不会发生冲突,并且在所有组织中都是唯一的。因此,您必须仅将 ELB 服务用于组织外部的客户必须访问的服务。

只要您允许组织内部运行的工作负载退出组织,这些工作负载就可以访问 ELB 服务。此流量模式实际上要求先从组织发出出站流量,然后再返回到内部服务。

准备工作

如需配置 ELB 服务,您必须具备以下条件:

  • 拥有您要配置负载均衡器的项目。如需了解详情,请参阅创建项目
  • 自定义的 ProjectNetworkPolicy (PNP) 入站流量政策,用于允许流量流向此 ELB 服务。如需了解详情,请参阅配置 PNP 以允许流量流向 ELB
  • 必要的身份和访问权限角色:

    • Project NetworkPolicy Admin:有权管理项目命名空间中的项目网络政策。请让您的组织 IAM 管理员为您授予 Project NetworkPolicy Admin (project-networkpolicy-admin) 角色。
    • Load Balancer Admin:请组织 IAM 管理员为您授予 Load Balancer Admin (load-balancer-admin) 角色。
    • Global Load Balancer Admin:对于全球 ELB,请让组织 IAM 管理员向您授予 Global Load Balancer Admin (global-load-balancer-admin) 角色。如需了解详情,请参阅预定义角色说明

配置 PNP 以允许流量流向 ELB

为了使 ELB 服务正常运行,您必须配置并应用自己的自定义 ProjectNetworkPolicy 入站流量政策,以允许流量流向此 ELB 服务的工作负载。网络政策控制对工作负载的访问,而不是负载均衡器本身的访问权限。 ELB 会将工作负载公开给客户网络,因此需要明确的网络政策来允许外部流量流向工作负载端口,例如 8080

指定外部 CIDR 地址以允许流量流向此 ELB 的工作负载:

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: allow-inbound-traffic-from-external
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - ipBlock:
        cidr: CIDR
    ports:
    - protocol: TCP
      port: PORT
EOF

替换以下内容:

  • MANAGEMENT_API_SERVER:管理 API 服务器的 kubeconfig 路径的 kubeconfig 路径。如果您尚未为目标可用区中的 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
  • PROJECT:您的 GDC 项目的名称。
  • CIDR:需要从哪个外部 CIDR 访问 ELB。此政策是必需的,因为外部负载均衡器使用直接服务器返回 (DSR),该功能可保留源外部 IP 地址,并在返回路径上绕过负载均衡器。如需了解详情,请参阅为跨组织流量创建全球入站防火墙规则
  • PORT:负载均衡器后面的 pod 上的后端端口。此值位于 Service 资源的清单的 .spec.ports[].targetPort 字段中。此字段是可选字段。

创建外部负载平衡器

您可以创建全球级或可用区级 ELB。全球 ELB 的范围涵盖整个 GDC 宇宙。区域 ELB 的范围仅限于创建时指定的可用区。如需了解详情,请参阅全球和可用区级负载平衡器

在 GDC 中使用三种不同的方法创建 ELB:

您可以使用 KRM API 和 gdcloud CLI 定位 Pod 或虚拟机工作负载。当您直接在 Kubernetes 集群中使用 Kubernetes 服务时,只能以创建 Service 对象的集群中的工作负载为目标。

创建可用区级 ELB

使用 gcloud CLI、KRM API 或 Kubernetes 集群中的 Kubernetes 服务创建区域 ELB:

gdcloud

使用 gdcloud CLI 创建以 Pod 或虚拟机工作负载为目标的 ELB。

此 ELB 以项目中与 Backend 对象中定义的标签匹配的所有工作负载为目标。

如需使用 gdcloud CLI 创建 ELB,请按照以下步骤操作:

  1. 创建 Backend 资源以定义 ELB 的端点:

    gdcloud compute backends create BACKEND_NAME \
      --labels=LABELS \
      --project=PROJECT_NAME \
      --zone=ZONE \
      --cluster=CLUSTER_NAME
    

    替换以下内容:

    • BACKEND_NAME:您为后端资源选择的名称,例如 my-backend
    • LABELS:一种选择器,用于定义要为此后端资源使用哪些 Pod 与虚拟机之间的端点。例如 app=web
    • PROJECT_NAME:您的项目的名称。
    • ZONE:要用于此调用的可用区。如需为所有需要可用区标志的命令预设该标志,请运行:gdcloud config set core/zone ZONE。可用区标志仅在多可用区环境中可用。此字段是可选字段。
    • CLUSTER_NAME:定义的选择器的范围所限制到的集群。如果未指定此字段,则会选择具有指定标签的所有端点。此字段是可选字段。
  2. 如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:

    gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --check-interval=CHECK_INTERVAL \
      --healthy-threshold=HEALTHY_THRESHOLD \
      --timeout=TIMEOUT \
      --unhealthy-threshold=UNHEALTHY_THRESHOLD \
      --port=PORT \
      --zone=ZONE
    

    替换以下内容:

    • HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如 my-health-check
    • CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为 5。此字段是可选字段。
    • HEALTHY_THRESHOLD:在声明失败之前等待的时间。默认值为 5。此字段是可选字段。
    • TIMEOUT:在声明失败之前等待的时间量(以秒为单位)。默认值为 5。此字段是可选字段。
    • UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为 2。此字段是可选字段。
    • PORT:执行健康检查的端口。默认值为 80。此字段是可选字段。
    • ZONE:您要在其中创建此 ELB 的可用区。
  3. 创建 BackendService 资源,并将之前创建的 Backend 资源添加到其中:

    gdcloud compute backend-services create BACKEND_SERVICE_NAME \
      --project=PROJECT_NAME \
      --target-ports=TARGET_PORTS \
      --zone=ZONE \
      --health-check=HEALTH_CHECK_NAME
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:相应后端服务的所选名称。
    • TARGET_PORT:此后端服务转换的目标端口的英文逗号分隔列表,其中每个目标端口都指定了协议、转发规则中的端口和后端实例中的端口。您可以指定多个目标端口。此字段必须采用 protocol:port:targetport 格式,例如 TCP:80:8080。此字段是可选字段。
    • HEALTH_CHECK_NAME:健康检查资源的名称。此字段是可选字段。仅当您为虚拟机工作负载配置 ELB 时,才添加此字段。
  4. BackendService 资源添加到之前创建的 Backend 资源:

    gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --backend=BACKEND_NAME \
      --project=PROJECT_NAME \
      --zone=ZONE
    
  5. 可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请使用 gdcloud compute load-balancer-policy create 命令创建后端服务政策:

     gdcloud compute load-balancer-policy create POLICY_NAME
     --session-affinity=MODE
     --selectors=RESOURCE_LABEL
    

    替换以下内容:

    • POLICY_NAME:您为后端服务政策选择的名称。
    • MODE:会话亲和性模式。支持两种模式:

      • NONE:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。
      • CLIENT_IP_DST_PORT_PROTO:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
    • RESOURCE_LABEL:用于选择 BackendServicePolicy 资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个 BackendServicePolicy 资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应 BackendService 资源的会话亲和性会变为已启用。

  6. 创建外部 ForwardingRule 资源,用于定义服务可用的 VIP:

    gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \
      --backend-service=BACKEND_SERVICE_NAME \
      --cidr=CIDR \
      --ip-protocol-port=PROTOCOL_PORT \
      --load-balancing-scheme=EXTERNAL \
      --zone=ZONE \
      --project=PROJECT_NAME
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:后端服务的名称。
    • FORWARDING_RULE_EXTERNAL_NAME:您为转发规则选择的名称。
    • CIDR:此字段是可选字段。如果未指定,系统会自动从可用区 IP 池中预留一个 IPv4/32 CIDR。指定与相应转发规则位于同一命名空间中的 Subnet 资源的名称。Subnet 资源表示区域子网的请求和分配信息。如需详细了解 Subnet 资源,请参阅自定义资源示例
    • PROTOCOL_PORT:要在转发规则中公开的协议和端口。此字段必须采用 ip-protocol=TCP:80 格式。公开的端口必须与实际应用在容器内公开的端口相同。
  7. 如需验证配置的 ELB,请确认每个已创建对象的 Ready 条件。如需获取负载均衡器的已分配 IP 地址,请描述转发规则:

    gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
    
  8. 如需验证配置的 ELB,请确认每个已创建对象的 Ready 条件。通过向 VIP 发送 curl 请求来验证流量:

    1. 如需获取分配的 VIP,请描述转发规则:

      gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
      
    2. 通过向转发规则中 PROTOCOL_PORT 字段指定的端口上的 VIP 发送 curl 请求来验证流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      替换以下内容:

      • FORWARDING_RULE_VIP:转发规则的 VIP。
      • PORT:转发规则中 PROTOCOL_PORT 字段的起始端口号。

API

使用 KRM API 创建以 Pod 或虚拟机工作负载为目标的 ELB。 此 ELB 以项目中与 Backend 对象中定义的标签匹配的所有工作负载为目标。

如需使用 KRM API 创建可用区级 ELB,请按以下步骤操作:

  1. 创建 Backend 资源以定义 ELB 的端点。为放置工作负载的每个可用区创建 Backend 资源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: Backend
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_NAME
    spec:
      clusterName: CLUSTER_NAME
      endpointsLabels:
        matchLabels:
          app: server
    EOF
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:区域管理 API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到地区性广告资源背景
    • PROJECT_NAME:您的项目的名称。
    • BACKEND_NAMEBackend 资源的名称。
    • CLUSTER_NAME:此字段为可选字段。此字段用于指定所定义选择器的范围所限定到的集群。此字段不适用于虚拟机工作负载。如果 Backend 资源未包含 clusterName 字段,则指定的标签会应用于项目中的所有工作负载。
  2. 如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: HealthCheck
    metadata:
      namespace: PROJECT_NAME
      name: HEALTH_CHECK_NAME
    spec:
      tcpHealthCheck:
        port: PORT
      timeoutSec: TIMEOUT
      checkIntervalSec: CHECK_INTERVAL
      healthyThreshold: HEALTHY_THRESHOLD
      unhealthyThreshold: UNHEALTHY_THRESHOLD
    EOF
    

    替换以下内容:

    • HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如 my-health-check
    • PORT:执行健康检查的端口。默认值为 80
    • TIMEOUT:在声明失败之前等待的时间量(以秒为单位)。默认值为 5
    • CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为 5
    • HEALTHY_THRESHOLD:要将端点视为运行状况良好必须通过的连续探测次数。默认值为 2
    • UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为 2
  3. 使用之前创建的 Backend 资源创建一个 BackendService 对象。如果您要为虚拟机工作负载配置 ELB,请添加 HealthCheck 资源。

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: BackendService
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_SERVICE_NAME
    spec:
      backendRefs:
      - name: BACKEND_NAME
      healthCheckName: HEALTH_CHECK_NAME
    EOF
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:为 BackendService 资源选择的名称。
    • HEALTH_CHECK_NAME:您之前创建的 HealthCheck 资源的名称。如果您要为 Pod 工作负载配置 ELB,请勿添加此字段。
  4. 可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请创建 BackendServicePolicy 资源。此资源定义了会话亲和性设置,并将 BackendServicePolicy 资源应用于 BackendService 资源。创建并应用 BackendServicePolicy 资源:

     kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
     apiVersion: networking.global.gdc.goog/v1
     kind: BackendServicePolicy
     metadata:
         namespace: PROJECT_NAME
         name: POLICY_NAME
     spec:
         sessionAffinity: MODE
         selector:
             matchLabels:
               RESOURCE_LABEL
    

    替换以下内容:

    • POLICY_NAME:您为后端服务政策选择的名称。
    • MODE:会话亲和性模式。支持两种模式:

      • NONE:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。
      • CLIENT_IP_DST_PORT_PROTO:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
    • RESOURCE_LABEL:用于选择 BackendServicePolicy 资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个 BackendServicePolicy 资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应 BackendService 资源的会话亲和性会变为已启用。

  5. 创建外部 ForwardingRule 资源,用于定义服务可用的 VIP。

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ForwardingRuleExternal
    metadata:
      namespace: PROJECT_NAME
      Name: FORWARDING_RULE_EXTERNAL_NAME
    spec:
      cidrRef: CIDR
      ports:
      - port: PORT
        Protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:您的 BackendService 资源的名称。
    • FORWARDING_RULE_EXTERNAL_NAME:您为 ForwardingRuleExternal 资源选择的名称。
    • CIDR:此字段是可选字段。如果未指定,系统会自动从可用区 IP 池中预留一个 IPv4/32 CIDR。指定与相应转发规则位于同一命名空间中的 Subnet 资源的名称。Subnet 资源表示可用区子网的请求和分配信息。如需详细了解 Subnet 资源,请参阅自定义资源示例
    • PORT:使用 ports 字段指定一个 L4 端口数组,数据包将转发到使用此转发规则配置的后端。必须至少指定一个端口。使用 port 字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。
    • PROTOCOL:用于转发规则的协议,例如 TCPports 数组中的条目必须如下所示:

      ports:
      - port: 80
        protocol: TCP
      
  6. 如需验证配置的 ELB,请确认每个已创建对象的 Ready 条件。通过向 VIP 发送 curl 请求来验证流量:

    1. 如需获取 VIP,请使用 kubectl get

      kubectl get forwardingruleexternal -n PROJECT_NAME
      

      输出如下所示:

      NAME           BACKENDSERVICE                               CIDR              READY
      elb-name       BACKEND_SERVICE_NAME        10.200.32.59/32   True
      
    2. 通过向转发规则中 PORT 字段指定的端口上的 VIP 发送 curl 请求来验证流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      FORWARDING_RULE_VIP 替换为转发规则的 VIP。

Kubernetes Service

您可以在 GDC 中通过在 Kubernetes 集群中创建类型为 LoadBalancer 的 Kubernetes Service 来创建 ELB。

如需创建 ELB 服务,请执行以下操作:

  1. LoadBalancer 类型的 Service 定义创建一个 YAML 文件。

    以下 Service 对象是 ELB 服务的示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: ELB_SERVICE_NAME
      namespace: PROJECT_NAME
    spec:
      ports:
      - port: 1235
        protocol: TCP
        targetPort: 1235
      selector:
        k8s-app: my-app
      type: LoadBalancer
    

    替换以下内容:

    • ELB_SERVICE_NAME:ELB 服务的名称。
    • PROJECT_NAME:包含后端工作负载的项目的命名空间。

    port 字段用于配置您在 VIP 地址上公开的前端端口。targetPort 字段用于配置您希望将后端工作负载上的流量转发到的后端端口。负载均衡器支持网络地址转换 (NAT)。前端端口和后端端口可以不同。

  2. Service 定义的 selector 字段中,将 Pod 或虚拟机指定为后端工作负载。

    选择器用于根据您指定的标签与工作负载上的标签的匹配情况,定义要将哪些工作负载作为此服务的后端工作负载。Service 只能选择您定义 Service 的同一项目和同一集群中的后端工作负载。

    如需详细了解服务选择,请参阅 https://kubernetes.io/docs/concepts/services-networking/service/

  3. Service 定义文件保存在与后端工作负载相同的项目中。

  4. Service 定义文件应用于集群:

    kubectl apply -f ELB_FILE
    

    ELB_FILE 替换为 ELB 服务的 Service 定义文件的名称。

    创建 ELB 时,该服务会获得两个 IP 地址。一个是只能从同一集群内访问的内部 IP 地址。另一个是外部 IP 地址,可从组织内部和外部访问。您可以通过查看服务状态来获取 ELB 服务的 IP 地址:

    kubectl -n PROJECT_NAME get svc ELB_SERVICE_NAME
    

    替换以下内容:

    • PROJECT_NAME:包含后端工作负载的项目的命名空间。
    • ELB_SERVICE_NAME:ELB 服务的名称。

    您必须获得类似于以下示例的输出:

    NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
    elb-service             LoadBalancer   10.0.0.1      20.12.1.11      1235:31931/TCP   22h
    

    EXTERNAL-IP 是可从组织外部访问的服务的 IP 地址。

    如果您未获得输出,请确保您已成功创建 ELB 服务。

创建全局 ELB

使用 gdcloud CLI 或 KRM API 创建全局 ELB。

gdcloud

使用 gdcloud CLI 创建以 Pod 或虚拟机工作负载为目标的 ELB。

此 ELB 以项目中与 Backend 对象中定义的标签匹配的所有工作负载为目标。Backend 自定义资源的范围必须限定为某个可用区。

如需使用 gdcloud CLI 创建 ELB,请按照以下步骤操作:

  1. 创建 Backend 资源以定义 ELB 的端点:

    gdcloud compute backends create BACKEND_NAME \
      --labels=LABELS \
      --project=PROJECT_NAME \
      --cluster=CLUSTER_NAME \
      --zone=ZONE
    

    替换以下内容:

    • BACKEND_NAME:您为后端资源选择的名称,例如 my-backend
    • LABELS:一种选择器,用于定义要为此后端资源使用哪些 Pod 与虚拟机之间的端点。例如 app=web
    • PROJECT_NAME:您的项目的名称。
    • CLUSTER_NAME:定义的选择器的范围所限制到的集群。如果未指定此字段,则会选择具有指定标签的所有端点。此字段是可选字段。
    • ZONE:要用于此调用的可用区。如需为所有需要可用区标志的命令预设该标志,请运行:gdcloud config set core/zone ZONE。只有在多区域环境中,区域标志才可用。此字段是可选字段。
  2. 如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:

    gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \
      --check-interval=CHECK_INTERVAL \
      --healthy-threshold=HEALTHY_THRESHOLD \
      --timeout=TIMEOUT \
      --unhealthy-threshold=UNHEALTHY_THRESHOLD \
      --port=PORT \
      --global
    

    替换以下内容:

    • HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如 my-health-check
    • CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为 5。此字段是可选字段。
    • HEALTHY_THRESHOLD:在声明失败之前等待的时间。默认值为 5。此字段是可选字段。
    • TIMEOUT:在声明失败之前等待的时间量(以秒为单位)。默认值为 5。此字段是可选字段。
    • UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为 2。此字段是可选字段。
    • PORT:执行健康检查的端口。默认值为 80。此字段是可选字段。
  3. 创建 BackendService 资源,并将之前创建的 Backend 资源添加到其中:

    gdcloud compute backend-services create BACKEND_SERVICE_NAME \
      --project=PROJECT_NAME \
      --target-ports=TARGET_PORTS \
      --health-check=HEALTH_CHECK_NAME \
      --global
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:相应后端服务的所选名称。
    • TARGET_PORTS:此后端服务转换的目标端口的英文逗号分隔列表,其中每个目标端口都指定了协议、转发规则中的端口和后端实例中的端口。您可以指定多个目标端口。此字段必须采用 protocol:port:targetport 格式,例如 TCP:80:8080。此字段是可选字段。
    • HEALTH_CHECK_NAME:健康检查资源的名称。此字段是可选字段。仅当您为虚拟机工作负载配置 ELB 时,才添加此字段。
  4. BackendService 资源添加到之前创建的 Backend 资源:

    gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --backend=BACKEND_NAME \
      --backend-zone BACKEND_ZONE \
      --project=PROJECT_NAME \
      --global
    
  5. 可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请使用 gdcloud compute load-balancer-policy create 命令创建后端服务政策:

     gdcloud compute load-balancer-policy create POLICY_NAME
     --session-affinity=MODE
     --selectors=RESOURCE_LABEL
    

    替换以下内容:

    • POLICY_NAME:您为后端服务政策选择的名称。
    • MODE:会话亲和性模式。支持两种模式:

      • NONE:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。
      • CLIENT_IP_DST_PORT_PROTO:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
    • RESOURCE_LABEL:用于选择 BackendServicePolicy 资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个 BackendServicePolicy 资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应 BackendService 资源的会话亲和性会变为已启用。

  6. 创建外部 ForwardingRule 资源,用于定义服务可用的 VIP:

    gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \
      --backend-service=BACKEND_SERVICE_NAME \
      --cidr=CIDR \
      --ip-protocol-port=PROTOCOL_PORT \
      --load-balancing-scheme=EXTERNAL \
      --project=PROJECT_NAME \
      --global
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:后端服务的名称。
    • FORWARDING_RULE_EXTERNAL_NAME:您为转发规则选择的名称。
    • CIDR:此字段是可选字段。如果未指定,系统会自动从全局 IP 池中预留一个 IPv4/32 CIDR。 指定与相应转发规则位于同一命名空间中的 Subnet 资源的名称。Subnet 资源表示全球子网的请求和分配信息。如需详细了解 Subnet 资源,请参阅自定义资源示例
    • PROTOCOL_PORT:要在转发规则中公开的协议和端口。此字段必须采用 ip-protocol=TCP:80 格式。公开的端口必须与实际应用在容器内公开的端口相同。
  7. 如需验证配置的 ELB,请确认每个已创建对象的 Ready 条件。如需获取负载均衡器的已分配 IP 地址,请描述转发规则:

    gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
    
  8. 如需验证配置的 ELB,请确认每个已创建对象的 Ready 条件。通过向 VIP 发送 curl 请求来验证流量:

    1. 如需获取分配的 VIP,请描述转发规则:

      gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME --global
      
    2. 通过向转发规则中 PROTOCOL_PORT 字段指定的端口上的 VIP 发送 curl 请求来验证流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      替换以下内容:

      • FORWARDING_RULE_VIP:转发规则的 VIP。
      • PORT:转发规则中 PROTOCOL_PORT 字段的起始端口号。

API

使用 KRM API 创建以 Pod 或虚拟机工作负载为目标的 ELB。此 ELB 以项目中与 Backend 对象中定义的标签匹配的所有工作负载为目标。如需使用 KRM API 创建可用区级 ELB,请按以下步骤操作:

  1. 创建 Backend 资源以定义 ELB 的端点。为放置工作负载的每个可用区创建 Backend 资源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: Backend
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_NAME
    spec:
      clusterName: CLUSTER_NAME
      endpointsLabels:
        matchLabels:
          app: server
    EOF
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:全局管理 API 服务器的 kubeconfig 路径。如需了解详情,请参阅切换到全局上下文
    • PROJECT_NAME:您的项目的名称。
    • BACKEND_NAMEBackend 资源的名称。
    • CLUSTER_NAME:此字段为可选字段。此字段用于指定所定义选择器的范围所限定到的集群。此字段不适用于虚拟机工作负载。如果 Backend 资源未包含 clusterName 字段,则指定的标签会应用于项目中的所有工作负载。
  2. 如果此 ELB 适用于 pod 工作负载,请跳过此步骤。如果您要为虚拟机工作负载配置 ELB,请为 ELB 定义健康检查:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: HealthCheck
    metadata:
      namespace: PROJECT_NAME
      name: HEALTH_CHECK_NAME
    spec:
      tcpHealthCheck:
        port: PORT
      timeoutSec: TIMEOUT
      checkIntervalSec: CHECK_INTERVAL
      healthyThreshold: HEALTHY_THRESHOLD
      unhealthyThreshold: UNHEALTHY_THRESHOLD
    EOF
    

    替换以下内容:

    • HEALTH_CHECK_NAME:您为健康检查资源选择的名称,例如 my-health-check
    • PORT:执行健康检查的端口。默认值为 80
    • TIMEOUT:在声明失败之前等待的时间量(以秒为单位)。默认值为 5
    • CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。默认值为 5
    • HEALTHY_THRESHOLD:要将端点视为运行状况良好必须通过的连续探测次数。默认值为 2
    • UNHEALTHY_THRESHOLD:要将端点视为运行状况不佳所必须失败的连续探测次数。默认值为 2

    由于这是全局 ELB,因此请在全局 API 中创建健康检查。

  3. 使用之前创建的 Backend 资源创建一个 BackendService 对象。如果您要为虚拟机工作负载配置 ELB,请添加 HealthCheck 资源。

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: BackendService
    metadata:
      namespace: PROJECT_NAME
      name: BACKEND_SERVICE_NAME
    spec:
      backendRefs:
      - name: BACKEND_NAME
        zone: ZONE
      healthCheckName: HEALTH_CHECK_NAME
      targetPorts:
      - port: PORT
        protocol: PROTOCOL
        targetPort: TARGET_PORT
    EOF
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:为 BackendService 资源选择的名称。
    • HEALTH_CHECK_NAME:您之前创建的 HealthCheck 资源的名称。如果您要为 Pod 工作负载配置 ELB,请勿添加此字段。
    • ZONE:创建 Backend 资源的可用区。您可以在 backendRefs 字段中指定多个后端。例如:

      - name: my-be
        zone: Zone-A
      - name: my-be
        zone: Zone-B
      
    • targetPorts 字段为可选字段。此资源列出了 BackendService 资源转换的端口。如果您使用的是此对象,请为以下各项提供值:

      • PORT:服务公开的端口。
      • PROTOCOL:流量必须匹配的第 4 层协议。仅支持 TCP 和 UDP。
      • TARGET_PORTPORT 值转换到的端口,例如 8080TARGET_PORT 的值在给定对象中不能重复。targetPorts 的示例可能如下所示:

        targetPorts:
        - port: 80
          protocol: TCP
          targetPort: 8080
        
  4. 可选:为 ELB 使用会话亲和性,以确保来自同一客户端的请求始终路由到同一后端。如需为负载平衡器启用会话亲和性,请创建 BackendServicePolicy 资源。此资源定义了会话亲和性设置,并将 BackendServicePolicy 资源应用于 BackendService 资源。创建并应用 BackendServicePolicy 资源:

     kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
     apiVersion: networking.global.gdc.goog/v1
     kind: BackendServicePolicy
     metadata:
         namespace: PROJECT_NAME
         name: POLICY_NAME
     spec:
         sessionAffinity: MODE
         selector:
             matchLabels:
               RESOURCE_LABEL
    

    替换以下内容:

    • POLICY_NAME:您为后端服务政策选择的名称。
    • MODE:会话亲和性模式。支持两种模式:

      • NONE:会话亲和性已停用。请求会路由到任何可用的后端。此为默认模式。
      • CLIENT_IP_DST_PORT_PROTO:来自同一四元组(来源 IP 地址、目标 IP 地址、目标端口和协议)的请求会被路由到同一后端。
    • RESOURCE_LABEL:用于选择 BackendServicePolicy 资源所应用到的后端服务的标签选择器(位于项目命名空间中)。如果多个 BackendServicePolicy 资源与同一后端服务匹配,并且其中至少有一项政策启用了会话亲和性,则相应 BackendService 资源的会话亲和性会变为已启用。

  5. 创建外部 ForwardingRule 资源,用于定义服务可用的 VIP。

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ForwardingRuleExternal
    metadata:
      namespace: PROJECT_NAME
      Name: FORWARDING_RULE_EXTERNAL_NAME
    spec:
      cidrRef: CIDR
      ports:
      - port: PORT
        Protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    替换以下内容:

    • FORWARDING_RULE_EXTERNAL_NAME:为 ForwardingRuleExternal 资源选择的名称。
    • CIDR:此字段是可选字段。如果未指定,系统会自动从全局 IP 池中预留一个 IPv4/32 CIDR。 指定与相应转发规则位于同一命名空间中的 Subnet 资源的名称。Subnet 资源表示全球子网的请求和分配信息。如需详细了解 Subnet 资源,请参阅自定义资源示例
    • PORT:使用 ports 字段指定一个 L4 端口数组,数据包将转发到使用此转发规则配置的后端。必须至少指定一个端口。使用 port 字段指定端口号。公开的端口必须与实际应用在容器内公开的端口相同。
    • PROTOCOL:用于转发规则的协议,例如 TCPports 数组中的条目必须如下所示:

      ports:
      - port: 80
        protocol: TCP
      
  6. 如需验证配置的 ELB,请确认每个已创建对象的 Ready 条件。通过向 VIP 发送 curl 请求来验证流量:

    1. 如需获取 VIP,请使用 kubectl get

      kubectl get forwardingruleexternal -n PROJECT_NAME
      

      输出如下所示:

      NAME           BACKENDSERVICE                               CIDR              READY
      elb-name       BACKEND_SERVICE_NAME        10.200.32.59/32   True
      
    2. 通过向转发规则中 PORT 字段指定的端口上的 VIP 发送 curl 请求来验证流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      FORWARDING_RULE_VIP 替换为转发规则的 VIP。