Aprovisionamiento de equilibradores de carga de red de OCI para servicios de Kubernetes de tipo LoadBalancer

Descubra cómo aprovisionar un equilibrador de carga de red de OCI para un servicio de Kubernetes de tipo LoadBalancer mediante Container Engine for Kubernetes (OKE).

En esta sección se describe cómo aprovisionar un equilibrador de carga de red de OCI para un servicio de Kubernetes de tipo LoadBalancer.

Un equilibrador de carga de red de Oracle Cloud Infrastructure es una solución de equilibrio de carga sin proxy que realiza un equilibrio de carga de transferencia de las cargas de trabajo de capa 3 y capa 4 de OSI (TCP/UDP/ICMP). Ofrece una dirección IP virtual regional (VIP) escalable elásticamente que puede ampliarse o reducirse en función del tráfico del cliente sin ningún requisito de configuración de ancho de banda mínimo o máximo. También proporciona las ventajas de la alta disponibilidad del flujo, la dirección IP de origen y destino y la conservación del puerto.

Para obtener más información sobre los equilibradores de carga de red de Oracle Cloud Infrastructure, consulte Visión general de Flexible Network Load Balancer.

El aprovisionamiento de un equilibrador de carga de red de OCI para un servicio de Kubernetes de tipo LoadBalancer le permite:

  • tráfico de equilibrio de carga con un alto rendimiento y baja latencia
  • conservar las direcciones IP y los puertos de origen y destino
  • manejar tráfico TCP y UDP

Tenga en cuenta que cuando Container Engine for Kubernetes aprovisiona un equilibrador de carga de red de OCI para un servicio de Kubernetes de tipo LoadBalancer, las reglas de seguridad para permitir el tráfico entrante y saliente hacia y desde la subred del equilibrador de carga de red no se crean automáticamente por defecto. Debe definir las reglas de seguridad adecuadas para permitir el tráfico entrante y saliente hacia y desde la subred del equilibrador de carga o del equilibrador de carga de red. Consulte Reglas de seguridad para equilibrador de carga y equilibrador de carga de red.

Utilice las métricas del equilibrador de carga de red de OCI para supervisar el estado de un equilibrador de carga de red de OCI aprovisionado para un servicio de Kubernetes de tipo LoadBalancer (consulte Métricas de equilibrador de carga de red).

Especificación de la anotación para un equilibrador de carga de red de OCI

Para aprovisionar un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, agregue la siguiente anotación en la sección de metadatos del archivo de manifiesto:

oci.oraclecloud.com/load-balancer-type: "nlb"
Por ejemplo:
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Tenga en cuenta que lb es el valor por defecto de la anotación oci.oraclecloud.com/load-balancer-type. Si no incluye explícitamente la anotación en la definición del servicio, se utiliza el valor por defecto de la anotación y se aprovisiona un equilibrador de carga (en lugar de un equilibrador de carga de red).

Terminación de solicitudes en el nodo de recepción

Al aprovisionar un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, puede especificar que las solicitudes terminen en la dirección IP del cliente especificada en las cabeceras de los paquetes IP, en lugar de conectarse mediante proxy a otros nodos de trabajador del cluster.

Por defecto, las solicitudes se conectan mediante proxy a otros nodos de trabajador del cluster.

Especificar que las solicitudes terminan en la dirección IP del cliente (en lugar de ser proxy) puede mejorar el rendimiento en clusters muy grandes con miles de nodos de trabajador al eliminar el tráfico entre nodos de trabajador. Especificar que las solicitudes terminan en la dirección IP del cliente también puede simplificar la implantación y eliminar posibles problemas de seguridad al permitirle configurar reglas de seguridad (en un grupo de seguridad de red (recomendado) o una lista de seguridad) para los nodos de trabajador del cluster que solo permiten el tráfico de entrada desde el bloque CIDR del equilibrador de carga de red.

Para terminar las solicitudes en la dirección IP del cliente, agregue la siguiente configuración en la sección de especificaciones del archivo de manifiesto:

externalTrafficPolicy: Local

Para enviar solicitudes de proxy a otros nodos de trabajador del cluster, agregue la siguiente configuración en la sección de especificaciones del archivo de manifiesto:

externalTrafficPolicy: Cluster

Tenga en cuenta que Cluster es el valor por defecto del valor externalTrafficPolicy. Si no incluye explícitamente el valor en la definición del servicio, se utiliza el valor por defecto del valor.

Tenga en cuenta también que si externalTrafficPolicy se define en Cluster, las direcciones IP de cliente no se conservan independientemente del valor de la anotación oci-network-load-balancer.oraclecloud.com/is-preserve-source. Las solicitudes fallan con un error si externalTrafficPolicy está definido en Cluster y la anotación oci-network-load-balancer.oraclecloud.com/is-preserve-source está definida explícitamente en true o false. Consulte Preserving The Client IP Address.

