IBM Cloud Docs
Clásico: configuración del equilibrio de carga básico con un NLB 1.0

Clásico: configuración del equilibrio de carga básico con un NLB 1.0

Los NLB versión 1.0 solo se pueden crear en clústeres clásicos; no se pueden crear en clústeres de VPC. Para equilibrar la carga en clústeres de VPC, consulte Exposición de apps con equilibradores de carga para VPC.

Exponga un puerto y utilice una dirección IP portátil para que un equilibrador de carga de red (NLB) capa 4 ofrezca una app contenerizada. Para obtener información sobre los NLB de la versión 1.0, consulte Componentes y arquitectura de un NLB 1.0.

Configuración de un NLB 1.0 en un clúster multizona

Antes de empezar:

  • Para crear equilibradores de carga de red (NLB) públicos en varias zonas, al menos una VLAN pública debe tener subredes portátiles disponibles en cada zona. Para crear NLB privados en varias zonas, al menos una VLAN privada debe tener subredes portátiles disponibles en cada zona. Puede añadir subredes siguiendo los pasos que se indican en Configuración de subredes para clústeres.
  • Habilite una función de direccionador virtual (VRF) para la cuenta de infraestructura de IBM Cloud. Para habilitar VRF, consulte Habilitación de VRF. Para comprobar si un VRF ya está habilitado, utilice el mandato ibmcloud account show. Si no puede o no desea habilitar VRF, habilite Expansión de VLAN. Cuando hay una VRF o una distribución de VLAN habilitada, el NLB 1.0 puede direccionar paquetes a varias subredes de la cuenta.
  • Asegúrese de tener el Escritor o Gestor IBM Cloud rol de acceso al servicio IAM para el espacio de nombres default.
  • Asegúrese de tener el número necesario de nodos trabajadores:
    • Clústeres clásicos: Si restringe el tráfico de red a los nodos trabajadores de extremo, asegúrese de que haya al menos dos nodos trabajadores de extremo habilitados en cada zona para que los NLB se desplieguen de forma uniforme.
  • Cuando se vuelven a cargar los nodos de clúster o cuando una actualización maestra de clúster incluye una nueva imagen de keepalived, la IP virtual del equilibrador de carga se mueve a la interfaz de red de un nodo nuevo. Cuando esto ocurre, toda conexión de larga duración a su equilibrador de carga debe restablecerse. Considera incluir lógica de reintento en tu aplicación para que los intentos de restablecer la conexión se realicen rápidamente.

