Uso de una dirección IP pública estática y una etiqueta DNS con el equilibrador de carga de Azure Kubernetes Service (AKS)

Cuando se crea un recurso de equilibrador de carga en un clúster de Azure Kubernetes Service (AKS), la dirección IP pública asignada a él solo es válida durante la duración de ese recurso. Si elimina el servicio de Kubernetes, el equilibrador de carga asociado y la dirección IP también se eliminan. Si quiere asignar una dirección IP específica o conservar una dirección IP para los servicios de Kubernetes reimplementados, puede crear y usar una dirección IP pública estática.

En este artículo se muestra cómo crear una dirección IP pública estática y asignarla al servicio de Kubernetes.

Antes de empezar

Creación de un clúster de AKS

  1. Cree un grupo de recursos de Azure con el comando az group create.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Cree un clúster de AKS mediante el az aks create comando .

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

Crear una dirección IP estática

  1. Obtenga el nombre del grupo de recursos del nodo mediante el comando az aks show y la consulta de la propiedad nodeResourceGroup.

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. Cree una dirección IP pública estática en el grupo de recursos del nodo mediante el az network public-ip create comando .

    az network public-ip create \
        --resource-group <node resource group name> \
        --name myAKSPublicIP \
        --sku Standard \
        --allocation-method static
    

    Importante

    AKS ya no admite Load Balancer Basic. Si el clúster usa un Load Balancer Básico, actualice a Standard Load Balancer antes de configurar una dirección IP pública estática.

  3. Obtenga la dirección IP pública estática mediante el az network public-ip show comando . Especifique el nombre del grupo de recursos del nodo y la dirección IP pública que creó, y consulte el ipAddress.

    az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
    

Creación de un servicio de Kubernetes con la dirección IP estática

  1. Cree un archivo denominado load-balancer-service.yaml y copie en el contenido del siguiente archivo YAML. Proporcione el nombre del recurso de DIRECCIÓN IP pública (myAKSPublicIP) que creó en la sección Creación de una dirección IP estática y el nombre del grupo de recursos del nodo.

    La identidad del plano de control de AKS tiene permisos de colaborador en el grupo de recursos del nodo de forma predeterminada, por lo que la dirección IP pública que cree en este artículo no requiere otra asignación de roles. Si usa una dirección IP pública entrante o saliente en otro grupo de recursos, conceda a la identidad del plano de control los permisos necesarios en ese grupo de recursos. Para más información, consulte Identidades administradas en AKS.

    Importante

    La propiedad loadBalancerIP de un manifiesto de servicio de Kubernetes ha quedado obsoleta, siguiendo a Kubernetes upstream. Los servicios existentes siguen funcionando sin modificaciones, pero usan anotaciones de servicio en su lugar.

    Anotación propósito
    service.beta.kubernetes.io/azure-pip-name Especifique el nombre del recurso de dirección IP pública.
    service.beta.kubernetes.io/azure-load-balancer-ipv4 Especifique una dirección IPv4.
    service.beta.kubernetes.io/azure-load-balancer-ipv6 Especifique una dirección IPv6.
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    

    Nota:

    Añadir la anotación service.beta.kubernetes.io/azure-pip-name garantiza la creación más eficiente del equilibrador de carga y es muy recomendable para evitar posibles problemas de limitación de velocidad.

  2. Establezca una etiqueta DNS orientada al público en el servicio mediante la anotación de servicio service.beta.kubernetes.io/azure-dns-label-name. Esto publica un nombre de dominio completo (FQDN) para su servicio mediante los servidores DNS públicos y el dominio de nivel superior de Azure. El valor de la anotación debe ser único dentro de la ubicación de Azure, por lo que se recomienda usar una etiqueta suficientemente calificada. Azure anexa automáticamente un sufijo predeterminado en la ubicación seleccionada, como <location>.cloudapp.azure.com, al nombre que proporcione y crea el FQDN.

    Nota:

    Si quiere publicar el servicio en su propio dominio, consulte Azure DNS y el proyecto external-dns.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
        service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    
  3. Antes de crear el servicio, asegúrese de que el clúster tenga una carga de trabajo con pods que usen la app: azure-load-balancer etiqueta . El manifiesto de servicio selecciona pods con esta etiqueta, pero no crea una implementación.

  4. Cree el servicio mediante el kubectl apply comando .

    kubectl apply -f load-balancer-service.yaml
    
  5. Compruebe que el servicio selecciona al menos un pod en ejecución y listo.

    kubectl get pods -l app=azure-load-balancer
    
  6. Para ver la etiqueta DNS del equilibrador de carga, use el comando kubectl describe:

    kubectl describe service azure-load-balancer
    

    La etiqueta DNS se mostrará en Annotations, como se muestra en la siguiente salida de ejemplo condensada:

    Name:                    azure-load-balancer
    Namespace:               default
    Labels:                  <none>
    Annotations:             service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
    

Solución de problemas

En esta sección se supone que ha completado la sección Creación de una dirección IP estática, ha intentado los pasos descritos en Creación de un servicio de Kubernetes con la dirección IP estática y tener un clúster de AKS en ejecución. Para recuperar el nombre del grupo de recursos del nodo, use az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv.

Si el recurso de dirección IP pública denominado en la service.beta.kubernetes.io/azure-pip-name anotación no existe en el grupo de recursos especificado por service.beta.kubernetes.io/azure-load-balancer-resource-groupo la identidad del plano de control de AKS no puede acceder a ese grupo de recursos, se produce un error en la creación del servicio del equilibrador de carga. Para solucionar problemas, revise las anotaciones de servicio y los eventos de creación mediante el kubectl describe comando . Indique el nombre del servicio especificado en el manifiesto de YAML, como se muestra en este ejemplo:

kubectl describe service azure-load-balancer

La salida le muestra información sobre el recurso de servicio de Kubernetes. En la salida del ejemplo siguiente se muestra un Warning en : Events"user supplied IP address was not found". En este escenario, asegúrese de que la azure-pip-name anotación coincide con el nombre del recurso de dirección IP pública estática y la azure-load-balancer-resource-group anotación coincide con el grupo de recursos que lo contiene.

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
                          service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
Selector:                 app=azure-load-balancer
Type:                     LoadBalancer
IP:                       10.0.18.125
IP:                       40.121.183.52
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32582/TCP
Endpoints:                <pod-ip>:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   CreatingLoadBalancer        7s (x2 over 22s)  service-controller  Creating load balancer
  Warning  CreatingLoadBalancerFailed  6s (x2 over 12s)  service-controller  Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found

Pasos siguientes

Para obtener más control sobre el tráfico de red a las aplicaciones, use el complemento de enrutamiento de aplicaciones para AKS. Para obtener más información sobre el complemento de enrutamiento de aplicaciones, consulte Entrada NGINX administrada con el complemento de enrutamiento de aplicaciones.