本文說明如何使用混合通訊協定外部 LoadBalancer 服務,同時處理 TCP 和 UDP 流量,將 Google Kubernetes Engine (GKE) 叢集中執行的應用程式公開至網際網路。
如要進一步瞭解外部直通式網路負載平衡器,請參閱「後端服務型外部直通式網路負載平衡器」。
總覽
如要公開同時使用 TCP 和 UDP 通訊協定的應用程式,可以使用兩個不同的 GKE LoadBalancer 服務,並手動協調共用 IP 位址。不過,這種做法效率不彰,因為需要為單一應用程式管理多個服務,而且可能會導致設定錯誤或 IP 位址配額用盡等問題。
混合通訊協定 LoadBalancer 服務可讓您使用單一服務,同時管理 TCP 和 UDP 的流量。使用單一服務可簡化設定,因為您能同時使用單一 IPv4 位址和一組整合的轉送規則。這項功能適用於外部直通式網路負載平衡器。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 請確認您有現有的 Autopilot 或 Standard 叢集。如要建立新叢集,請參閱「建立 Autopilot 叢集」。
需求條件
如要建立使用混合通訊協定的外部 LoadBalancer 服務,叢集必須符合下列條件:
- 混合通訊協定負載平衡僅適用於版本 1.34.1-gke.2190000 以上的新建叢集。
- 您必須在叢集上啟用
HttpLoadBalancing外掛程式。 - 如要為新的外部 LoadBalancer 服務實作負載平衡器,請在服務資訊清單中將
spec.loadBalancerClass欄位設為networking.gke.io/l4-regional-external。如果是現有服務,資訊清單中已有cloud.google.com/l4-rbs: "enabled"註解,您可以保留註解。
限制
- 混合通訊協定負載平衡器僅支援 IPv4 位址。
您無法在服務資訊清單中,使用下列終結器混合通訊協定:
gke.networking.io/l4-ilb-v1gke.networking.io/l4-netlb-v1
如果資訊清單有這些終結器,您必須根據上述規定刪除並重新建立 Service。
定價
Google Cloud 會針對任何外部 IP 位址和傳送的資料,按轉送規則向您收費。下表說明指定設定使用的轉送規則和外部 IP 位址數量。詳情請參閱「虛擬私有雲網路定價」。
| 類型 | 傳輸層 | 網際網路層 | 轉送規則數量 | 外部 IP 位址數量 |
|---|---|---|---|---|
| 外部 | 單一 (TCP 或 UDP) | IPv4 | 1 | 1 |
| IPv6 | 1 | 1 | ||
| IPv4 和 IPv6(雙重堆疊) | 2 | 2 | ||
| 混合 (TCP 和 UDP) | IPv4 | 2 | 1 |
部署工作負載
本節說明如何部署同時監聽 TCP 和 UDP 連接埠的範例工作負載。請注意,無論您是使用混合通訊協定的 LoadBalancer 服務,還是兩個獨立的單一通訊協定 LoadBalancer 服務,Deployment 設定都相同。
下列資訊清單適用於監聽通訊埠 8080 的範例應用程式,可處理 TCP 和 UDP 流量。請將下列資訊清單儲存為
mixed-app-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: mixed-app-deployment spec: replicas: 3 selector: matchLabels: app: mixed-app template: metadata: labels: app: mixed-app spec: containers: - image: gcr.io/kubernetes-e2e-test-images/agnhost:2.6 name: agnhost args: ["serve-hostname", "--port=8080", "--tcp=true", "--udp=true", "--http=false"] ports: - name: tcp8080 protocol: TCP containerPort: 8080 - name: udp8080 protocol: UDP containerPort: 8080將資訊清單套用至叢集:
kubectl apply -f mixed-app-deployment.yaml
建立混合通訊協定負載平衡器
建立 LoadBalancer 類型的服務,將部署項目同時公開給 TCP 和 UDP 流量。
將下列資訊清單儲存為
mixed-protocol-lb.yaml:apiVersion: v1 kind: Service metadata: name: mixed-protocol-lb spec: loadBalancerClass: "networking.gke.io/l4-regional-external" type: LoadBalancer selector: app: mixed-app ports: - name: tcp-port protocol: TCP port: 8080 - name: udp-port protocol: UDP port: 8080上述 Service 有兩個通訊埠,一個用於 TCP,另一個用於 UDP,兩者都位於通訊埠 8080。
將資訊清單套用至叢集:
kubectl apply --server-side -f mixed-protocol-lb.yaml
驗證混合通訊協定負載平衡器
建立 Service 後,請確認 GKE 已成功建立負載平衡器。
檢查 Service:
kubectl describe service mixed-protocol-lb輸出會顯示負載平衡器的外部 IP 位址,以及 TCP 和 UDP 的轉送規則。在輸出內容中驗證下列詳細資料:
- 系統會自動填入「
status.loadBalancer.ingress.ip」欄位的值。 - 確認外部負載平衡器有下列註解:
service.kubernetes.io/tcp-forwarding-ruleservice.kubernetes.io/udp-forwarding-rule
- 「
Events」部分不含任何錯誤訊息。
- 系統會自動填入「
更新混合通訊協定負載平衡器
如要更新混合通訊協定負載平衡器上的通訊埠,請編輯服務資訊清單。如要編輯服務,請執行下列指令:
kubectl edit service SERVICE_NAME
將 SERVICE_NAME 改為您的服務名稱。
更新通訊埠
如要更新混合通訊協定負載平衡器上的通訊埠,請修改 Service 資訊清單的 ports 區段。您可以新增、移除或修改連接埠。
以下範例新增 UDP 通訊埠用於串流,以及 TCP 通訊埠用於遊戲伺服器中繼資料:
apiVersion: v1
kind: Service
metadata:
name: mixed-protocol-lb
spec:
loadBalancerClass: "networking.gke.io/l4-regional-external"
type: LoadBalancer
selector:
app: mixed-app
ports:
- name: tcp-port
protocol: TCP
port: 8080
- name: streaming
protocol: UDP
port: 10100
- name: gameserver-metadata
protocol: TCP
port: 10400
- name: https
protocol: TCP
port: 443
將單一通訊協定負載平衡器更新為混合通訊協定
如要將單一通訊協定負載平衡器變更為混合通訊協定負載平衡器,請編輯 Service,加入 TCP 和 UDP 通訊協定的通訊埠。
以下範例會為現有的純 TCP 負載平衡器新增 DNS 的 UDP 連接埠:
apiVersion: v1
kind: Service
metadata:
name: already-existing-single-protocol-lb
spec:
loadBalancerClass: "networking.gke.io/l4-regional-external"
type: LoadBalancer
selector:
app: mixed-app
ports:
- name: http
protocol: TCP
port: 80
- name: https
protocol: TCP
port: 443
- name: dns
protocol: UDP
port: 53
將混合通訊協定負載平衡器更新為單一通訊協定
如要將混合通訊協定負載平衡器變更為單一通訊協定負載平衡器,請移除其中一個通訊協定的所有通訊埠。
以下範例會移除 DNS 的 UDP 連接埠,將負載平衡器轉換為僅限 TCP:
apiVersion: v1
kind: Service
metadata:
name: already-existing-mixed-protocol-lb
spec:
loadBalancerClass: "networking.gke.io/l4-regional-external"
type: LoadBalancer
selector:
app: mixed-app
ports:
- name: http
protocol: TCP
port: 80
- name: https
protocol: TCP
port: 443
刪除混合通訊協定 LoadBalancer
如要刪除 mixed-protocol-lb 外部 LoadBalancer 服務,請執行下列指令:
kubectl delete service mixed-protocol-lb
GKE 會自動移除為 Service 建立的所有負載平衡器資源。
疑難排解
本節說明如何解決混合通訊協定 LoadBalancer 服務的常見問題。
檢查錯誤事件
疑難排解的第一步是檢查與服務相關聯的事件。
取得服務詳細資料:
kubectl describe service mixed-protocol-lb查看輸出內容結尾的
Events區段,瞭解是否有任何錯誤訊息。
錯誤:LoadBalancer 不支援混合通訊協定
如果您使用 cloud.google.com/l4-rbs: "enabled"
註解建立服務,在建立混合通訊協定負載平衡器後,可能會看到原始服務控制器發出的警告事件:mixed-protocol is not
supported for LoadBalancer。
您可以放心忽略這則訊息,因為支援混合通訊協定的新控制器會正確佈建負載平衡器。
更新後缺少連接埠定義
症狀:
更新同時使用 TCP 和 UDP 的通訊埠 (例如通訊埠 8080) 時,更新後的 Service 會缺少其中一個通訊埠定義。
原因:
這是 Kubernetes 的已知問題。在同一個通訊埠上更新具有多個通訊協定的服務時,用戶端修補程式計算可能會錯誤合併通訊埠清單,導致其中一個通訊埠定義遭到移除。這個問題會影響使用用戶端修補程式的用戶端,例如 kubectl apply 和 Go 用戶端 (含合併修補程式)。
解決方法:
這個問題的解決方法取決於您的用戶端。
kubectl:使用
--server-side標記搭配kubectl apply:kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yaml將
YOUR_SERVICE_MANIFEST改為您的服務資訊清單名稱。適用於 go-client:請勿使用合併修補程式。請改用更新呼叫來取代服務。這需要 HTTP
PUT要求,並附上完整的 Service 物件規格。
後續步驟
- 進一步瞭解如何使用 Service 公開應用程式。
- 瞭解 LoadBalancer 服務。