Para configurar un servicio de NLB 1.0 en un clúster multizona:

  1. Despliegue la app en el clúster. Asegúrese de añadir una etiqueta en la sección de metadatos del archivo de configuración de despliegue. Esta etiqueta personalizada identifica todos los pods en los que se ejecuta la app para incluirlos en el equilibrio de carga.

  2. Cree un servicio equilibrador de carga para la app que desea exponer en internet público o en una red privada.

    1. Cree un archivo de configuración de servicio llamado, por ejemplo, myloadbalancer.yaml.

    2. Defina un servicio equilibrador de carga para la app que desee exponer. Puede especificar una zona, una VLAN y una dirección IP.

      apiVersion: v1
      kind: Service
      metadata:
        name: myloadbalancer
        annotations:
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private>
          service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>"
      spec:
        type: LoadBalancer
        selector:
          <selector_key>: <selector_value>
        ports:
         - protocol: TCP
           port: 8080
           targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
        loadBalancerIP: <IP_address>
      
      service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type
      Anotación para especificar un equilibrador de carga de private o public. Si no especifica esta anotación y los nodos de trabajador están conectados a VLAN públicas, se crea un servicio LoadBalancer público. Si los nodos trabajadores solo están conectados a VLAN privadas, se crea un servicio LoadBalancer privado.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-zone
      Anotación para especificar la zona en la que se despliega el servicio de equilibrador de carga. Para ver las zonas, ejecute ibmcloud ks zone ls.
      service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan
      Anotación para especificar una VLAN en la que se despliega el servicio de equilibrador de carga. Para ver las VLAN, ejecute ibmcloud ks vlan ls --zone <zone>.
      selector
      La clave de etiqueta (<selector_key>) y el valor (<selector_value>) que ha utilizado en la sección spec.template.metadata.labels del YAML de despliegue de aplicación.
      port
      El puerto que en el que está a la escucha el servicio.
      loadBalancerIP
      Opcional: para crear un equilibrador de carga privado o para utilizar una dirección IP portátil específica para un equilibrador de carga público, especifique la dirección IP que desea utilizar. La dirección IP debe estar en la VLAN y en la zona que especifique en las anotaciones. Si no especifica una dirección IP:
      Si el clúster está en una VLAN pública, se utiliza una dirección IP pública portátil. La mayoría de los clústeres están en una VLAN pública.
      Si el clúster solo está en una VLAN privada, se utiliza una dirección IP privada portátil.

      Archivo de configuración de ejemplo para crear un servicio de NLB 1.0 privado que utiliza una dirección IP especificada en la VLAN privada 2234945 en dal12:

      apiVersion: v1
      kind: Service
      metadata:
        name: myloadbalancer
        annotations:
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private
          service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12"
          service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "2234945"
      spec:
        type: LoadBalancer
        selector:
          app: nginx
        ports:
         - protocol: TCP
           port: 8080
           targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
        loadBalancerIP: 172.21.xxx.xxx
      
    3. Opcional: ponga el servicio de NLB a disposición de solo un rango limitado de direcciones IP especificando las IP en el campo spec.loadBalancerSourceRanges. kube-proxy implementa loadBalancerSourceRanges en el clúster a través de las reglas Iptables en los nodos de trabajador. Para obtener más información, consulte la Kubernetes.

    4. Cree el servicio en el clúster.

      kubectl apply -f myloadbalancer.yaml
      
  3. Verifique que el servicio de NLB se haya creado correctamente. Pueden transcurrir unos minutos hasta que el servicio se cree correctamente y la app esté disponible.

    kubectl describe service myloadbalancer
    

    En la salida, la dirección IP de LoadBalancer Ingress es la dirección IP portátil asignada al servicio de NLB:

    NAME:                   myloadbalancer
    Namespace:              default
    Labels:                 <none>
    Selector:               app=liberty
    Type:                   LoadBalancer
    Zone:                   dal10
    IP:                     172.21.xxx.xxx
    LoadBalancer Ingress:   169.xx.xxx.xxx
    Port:                   <unset> 8080/TCP
    NodePort:               <unset> 32040/TCP
    Endpoints:              172.30.xxx.xxx:8080
    Session Affinity:       None
    Events:
        FirstSeen    LastSeen    Count    From            SubObjectPath    Type     Reason                      Message
        ---------    --------    -----    ----            -------------    ----     ------                      -------
        10s            10s            1        {service-controller }      Normal CreatingLoadBalancer    Creating load balancer
        10s            10s            1        {service-controller }        Normal CreatedLoadBalancer    Created load balancer
    
  4. Si ha creado un NLB público, acceda a la app desde Internet.

    1. Abra el navegador web preferido.

    2. Especifique la dirección IP pública portátil y el puerto del NLB.

      http://169.xx.xxx.xxx:8080
      
  5. Repita los pasos 2 - 4 para añadir un NLB de la versión 1.0 en cada zona.

  6. Si elige habilitar la conservación de IP de origen para un NLB 1.0, asegúrese de que los pods de app estén planificados en los nodos trabajadores de extremo mediante la adición de afinidad de nodo de extremo a los pods de app. Los pods de app se deben planificar en los nodos de extremo para recibir solicitudes entrantes.

  7. Opcional: un servicio de equilibrador de carga también hace que la app esté disponible a través de los NodePorts del servicio. Se puede acceder a los NodePorts en cada dirección IP pública o privada de cada nodo del clúster. Para bloquear el tráfico a los NodePorts mientras utiliza un servicio de NLB, consulte Control del tráfico de entrada a los servicios de equilibrador de carga de red (NLB) o de NodePort.

A continuación, puede registrar un subdominio de NLB.

Configuración de un NLB 1.0 en un clúster de una sola zona

Antes de empezar:

  • Debe tener una dirección IP pública o privada portátil disponible para asignarla al servicio equilibrador de carga de red (NLB). Para obtener más información, consulte Configuración de subredes para clústeres.
  • Asegúrese de tener el Escritor o Gestor IBM Cloud rol de acceso al servicio IAM para el espacio de nombres default.
  • Cuando se vuelven a cargar los nodos de clúster o cuando una actualización maestra de clúster incluye una nueva imagen de keepalived, la IP virtual del equilibrador de carga se mueve a la interfaz de red de un nodo nuevo. Cuando esto ocurre, toda conexión de larga duración a su equilibrador de carga debe restablecerse. Considera incluir lógica de reintento en tu aplicación para que los intentos de restablecer la conexión se realicen rápidamente.

