外部負載平衡器 (ELB) 會從較大的執行個體外部 IP 集區,將指派給組織的集區 IP 位址公開,以便從組織外部存取服務。
ELB 虛擬 IP (VIP) 位址在各組織之間不會衝突,且在所有組織中都是不重複的。因此,您只能將 ELB 服務用於組織外部用戶端需要存取的服務。
只要啟用工作負載,讓工作負載離開組織,在組織內執行的工作負載就能存取 ELB 服務。這種流量模式實際上需要先從組織傳出流量,再返回內部服務。
為共用叢集建立外部負載平衡器
您可以建立全域或可用區 ELB。全域 ELB 的範圍涵蓋整個 GDC Universe。可用區 ELB 的範圍僅限於建立時指定的可用區。詳情請參閱「全域和可用區負載平衡器」。
事前準備
如要設定 ELB 服務,您必須:
- 擁有要設定負載平衡器的專案。詳情請參閱「建立專案」一文。
- 具備自訂
ProjectNetworkPolicy(PNP) 輸入政策,允許流量傳送至這項 ELB 服務。詳情請參閱「設定 PNP 以允許流量傳送至 ELB」。 具備必要的身分和存取權角色:
- 專案 NetworkPolicy 管理員:可管理專案命名空間中的專案網路政策。請要求 IAM 機構組織管理員授予您專案 NetworkPolicy 管理員 (
project-networkpolicy-admin) 角色。 - 負載平衡器管理員:請要求 IAM 機構組織管理員授予您負載平衡器管理員 (
load-balancer-admin) 角色。 - 全域負載平衡器管理員:如果是全域 ELB,請要求 IAM 機構組織管理員授予您全域負載平衡器管理員 (
global-load-balancer-admin) 角色。詳情請參閱「預先定義的角色說明」。
- 專案 NetworkPolicy 管理員:可管理專案命名空間中的專案網路政策。請要求 IAM 機構組織管理員授予您專案 NetworkPolicy 管理員 (
設定 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:
- 使用 gdcloud CLI 建立全域或可用區 ELB。
- 使用網路 Kubernetes 資源模型 (KRM) API 建立全域或可用區 ELB。
- 直接在 Kubernetes 叢集中使用 Kubernetes Service。這個方法僅適用於可用區 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,請按照下列步驟操作:
建立
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:定義的選取器範圍僅限於這個叢集。如未指定這個欄位,系統會選取所有具有指定標籤的端點。這是選填欄位。
如果這個 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 的可用區。
建立
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 時,才需要加入這個欄位。
將
BackendService資源新增至先前建立的Backend資源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --project=PROJECT_NAME \ --zone=ZONE選用:對 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資源的工作階段相依性。
建立外部
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/32CIDR。指定與這項轉送規則位於相同命名空間的Subnet資源名稱。Subnet資源代表可用區子網路的要求和分配資訊。如要進一步瞭解Subnet資源,請參閱「自訂資源範例」。PROTOCOL_PORT:要在轉送規則上公開的通訊協定和通訊埠。這個欄位必須採用ip-protocol=TCP:80格式。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。
如要驗證設定的 ELB,請確認每個建立的物件上的
Ready條件。如要取得負載平衡器指派的 IP 位址,請說明轉送規則:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME如要驗證設定的 ELB,請確認每個建立物件的
Ready條件。向 VIP 發出curl要求,驗證流量:如要取得指派的 VIP,請說明轉送規則:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME向轉送規則中
PROTOCOL_PORT欄位指定的通訊埠,傳送curl要求至 VIP,驗證流量:curl http://FORWARDING_RULE_VIP:PORT更改下列內容:
FORWARDING_RULE_VIP:轉送規則的 VIP。PORT:轉送規則中PROTOCOL_PORT欄位的通訊埠編號。
API
使用 KRM API 建立 ELB,指定 Pod 或 VM 工作負載。這個 ELB 會指定專案中所有符合 Backend 物件定義標籤的工作負載。
如要使用 KRM API 建立可用區 ELB,請按照下列步驟操作:
建立
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欄位,指定的標籤會套用至專案中的所有工作負載。
如果這個 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。
使用先前建立的
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,請勿加入這個欄位。
選用:對 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資源的工作階段相依性。
建立外部
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/32CIDR。指定與這項轉送規則位於相同命名空間的Subnet資源名稱。Subnet資源代表可用區子網路的要求和分配資訊。如要進一步瞭解Subnet資源,請參閱「自訂資源範例」。PORT:使用ports欄位指定 L4 通訊埠陣列,封包會轉送至使用這項轉送規則設定的後端。至少須指定一個通訊埠。使用port欄位指定通訊埠編號。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。PROTOCOL:轉送規則使用的通訊協定,例如TCP。ports陣列中的項目必須如下所示:ports: - port: 80 protocol: TCP
如要驗證設定的 ELB,請確認每個建立物件的
Ready條件。向 VIP 發出curl要求,驗證流量:如要取得 VIP,請使用
kubectl get:kubectl get forwardingruleexternal -n PROJECT_NAME輸出內容如下:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True向轉送規則中
PORT欄位指定的通訊埠,傳送curl要求至 VIP,驗證流量:curl http://FORWARDING_RULE_VIP:PORT將
FORWARDING_RULE_VIP替換為轉送規則的 VIP。
Kubernetes 服務
如要在 GDC 中建立 ELB,請在 Kubernetes 叢集中建立 LoadBalancer 類型的 Kubernetes Service。
如要建立 ELB 服務,請按照下列步驟操作:
為
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)。前端和後端通訊埠可以不同。在
Service定義的selector欄位中,指定 Pod 或虛擬機器做為後端工作負載。選取器會比對您指定的標籤與工作負載上的標籤,定義要將哪些工作負載做為這項服務的後端工作負載。
Service只能選取與定義Service的專案和叢集相同的後端工作負載。如要進一步瞭解服務選取,請參閱 https://kubernetes.io/docs/concepts/services-networking/service/。
將
Service定義檔儲存在與後端工作負載相同的專案中。將
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 22hEXTERNAL-IP是可從組織外部存取的服務 IP 位址。如果沒有取得輸出內容,請確認您已成功建立 ELB 服務。
建立全域 ELB
使用 gdcloud CLI 或 KRM API 建立全域 ELB。
gdcloud
使用 gdcloud CLI 建立 ELB,指定 Pod 或 VM 工作負載。
這個 ELB 會指定專案中所有符合 Backend 物件定義標籤的工作負載。Backend 自訂資源必須限定在可用區範圍內。
如要使用 gdcloud CLI 建立 ELB,請按照下列步驟操作:
建立
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。可用區旗標僅適用於多可用區環境。這是選填欄位。
如果這個 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。這是選填欄位。
建立
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 時,才需要加入這個欄位。
將
BackendService資源新增至先前建立的Backend資源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone BACKEND_ZONE \ --project=PROJECT_NAME \ --global選用:對 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資源的工作階段相依性。
建立外部
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/32CIDR。指定與這項轉送規則位於相同命名空間的Subnet資源名稱。Subnet資源代表全域子網路的要求和分配資訊。如要進一步瞭解Subnet資源,請參閱「自訂資源範例」。PROTOCOL_PORT:要在轉送規則上公開的通訊協定和通訊埠。這個欄位必須採用ip-protocol=TCP:80格式。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。
如要驗證設定的 ELB,請確認每個建立的物件上的
Ready條件。如要取得負載平衡器指派的 IP 位址,請說明轉送規則:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME如要驗證設定的 ELB,請確認每個建立物件的
Ready條件。向 VIP 發出curl要求,驗證流量:如要取得指派的 VIP,請說明轉送規則:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME --global向轉送規則中
PROTOCOL_PORT欄位指定的通訊埠,傳送curl要求至 VIP,驗證流量:curl http://FORWARDING_RULE_VIP:PORT更改下列內容:
FORWARDING_RULE_VIP:轉送規則的 VIP。PORT:轉送規則中PROTOCOL_PORT欄位的通訊埠編號。
API
使用 KRM API 建立 ELB,指定 Pod 或 VM 工作負載。這個 ELB 會指定專案中符合 Backend 物件定義標籤的所有工作負載。如要使用 KRM API 建立可用區 ELB,請按照下列步驟操作:
建立
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欄位,指定的標籤會套用至專案中的所有工作負載。
如果這個 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 中建立健康狀態檢查。
使用先前建立的
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-BtargetPorts欄位為選填。這項資源會列出BackendService資源轉譯的通訊埠。如果使用這個物件,請提供下列值:PORT:服務公開的通訊埠。PROTOCOL:流量必須符合的第 4 層通訊協定。僅支援 TCP 和 UDP。TARGET_PORT:PORT值轉譯後的通訊埠,例如8080。在特定物件中,TARGET_PORT的值不得重複。targetPorts的範例如下:targetPorts: - port: 80 protocol: TCP targetPort: 8080
選用:對 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資源的工作階段相依性。
建立外部
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/32CIDR。指定與這項轉送規則位於相同命名空間的Subnet資源名稱。Subnet資源代表全域子網路的要求和分配資訊。如要進一步瞭解Subnet資源,請參閱「自訂資源範例」。PORT:使用ports欄位指定 L4 通訊埠陣列,封包會轉送至使用這項轉送規則設定的後端。至少須指定一個通訊埠。使用port欄位指定通訊埠編號。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。PROTOCOL:轉送規則使用的通訊協定,例如TCP。ports陣列中的項目必須如下所示:ports: - port: 80 protocol: TCP
如要驗證設定的 ELB,請確認每個建立物件的
Ready條件。向 VIP 發出curl要求,驗證流量:如要取得 VIP,請使用
kubectl get:kubectl get forwardingruleexternal -n PROJECT_NAME輸出內容如下:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True向轉送規則中
PORT欄位指定的通訊埠,傳送curl要求至 VIP,驗證流量: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) 角色。
- 專案 NetworkPolicy 管理員:可管理專案命名空間中的專案網路政策。請要求 IAM 機構組織管理員授予您專案 NetworkPolicy 管理員 (
設定 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 服務,請按照下列步驟操作:
為
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)。前端和後端通訊埠可以不同。在
Service定義的selector欄位中,指定與後端工作負載相符的鍵/值組合。如果是標準叢集,則僅支援 Pod 做為工作負載。選取器會比對您指定的標籤與工作負載上的標籤,並根據比對結果選取工作負載。
Service只能選取與定義Service的專案和叢集相同的後端工作負載。如要進一步瞭解服務選取,請參閱 https://kubernetes.io/docs/concepts/services-networking/service/。
將
Service規格儲存為 YAML 檔案。在下列指令中,將檔案名稱替換為 ELB_FILE。將
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 22hEXTERNAL-IP是可從組織外部存取的服務 IP 位址。
選取 VM 做為負載平衡器的後端
如要將 VM 連結至負載平衡器,請按照下列步驟操作:
確認 VM 的標籤與負載平衡器設定中使用的標籤選取器相符。
舉例來說,如果 VM 沒有適當的標籤,您可以將相應可用區後端物件的指定標籤新增至 VM:
kubectl --kubeconfig MANAGEMENT_API_SERVER label virtualmachine VM_NAME -n PROJECT_NAMELABEL更改下列內容:
LABEL:與負載平衡器設定中的LabelSelector相符的標籤,例如app=server。VM_NAME:要連結的虛擬機器名稱。PROJECT_NAME:專案名稱。
確認伺服器監聽的通訊埠與
HealthCheck物件中指定的通訊埠相同。