Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Expose Services Across Multiple Regions Using ELB

Última actualización: Sep 29, 2026

Edge Load Balancer (ELB) permite exponer aplicaciones desplegadas en varios node pools de ENS mediante un único Service de tipo Kubernetes LoadBalancer. Cada node pool obtiene su propia instancia ELB en su región, y edge-controller-manager (ECM) vincula el ciclo de vida de dichas instancias a los resources PoolService que se crean automáticamente.

En este tema se explica cómo desplegar una aplicación en node pools de ENS de dos regiones y exponerla con un Service LoadBalancer respaldado por ELB.

Existen dos opciones para aprovisionar instancias ELB. Si no cuenta con instancias ELB existentes, utilice la opción 1 (recomendada) para que ECM las cree automáticamente. Si necesita adjuntar instancias ELB aprovisionadas previamente —por ejemplo, para compartir una entre varios Services—, use la opción 2 .

Funcionamiento

Cuando usted crea un Service LoadBalancer con loadBalancerClass: alibabacloud.com/elb, ECM busca los node pools que coinciden con el selector del Service. Por cada node pool coincidente, crea un PoolService y aprovisiona una instancia ELB en la región correspondiente. Después, ECM vincula el ciclo de vida de la instancia ELB y de su dirección IP elástica (EIP) asociada al PoolService.

El resultado es un único Service con varias direcciones IP externas, una por región.

image

Requisitos previos

Antes de empezar, compruebe que cuenta con lo siguiente:

  • Un clúster ACK Edge con ECM versión 2.1.0 o posterior

  • Node pools de ENS ya creados en las regiones de destino (en este ejemplo se usan China (Hefei) y China (Chengdu))

  • Redes perimetrales creadas para sus instancias ENS

Para las instancias ENS sin interfaces de red elásticas (ENI), use instancias ELB para exponerlas y asigne EIP o configure NAT para acceder a Internet. En las instancias ENS con ENI, también debe agregar reglas de enrutamiento a la red del host. Consulte Precauciones para ver los comandos correspondientes.

Precauciones

  • ECM configura instancias ELB únicamente para los Services con type: LoadBalancer. Se requiere ECM versión 2.1.0 o posterior.

  • Las instancias ELB y las EIP gestionadas por ECM reciben el nombre k8s/${Service_Name}/${Service_Namespace}/${NodePool_Id}/${Cluster_Id}. Evite nombres duplicados, ya que los resources con el mismo nombre podrían eliminarse por accidente.

  • Para compartir una instancia ELB entre varios Services, utilice una EIP y una instancia ELB autogestionadas, y establezca externalTrafficPolicy: Cluster.

  • En las instancias ENS con ENI asignadas, agregue reglas de enrutamiento a la red del host de cada nodo:

    # 10.0.0.3 is the internal network interface; 10.0.0.1 is the internal gateway.
    ip rule add from 10.0.0.3 lookup 4
    ip route add default via 10.0.0.1 table 4

Paso 1: Desplegar una aplicación

Despliegue la aplicación cube como DaemonSet para que se ejecute en todos los nodos de los node pools de ENS.

  1. Cree un archivo llamado cube.yaml con el siguiente contenido:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: cube
      labels:
        app: cube
    spec:
      selector:
        matchLabels:
          app: cube
      template:
        metadata:
          labels:
            app: cube
        spec:
          containers:
          - name: cube
            image: registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube:1.0
            ports:
            - containerPort: 80
  2. Aplique el DaemonSet:

    kubectl apply -f cube.yaml
  3. Compruebe que todos los pods se estén ejecutando:

    kubectl get ds cube

    Salida esperada:

    NAME   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    cube   4         4         4       4            4           <none>          3d1h

Paso 2: Anotar los node pools

Agregue las anotaciones de red obligatorias y una etiqueta de selector de Service a cada node pool de ENS. Ejecute estos comandos para cada node pool; en este ejemplo, los de China (Hefei) y China (Chengdu).

  1. Obtenga los nombres de los node pools:

    kubectl get nodepool
  2. Agregue el ID de red de ENS:

    kubectl annotate nodepool np-xxx alibabacloud.com/ens-network-id=n-xxx
  3. Agregue el ID de región de ENS:

    kubectl annotate nodepool np-xxx alibabacloud.com/ens-region-id=cn-xxx-xxx
  4. Agregue el ID de vSwitch:

    kubectl annotate nodepool np-xxx alibabacloud.com/ens-vswitch-id=vsw-xxx,vsw-xxx
  5. Agregue la etiqueta de selector de Service que vincula este node pool al Service:

    kubectl label nodepool np-xxx k8s-svc=cube

Paso 3: Exponer la aplicación con un Service ELB

Importante

Establezca type: LoadBalancer y loadBalancerClass: alibabacloud.com/elb en el Service. Sin estos campos, ECM no aprovisiona instancias ELB.

Elija uno de los siguientes enfoques según si desea que ECM cree las instancias ELB automáticamente o prefiere usar instancias existentes.

Opción 1: Permitir que ECM cree instancias ELB automáticamente