Para crear un servicio de NLB 1.0 en un clúster de una sola zona:

  1. Despliegue la app en el clúster. Asegúrese de añadir una etiqueta a su despliegue en la sección de metadatos del archivo de configuración. Esta etiqueta es necesaria para identificar todos los pods en los que se ejecuta la aplicación, para que estén incluidos en el equilibrio de carga.

  2. Cree un servicio equilibrador de carga para la app que desea exponer en internet público o en una red privada.

    1. Cree un archivo de configuración de servicio llamado, por ejemplo, myloadbalancer.yaml.

    2. Defina un servicio equilibrador de carga para la app que desee exponer.

      apiVersion: v1
      kind: Service
      metadata:
        name: myloadbalancer
        annotations:
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private>
          service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>"
      spec:
        type: LoadBalancer
        selector:
          <selector_key>: <selector_value>
        ports:
         - protocol: TCP
           port: 8080
           targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
        loadBalancerIP: <IP_address>
      
      service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type:
      Anotación para especificar un equilibrador de carga de private o public. service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan:: Anotación para especificar una VLAN en la que se despliega el servicio de equilibrador de carga. Para ver las VLAN, ejecute ibmcloud ks vlan ls --zone <zone>. selector: La clave de la etiqueta (<selector_key>) y el valor (<selector_value>) que utilizaste en la sección spec.template.metadata.labels del YAML de despliegue de tu app.
      port
      El puerto que en el que está a la escucha el servicio.
      loadBalancerIP
      Opcional: para crear un equilibrador de carga privado o para utilizar una dirección IP portátil específica para un equilibrador de carga público, especifique la dirección IP que desea utilizar. La dirección IP debe estar en la VLAN que especifique en las anotaciones. Si no especifica una dirección IP:
      Si el clúster está en una VLAN pública, se utiliza una dirección IP pública portátil. La mayoría de los clústeres están en una VLAN pública.
      Si el clúster solo está en una VLAN privada, se utiliza una dirección IP privada portátil.

      Archivo de configuración de ejemplo para crear un servicio de NLB 1.0 privado que utiliza una dirección IP especificada en la VLAN privada 2234945:

      apiVersion: v1
      kind: Service
      metadata:
        name: myloadbalancer
        annotations:
          service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private
          service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "2234945"
      spec:
        type: LoadBalancer
        selector:
          app: nginx
        ports:
         - protocol: TCP
           port: 8080
           targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
        loadBalancerIP: 172.21.xxx.xxx
      
    3. Opcional: ponga el servicio de NLB a disposición de solo un rango limitado de direcciones IP especificando las IP en el campo spec.loadBalancerSourceRanges. kube-proxy implementa loadBalancerSourceRanges en el clúster a través de las reglas Iptables en los nodos de trabajador. Para obtener más información, consulte la Kubernetes.

    4. Cree el servicio en el clúster.

      kubectl apply -f myloadbalancer.yaml
      
  3. Verifique que el servicio de NLB se haya creado correctamente. Pueden transcurrir unos minutos hasta que el servicio se cree correctamente y la app esté disponible.

    kubectl describe service myloadbalancer
    

    Ejemplo de salida de CLI:

    NAME:                   myloadbalancer
    Namespace:              default
    Labels:                 <none>
    Selector:               app=liberty
    Type:                   LoadBalancer
    Location:               dal10
    IP:                     172.21.xxx.xxx
    LoadBalancer Ingress:   169.xx.xxx.xxx
    Port:                   <unset> 8080/TCP
    NodePort:               <unset> 32040/TCP
    Endpoints:              172.30.xxx.xxx:8080
    Session Affinity:       None
    Events:
        FirstSeen    LastSeen    Count    From            SubObjectPath    Type     Reason                      Message
        ---------    --------    -----    ----            -------------    ----     ------                      -------
        10s            10s            1        {service-controller }      Normal CreatingLoadBalancer    Creating load balancer
        10s            10s            1        {service-controller }        Normal CreatedLoadBalancer    Created load balancer
    

    La dirección IP de LoadBalancer Ingress es la dirección IP portátil asignada al servicio de NLB.

  4. Si ha creado un NLB público, acceda a la app desde Internet.

    1. Abra el navegador web preferido.

    2. Especifique la dirección IP pública portátil y el puerto del NLB.

      http://169.xx.xxx.xxx:8080
      
  5. Si elige habilitar la conservación de IP de origen para un NLB 1.0, asegúrese de que los pods de app estén planificados en los nodos trabajadores de extremo mediante la adición de afinidad de nodo de extremo a los pods de app. Los pods de app se deben planificar en los nodos de extremo para recibir solicitudes entrantes.

  6. Opcional: un servicio de equilibrador de carga también hace que la app esté disponible a través de los NodePorts del servicio. Se puede acceder a los NodePorts en cada dirección IP pública o privada de cada nodo del clúster. Para bloquear el tráfico a los NodePorts mientras utiliza un servicio de NLB, consulte Control del tráfico de entrada a los servicios de equilibrador de carga de red (NLB) o de NodePort.

