設定外部負載平衡器

外部負載平衡器 (ELB) 會公開服務,讓機構外部可從指派給機構的集區 IP 位址,存取較大的執行個體外部 IP 集區。

ELB 虛擬 IP (VIP) 位址不會在機構之間發生衝突,且在所有機構中都是唯一的。因此,您只能將 ELB 服務用於機構外部用戶端必須存取的服務。

只要您允許工作負載離開機構,機構內執行的工作負載就能存取 ELB 服務。這種流量模式實際上需要機構的輸出流量,才能返回內部服務。

事前準備

如要設定 ELB 服務,您必須具備下列條件:

  • 擁有要設定負載平衡器的專案。詳情請參閱「建立專案」一文。
  • 自訂 ProjectNetworkPolicy (PNP) Ingress 政策,允許流量傳送至這個 ELB 服務。詳情請參閱「設定 PNP,允許流量流向 ELB」。
  • 必要的身分與存取權角色:

    • 專案 NetworkPolicy 管理員:有權管理專案命名空間中的專案網路政策。請要求機構 IAM 管理員授予您專案 NetworkPolicy 管理員 (project-networkpolicy-admin) 角色。
    • 負載平衡器管理員:請機構 IAM 管理員授予您負載平衡器管理員 (load-balancer-admin) 角色。
    • 全域負載平衡器管理員:如果是全域 ELB,請要求機構 IAM 管理員授予您全域負載平衡器管理員 (global-load-balancer-admin) 角色。詳情請參閱預先定義的角色說明

設定 PNP,允許流量傳送至 ELB

如要讓 ELB 服務正常運作,您必須設定及套用自訂的ProjectNetworkPolicy Ingress 政策,允許流量傳輸至這項 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 路徑。如果您尚未在目標區域中為 API 伺服器產生 kubeconfig 檔案,請參閱「登入」一文瞭解詳情。
  • PROJECT:GDC 專案名稱。
  • CIDR:ELB 需要從中存取的外部 CIDR。由於外部負載平衡器使用直接伺服器回傳 (DSR),會保留來源外部 IP 位址,並略過回傳路徑上的負載平衡器,因此需要這項政策。詳情請參閱「為跨機構流量建立全域輸入防火牆規則」。
  • PORT:負載平衡器後方 Pod 的後端通訊埠。這個值位於 Service 資源資訊清單的 .spec.ports[].targetPort 欄位中。這是選填欄位。

建立外部負載平衡器

您可以建立全域或可用區 ELB。全球 ELB 的範圍涵蓋整個 GDC 宇宙。區域 ELB 的範圍僅限於建立時指定的區域。詳情請參閱全域和區域負載平衡器

在 GDC 中使用三種不同方法建立 ELB:

您可以使用 KRM API 和 gdcloud CLI,以 Pod 或 VM 工作負載為目標。直接在 Kubernetes 叢集中使用 Kubernetes Service 時,只能以建立 Service 物件的叢集中的工作負載為目標。

建立可用區 ELB

使用 gdcloud CLI、KRM API 或 Kubernetes 叢集中的 Kubernetes 服務,建立區域 ELB:

gdcloud

使用 gdcloud CLI 建立以 Pod 或 VM 工作負載為目標的 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 和 VM 之間的端點用於這個後端資源。例如:app=web
    • PROJECT_NAME:專案名稱。
    • ZONE:這次呼叫要使用的區域。如要為所有需要區域標記的指令預先設定該標記,請執行:gdcloud config set core/zone ZONE。區域旗標僅適用於多區域環境。這是選填欄位。
    • CLUSTER_NAME:定義選取器範圍時,可將範圍限制在這個叢集。如未指定這個欄位,系統會選取具有指定標籤的所有端點。這是選填欄位。
  2. 如果這個 ELB 是用於 Pod 工作負載,請略過這個步驟。如果您要為 VM 工作負載設定 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:健康狀態檢查資源的名稱。這是選填欄位。只有在為 VM 工作負載設定 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. 使用 curl 要求,在轉送規則的 PROTOCOL_PORT 欄位中指定的通訊埠,驗證 VIP 的流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      更改下列內容:

      • FORWARDING_RULE_VIP:轉送規則的 VIP。
      • PORT:轉送規則中 PROTOCOL_PORT 欄位的通訊埠號碼。

API

使用 KRM API 建立以 Pod 或 VM 工作負載為目標的 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:此為選填欄位。這個欄位會指定定義的選取器範圍所限制的叢集。這個欄位不適用於 VM 工作負載。如果 Backend 資源未包含 clusterName 欄位,指定標籤就會套用至專案中的所有工作負載。
  2. 如果這個 ELB 是用於 Pod 工作負載,請略過這個步驟。如果您要為 VM 工作負載設定 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 物件。如要為 VM 工作負載設定 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_NAMEBackendService 資源的名稱。
    • 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. 使用 curl 要求,在轉送規則的 PORT 欄位中指定的通訊埠,驗證 VIP 的流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      FORWARDING_RULE_VIP 替換為轉送規則的 VIP。

Kubernetes 服務

如要在 GDC 中建立 ELB,請在 Kubernetes 叢集中建立 LoadBalancer 類型的 Kubernetes Service

如要建立 ELB 服務,請按照下列步驟操作:

  1. 建立 Service 定義的 YAML 檔案,類型為 LoadBalancer

    以下 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 或 VM 工作負載為目標的 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 和 VM 之間的端點用於這個後端資源。例如:app=web
    • PROJECT_NAME:專案名稱。
    • CLUSTER_NAME:定義選取器範圍時,可將範圍限制在這個叢集。如未指定這個欄位,系統會選取具有指定標籤的所有端點。這是選填欄位。
    • ZONE:這次呼叫要使用的區域。如要為所有需要區域標記的指令預先設定該標記,請執行:gdcloud config set core/zone ZONE。可用區標記僅適用於多可用區環境。這是選填欄位。
  2. 如果這個 ELB 是用於 Pod 工作負載,請略過這個步驟。如果您要為 VM 工作負載設定 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:健康狀態檢查資源的名稱。這是選填欄位。只有在為 VM 工作負載設定 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. 使用 curl 要求,在轉送規則的 PROTOCOL_PORT 欄位中指定的通訊埠,驗證 VIP 的流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      更改下列內容:

      • FORWARDING_RULE_VIP:轉送規則的 VIP。
      • PORT:轉送規則中 PROTOCOL_PORT 欄位的通訊埠號碼。

API

使用 KRM API 建立以 Pod 或 VM 工作負載為目標的 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:此為選填欄位。這個欄位會指定定義的選取器範圍所限制的叢集。這個欄位不適用於 VM 工作負載。如果 Backend 資源未包含 clusterName 欄位,指定標籤就會套用至專案中的所有工作負載。
  2. 如果這個 ELB 是用於 Pod 工作負載,請略過這個步驟。如果您要為 VM 工作負載設定 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 物件。如要為 VM 工作負載設定 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 值要轉換成的通訊埠,例如 8080。特定物件中的 TARGET_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. 使用 curl 要求,在轉送規則的 PORT 欄位中指定的通訊埠,驗證 VIP 的流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      FORWARDING_RULE_VIP 替換為轉送規則的 VIP。