Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ Cloud Container Engine/ Guía del usuario/ Red/ Service/ LoadBalancer/ Habilitación de redes de paso a través para los servicios de LoadBalancer
Actualización más reciente 2024-09-10 GMT+08:00

Habilitación de redes de paso a través para los servicios de LoadBalancer

Desafíos

Un clúster de Kubernetes puede publicar aplicaciones que se ejecutan en un grupo de pods como Services, que proporcionan entradas de acceso de capa 4 unificadas. Para un Service de Loadbalancer, kube-proxy configura el LoadbalanceIP en status del Service a la regla de reenvío local del nodo de forma predeterminada. Cuando un pod accede al balanceador de carga desde dentro del clúster, el tráfico se reenvía dentro del clúster en lugar de ser reenviado por el balanceador de carga.

kube-proxy es responsable del reenvío dentro del clúster. kube-proxy tiene dos modos de reenvío: iptables e IPVS. iptables es un modo de reenvío de sondeo simple. IPVS tiene múltiples modos de reenvío, pero requiere modificar los parámetros de inicio de kube-proxy. En comparación con iptables e IPVS, los balanceadores de carga proporcionan políticas de reenvío más flexibles, así como capacidades de comprobación de estado.

Solución

CCE admite la creación de redes de paso a través. Puede configurar el annotation de kubernetes.io/elb.pass-through para el Service Loadbalancer. El acceso dentro del clúster a la dirección del balanceador de carga de Service se reenvía entonces a los pods de backend por el balanceador de carga.

Figura 1 Ilustración de red de paso
  • Clústeres de CCE

    Cuando se accede a un Service de LoadBalancer dentro del clúster, el acceso se reenvía a los pods de backend mediante iptables/IPVS de forma predeterminada.

    Cuando se accede a un Service LoadBalancer (configurado con elb.pass-through) dentro del clúster, el acceso se reenvía primero al balanceador de carga, luego a los nodos y, finalmente, a los pods del backend usando iptables/IPVS.

  • Clústeres de CCE Turbo

    Cuando se accede a un Service de LoadBalancer dentro del clúster, el acceso se reenvía a los pods de backend mediante iptables/IPVS de forma predeterminada.

    Cuando se accede a un Service de LoadBalancer (configurado con elb.pass-through) dentro del clúster, el acceso se reenvía primero al balanceador de carga y, a continuación, a los pods.

Notas y restricciones

  • Después de configurar las redes de paso a través para un balanceador de carga dedicado, no se puede acceder a contenedores en el nodo donde se ejecuta la carga de trabajo a través del Service.
  • Las redes de paso a través no son compatibles con clústeres de v1.15 o anteriores.
  • En el modo de red IPVS, la configuración de paso a través del Service conectado al mismo ELB debe ser la misma.

Procedimiento

Esta sección describe cómo crear una Deployment usando una imagen de Nginx y crear un Service con redes de paso a través habilitadas.

  1. Utilice la imagen Nginx para crear una Deployment.

    apiVersion: apps/v1     
    kind: Deployment         
    metadata:
      name: nginx            
    spec:
      replicas: 2                     
      selector:              
        matchLabels:
          app: nginx
      template:              
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:latest
            name: container-0
            resources:
              limits:
                cpu: 100m
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
          imagePullSecrets:
          - name: default-secret

  2. Cree un Service de LoadBalancer y configure kubernetes.io/elb.pass-through en true.

    Para obtener más información sobre cómo crear un Service LoadBalancer, consulte Creación automática de un Service LoadBalancer.
    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:   
        kubernetes.io/elb.pass-through: "true"
        kubernetes.io/elb.class: union
        kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'
      labels: 
        app: nginx 
      name: nginx 
    spec: 
      externalTrafficPolicy: Local
      ports: 
      - name: service0 
        port: 80
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer

    Se crea automáticamente un balanceador de carga compartido denominado james. Utilice kubernetes.io/elb.subnet-id para especificar la subred de VPC donde se encuentra el balanceador de carga. El balanceador de carga y el clúster deben estar en la misma VPC.

Verificación

Compruebe el balanceador de carga de ELB correspondiente al Service creado. El nombre del balanceador de carga es james. El número de conexiones de ELB es 0 como se muestra en la siguiente figura.

Utilice kubectl para conectarse al clúster, vaya a un contenedor de Nginx y acceda a la dirección de ELB. El acceso se realiza correctamente.

# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7c4c5cc6b5-vpncx   1/1     Running   0          9m47s
nginx-7c4c5cc6b5-xj5wl   1/1     Running   0          9m47s
# kubectl exec -it nginx-7c4c5cc6b5-vpncx -- /bin/sh
# curl 120.46.141.192
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Espere un período de tiempo y vea los datos de supervisión del ELB. Se crea una nueva conexión de acceso para el ELB, que indica que el acceso pasa a través del balanceador de carga del ELB como se esperaba.