設定外部負載平衡器

外部負載平衡器 (ELB) 會公開服務,以便從組織外部存取。這些服務的 IP 位址來自較大的執行個體外部 IP 集區,並指派給組織。

ELB 虛擬 IP (VIP) 位址在組織之間不會衝突,且在所有組織中都是不重複的。因此,您只能將 ELB 服務用於組織外部用戶端需要存取的服務。

只要啟用工作負載,讓工作負載離開組織,在組織內執行的工作負載就能存取 ELB 服務。這種流量模式實際上需要先從組織傳出流量,再返回內部服務。

共用和標準叢集的 ELB 設定方式不同。

為共用叢集建立外部負載平衡器

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

事前準備

如要設定 ELB 服務,您必須:

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

    • 專案 NetworkPolicy 管理員:可管理專案命名空間中的專案網路政策。請要求 IAM 機構組織管理員授予您專案 NetworkPolicy 管理員 (project-networkpolicy-admin) 角色。
    • 負載平衡器管理員:請要求 IAM 機構組織管理員授予您負載平衡器管理員 (load-balancer-admin) 角色。
    • 全域負載平衡器管理員:如為全域 ELB,請要求 IAM 機構組織管理員授予您全域負載平衡器管理員 (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:ELB 必須從這個外部 CIDR 存取。外部負載平衡器會使用直接伺服器回傳 (DSR),保留來源外部 IP 位址,並在傳回路徑上略過負載平衡器,因此必須採用這項政策。詳情請參閱「為組織外部流量建立全域輸入防火牆規則」。
  • PORT:負載平衡器後方 Pod 的後端通訊埠。這個值位於 Service 資源資訊清單的 .spec.ports[].targetPort 欄位中。這是選填欄位。

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

您可以使用 KRM API 和 gdcloud CLI 指定 Pod 或 VM 工作負載。如果直接在 Kubernetes 叢集使用 Kubernetes Service,則只能指定建立 Service 物件的叢集中的工作負載。

建立可用區 ELB

使用 gdcloud CLI、KRM API 或 Kubernetes 叢集中的 Kubernetes Service,建立可用區 ELB:

gdcloud

使用 gdcloud CLI 建立 ELB,指定 Pod 或 VM 工作負載。

這個 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 和 VM 之間的端點。例如:app=web。
    • PROJECT_NAME:專案名稱。
    • ZONE::用於這項叫用作業的可用區。如要為所有需要可用區旗標的指令預設該旗標,請執行:gdcloud config set core/zone ZONE。可用區旗標僅適用於多可用區環境。這是選填欄位。
    • CLUSTER_NAME:定義的選取器範圍僅限於這個叢集。如未指定這個欄位,系統會選取所有具有指定標籤的端點。這是選填欄位。
  2. 如果這個 ELB 是用於 Pod 工作負載,請略過這個步驟。如果您要為 VM 工作負載設定 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。不建議將逾時時間設為超過 checkInterval。
    • HEALTHY_THRESHOLD:端點必須通過的連續探測次數,才能視為健康狀態良好。如省略或設為 0,則預設為 5。
    • TIMEOUT:判定失敗前等待的時間 (以秒為單位)。如省略或設為 0,則預設為 5。不建議將逾時時間設為超過 checkInterval。
    • 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:健康狀態檢查資源的名稱。這是選填欄位。只有在為 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. 向轉送規則中 PROTOCOL_PORT 欄位指定的通訊埠傳送 curl 要求,驗證流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      更改下列內容:

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

API

使用 KRM API 建立 ELB,指定 Pod 或 VM 工作負載。這個 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_NAME:Backend 資源的名稱。
    • 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:判定失敗前等待的時間 (以秒為單位)。如省略或設為 0,則預設為 5。不建議將逾時時間設為超過 checkInterval。
    • CHECK_INTERVAL:從某個探測開始到下一個探測開始的時間間隔,以秒為單位。如省略或設為 0,則預設為 5。不建議將逾時時間設為超過 checkInterval。
    • HEALTHY_THRESHOLD:端點必須通過的連續探測次數,才能視為健康狀態良好。如省略或設為 0,則預設為 2。
    • UNHEALTHY_THRESHOLD:端點必須連續失敗的探測次數,才會判定為健康狀態不良。如省略或設為 0,則預設為 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:
        name: CIDR_NAME
      ports:
      - port: PORT
        protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    更改下列內容:

    • BACKEND_SERVICE_NAME:BackendService 資源的名稱。
    • FORWARDING_RULE_EXTERNAL_NAME:您為 ForwardingRuleExternal 資源選擇的名稱。
    • CIDR_NAME:cidrRef 為選填欄位。如未指定,系統會自動從可用區 IP 集區保留 IPv4/32 CIDR。指定與這項轉送規則位於相同命名空間的 Subnet 資源名稱。Subnet 資源代表可用區子網路的要求和分配資訊。如要進一步瞭解 Subnet 資源,請參閱「自訂資源範例」。
    • PORT:使用 ports 欄位指定 L4 通訊埠陣列,封包會轉送至使用這項轉送規則設定的後端。至少須指定一個通訊埠。使用 port 欄位指定通訊埠編號。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。
    • PROTOCOL:轉送規則使用的通訊協定,例如 TCP。ports 陣列中的項目必須如下所示:

      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 欄位指定的通訊埠傳送 curl 要求,驗證流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      將 FORWARDING_RULE_VIP 替換為轉送規則的 VIP。

Kubernetes 服務

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

如要建立 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 建立 ELB,指定 Pod 或 VM 工作負載。

這個 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 和 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:從某個探測開始到下一個探測開始的時間間隔,以秒為單位。如省略或設為 0,則預設為 5。不建議將逾時時間設為超過 checkInterval。
    • HEALTHY_THRESHOLD:宣告失敗前等待的時間。如省略或設為 0,則預設為 5。
    • TIMEOUT:判定失敗前等待的時間 (以秒為單位)。如省略或設為 0,則預設為 5。不建議將逾時時間設為超過 checkInterval。
    • 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:健康狀態檢查資源的名稱。這是選填欄位。只有在為 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. 向轉送規則中 PROTOCOL_PORT 欄位指定的通訊埠傳送 curl 要求,驗證流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      更改下列內容:

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

API

使用 KRM API 建立 ELB,指定 Pod 或 VM 工作負載。這個 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_NAME:Backend 資源的名稱。
    • 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:判定失敗前等待的時間 (以秒為單位)。如省略或設為 0,則預設為 5。不建議將逾時時間設為超過 checkInterval。
    • CHECK_INTERVAL:從某個探測開始到下一個探測開始的時間間隔,以秒為單位。如省略或設為 0,則預設為 5。不建議將逾時時間設為超過 checkInterval。
    • HEALTHY_THRESHOLD:端點必須通過的連續探測次數,才能視為健康狀態良好。如省略或設為 0,則預設為 2。
    • UNHEALTHY_THRESHOLD:端點必須連續失敗的探測次數,才會判定為健康狀態不良。如省略或設為 0,則預設為 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_PORT:PORT 值轉譯後的通訊埠,例如 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:
        name: CIDR_NAME
      ports:
      - port: PORT
        protocol: PROTOCOL
      backendServiceRef:
        name: BACKEND_SERVICE_NAME
    EOF
    

    更改下列內容:

    • FORWARDING_RULE_EXTERNAL_NAME:您為 ForwardingRuleExternal 資源選擇的名稱。
    • CIDR_NAME:cidrRef 為選填欄位。如未指定,系統會自動從全域 IP 集區保留 IPv4/32 CIDR。指定與這項轉送規則位於相同命名空間的 Subnet 資源名稱。Subnet 資源代表全域子網路的要求和分配資訊。如要進一步瞭解 Subnet 資源,請參閱「自訂資源範例」。
    • PORT:使用 ports 欄位指定 L4 通訊埠陣列,封包會轉送至使用這項轉送規則設定的後端。至少須指定一個通訊埠。使用 port 欄位指定通訊埠編號。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。
    • PROTOCOL:轉送規則使用的通訊協定,例如 TCP。ports 陣列中的項目必須如下所示:

      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 欄位指定的通訊埠傳送 curl 要求,驗證流量:

      curl http://FORWARDING_RULE_VIP:PORT
      

      將 FORWARDING_RULE_VIP 替換為轉送規則的 VIP。

為標準叢集建立外部負載平衡器

應用程式擁有者 (AO) 可以建立 LoadBalancer 類型的 Kubernetes 服務,對外公開服務。這項服務只能選取建立服務的標準叢集中的後端。這相當於可用區叢集範圍 ELB。標準叢集不支援全域 ELB。詳情請參閱「全域和可用區負載平衡器」一文。

事前準備

如要設定 ELB 服務,您必須:

  • 擁有您要設定負載平衡器的專案。詳情請參閱「建立專案」一文。
  • 具備自訂 ProjectNetworkPolicy (PNP) 輸入政策,允許流量傳送至這項 ELB 服務。詳情請參閱「設定 PNP,允許流量傳送至標準叢集的 ELB」。
  • 具備必要的身分和存取權角色:

    • 專案 NetworkPolicy 管理員:可管理專案命名空間中的專案網路政策。請要求 IAM 機構組織管理員授予您專案 NetworkPolicy 管理員 (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:
          labelSelector:
            workloads:
              matchLabels:
                app: my-client
    ports:
    - protocol: TCP
      port: 8080

為標準叢集建立可用區 ELB

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

如要建立 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 Service 本身公開的通訊埠。叢集內的其他服務或外部用戶端會連線至 Service 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 位址。

選取 VM 做為負載平衡器的後端

如要將 VM 連結至負載平衡器,請按照下列步驟操作:

  1. 確認 VM 的標籤與負載平衡器設定中使用的標籤選取器相符。

    舉例來說,如果 VM 沒有適當的標籤,您可以將相應可用區後端物件的指定標籤新增至 VM:

    kubectl --kubeconfig MANAGEMENT_API_SERVER label virtualmachine VM_NAME -n PROJECT_NAMELABEL
    

    更改下列內容:

    • LABEL:與負載平衡器設定中的 LabelSelector 相符的標籤,例如 app=server。
    • VM_NAME:要連結的虛擬機器名稱。
    • PROJECT_NAME:專案名稱。
  2. 確認伺服器監聽的通訊埠與 HealthCheck 物件中指定的通訊埠相同。