Desplegar cargas de trabajo con SCTP


En esta página se explica cómo desplegar cargas de trabajo que usan el protocolo de control de transmisión de flujo (SCTP) en clústeres estándar de Google Kubernetes Engine (GKE).

SCTP es compatible con la tecnología Cilium. Como GKE Dataplane V2 se implementa con Cilium, solo puedes usar SCTP en clústeres que tengan habilitado GKE Dataplane V2. Con la compatibilidad con SCTP, puedes habilitar la comunicación SCTP directa para el tráfico de pod a pod y de pod a servicio. Para obtener más información, consulta Compatibilidad con SCTP en Cilium.

Esta página está dirigida a operadores y desarrolladores que aprovisionan y configuran recursos en la nube, y despliegan aplicaciones y servicios. Para obtener más información sobre los roles habituales y las tareas de ejemplo que se mencionan en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Google Cloud

Antes de empezar

Antes de empezar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Requisitos y limitaciones

La compatibilidad con SCTP en clústeres estándar de GKE tiene los siguientes requisitos y limitaciones:

  • Tu clúster debe ejecutar la versión 1.32.2-gke.1297000 de GKE o una posterior.
  • Los nodos del clúster deben usar imágenes de nodo de Ubuntu. SCTP no es compatible con las imágenes de Container-Optimized OS.
  • Para habilitar la compatibilidad con SCTP, asegúrate de que tus imágenes de contenedor basadas en Ubuntu y el sistema operativo del nodo de GKE subyacente tengan cargado el módulo del kernel sctp.
  • No puedes usar SCTP en clústeres que tengan habilitada la compatibilidad con varias redes para pods.
  • El tiempo de configuración de una asociación SCTP puede ser mayor que el de una conexión TCP. Diseña tus aplicaciones para que puedan gestionar posibles retrasos mientras se establecen las asociaciones.
  • Para obtener más información sobre lo que admite y no admite Cilium con SCTP, consulta la documentación de Cilium.

Desplegar cargas de trabajo con SCTP

Práctica recomendada:

Prueba a fondo tu implementación en un entorno que no sea de producción antes de implementar cargas de trabajo en producción.

A partir de la versión 1.32.2-gke.1297000 de GKE, SCTP está habilitado de forma predeterminada en los clústeres que usan GKE Dataplane V2 e imágenes de nodo de Ubuntu. Para implementar cargas de trabajo con SCTP, sigue estos pasos:

  1. Para crear un clúster con GKE Dataplane V2 e imágenes de Ubuntu, ejecuta el siguiente comando:

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

    Sustituye los siguientes valores:

    • CLUSTER_NAME: el nombre de tu clúster.
    • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.
    • CLUSTER_VERSION: la versión de GKE, que debe ser la 1.32.2-gke.1297000 o una posterior.
  2. Para contenerizar la aplicación, asegúrate de que tu imagen de contenedor incluya una aplicación configurada para usar SCTP. Puedes usar cualquier aplicación que admita SCTP, como una aplicación personalizada.

    A continuación, se muestra un ejemplo de Dockerfile para empaquetar la aplicación en un contenedor, suponiendo que usas 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"]
    

    Crea y envía la imagen a un registro de contenedores como Artifact Registry. Para obtener más información sobre cómo funciona este archivo, consulta la referencia de Dockerfile en la documentación de Docker.

  3. Para crear un Deployment y un Service, guarda el siguiente manifiesto como 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
    

    Haz los cambios siguientes:

    • CONTAINER_IMAGE: la imagen del contenedor que has creado en el paso anterior.
    • PORT: los números de puerto SCTP y de puerto de destino de la aplicación. Los valores de port y targetPort deben ser iguales.
  4. Para aplicar el Deployment y el Service, ejecuta el siguiente comando:

    kubectl apply -f sctp-deployment.yaml
    
  5. Para verificar la conectividad SCTP del servicio, crea un pod en el mismo clúster y ejecuta el siguiente comando:

    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'
    

    El resultado debería ser similar al siguiente:

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

Solución de problemas

Si tienes problemas con la conectividad SCTP, sigue estas instrucciones para determinar el origen del problema:

  • Consulta los registros de pods. Para comprobar si hay errores en los registros de tu aplicación, ejecuta el siguiente comando:

    kubectl logs POD_NAME
    

    Estos registros pueden ayudarte a identificar la causa del fallo del pod.

  • Comprueba el estado del objeto de servicio SCTP:

    kubectl describe service SCTP_SERVICE_NAME
    
  • Comprueba tus políticas de red. Las políticas de red pueden restringir el tráfico SCTP. Asegúrate de que tus políticas de red permitan el tráfico SCTP necesario para tus aplicaciones.

  • Comprueba el estado de GKE Dataplane V2. Para comprobar que GKE Dataplane V2 está habilitado en tu clúster, ejecuta el siguiente comando:

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

    Comprueba que la salida incluya pods con el prefijo anetd-. anetd es el controlador de redes de GKE Dataplane V2.

  • Para mejorar el rendimiento, aumente los parámetros sysctl net.core.wmem_default y net.core.rmem_default a un valor mayor, por ejemplo, 4194304 (4 MB). Para obtener más información, consulta Opciones de configuración de Sysctl.

  • Puede que tengas problemas si usas la traducción de direcciones de red (NAT) con SCTP en GKE. Para obtener más información sobre lo que admite Cilium con SCTP, consulta la documentación de Cilium.

  • Los paquetes SCTP están sujetos a la unidad máxima de transmisión (MTU) de la red. Asegúrate de que la MTU de tu red sea suficiente para tu tráfico SCTP.

  • El rendimiento de SCTP puede verse afectado por factores como la latencia de la red, la pérdida de paquetes y la optimización del kernel. Monitoriza el rendimiento de la SCTP de tu aplicación y ajusta la configuración según sea necesario.

Siguientes pasos