A continuación, puede registrar un subdominio de NLB.

Habilitación de la conservación de IP de origen

Esta característica es únicamente para los equilibradores de carga de red (NLB) de la versión 1.0. La dirección IP de origen de las solicitudes de cliente se conserva de forma predeterminada en los NLB versión 2.0.

Cuando se envía al clúster una solicitud de cliente para la app, un pod del servicio de equilibrador de carga recibe la solicitud. Si no existen pods de app en el mismo nodo trabajador que el pod del servicio equilibrador de carga, el NLB reenvía la solicitud a otro nodo trabajador. La dirección IP de origen del paquete se cambia a la dirección IP pública del nodo trabajador donde se ejecuta el servicio equilibrador de carga.

Para conservar la dirección IP de origen original de la solicitud del cliente, puede habilitar la IP de origen para los servicios del equilibrador de carga. La conexión TCP continúa hasta los pods de la app para que la app pueda ver la dirección IP de origen real del iniciador. Conservar la dirección IP del cliente es útil, por ejemplo, cuando los servidores de apps tienen que aplicar políticas de control de acceso y seguridad.

Después de habilitar la dirección IP de origen, los pods de servicio de equilibrador de carga deben reenviar las solicitudes a los pods de app que se desplieguen únicamente en el mismo nodo trabajador. Generalmente, los pods del servicio equilibrador de carga también se despliegan en los nodos trabajadores donde se despliegan los pods de app. Sin embargo, existen algunas situaciones donde los pods de equilibrador de carga y los pods de app podrían no planificarse en los mismos nodos trabajadores:

  • Tiene nodos extremos a los que se ha aplicado una marca de forma que únicamente los pods de servicio equilibrador de carga se puedan desplegar en ellos. No se permite desplegar pods de app en dichos nodos.
  • El clúster está conectado a varias VLAN públicas o privadas, y sus pods de app podrían desplegarse en nodos trabajadores que están conectados únicamente a una VLAN. Pods de servicio de equilibrador de carga podrían no desplegarse en dichos nodos trabajadores porque la dirección de IP del NLB estuviese conectado a VLAN distintas de las de los nodos trabajadores.

Para forzar el despliegue de una app en los nodos trabajadores específicos en los que también se puedan desplegar los pods de servicio de equilibrador de carga, debe añadir tolerancias y reglas de afinidad al despliegue de dichas app.

Adición de tolerancias y reglas de afinidad de nodo extremo

Cuando etiqueta nodos de trabajador como nodos periféricos y también marca los nodos periféricos, los pods de servicio de equilibrador de carga se despliegan solo en esos nodos periféricos, y los pods de la aplicación no se pueden desplegar en nodos periféricos. Cuando la IP de origen está habilitada para el servicio de NLB, los pods del equilibrador de carga en los nodos periféricos no pueden reenviar las solicitudes entrantes a los pods de su aplicación en otros nodos de trabajador.

Para forzar el despliegue de sus pods de aplicaciones en nodos periféricos, añada una regla de afinidad y tolerancia de nodo periférico al despliegue de la aplicación.