Importante

Si elimina el Service, elimina un node pool o cambia el selector de node pool, se quitan las instancias ELB y las EIP correspondientes. Si actualiza las etiquetas de los node pools y dejan de coincidir con el selector, también se eliminan las instancias ELB de dichos node pools.

  1. Cree un archivo llamado cube-svc.yaml:

    • openyurt.io/topologyKeys: habilita el enrutamiento basado en topología para que el tráfico permanezca dentro de la región de cada node pool.

    • service.openyurt.io/nodepool-labelselector: selecciona qué node pools reciben instancias ELB.

    • externalTrafficPolicy: Local: conserva la IP del cliente y enruta el tráfico solo a los pods del mismo nodo.

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      labels:
        app: cube
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool           # Route traffic within each node pool.
        service.openyurt.io/nodepool-labelselector: k8s-svc=cube # Select node pools with this label.
    spec:
      selector:
        app: cube
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
      externalTrafficPolicy: Local
      ports:
      - name: cube
        port: 80
        protocol: TCP
        targetPort: 80

    Campos clave:

  2. Aplique el Service:

    kubectl apply -f cube-svc.yaml
  3. Confirme que el Service esté listo y anote las direcciones IP externas:

    kubectl get svc cube-svc

    Salida esperada:

    NAME       TYPE           CLUSTER-IP        EXTERNAL-IP                    PORT(S)        AGE
    cube-svc   LoadBalancer   192.168.xxx.xxx   39.106.XX.XX,144.121.XX.XX     80:30081/TCP   5m
  4. Acceda a la aplicación:

    curl http://<EXTERNAL-IP>:80

    Reemplace <EXTERNAL-IP> por una de las direcciones IP de la columna EXTERNAL-IP.

Opción 2: Usar instancias ELB existentes

Utilice esta opción cuando necesite adjuntar instancias ELB aprovisionadas previamente, por ejemplo, para compartir una instancia ELB entre varios Services.

  1. Cree un archivo llamado cube-svc.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: cube-svc
      labels:
        app: cube
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool             # Route traffic within each node pool.
        service.openyurt.io/nodepool-labelselector: k8s-svc=cube   # Select node pools with this label.
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true" # Use a self-managed ELB instance.
    spec:
      selector:
        app: cube
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
      externalTrafficPolicy: Local
      ports:
      - name: cube
        port: 80
        protocol: TCP
        targetPort: 80
  2. Aplique el Service:

    kubectl apply -f cube-svc.yaml
  3. Revise los PoolServices creados automáticamente (uno por cada node pool):

    kubectl get ps

    Salida esperada:

    NAME                   AGE
    cube-svc-np-heifei     32s
    cube-svc-np-chengdu    32s
  4. Adjunte una instancia ELB existente a cada PoolService:

    • Node pool de China (Hefei): ``bash kubectl annotate ps cube-svc-np-heifei service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx ``

    • Node pool de China (Chengdu): ``bash kubectl annotate ps cube-svc-np-chengdu service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=lb-xxx ``

  5. Confirme que el Service esté listo:

    kubectl get svc cube-svc

    Salida esperada:

    NAME       TYPE           CLUSTER-IP        EXTERNAL-IP                    PORT(S)        AGE
    cube-svc   LoadBalancer   192.168.xxx.xxx   39.106.XX.XX,144.121.XX.XX     80:30081/TCP   5m
  6. Acceda a la aplicación:

    curl http://<EXTERNAL-IP>:80

    Reemplace <EXTERNAL-IP> por una de las direcciones IP de la columna EXTERNAL-IP.

Política de actualización de ELB

La siguiente tabla resume el comportamiento de los resources según si la instancia ELB está gestionada por usted o por ECM.

Resource

ELB autogestionado

ELB gestionado por ECM

Atributos de ELB

Creación: especifique el selector de node pool y el ID de ELB mediante service.openyurt.io/nodepool-labelselector y service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user. Actualización: no compatible. Eliminación: no automática.

Creación: especifique el selector de node pool mediante service.openyurt.io/nodepool-labelselector. Actualización: no compatible. Eliminación: no automática.

Grupos de servidores de backend

Creación: se actualizan según el estado del Service y de los pods. Actualización: los servidores se agregan o quitan dinámicamente en modo Local. Eliminación: no automática; elimínelos manualmente.

Creación: se actualizan según el estado del Service y de los pods. Actualización: los servidores se agregan o quitan dinámicamente en modo Local. Eliminación: automática.

Listeners

Creación: se agregan según spec.ports. Actualización: se agregan, actualizan y eliminan según los cambios de puerto. Eliminación: no automática; elimínelos manualmente.

Creación: se agregan según spec.ports. Actualización: se agregan, actualizan y eliminan según los cambios de puerto. Eliminación: automática.

Atributos de EIP

Creación: no automática; gestione las EIP manualmente. Actualización: no compatible. Eliminación: no automática.

Creación: automática, en la misma región que la instancia ELB. Actualización: el ancho de banda se puede aumentar o reducir. Eliminación: automática.

Pasos siguientes