Para terminar las solicitudes en la dirección IP del cliente, también debe haber configurado las siguientes reglas de seguridad:

  • Debe haber configurado una regla de seguridad (en un grupo de seguridad de red (recomendado) y/o una lista de seguridad) para que los nodos de trabajador del cluster permitan el tráfico de entrada desde el bloque CIDR en el que se realizan las conexiones de cliente a todos los puertos de nodo (30000 to 32767). Si la aplicación está expuesta a Internet, defina el bloque de CIDR de origen de la regla de seguridad en 0.0.0.0/0. También puede definir el bloque de CIDR de origen de la regla de seguridad en un bloque de CIDR específico (por ejemplo, si las conexiones de cliente provienen de una subred específica).
    Estado Origen Protocolo/puerto de destino Descripción
    Con estado 0.0.0.0/0 o CIDR de subred TODO/30000-32767 Permitir que los nodos de trabajador reciban conexiones a través del equilibrador de carga de red de OCI.
  • Debe haber configurado las reglas de seguridad de entrada y salida para el equilibrador de carga de red, como se describe en Reglas de seguridad para equilibradores de carga y equilibradores de carga de red.

Por ejemplo, esta es una definición de servicio de Kubernetes para terminar las solicitudes en la dirección IP del cliente (en lugar de ser proxy):

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
  - port: 80
  selector:
    app: nginx

Conservación de la dirección IP del cliente

Al aprovisionar un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, puede especificar si desea conservar o evitar la conservación de la dirección IP del cliente en las cabeceras de los paquetes IP.

Solo tiene la opción de conservar las direcciones IP de cliente cuando las solicitudes se terminan en las direcciones IP de cliente especificadas en los encabezados de paquetes IP. Es decir, cuando el valor externalTrafficPolicy se define en Local. Si externalTrafficPolicy se define en Cluster, las direcciones IP de cliente no se conservan. Consulte Terminación de solicitudes en el nodo de recepción.

Para evitar la conservación de direcciones IP de cliente, agregue la siguiente anotación en la sección de metadatos del archivo de manifiesto:

oci-network-load-balancer.oraclecloud.com/is-preserve-source: "false"

Para conservar la dirección IP del cliente, agregue la siguiente anotación en la sección de metadatos del archivo de manifiesto:

oci-network-load-balancer.oraclecloud.com/is-preserve-source: "true"

Tenga en cuenta que true es el valor por defecto de la anotación oci-network-load-balancer.oraclecloud.com/is-preserve-source. Si no incluye explícitamente la anotación en la definición del servicio, se utiliza el valor por defecto de la anotación.

Tenga en cuenta también que si externalTrafficPolicy se define en Cluster, las direcciones IP de cliente no se conservan independientemente del valor de la anotación oci-network-load-balancer.oraclecloud.com/is-preserve-source. Las solicitudes fallan con un error si externalTrafficPolicy está definido en Cluster y la anotación oci-network-load-balancer.oraclecloud.com/is-preserve-source está definida explícitamente en true o false. Por lo tanto, no agregue la anotación oci-network-load-balancer.oraclecloud.com/is-preserve-source si externalTrafficPolicy está definido en Cluster.

Puede conservar las direcciones IP de cliente cuando utilice pools de nodos gestionados, pero no cuando utilice pools de nodos virtuales.

Para conservar la dirección IP del cliente, también debe haber configurado las siguientes reglas de seguridad:

  • Debe haber configurado una regla de seguridad (en un grupo de seguridad de red (recomendado) y/o una lista de seguridad) para que los nodos de trabajador del cluster permitan el tráfico de entrada desde el bloque CIDR en el que se realizan las conexiones de cliente a todos los puertos de nodo (30000 to 32767). Si la aplicación está expuesta a Internet, defina el bloque de CIDR de origen de la regla de seguridad en 0.0.0.0/0. También puede definir el bloque de CIDR de origen de la regla de seguridad en un bloque de CIDR específico (por ejemplo, si las conexiones de cliente provienen de una subred específica).
    Estado Origen Protocolo/puerto de destino Descripción
    Con estado 0.0.0.0/0 o CIDR de subred TODO/30000-32767 Permitir que los nodos de trabajador reciban conexiones a través del equilibrador de carga de red de OCI.
  • Debe haber configurado las reglas de seguridad de entrada y salida para el equilibrador de carga de red, como se describe en Reglas de seguridad para equilibradores de carga y equilibradores de carga de red.

Por ejemplo, esta es una definición de servicio de Kubernetes que impide la conservación de la dirección IP del cliente:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
    oci-network-load-balancer.oraclecloud.com/is-preserve-source: "false"
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
  - port: 80
  selector:
    app: nginx

Exposición de aplicaciones TCP y UDP

Cuando Container Engine for Kubernetes aprovisiona un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, puede definir el tipo de tráfico aceptado por el listener especificando el protocolo en el que el listener acepta las solicitudes de conexión.

Tenga en cuenta que si no especifica explícitamente un protocolo, "TCP" se utilizará como valor por defecto.

