配置外部负载平衡器

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

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

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

针对共享标准集群设置 ELB 的说明有所不同。

为共享集群创建外部负载均衡器

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

准备工作

如需配置 ELB 服务,您必须执行以下操作:

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

    • Project NetworkPolicy Admin:有权管理项目命名空间中的项目网络政策。请让您的组织 IAM 管理员向您授予 Project NetworkPolicy Admin (project-networkpolicy-admin) 角色。
    • 负载平衡器管理员:请让您的组织 IAM 管理员向您授予负载平衡器管理员 (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:Management API 服务器的 kubeconfig 路径。如果您尚未为目标可用区中的 API 服务器生成 kubeconfig 文件,请参阅登录了解详情。
  • PROJECT:您的 GDC 项目的名称。
  • CIDR:需要从哪个外部 CIDR 访问 ELB。此政策是必需的,因为外部负载均衡器使用直接服务器返回 (DSR),该功能可保留源外部 IP 地址,并在返回路径上绕过负载均衡器。如需了解详情,请参阅为组织外部流量创建全局入站防火墙规则
  • PORT:负载均衡器后面的 pod 上的后端端口。此值位于 Service 资源的清单的 .spec.ports[].targetPort 字段中。此字段是可选字段。

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

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

创建可用区级 ELB

使用 gdcloud 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-name=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 定义健康检查类型。例如,如需创建 TCP 健康检查,请按如下方式定义:

    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:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • HEALTHY_THRESHOLD:要将端点视为运行状况良好必须通过的连续探测次数。如果省略或设置为 0,则默认为 5
    • TIMEOUT:在声明失败之前等待的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • UNHEALTHY_THRESHOLD:端点被视为运行状况不佳所必须失败的连续探测次数。如果省略或设置为 0,则默认为 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:区域 Management 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:在声明失败之前等待的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • HEALTHY_THRESHOLD:要将端点视为运行状况良好必须通过的连续探测次数。如果省略或设置为 0,则默认为 2
    • UNHEALTHY_THRESHOLD:端点被视为运行状况不佳所必须失败的连续探测次数。如果省略或设置为 0,则默认为 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:
        name: CIDR_NAME
      ports:
      - port: PORT
        protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    替换以下内容:

    • BACKEND_SERVICE_NAME:您的 BackendService 资源的名称。
    • FORWARDING_RULE_EXTERNAL_NAME:您为 ForwardingRuleExternal 资源选择的名称。
    • CIDR_NAMEcidrRef 字段为可选字段。如果未指定,系统会自动从可用区 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-name=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:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • HEALTHY_THRESHOLD:在声明失败之前等待的时间。如果省略或设置为 0,则默认为 5
    • TIMEOUT:在声明失败之前等待的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • UNHEALTHY_THRESHOLD:端点被视为运行状况不佳所必须失败的连续探测次数。如果省略或设置为 0,则默认为 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:全局 Management 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:在声明失败之前等待的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • CHECK_INTERVAL:从一次探测开始到下一次探测开始之间的时间量(以秒为单位)。如果省略或设置为 0,则默认为 5。不建议将超时时间设置为长于检查间隔。
    • HEALTHY_THRESHOLD:要将端点视为运行状况良好必须通过的连续探测次数。如果省略或设置为 0,则默认为 2
    • UNHEALTHY_THRESHOLD:端点被视为运行状况不佳所必须失败的连续探测次数。如果省略或设置为 0,则默认为 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:
        name: CIDR_NAME
      ports:
      - port: PORT
        protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    替换以下内容:

    • FORWARDING_RULE_EXTERNAL_NAME:您为 ForwardingRuleExternal 资源选择的名称。
    • CIDR_NAMEcidrRef 字段为可选字段。如果未指定,系统会自动从全局 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。

为标准集群创建外部负载均衡器

应用所有者 (AO) 可以创建 LoadBalancer 类型的 Kubernetes 服务,以在外部公开服务。此服务只能选择创建该服务的标准集群中的后端。这相当于区域集群范围的 ELB。标准集群不支持全局 ELB。如需了解详情,请参阅全球和可用区级负载平衡器

准备工作

如需配置 ELB 服务,您必须执行以下操作:

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

    • Project NetworkPolicy Admin:有权管理项目命名空间中的项目网络政策。请让您的组织 IAM 管理员为您授予 Project NetworkPolicy Admin (project-networkpolicy-admin) 角色。
    • 负载平衡器管理员:请让您的组织 IAM 管理员向您授予负载平衡器管理员 (load-balancer-admin) 角色。

配置 PNP 以允许流量传输到标准集群的 ELB

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

以下示例项目网络政策 YAML 文件允许另一个项目中的工作负载通过 ELB 访问当前项目中的工作负载。

apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  name: allow-ingress-from-client-to-server
  namespace: ${VANILLA_CLUSTER_PROJECT}
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
    userWorkloadSelector:
    labelSelector:
      clusters:
        matchLabels:
          kubernetes.io/metadata.name: my-sc-1
      namespaces:
        matchLabels:
          kubernetes.io/metadata.name: my-app-ns
      workloads:
        matchLabels:
          app: my-internal-app
  ingress:
  - from:
    - projectSelector:
        projects:
          matchNames:
          - "$PROJECT_2"
        workloadSelector:
          workloads:
            matchLabels:
              app: my-client
    ports:
    - protocol: TCP
      port: 8080

为标准集群创建可用区级 ELB

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

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

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

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

    apiVersion: v1
    kind: Service
    metadata:
      name: ELB_SERVICE_NAME
      namespace: ELB_SERVICE_NAMESPACE
    spec:
      ports:
      - port: PORT
        protocol: TCP
        targetPort: TARGET_PORT
      selector:
        k8s-app: my-app # Example selector, replace with your workload's labels
      type: LoadBalancer
    

    替换以下内容:

    • ELB_SERVICE_NAME:ELB 服务的名称。
    • ELB_SERVICE_NAMESPACE:标准集群中包含后端工作负载的命名空间。
    • PORT:Kubernetes 服务本身公开的端口。集群内的其他服务或外部客户端将连接到服务 IP 地址上的此端口。
    • TARGET_PORT:Pod 容器内应用正在运行并监听传入连接的端口。可以是数字端口,也可以是 Pod 容器规范中定义的命名端口。

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

  2. Service 定义的 selector 字段中,指定与后端工作负载匹配的键值对。对于标准集群,仅支持将 pod 作为工作负载。

    选择器,根据您指定的标签与工作负载上的标签是否匹配来确定。Service 只能选择定义 Service 的项目和集群中的后端工作负载。

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

  3. Service 规范保存在 YAML 文件中。将以下命令中的 ELB_FILE 替换为文件名。

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

    export KUBECONFIG=KUBECONFIG_PATH
    kubectl apply -f ELB_FILE
    

    替换以下内容:

    • ELB_FILE:ELB 服务的 Service 定义文件的名称。
    • KUBECONFIG_PATH:标准集群的 kubeconfig 文件的路径。

    您可以通过查看服务状态来获取 ELB 服务的 IP 地址:

    kubectl -n ELB_SERVICE_NAMESPACE get svc ELB_SERVICE_NAME
    

    替换以下内容:

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

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

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

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

选择虚拟机作为负载均衡器的后端

如需将虚拟机关联到负载均衡器,请执行以下操作:

  1. 确保虚拟机的标签与负载均衡器配置中使用的标签选择器匹配。

    例如,如果您的虚拟机没有合适的标签,您可以从相应可用区的后端对象向该虚拟机添加指定的标签:

    kubectl --kubeconfig MANAGEMENT_API_SERVER label virtualmachine VM_NAME -n PROJECT_NAMELABEL
    

    替换以下内容:

    • LABEL:与负载均衡器配置中的 LabelSelector 相匹配的标签,例如 app=server
    • VM_NAME:要关联的虚拟机的名称。
    • PROJECT_NAME:您的项目的名称。
  2. 确保服务器正在侦听 HealthCheck 对象中指定的端口。