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.
- 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.
- 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
- 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.