本頁面說明如何部署外部 LoadBalancer Service,建構以後端服務為基礎的區域性外部直通式網路負載平衡器。閱讀本頁面前,請確認您已熟悉下列事項:
如要進一步瞭解區域性外部直通式網路負載平衡器,請參閱「後端服務型區域性外部直通式網路負載平衡器」。
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
需求條件
本教學課程使用
spec.loadBalancerClass建立以GCE_VM_IPNEG 為後端的區域性外部直通式網路負載平衡器,並以該平衡器做為後端服務。本教學課程需要 GKE 1.33.1-gke.1779000 以上版本,因為spec.loadBalancerClass需要 GKE 1.33.1-gke.1779000 以上版本。1.33.1-gke.1779000 以上版本也超過 NEG 後端或加權負載平衡器功能的最低 GKE 版本需求。如果叢集版本早於 1.36,則必須在叢集中啟用
HttpLoadBalancing外掛程式。這項外掛程式預設為啟用。詳情請參閱「HttpLoadBalancing 必要條件」。如要為外部 LoadBalancer Service 啟用 Cloud Logging,GKE 叢集必須使用 1.36.0-gke.2459000 以上版本。
如要搭配使用自備 IP (BYOIP) IPv6 位址和單一堆疊 IPv6 外部 LoadBalancer 服務,GKE 叢集必須使用 1.37.1-gke.2097000 以上版本。
選擇叢集
您可以建立新叢集,或選擇符合需求的現有叢集。
建立新叢集
Autopilot
如要建立新的 Autopilot 叢集,請按照下列步驟操作:
gcloud container clusters create-auto CLUSTER_NAME \
--release-channel=RELEASE_CHANNEL \
--cluster-version=VERSION \
--location=COMPUTE_LOCATION
更改下列內容:
CLUSTER_NAME:新叢集的名稱。RELEASE_CHANNEL:叢集的 GKE 發布管道名稱。VERSION:叢集的 GKE 版本。COMPUTE_LOCATION:叢集的 Compute Engine 區域。
如要停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能,請加入 --disable-l4-lb-firewall-reconciliation 旗標。詳情請參閱「GKE LoadBalancer 服務的使用者代管防火牆規則」。
標準
如要建立新的 Standard 叢集,請按照下列步驟操作:
gcloud container clusters create CLUSTER_NAME \
--release-channel=RELEASE_CHANNEL \
--cluster-version=VERSION \
--location=COMPUTE_LOCATION
更改下列內容:
CLUSTER_NAME:新叢集的名稱。RELEASE_CHANNEL:叢集的 GKE 發布管道名稱。VERSION:叢集的 GKE 版本。COMPUTE_LOCATION:叢集的 Compute Engine 區域。
如要停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能,請加入 --disable-l4-lb-firewall-reconciliation 旗標。詳情請參閱「GKE LoadBalancer 服務的使用者代管防火牆規則」。
升級現有叢集
使用 gcloud CLI 更新現有叢集:
gcloud container clusters upgrade CLUSTER_NAME \
--cluster-version=VERSION \
--master \
--location=COMPUTE_LOCATION
更改下列內容:
CLUSTER_NAME:現有叢集的名稱。VERSION:要將叢集升級至哪個 GKE 版本。詳情請參閱「手動升級控制層」。COMPUTE_LOCATION:叢集的 Compute Engine 區域。
如要停用 LoadBalancer Service 的虛擬私有雲防火牆規則自動建立功能,請加入 --disable-l4-lb-firewall-reconciliation 旗標。詳情請參閱「GKE LoadBalancer 服務的使用者代管防火牆規則」。
部署範例工作負載
部署下列範例工作負載,為外部 LoadBalancer Service 提供服務 Pod。
將下列 Deployment 範例儲存為
store-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: store spec: replicas: 20 selector: matchLabels: app: store template: metadata: labels: app: store spec: containers: - image: registry.k8s.io/echoserver:1.10 imagePullPolicy: Always name: echoserver ports: - name: http containerPort: 8080 readinessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP將資訊清單套用至叢集:
kubectl apply -f store-deployment.yaml確認 Deployment 有 20 個提供服務的 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 ....
建立外部 LoadBalancer Service
建立外部 LoadBalancer Service,公開範例工作負載。
將下列 Service 資訊清單儲存為
store-v1-lb-svc.yaml:apiVersion: v1 kind: Service metadata: name: store-v1-lb-svc spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080將資訊清單套用至叢集:
kubectl apply -f store-v1-lb-svc.yaml
請注意下列關於這個範例資訊清單的事項:
如果叢集執行 GKE 1.33.1-gke.1779000 至 1.36,您必須在資訊清單首次套用至叢集時,將
spec.loadBalancerClass欄位設為networking.gke.io/l4-regional-external值。這個欄位會指示 GKE 建立以區域性後端服務為基礎的外部直通式網路負載平衡器。在 GKE 1.37 以上版本中,這項設定是預設行為,不需填寫這個欄位。如要支援 IPv6 流量和加權負載平衡等功能,必須使用後端服務型區域性外部直通式網路負載平衡器。GKE 會根據叢集版本,使用
GCE_VM_IPNEG 後端或非代管執行個體群組後端。在 1.32.2-gke.1652000 版叢集中,後端服務型區域性外部直通式網路負載平衡器會使用GCE_VM_IPNEG。在舊版中,以後端服務為基礎的區域性外部直通式網路負載平衡器會使用非代管執行個體群組。這個
spec.loadBalancerClass欄位不可變更,且必須在建立服務時設定。這個欄位無法變更,因此您無法在「現有」LoadBalancer 服務的資訊清單中新增或修改這個欄位。任何這類嘗試都會導致錯誤,且服務更新會失敗。如要在雙重堆疊叢集中建立單一堆疊 IPv6 Service,請將
spec.ipFamilyPolicy欄位的值設為SingleStack,並將spec.ipFamilies欄位的值設為IPv6。在單一堆疊 IPv6 叢集中,這些是預設值,您可以省略。詳情請參閱「IPv6 LoadBalancer 服務」。
在單一堆疊 IPv6 叢集上建立外部 LoadBalancer Service
在單一堆疊 IPv6 叢集或雙重堆疊叢集上建立單一堆疊 IPv6 外部 LoadBalancer 服務時,負載平衡器使用的子網路取決於叢集的節點子網路是否使用 EXTERNAL 或 INTERNAL IPv6 存取權類型。在雙堆疊叢集上,您必須將 spec.ipFamilyPolicy 欄位的值設為 SingleStack,並將 spec.ipFamilies 欄位的值設為 IPv6 (在單堆疊 IPv6 叢集上,這些是預設值,可以省略)。IPv6 外部 LoadBalancer Service 一律使用進階級中,以後端服務為基礎的區域性外部直通式網路負載平衡器。雖然這個負載平衡器變體是 GKE 1.37 以上版本的預設設定,但下列範例會明確將 spec.loadBalancerClass 欄位設為 networking.gke.io/l4-regional-external:
具有外部節點的叢集 (
EXTERNALGUA 存取權類型):如果叢集節點在具有全域單點傳播位址 (GUA) 的外部子網路上執行,外部負載平衡器會自動使用現有的節點子網路。建立不含自訂子網路註解的 Service:apiVersion: v1 kind: Service metadata: name: ext-ipv6-svc spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - protocol: TCP port: 8080 targetPort: 8080具有內部節點的叢集 (
INTERNALULA 存取權類型):如果叢集節點在具有唯一本機單點傳播位址 (ULA) 的內部子網路上執行,外部負載平衡器就無法直接使用該子網路。您必須佈建專屬的外部 (EXTERNAL) IPv6 子網路,並在 Service 中使用networking.gke.io/load-balancer-subnet註解參照該子網路:建立專用的外部 IPv6 子網路:
gcloud compute networks subnets create SUBNET_NAME \ --stack-type=ipv6_only \ --ipv6-access-type=EXTERNAL \ --network=NETWORK_NAME \ --region=COMPUTE_REGION更改下列內容:
SUBNET_NAME:要建立的子網路名稱。NETWORK_NAME:您要在其中建立這個子網路的虛擬私有雲網路名稱。COMPUTE_REGION:子網路的 Compute Engine 區域。
在
networking.gke.io/load-balancer-subnet註解中參照專屬子網路名稱,建立 Service:apiVersion: v1 kind: Service metadata: name: ext-ipv6-svc annotations: networking.gke.io/load-balancer-subnet: SUBNET_NAME spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - protocol: TCP port: 8080 targetPort: 8080
驗證指派的 Service IP 位址:
kubectl get svc ext-ipv6-svc輸出內容會確認
CLUSTER-IP和EXTERNAL-IP欄 (公開 GUA 位址) 已填入:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ext-ipv6-svc LoadBalancer 2600:2d00:0:4:1a1e:d3b3:de4d:c401 2600:1900:4000:2714:8000:0:0:0 80:31114/TCP 51s
詳情請參閱「IPv6 LoadBalancer 服務」。
使用自備 IPv6 位址 (BYOIPv6)
在 GKE 1.37.1-gke.2097000 以上版本中,您可以設定單一堆疊 IPv6 外部 LoadBalancer Service,使用EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式中公開委派前置字元 (PDP) 的區域 IPv6 子前置字元,自備 IPv6 位址 (BYOIPv6)。
建立 Service 之前,請確認您符合下列規定:
- 叢集執行 GKE 1.37.1-gke.2097000 以上版本。叢集可以是單一堆疊 IPv6 或雙重堆疊 (在這兩種情況下,Service 都必須是單一堆疊 IPv6),且叢集的子網路可以有
INTERNAL或EXTERNALIPv6 存取類型;由於位址範圍來自公開委派前置碼,因此不需要外部 IPv6 子網路範圍。 - 您在
EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式中擁有區域 IPv6 子前置字元,可分配的前置字元長度為/96,狀態為ANNOUNCED,與叢集位於相同區域。如需操作說明,請參閱「建立 IPv6 子前置字串」。 GKE 服務代理 (
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com) 在擁有公開委派前置字元的專案中,具備 Compute 公開 IP 管理員角色 (roles/compute.publicIpAdmin)。如要授予角色,請執行下列指令:gcloud projects add-iam-policy-binding PDP_PROJECT_ID \ --member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \ --role="roles/compute.publicIpAdmin"更改下列內容:
PDP_PROJECT_ID:擁有公開委派前置字元的專案 ID。PROJECT_NUMBER:叢集所在專案的專案編號。
Service 是單一堆疊 IPv6 Service (
spec.ipFamilyPolicy: SingleStack和spec.ipFamilies: ["IPv6"]),會將spec.loadBalancerClass欄位設為networking.gke.io/l4-regional-external,並使用進階級。BYOIPv6 不支援雙重堆疊服務、IPv4 服務和標準級。服務不含
networking.gke.io/load-balancer-subnet註解,無法與networking.gke.io/ip-collection-v6註解合併。
選擇要分配臨時外部 BYOIPv6 位址範圍,還是使用預留的靜態外部 BYOIPv6 位址範圍:
臨時外部 BYOIPv6 位址範圍:將
networking.gke.io/ip-collection-v6註解新增至 Service 資訊清單,並設為區域子前置字元的完整資源網址或部分資源路徑:apiVersion: v1 kind: Service metadata: name: ext-byoipv6-svc annotations: networking.gke.io/ip-collection-v6: "projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME" spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080更改下列內容:
PROJECT_ID:子前置字元所在專案的 ID。REGION:叢集所在的區域。SUB_PREFIX_NAME:EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式中區域子前置字串的名稱。
如果之後變更
networking.gke.io/ip-collection-v6註解,GKE 會使用新前置字元的新位址重新建立 IPv6 轉送規則,這會短暫中斷傳送至 Service 的流量。如果移除註解,Service 會還原為 Google 提供的位址,該位址來自具有外部 IPv6 範圍的子網路。如果叢集的子網路有內部 IPv6 範圍,請同時新增networking.gke.io/load-balancer-subnet註解。靜態外部 BYOIPv6 位址範圍:從子前置字串預留區域性靜態外部
/96IPv6 位址範圍,並使用networking.gke.io/load-balancer-ip-addresses註解參照該範圍:從子前置字串建立區域性靜態外部 IPv6 位址範圍:
gcloud compute addresses create STATIC_BYOIPV6_NAME \ --region=REGION \ --ip-version=IPV6 \ --endpoint-type=NETLB \ --ip-collection=projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME更改下列內容:
STATIC_BYOIPV6_NAME:靜態 IPv6 位址資源的名稱。REGION:叢集所在的區域。PROJECT_ID:包含子前置字串的專案 ID。SUB_PREFIX_NAME:EXTERNAL_IPV6_FORWARDING_RULE_CREATION模式中區域子前置字串的名稱。
使用靜態外部 BYOIPv6 位址範圍時,
networking.gke.io/ip-collection-v6註解為選用。如果設定這個註解,註解必須參照您預留位址範圍的相同子前置碼。在 Service 資訊清單中,參照預留的靜態 IPv6 位址資源名稱:
apiVersion: v1 kind: Service metadata: name: ext-static-byoipv6-svc annotations: networking.gke.io/load-balancer-ip-addresses: STATIC_BYOIPV6_NAME spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external ipFamilyPolicy: SingleStack ipFamilies: - IPv6 selector: app: store ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080
詳情請參閱「自備 IPv6 位址 (BYOIPv6)」。
啟用加權負載平衡
如要根據每個節點上提供服務、就緒和未終止的 Pod 數量,按比例將新連線分配給節點,請在 Service 資訊清單中新增 networking.gke.io/weighted-load-balancing:
"pods-per-node" 註解,啟用加權負載平衡。
將
networking.gke.io/weighted-load-balancing: "pods-per-node"註解新增至store-v1-lb-svc.yamlService 資訊清單,並確保您也設定了externalTrafficPolicy: Local值,如下所示:apiVersion: v1 kind: Service metadata: name: store-v1-lb-svc annotations: networking.gke.io/weighted-load-balancing: "pods-per-node" spec: type: LoadBalancer loadBalancerClass: networking.gke.io/l4-regional-external externalTrafficPolicy: Local selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080將資訊清單套用至叢集:
kubectl apply -f store-v1-lb-svc.yaml
關於這個加權負載平衡範例,請注意下列事項:
Service 資訊清單使用
externalTrafficPolicy: Local。如果不需要啟用加權負載平衡,也可以使用externalTrafficPolicy: Cluster。如要進一步瞭解externalTrafficPolicy如何定義節點分組、哪些節點通過負載平衡器健康狀態檢查,以及封包的處理方式,請參閱「LoadBalancer 服務概念」。啟用加權負載平衡後,GKE 不會禁止您使用
externalTrafficPolicy: Cluster,但externalTrafficPolicy: Cluster會有效停用加權負載平衡,因為封包可能會在負載平衡器之後轉送至其他節點。
您也可以使用 kubectl edit svc service-name,在現有的外部 LoadBalancer Service 啟用加權負載平衡。kubectl edit 指令會在設定的文字編輯器中開啟現有負載平衡器的 Service 資訊清單,您可以在其中修改資訊清單並儲存變更。編輯現有的外部 LoadBalancer Service 時,請注意下列事項:
現有的外部 LoadBalancer Service 必須已建立後端服務型區域性外部直通式網路負載平衡器。如果叢集執行的 GKE 版本低於 1.37,這項規定代表現有的外部 LoadBalancer Service 在資訊清單首次套用至叢集時,必須將
spec.loadBalancerClass欄位設為networking.gke.io/l4-regional-external。如果現有的外部 LoadBalancer 服務使用以目標集區為基礎的區域性外部直通式網路負載平衡器,則在該服務中新增
networking.gke.io/weighted-load-balancing: "pods-per-node"註解不會有任何作用。更新現有的外部 LoadBalancer Service 資訊清單時,請務必設定
externalTrafficPolicy: Local值。使用externalTrafficPolicy: Cluster會有效停用加權負載平衡,因為封包可能會在負載平衡器之後轉送至其他節點。
停用加權負載平衡
如要將新連線分配至節點,而不考慮每個節點上有多少個提供服務的 Pod,請從 Service 資訊清單中移除 networking.gke.io/weighted-load-balancing: "pods-per-node" 註解,停用加權負載平衡。
啟用後端服務的記錄功能
您可以啟用、停用及查看後端服務型區域性外部直通式網路負載平衡器的記錄。
如要設定 Cloud Logging,請建立 L4LBConfig 自訂資源,並指定記錄設定。L4LBConfig 資源會連結至 Service 資訊清單中的 Kubernetes Service。套用資訊清單後,GKE 控制器會設定後端服務的記錄功能。如未將 L4LBConfig 資源連結至 Service,控制器會停止管理記錄設定,並將後端服務保留在最後已知的狀態。詳情請參閱「瞭解滑行行為」。
您可以設定下列欄位:
enabled:如果設為true,系統會啟用這項服務的記錄功能,並將記錄檔儲存至 Cloud Logging。否則,系統會停用這項服務的記錄功能。sampleRate:指定介於0到1,000,000(預設) 之間的值,0表示不會記錄任何封包,1,000,000則代表會記錄所有封包。sampleRate欄位為選填,只有在enable欄位的值設為true時才適用。optionalMode:控制要將哪些選填中繼資料欄位,納入為負載平衡器產生的記錄。這個欄位接受下列其中一個字串值:EXCLUDE_ALL_OPTIONAL:如果未指定optionalMode,則為預設設定。設定後,記錄就不會包含任何選項欄位,提供最精簡的記錄格式。INCLUDE_ALL_OPTIONAL:為所有可用的選填欄位啟用記錄功能,提供最詳細的記錄項目。CUSTOM:指定要納入記錄的選填欄位自訂清單。使用CUSTOM模式時,您也必須使用optionalFields參數,提供以半形逗號分隔的所需欄位清單。
optionalFields:以半形逗號分隔的欄位名稱字串。定義要納入生成記錄檔的確切選用中繼資料欄位。只有在optionalMode設為CUSTOM時,系統才會使用這個欄位,否則會忽略任何值。
如要設定 Cloud Logging,請在與 Service 資源相同的命名空間中建立 L4LBConfig 資源。下列 L4LBConfig 資訊清單範例會啟用 Cloud Logging,並將指定負載平衡器 Service 的取樣率設為 50%。
將下列資訊清單儲存為
svc-l4lb-config.yaml:apiVersion: networking.gke.io/v1 kind: L4LBConfig metadata: name: svc-l4lb-config namespace: default spec: logging: enabled: true # must be included sampleRate: 500000 optionalMode: "INCLUDE_ALL_OPTIONAL"將 L4LBConfig 資訊清單套用至叢集:
kubectl apply -f svc-l4lb-config.yaml將
networking.gke.io/l4lb-config註解新增至store-v1-lb-svc.yamlService 資訊清單:apiVersion: v1 kind: Service metadata: name: store-v1-lb-svc annotations: cloud.google.com/l4-rbs: "enabled" networking.gke.io/l4lb-config: "svc-l4lb-config" spec: type: LoadBalancer selector: app: store ports: - name: tcp-port protocol: TCP port: 8080 targetPort: 8080將 Service 資訊清單套用至叢集:
kubectl apply -f store-v1-lb-svc.yaml
驗證外部 LoadBalancer 服務及其元件
確認 Service 是否正在運作:
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 11mGKE 已為區域性外部直通式網路負載平衡器指派
EXTERNAL_IP。測試能否連線至負載平衡器:
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 Service 和描述其Google Cloud 資源的註解集:
kubectl describe svc store-v1-lb-svc輸出結果會與下列內容相似:
Name: store-v1-lb-svc Namespace: default Labels: <none> Annotations: cloud.google.com/neg-status: {"network_endpoint_groups":{"0":"k8s2-qvveq1d8-default-my-service-ext-5s55db85"},"zones":["us-central1-c"]} #This annotation appears in the output only if the service uses NEG backends. networking.gke.io/weighted-load-balancing: pods-per-node #This annotation appears in the output only if weighted load balancing is enabled. service.kubernetes.io/backend-service: k8s2-qvveq1d8-default-my-service-ext-5s55db85 service.kubernetes.io/firewall-rule: k8s2-qvveq1d8-default-my-service-ext-5s55db85 service.kubernetes.io/firewall-rule-for-hc: k8s2-qvveq1d8-default-my-service-ext-5s55db85-fw service.kubernetes.io/healthcheck: k8s2-qvveq1d8-default-my-service-ext-5s55db85 service.kubernetes.io/tcp-forwarding-rule: a808124abf8ce406ca51ab3d4e7d0b7d Selector: app=store Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.18.102.23 IPs: 10.18.102.23 LoadBalancer Ingress: 35.184.160.229 Port: tcp-port 8080/TCP TargetPort: 8080/TCP NodePort: tcp-port 31864/TCP Endpoints: 10.20.1.28:8080,10.20.1.29:8080 Session Affinity: None External Traffic Policy: Local HealthCheck NodePort: 30394 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 4m55s loadbalancer-controller default/my-service-ext有幾個欄位會指出,後端服務型區域性外部直通式網路負載平衡器及其 Google Cloud 資源已成功建立:
Events欄位。如果 LoadBalancer 服務及其資源建立成功,這個欄位會留空。如果發生錯誤,會列在這裡。已啟用
Annotations的清單:GKE 會將下列唯讀註解清單新增至 Service 資訊清單。每個名稱開頭為service.kubernetes.io/的註解,都用於表示Google Cloud 資源的名稱,該資源是做為負載平衡器的一部分或支援負載平衡器而建立。networking.gke.io/weighted-load-balancing: pods-per-node註解表示已套用加權負載平衡,且負載平衡器會根據每個節點上執行的 Pod 數量,將流量分配至後端 Pod。service.kubernetes.io/backend-service註解表示負載平衡器的後端服務名稱。service.kubernetes.io/healthcheck註解表示後端服務使用的負載平衡器健康狀態檢查名稱。service.kubernetes.io/tcp-forwarding-rule或service.kubernetes.io/udp-forwarding-rule註解會指出負載平衡器的轉送規則名稱。service.kubernetes.io/firewall-rule註解會指出建立的防火牆規則名稱,用於允許流量傳送至叢集節點。您可以使用spec.loadBalancerSourceRanges[]自訂這項防火牆規則的來源範圍。如要進一步瞭解 LoadBalancer 服務的防火牆規則,請參閱「防火牆規則和來源 IP 位址許可清單」。service.kubernetes.io/firewall-rule-for-hc註解表示負載平衡器健康狀態檢查所需的防火牆規則名稱。cloud.google.com/neg-status註解會指出負載平衡器使用的 NEG 及其可用區。只有在同時符合下列兩項條件時,系統才會顯示這項註解:- 將資訊清單套用至叢集時,叢集執行的是 GKE 1.32.2-gke.1652000 以上版本。
- 將資訊清單套用至叢集時,設為
networking.gke.io/l4-regional-external值的spec.loadBalancerClass欄位會出現在 Service 資訊清單中。
確認已為外部 LoadBalancer 服務建立負載平衡器資源和防火牆規則:
執行下列指令,查看轉送規則:
gcloud compute forwarding-rules describe FWD_RULE_NAME \ --region=REGION_NAME更改下列內容:
FWD_RULE_NAME:由service.kubernetes.io/tcp-forwarding-rule或service.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_NAMEgcloud 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。
如要查看負載平衡器 NEG,請執行下列指令:
gcloud compute network-endpoint-groups describe NEG_NAME \ --zone=ZONE_NAME更改下列內容:
NEG_NAME:負載平衡器的 NEG 名稱。NEG 的名稱由cloud.google.com/neg-status唯讀註解提供。如要查看這個唯讀註解,請執行kubectl describe svc SERVICE_NAME指令。註解包含結構化資料,內含負載平衡器使用的 NEG 名稱和可用區資訊。如果是可用區叢集,這個註解會包含一個 NEG 的相關資訊。如果是區域叢集,這項註解會包含叢集所在各可用區的 NEG 相關資訊。ZONE_NAME:包含 NEG 的 Google Cloud 可用區。
確認後端服務已啟用 Cloud Logging:
kubectl get svc SERVICE_NAME --output yaml更改下列內容:
SERVICE_NAME:後端服務的名稱。
在輸出內容中,確認
Status.Conditions欄位包含Type: LoggingConfigManaged和Reason: Reconciled。
刪除外部 LoadBalancer Service
如要刪除範例 store-v1-lb-svc 外部 LoadBalancer 服務,請使用下列指令:
kubectl delete service store-v1-lb-svc
GKE 會自動移除為外部 LoadBalancer Service 建立的所有負載平衡器資源。
遷移至 GCE_VM_IP NEG 後端
如果外部 LoadBalancer 服務是在 GKE 1.37 以上版本建立、為 spec.loadBalancerClass 欄位指定 networking.gke.io/l4-regional-external 值,或包含 cloud.google.com/l4-rbs: "enabled" 註解,則會建立以後端服務為基礎的區域性外部直通式網路負載平衡器。視叢集的 GKE 版本而定,GKE 會使用 GCE_VM_IP 網路端點群組或非代管執行個體群組做為後端:
如果 Service 資訊清單套用至執行 GKE 1.32.2-gke.1652000 以上版本的叢集,產生的區域性外部直通式網路負載平衡器會使用
GCE_VM_IP網路端點群組 (NEG) 後端。如果 Service 資訊清單套用至執行舊版 GKE 的叢集,產生的區域性外部直通式網路負載平衡器會使用非代管執行個體群組後端。
詳情請參閱「關於 LoadBalancer 服務」中的「節點分組」。
如果現有 Service 使用下列其中一種負載平衡器,您可以建立新的外部 LoadBalancer Service,由以後端服務為基礎的區域性外部直通式網路負載平衡器提供支援,並使用 GCE_VM_IP NEG 後端:
- 後端服務型區域性外部直通式網路負載平衡器,具有執行個體群組後端
- 目標集區型區域性外部直通式網路負載平衡器
如要在切換至以後端服務為基礎的區域性外部直通式網路負載平衡器 (使用 GCE_VM_IP NEG 後端) 時保留外部 IPv4 位址,請按照下列步驟操作 (IPv6 外部 LoadBalancer 服務不需要這項遷移作業):
如果尚未升級,請將叢集升級至 GKE 1.32.2-gke.1652000 以上版本。
找出要切換至以後端服務為基礎的區域性外部直通式網路負載平衡器的外部 LoadBalancer Service,該負載平衡器使用
GCE_VM_IPNEG 後端。使用下列指令說明 Service:kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE更改下列內容:
SERVICE_NAME:現有外部 LoadBalancer 服務的名稱。SERVICE_NAMESPACE:現有外部 LoadBalancer 服務的命名空間。
在指令輸出內容中,記下列在
LoadBalancer Ingress後方的負載平衡器外部 IPv4 位址。擷取現有 LoadBalancer Service 的 Service 資訊清單:
最好有先前套用至叢集的原始 Service 資訊清單。例如,您可能將其儲存在原始碼控管存放區中。
如果您沒有原始 Service 資訊清單:
執行下列指令,取得代表負載平衡器目前實作的 Service 資訊清單 YAML 副本:
kubectl get svc SERVICE_NAME -n SERVICE_NAMESPACE -o yaml將資訊清單 YAML 複製到文字編輯器。移除
status屬性和下列metadata屬性:- 下列所有註解:
kubectl.kubernetes.io/last-applied-configuration註解- 所有開頭為
service.kubernetes.io的註解
creationTimestampfinalizersresourceVersionuid
- 下列所有註解:
確認資訊清單包含
spec.loadBalancerClass欄位,且值設為networking.gke.io/l4-regional-external。如果您是從以目標集區為基礎的區域性外部直通式網路負載平衡器遷移,則必須新增這個欄位。
儲存資訊清單檔案,並記下儲存位置。本程序其餘部分會將資訊清單的儲存路徑稱為 MANIFEST_FILE_PATH。
設定靜態外部 IPv4 位址資源,保留現有負載平衡器使用的外部 IPv4 位址:
gcloud compute addresses create IP_ADDRESS_NAME --region=CLUSTER_REGION --addresses LB_EXTERNAL_IP更改下列內容:
IP_ADDRESS_NAME:靜態外部 IP 位址的名稱。名稱必須符合 Compute Engine 資源的命名慣例。CLUSTER_REGION:叢集所在的區域。如果是可用區叢集,則是指叢集可用區所在的區域。LB_EXTERNAL_IP:目前負載平衡器使用的外部 IPv4 位址,在程序第二步中決定。
確認靜態外部 IPv4 位址資源已建立:
gcloud compute addresses describe IP_ADDRESS_NAME --region=CLUSTER_REGION按照上一個步驟的指示替換變數。
刪除現有 Service:
kubectl delete svc SERVICE_NAME -n SERVICE_NAMESPACE將下列註解新增至
MANIFEST_FILE_PATHService 資訊清單檔案:networking.gke.io/load-balancer-ip-addresses: IP_ADDRESS_NAME如要進一步瞭解這個註解,請參閱 LoadBalancer 服務參數中的「靜態 IP 位址」。
將更新後的 Service 資訊清單套用至叢集:
kubectl apply -f MANIFEST_FILE_PATH(選用) 釋出靜態 IPv4 位址資源。
gcloud compute addresses delete IP_ADDRESS_NAME --region=CLUSTER_REGION
疑難排解
本節說明設定以後端服務為基礎的外部 LoadBalancer Service 時,可能會遇到的問題。
加權負載平衡的外部流量政策有誤
如果在啟用加權負載平衡時未設定 externalTrafficPolicy: Local 值,使用下列指令描述 Service 時,可能會收到警告事件:
kubectl describe svc store-v1-lb-svc`
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning UnsupportedConfiguration 4m55s loadbalancer-controller Weighted load balancing by pods-per-node has no effect with External Traffic Policy: Cluster.
如要有效啟用加權負載平衡,您必須設定 externalTrafficPolicy: Local 值。
在標準級建立 IPv6 負載平衡器時發生錯誤
如果 IPv6 外部 LoadBalancer Service 顯示 SyncExternalLoadBalancerFailed 事件,並附帶 Network tier Standard is not supported for IPv6 External Load Balancer 訊息,請從 Service 資訊清單中移除 cloud.google.com/network-tier: Standard 註解。IPv6 外部 LoadBalancer 服務僅支援進階級。
設定自備 IPv6 位址 (BYOIPv6) 時發生錯誤
為外部 LoadBalancer Service 設定自備 IPv6 位址 (BYOIPv6) 時,執行 kubectl describe service SERVICE_NAME 指令可能會看到 SyncExternalLoadBalancerFailed 警告事件。事件訊息開頭為 Error ensuring Resource for L4 External LoadBalancer, err:,後方會顯示下列其中一項錯誤:
networking.gke.io/ip-collection-v6 is currently only supported for IPv6-only Services:請確認 Service 資訊清單指定spec.ipFamilyPolicy: SingleStack和spec.ipFamilies: ["IPv6"]。static IPv6 address "ADDRESS_NAME" is a BYOIP address from IP collection "SUB_PREFIX", which is currently only supported for IPv6-only Services:請確認服務資訊清單指定spec.ipFamilyPolicy: SingleStack和spec.ipFamilies: ["IPv6"]。這項錯誤表示 Service 為雙重堆疊或 IPv4,但參照靜態 BYOIPv6 位址。cannot specify both networking.gke.io/load-balancer-subnet ("SUBNET") and networking.gke.io/ip-collection-v6 ("SUB_PREFIX") for LoadBalancer:使用networking.gke.io/ip-collection-v6註解時,請從 Service 資訊清單中移除networking.gke.io/load-balancer-subnet註解。invalid networking.gke.io/ip-collection-v6 "VALUE": expected projects/PROJECT/regions/REGION/publicDelegatedPrefixes/NAME或invalid networking.gke.io/ip-collection-v6 "VALUE": the public delegated prefix must be in the cluster region REGION:將註解設為與叢集位於相同區域的子前置字元完整資源網址或部分資源路徑 (projects/PROJECT_ID/regions/REGION/publicDelegatedPrefixes/SUB_PREFIX_NAME)。不接受單純的子前置字串名稱。reserved address ("ADDRESS_NAME") is not valid, err: ipCollection mismatch, expected "SUB_PREFIX_A", actual: "SUB_PREFIX_B":請確認networking.gke.io/ip-collection-v6註解與您用來預留靜態 IPv6 位址的公開委派前置字串相符,或是在使用networking.gke.io/load-balancer-ip-addresses註解時省略networking.gke.io/ip-collection-v6註解。googleapi: Error 403: Required 'compute.publicDelegatedPrefixes.use' permission for 'SUB_PREFIX', forbidden:在擁有公開委派前置字元的專案中,將 Compute 公開 IP 管理員角色 (roles/compute.publicIpAdmin) 授予 GKE 服務代理 (service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com)。GKE 每次同步處理 Service 時都需要這項權限,因此請勿在 GKE 建立 Service 後移除角色。
後續步驟
- 如需負載平衡器 Service 的一般總覽,請參閱「LoadBalancer Service」。
- 如需負載平衡器服務參數的說明,請參閱「LoadBalancer 服務參數」。
- 排解 GKE 負載平衡問題。