Ejemplo de YAML de despliegue con afinidad y tolerancia de nodo extremo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: with-node-affinity
spec:
  selector:
    matchLabels:
      <label_name>: <label_value>
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated
                operator: In
                values:
                - edge
      tolerations:
        - key: dedicated
          value: edge
...

Tanto la sección affinity como la sección tolerations tienen dedicated como key y edge como value.

Adición de reglas de afinidad para múltiples VLAN privadas o públicas

Cuando el clúster está conectado a varias VLAN públicas o privadas, sus pods de app podrían desplegarse en nodos trabajadores que están conectados únicamente a una VLAN. Si la dirección de IP del NLB está conectada a una VLAN diferente de la de estos nodos trabajadores, los pods de servicio de equilibrador de carga no se desplegarán en dichos nodos trabajadores.

Cuando la dirección IP de origen esté habilitada, planifique pods de app en nodos trabajadores que estén en la misma VLAN que la dirección IP del NLB añadiendo una regla de afinidad al despliegue de la app.

Antes de empezar: Inicie una sesión en su cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

  1. Obtenga la dirección IP del servicio de NLB. Busque la dirección IP en el campo LoadBalancer Ingress.

    kubectl describe service <loadbalancer_service_name>
    
  2. Recupere el ID de VLAN al que se conecta el servicio de NLB.

    1. Obtenga una lista de VLAN públicas portátiles para su clúster.

      ibmcloud ks cluster get --cluster <cluster_name_or_ID> --show-resources
      

      Salida de ejemplo

      ...
      
      Subnet VLANs
      VLAN ID   Subnet CIDR       Public   User-managed
      2234947   10.xxx.xx.xxx/29  false    false
      2234945   169.36.5.xxx/29   true     false
      
    2. En la salida bajo Subnet VLANs, busque el CIDR de subred que coincida con la dirección IP del NLB que recuperó con anterioridad y anote el ID de VLAN.

      Por ejemplo, si la dirección IP del servicio de NLB es 169.36.5.xxx, la subred coincidente en la salida del ejemplo del paso anterior es 169.36.5.xxx/29. El ID de VLAN al que se conecta la subred es 2234945.

  3. Añada una regla de afinidad a la implementación de la aplicación para el ID de VLAN que anotó en el paso anterior.

    Por ejemplo, si tiene varias VLAN pero desea que sus pods de app se desplieguen en nodos trabajadores únicamente en la VLAN pública 2234945:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-node-affinity
    spec:
      selector:
        matchLabels:
          <label_name>: <label_value>
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: publicVLAN
                    operator: In
                    values:
                    - "2234945"
    ...
    

    En el YAML de ejemplo, la sección affinity tiene publicVLAN como key y "2234945" como value.

  4. Aplique el archivo de configuración de despliegue actualizado.

    kubectl apply -f with-node-affinity.yaml
    
  5. Verifique que los pods de app desplegados en los nodos trabajadores se conectan a la VLAN designada.

    1. Obtenga una lista de pods en el clúster. Sustituya <selector> por la etiqueta que ha utilizado para la aplicación.

      kubectl get pods -o wide app=<selector>
      

      Salida de ejemplo

      NAME                   READY     STATUS              RESTARTS   AGE       IP               NODE
      cf-py-d7b7d94db-vp8pq  1/1       Running             0          10d       172.30.xxx.xxx   10.176.48.78
      
    2. En la salida, identifique un pod para su app. Observe el ID NODE del nodo trabajador en el que se encuentra el pod.

      En la salida de ejemplo del paso anterior, el pod de app cf-py-d7b7d94db-vp8pq se encuentra en el nodo trabajador 10.176.48.78.

    3. Obtener los detalles del nodo trabajador.

      kubectl describe node <worker_node_ID>
      

      Salida de ejemplo

      NAME:                   10.xxx.xx.xxx
      Role:
      Labels:                 arch=amd64
      beta.kubernetes.io/arch=amd64
      beta.kubernetes.io/os=linux
      failure-domain.beta.kubernetes.io/region=us-south
      failure-domain.beta.kubernetes.io/zone=dal10
      ibm-cloud.kubernetes.io/encrypted-docker-data=true
      kubernetes.io/hostname=10.xxx.xx.xxx
      privateVLAN=2234945
      publicVLAN=2234967
      ...
      
    4. En la sección Labels de la salida, verifique que la VLAN privada o pública es la VLAN es que haya designado en los pasos anteriores.