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:
-
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.
-
Cree un servicio equilibrador de carga para la app que desea exponer en internet público o en una red privada.
-
Cree un archivo de configuración de servicio llamado, por ejemplo,
myloadbalancer.yaml
. -
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
opublic
. Si no especifica esta anotación y los nodos de trabajador están conectados a VLAN públicas, se crea un servicioLoadBalancer
público. Si los nodos trabajadores solo están conectados a VLAN privadas, se crea un servicioLoadBalancer
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ónspec.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
endal12
: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
-
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
implementaloadBalancerSourceRanges
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. -
Cree el servicio en el clúster.
kubectl apply -f myloadbalancer.yaml
-
-
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
-
Si ha creado un NLB público, acceda a la app desde Internet.
-
Abra el navegador web preferido.
-
Especifique la dirección IP pública portátil y el puerto del NLB.
http://169.xx.xxx.xxx:8080
-
-
Repita los pasos 2 - 4 para añadir un NLB de la versión 1.0 en cada zona.
-
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.
-
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:
-
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.
-
Cree un servicio equilibrador de carga para la app que desea exponer en internet público o en una red privada.
-
Cree un archivo de configuración de servicio llamado, por ejemplo,
myloadbalancer.yaml
. -
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
opublic
.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, ejecuteibmcloud ks vlan ls --zone <zone>
.selector
: La clave de la etiqueta (<selector_key>
) y el valor (<selector_value>
) que utilizaste en la secciónspec.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
-
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
implementaloadBalancerSourceRanges
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. -
Cree el servicio en el clúster.
kubectl apply -f myloadbalancer.yaml
-
-
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.
-
Si ha creado un NLB público, acceda a la app desde Internet.
-
Abra el navegador web preferido.
-
Especifique la dirección IP pública portátil y el puerto del NLB.
http://169.xx.xxx.xxx:8080
-
-
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.
-
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.
-
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>
-
Recupere el ID de VLAN al que se conecta el servicio de NLB.
-
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
-
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 es169.36.5.xxx/29
. El ID de VLAN al que se conecta la subred es2234945
.
-
-
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
comokey
y"2234945"
comovalue
. -
Aplique el archivo de configuración de despliegue actualizado.
kubectl apply -f with-node-affinity.yaml
-
Verifique que los pods de app desplegados en los nodos trabajadores se conectan a la VLAN designada.
-
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
-
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 trabajador10.176.48.78
. -
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 ...
-
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.
-