Implementa cargas de trabajo con SCTP


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

SCTP es compatible con la tecnología de Cilium. Dado que GKE Dataplane V2 se implementa con Cilium, solo puedes usar SCTP en los clústeres que se habilitaron con GKE Dataplane V2. Con la compatibilidad con SCTP, puedes habilitar la comunicación directa con SCTP para el tráfico de Pod a Pod y de Pod a Service. 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 de la nube, y que implementan apps y servicios. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que se hace referencia en el contenido de Trusted Cloud by S3NS, consulta Tareas y roles comunes de los usuarios de GKE.

Antes de comenzar

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

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Requisitos y limitaciones

La compatibilidad con SCTP en los clústeres de GKE Standard 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 nodos 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 SO del nodo de GKE subyacente se carguen con el módulo del kernel sctp.
  • No puedes usar SCTP en clústeres habilitados con compatibilidad de 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 controlar posibles demoras mientras se establecen las asociaciones.
  • Para obtener más información sobre lo que Cilium admite y no admite con SCTP, consulta la documentación de Cilium.

Implementa cargas de trabajo con SCTP

Práctica recomendada:

Prueba tu implementación de forma exhaustiva 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 y las imágenes de nodos de Ubuntu. Para implementar cargas de trabajo con SCTP, completa los siguientes pasos:

  1. Para crear un clúster con imágenes de Ubuntu y GKE Dataplane V2, 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
    

    Reemplaza los siguientes valores:

    • CLUSTER_NAME: El nombre de tu clúster.
    • CONTROL_PLANE_LOCATION: Es 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 1.32.2-gke.1297000 o posterior.
  2. Para crear un contenedor de la aplicación, asegúrate de que la imagen del 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 un Dockerfile para crear un contenedor para la aplicación, 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"]
    

    Compila 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
    

    Reemplaza lo siguiente:

    • CONTAINER_IMAGE: Es la imagen del contenedor que compilaste en el paso anterior.
    • PORT: Son los números de puerto SCTP y de puerto de destino de la aplicación. El valor de port y targetPort debe ser el mismo.
  4. Para aplicar el Deployment y el Service, ejecuta el siguiente comando:

    kubectl apply -f sctp-deployment.yaml
    
  5. Para verificar la conectividad de SCTP del servicio, crea un Pod dentro del 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 es similar a este:

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

Soluciona problemas

Si tienes problemas de conectividad con SCTP, sigue esta guía para determinar el origen del problema:

  • Verifica los registros del Pod. Para verificar si hay errores en los registros de tu aplicación, ejecuta el siguiente comando:

    kubectl logs POD_NAME
    

    Estos registros pueden ayudarte a identificar qué causó la falla del Pod.

  • Verifica el estado del objeto de servicio SCTP:

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

  • Verifica el estado de GKE Dataplane V2. Para verificar 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
    

    Verifica que el resultado incluya Pods con el prefijo anetd-. anetd es el controlador de herramientas de redes para GKE Dataplane V2.

  • Para mejorar la capacidad de procesamiento, aumenta 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.

  • Es posible 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 de transmisión máxima (MTU) de la red. Asegúrate de que la MTU de tu red sea suficiente para el tráfico de SCTP.

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

¿Qué sigue?