使用 SCTP 部署工作負載

本頁說明如何在 Google Kubernetes Engine (GKE) 標準叢集上,部署使用串流控制傳輸通訊協定 (SCTP) 的工作負載。

Cilium 技術支援 SCTP。由於 GKE Dataplane V2 是使用 Cilium 實作,因此只有啟用 GKE Dataplane V2 的叢集才能使用 SCTP。有了 SCTP 支援,您就能為 Pod 對 Pod 和 Pod 對服務流量啟用直接 SCTP 通訊。詳情請參閱「Cilium 上的 SCTP 支援」。

本頁內容適用於佈建及設定雲端資源,並部署應用程式和服務的作業人員和開發人員。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。

需求條件和限制

GKE Standard 叢集上的 SCTP 支援功能有下列規定和限制:

  • 叢集必須執行 GKE 1.32.2-gke.1297000 以上版本。
  • 叢集節點必須使用 Ubuntu 節點映像檔。Container-Optimized OS 映像檔不支援 SCTP。
  • 如要啟用 SCTP 支援,請確認以 Ubuntu 為基礎的容器映像檔和基礎 GKE 節點 OS 已載入 sctp 核心模組。
  • 在啟用 Pod 多網路支援功能的叢集上,您無法使用 SCTP。
  • SCTP 關聯的設定時間可能比 TCP 連線的設定時間長。設計應用程式時,請考量建立關聯時可能發生的延遲。
  • 如要進一步瞭解 Cilium 支援和不支援的 SCTP 功能,請參閱 Cilium 說明文件

使用 SCTP 部署工作負載

最佳做法

在將工作負載部署至正式環境前,請先在非正式環境中徹底測試部署作業。

從 GKE 1.32.2-gke.1297000 版開始,使用 GKE Dataplane V2 和 Ubuntu 節點映像檔的叢集會預設啟用 SCTP。如要使用 SCTP 部署工作負載,請完成下列步驟:

  1. 如要建立具有 GKE Dataplane V2 和 Ubuntu 映像檔的叢集,請執行下列指令:

    gcloud container clusters create CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-dataplane-v2 \
        --image-type=ubuntu_containerd
    

    替換下列值:

    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine位置。為地區叢集提供區域,或為區域叢集提供可用區。
    • CLUSTER_VERSION:GKE 版本,必須為 1.32.2-gke.1297000 以上版本。
  2. 如要將應用程式容器化,請確保容器映像檔包含已設定使用 SCTP 的應用程式。您可以使用任何支援 SCTP 的應用程式,例如自訂應用程式。

    以下是將應用程式容器化的 Dockerfile 範例 (假設您使用 Docker):

    FROM ubuntu:latest
    RUN apt-get update && apt-get install -y socat
    
    # Run a simple SCTP echo server.  This command uses socat to listen for
    # incoming SCTP connections on a specified port and echo back any received data.
    # The 'fork' option ensures that a new process is created for each connection.
    # Replace "PORT" below with the desired port number.
    CMD ["socat", "PIPE", "SCTP-LISTEN:PORT,fork"]
    

    建構映像檔並推送至容器登錄服務,例如 Artifact Registry。如要進一步瞭解這個檔案的運作方式,請參閱 Docker 說明文件中的 Dockerfile 參考資料

  3. 如要建立 Deployment 和 Service,請將下列資訊清單儲存為 sctp-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: sctp-app
    spec:
     replicas: 1
     selector:
       matchLabels:
         app: sctp-app
     template:
       metadata:
         labels:
           app: sctp-app
       spec:
         containers:
         - name: sctp-container
           image: CONTAINER_IMAGE
           ports:
           - containerPort: PORT
             protocol: SCTP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sctp-service
    spec:
      selector:
        app: sctp-app
      ports:
      - protocol: SCTP
        port: PORT
        targetPort: PORT
      type: ClusterIP
    

    更改下列內容:

    • CONTAINER_IMAGE:您在上一個步驟中建構的容器映像檔。
    • PORT:應用程式的 SCTP 通訊埠和目標通訊埠編號。porttargetPort 的值必須相同。
  4. 如要套用 Deployment 和 Service,請執行下列指令:

    kubectl apply -f sctp-deployment.yaml
    
  5. 如要驗證服務的 SCTP 連線,請在同一叢集中建立 Pod,然後執行下列指令:

    kubectl run sctp-client \
     --image=ubuntu:latest \
     --namespace=default \
     -it --rm \
     --command -- bash -c 'apt-get update && apt-get install -y socat && (echo "Hello, SCTP!"; sleep 1) | socat - SCTP:sctp-service:PORT'
    

    輸出結果會與下列內容相似:

    Preparing to unpack .../socat_1.8.0.0-4build3_amd64.deb ...
    Setting up socat (1.8.0.0-4build3) ...
    Hello, SCTP!
    

疑難排解

如果 SCTP 連線發生問題,請按照下列指引判斷問題來源:

  • 檢查 Pod 記錄。如要檢查應用程式記錄是否有任何錯誤,請執行下列指令:

    kubectl logs POD_NAME
    

    這些記錄有助於找出 Pod 損毀的原因。

  • 檢查 SCTP 服務物件的狀態:

    kubectl describe service SCTP_SERVICE_NAME
    
  • 檢查網路政策。網路政策可以限制 SCTP 流量。 確認網路政策允許應用程式所需的 SCTP 流量。

  • 檢查 GKE Dataplane V2 的狀態。如要確認叢集是否已啟用 GKE Dataplane V2,請執行下列指令:

    kubectl -n kube-system get pods -l k8s-app=cilium -o wide
    

    確認輸出內容包含前置字元為 anetd- 的 Pod。anetd 是 GKE Dataplane V2 的網路控制器。

  • 如要提高輸送量,請將 sysctl 參數 net.core.wmem_defaultnet.core.rmem_default 增加到較大的值,例如 4194304 (4 MB)。詳情請參閱「Sysctl 設定選項」。

  • 在 GKE 中使用 SCTP 時,如果搭配網路位址轉譯 (NAT),可能會發生問題。如要進一步瞭解 Cilium 支援的 SCTP 功能,請參閱 Cilium 說明文件

  • SCTP 封包會受到網路最大傳輸單位 (MTU) 的限制。確認網路的 MTU 足以處理 SCTP 流量。

  • SCTP 的效能可能會受到網路延遲、封包遺失和核心調整等因素影響。監控應用程式的 SCTP 效能,並視需要調整設定。

後續步驟