SCTP を使用してワークロードをデプロイする


このページでは、Google Kubernetes Engine(GKE)Standard クラスタに Stream Control Transmission Protocol(SCTP)を使用するワークロードをデプロイする方法について説明します。

SCTP は Cilium テクノロジーでサポートされています。GKE Dataplane V2 は Cilium を使用して実装されているため、SCTP は GKE Dataplane V2 で有効になっているクラスタでのみ使用できます。SCTP のサポートにより、Pod 間トラフィックと Pod と Service 間のトラフィックで直接 SCTP 通信を有効にできます。詳細については、Cilium での SCTP サポートをご覧ください。

このページは、クラウド リソースのプロビジョニングと構成、アプリとサービスのデプロイを行うオペレーターとデベロッパーを対象としています。 Google Cloudのコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

要件と制限事項

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 \
        --region=REGION \
        --cluster-version=CLUSTER_VERSION \
        --enable-dataplane-v2 \
        --image-type=ubuntu_containerd
    

    次の値を置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • REGION: クラスタが作成される Google Cloud リージョン。
    • CLUSTER_VERSION: GKE バージョン。1.32.2-gke.1297000 以降にする必要があります。
  2. アプリケーションをコンテナ化するには、コンテナ イメージに SCTP を使用するように構成されたアプリケーションが含まれていることを確認します。カスタム アプリケーションなど、SCTP をサポートする任意のアプリケーションを使用できます。

    Docker を使用することを前提として、アプリケーションをコンテナ化する Dockerfile の例を次に示します。

    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"]
    

    イメージをビルドして push する。Artifact Registry などのコンテナ レジストリに push します。このファイルの動作については、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. Service の 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 Service オブジェクトのステータスを確認します。

    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 のパフォーマンスをモニタリングし、必要に応じて設定を調整します。

次のステップ