Arbeitslasten mit SCTP bereitstellen

Auf dieser Seite wird erläutert, wie Sie Arbeitslasten bereitstellen, die das Stream Control Transmission Protocol (SCTP) in Google Kubernetes Engine (GKE) Standard-Clustern verwenden.

SCTP wird von der Cilium-Technologie unterstützt. Da GKE Dataplane V2 mit Cilium implementiert wird, können Sie SCTP nur in Clustern verwenden, in denen GKE Dataplane V2 aktiviert ist. Mit der SCTP-Unterstützung können Sie die direkte SCTP-Kommunikation für Pod-zu-Pod- und Pod-zu-Dienst-Traffic aktivieren. Weitere Informationen finden Sie unter SCTP-Unterstützung in Cilium.

Diese Seite richtet sich an Betreiber und Entwickler, die Cloud-Ressourcen bereitstellen und konfigurieren sowie Apps und Dienste bereitstellen. Weitere Informationen zu gängigen Rollen und Beispielaufgaben, auf die in Google Cloud Inhalten verwiesen wird, finden Sie unter Häufig verwendete GKE-Nutzerrollen und -Aufgaben.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, installieren und dann initialisieren Sie die gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem gcloud components update Befehl ab. Ältere gcloud CLI-Versionen unterstützen möglicherweise nicht die Ausführung der Befehle in diesem Dokument.

Anforderungen und Einschränkungen

Für die SCTP-Unterstützung in GKE Standard-Clustern gelten die folgenden Anforderungen und Einschränkungen:

  • Ihr Cluster muss GKE-Version 1.32.2-gke.1297000 oder höher ausführen.
  • Clusterknoten müssen Ubuntu Knoten-Images verwenden. SCTP wird für Container-Optimized OS-Images nicht unterstützt.
  • Damit die SCTP-Unterstützung aktiviert werden kann, muss das sctp-Kernelmodul in Ihre Ubuntu-basierten Container-Images und das zugrunde liegende GKE-Knotenbetriebssystem geladen werden.
  • Die Einrichtungszeit für eine SCTP-Zuordnung kann länger sein als die Einrichtungszeit für eine TCP-Verbindung. Entwickeln Sie Ihre Anwendungen so, dass sie potenzielle Verzögerungen bei der Einrichtung von Zuordnungen verarbeiten können.
  • Weitere Informationen dazu, was Cilium mit SCTP unterstützt und was nicht, finden Sie in der Cilium-Dokumentation.

Arbeitslasten mit SCTP bereitstellen

Best Practice:

Testen Sie Ihre Bereitstellung gründlich in einer Nicht-Produktionsumgebung, bevor Sie Arbeitslasten in der Produktion bereitstellen.

Ab GKE-Version 1.32.2-gke.1297000 ist SCTP standardmäßig in Clustern aktiviert, die GKE Dataplane V2 und Ubuntu-Knoten-Images verwenden. Führen Sie die folgenden Schritte aus, um Arbeitslasten mit SCTP bereitzustellen:

  1. Führen Sie den folgenden Befehl aus, um einen Cluster mit GKE Dataplane V2 und Ubuntu-Images zu erstellen:

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

    Ersetzen Sie die folgenden Werte:

    • CLUSTER_NAME: Der Name Ihres Clusters.
    • CONTROL_PLANE_LOCATION: Der Compute Engine Standort der Steuerungsebene Ihres Clusters. Geben Sie für regionale Cluster eine Region und für zonale Cluster eine Zone an.
    • CLUSTER_VERSION: Die GKE-Version, die mindestens 1.32.2-gke.1297000 sein muss.
  2. Wenn Sie die Anwendung containerisieren möchten, muss Ihr Container-Image eine Anwendung enthalten, die für die Verwendung von SCTP konfiguriert ist. Sie können jede Anwendung verwenden, die SCTP unterstützt, z. B. eine benutzerdefinierte Anwendung.

    Das folgende Beispiel zeigt eine Dockerfile-Datei zum Containerisieren der Anwendung, wenn Sie Docker verwenden:

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

    Erstellen Sie das Image und übertragen Sie es in eine Container Registry wie Artifact Registry. Weitere Informationen zur Funktionsweise dieser Datei finden Sie in der Docker Dokumentation unter Dockerfile reference.

  3. Speichern Sie zum Erstellen eines Deployments und eines Dienstes das folgende Manifest als 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
    

    Ersetzen Sie Folgendes:

    • CONTAINER_IMAGE: Das Container-Image, das Sie im vorherigen Schritt erstellt haben.
    • PORT: Die SCTP-Port- und Zielportnummern der Anwendung. Die Werte für port und targetPort müssen identisch sein.
  4. Führen Sie den folgenden Befehl aus, um das Deployment und den Dienst anzuwenden:

    kubectl apply -f sctp-deployment.yaml
    
  5. Erstellen Sie einen Pod im selben Cluster und führen Sie den folgenden Befehl aus, um die SCTP-Verbindung für den Dienst zu prüfen:

    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'
    

    Die Ausgabe sieht etwa so aus:

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

Fehlerbehebung

Wenn Probleme mit der SCTP-Verbindung auftreten, folgen Sie dieser Anleitung, um die Ursache des Problems zu ermitteln:

  • Prüfen Sie die Pod-Logs. Führen Sie den folgenden Befehl aus, um die Logs Ihrer Anwendung auf Fehler zu prüfen:

    kubectl logs POD_NAME
    

    Anhand dieser Logs können Sie ermitteln, warum der Pod abgestürzt ist.

  • Prüfen Sie den Status des SCTP-Dienstobjekts:

    kubectl describe service SCTP_SERVICE_NAME
    
  • Prüfen Sie Ihre Netzwerkrichtlinien. Netzwerkrichtlinien können den SCTP-Traffic einschränken. Prüfen Sie, ob Ihre Netzwerkrichtlinien den erforderlichen SCTP-Traffic für Ihre Anwendungen zulassen.

  • Prüfen Sie den Status von GKE Dataplane V2. Führen Sie den folgenden Befehl aus, um zu prüfen, ob GKE Dataplane V2 in Ihrem Cluster aktiviert ist:

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

    Prüfen Sie, ob die Ausgabe Pods mit dem Präfix anetd- enthält. anetd ist der Netzwerkcontroller für GKE Dataplane V2.

  • Erhöhen Sie die sysctl-Parameter net.core.wmem_default und net.core.rmem_default auf einen größeren Wert, z. B. 4194304 (4 MB), um den Durchsatz zu verbessern. Weitere Informationen finden Sie unter Sysctl-Konfigurationsoptionen.

  • Es können Probleme auftreten, wenn Sie NAT (Network Address Translation) mit SCTP in GKE verwenden. Weitere Informationen dazu, was Cilium mit SCTP unterstützt, finden Sie in der Cilium-Dokumentation.

  • Für SCTP-Pakete gilt die maximale Übertragungseinheit (Maximum Transmission Unit, MTU) des Netzwerks. Prüfen Sie, ob die MTU Ihres Netzwerks für Ihren SCTP-Traffic ausreichend ist.

  • Die Leistung von SCTP kann durch Faktoren wie Netzwerklatenz, Paketverlust und Kernel-Tuning beeinflusst werden. Beobachten Sie die Leistung von SCTP Ihrer Anwendung und passen Sie die Einstellungen nach Bedarf an.

Nächste Schritte