Para especificar explícitamente el protocolo del listener cuando Container Engine for Kubernetes aprovisione un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, agregue el siguiente valor en la sección de especificaciones del archivo de manifiesto:

protocol: <value>

donde <value> es el protocolo que define el tipo de tráfico aceptado por el listener. Por ejemplo, "UDP". Los protocolos válidos incluyen "UDP" y "TCP".

Por ejemplo:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  ports:
  - port: 80
    protocol: UDP
  selector:
    app: nginx

Especificación de la Política de Juego de Backend

Cuando Container Engine for Kubernetes aprovisiona un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, puede definir una política para el juego de backends para especificar cómo distribuir el tráfico entrante entre los servidores backend. Para obtener más información, consulte Políticas del equilibrador de carga de red.

Tenga en cuenta que si no especifica explícitamente una política para el juego de backends, se utiliza "FIVE_TUPLE" como valor por defecto.

Para especificar una política para el juego de backends cuando Container Engine for Kubernetes aprovisiona un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, agregue la siguiente anotación en la sección de metadatos del archivo de manifiesto:

oci-network-load-balancer.oraclecloud.com/backend-policy: <value>

donde <value> es uno de:

  • "TWO_TUPLE": enruta el tráfico entrante según el hash de 2-uple (IP de origen, IP de destino).
  • "THREE_TUPLE": enruta el tráfico entrante según el hash de 3 copias (IP de origen, IP de destino, protocolo).
  • "FIVE_TUPLE": enruta el tráfico de entrada mediante el hash de 5-uple (IP y puerto de origen, IP y puerto de destino, protocolo).

Por ejemplo:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/backend-policy: "THREE_TUPLE"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Especificación de opciones de gestión de lista de seguridad al aprovisionar un equilibrador de carga de red de OCI

Nota

Puede encontrar escalabilidad y otros problemas si utiliza la función de gestión de lista de seguridad de Kubernetes en despliegues complejos y con herramientas como Terraform. Por estos motivos, Oracle no recomienda utilizar la función de gestión de lista de seguridad de Kubernetes en entornos de producción.

Tenga en cuenta también que la capacidad de utilizar listas de seguridad para gestionar reglas de seguridad quedará en desuso en futuras versiones. Por este motivo, Oracle recomienda el uso de grupos de seguridad de red (NSG) y la anotación oci.oraclecloud.com/security-rule-management-mode (consulte Especificación de opciones de gestión de reglas de seguridad para equilibradores de carga y equilibradores de carga de red).

Puede utilizar la función de gestión de listas de seguridad para configurar cómo se gestionan las reglas de listas de seguridad para un equilibrador de carga de red de Oracle Cloud Infrastructure que Container Engine for Kubernetes aprovisiona para un servicio de Kubernetes de tipo LoadBalancer. Esta función es útil si es no está familiarizado con Kubernetes o para despliegues básicos.

Para especificar cómo la función de gestión de lista de seguridad de Kubernetes gestiona las listas de seguridad cuando Container Engine for Kubernetes aprovisiona un equilibrador de carga de red para un servicio de Kubernetes de tipo LoadBalancer, agregue la siguiente anotación en la sección de metadatos del archivo de manifiesto:

oci-network-load-balancer.oraclecloud.com/security-list-management-mode: <value>

donde <value> es uno de:

  • "None": (por defecto y recomendado) no está activada la gestión de listas de seguridad. Debe configurar una regla de seguridad que permita tráfico entrante a los puertos adecuados para rangos de puertos de nodo, el puerto de estado de kube-proxy y los rangos de puertos de comprobación del sistema. Además, debe configurar reglas de seguridad para permitir tráfico entrante a equilibradores de carga de red (consulte Reglas de seguridad para equilibradores de carga y equilibradores de carga de red).
  • "All": todas las reglas de la lista de seguridad necesarias para los servicios de equilibrador de carga de red están gestionadas.
  • "Frontend": solo se gestionan reglas de lista de seguridad para entrada a servicios de equilibrador de carga de red. Debe configurar una regla de seguridad que permita tráfico entrante a los puertos adecuados para rangos de puertos de nodo, el puerto de estado de kube-proxy y los rangos de puertos de comprobación del sistema.

Oracle recomienda definir explícitamente oci-network-load-balancer.oraclecloud.com/security-list-management-mode en None.

En los clusters con nodos gestionados, si no especifica explícitamente un modo de gestión, la gestión de listas de seguridad no está activada (equivalente a "None"). En los clusters con nodos virtuales, la gestión de listas de seguridad nunca se activa y siempre tiene que configurar manualmente las reglas de seguridad (equivalente a "None").

Tenga en cuenta que hay límites en el número de reglas de entrada y salida permitidas en una lista de seguridad (consulte Límites de lista de seguridad). Si el número de reglas de entrada o salida supera el límite y <value> está definido en "All" o "Frontend", la creación o actualización del equilibrador de carga falla.

Por ejemplo:


apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
    oci-network-load-balancer.oraclecloud.com/security-list-management-mode: "Frontend"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx