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

  • Es preciso que esté instalada y configurada la versión 2.0.59 o posterior de la CLI de Azure, o cualquier otra posterior. Ejecute az --version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.
  • En este artículo se describe el uso de una dirección IP de SKU Estándar con un equilibrador de carga de SKU Estándar. Para más información, consulte Tipos de direcciones IP y métodos de asignación en Azure.

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 con el comando az aks create.

    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 con el comando az network public ip create.

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

    Nota:

    Si usa un equilibrador de carga de SKU Básico en el clúster de AKS, use Básico para el parámetro --sku al definir una dirección IP pública. Solo las direcciones IP de SKU Básicas funcionan con el equilibrador de carga de SKU Básico y solo las IP de SKU Estándar funcionan con los equilibradores de carga de SKU Estándar.

  3. Use el comando az network public-ip list para obtener una dirección IP pública estática. Especifique el nombre del grupo de recursos del nodo y la dirección IP pública que ha creado y envíe una consulta para ipAddress.

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

Crear un servicio mediante la dirección IP estática

  1. Asegúrese de que la identidad de clúster que usa el clúster de AKS haya delegado permisos en el grupo de recursos de la dirección IP pública con el comando az role assignment create.

    CLIENT_ID=$(az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query identity.principalId -o tsv)
    RG_SCOPE=$(az group show --name <node resource group> --query id -o tsv)
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    

    Importante

    Si ha personalizado la dirección IP de salida, asegúrese de que la identidad del clúster tenga permisos tanto para la dirección IP pública de salida como para la dirección IP pública de entrada.

  2. Cree un archivo denominado load-balancer-service.yaml y copie en el contenido del siguiente archivo YAML, proporcionando su propia dirección IP pública creada en el paso anterior y el nombre del grupo de recursos del nodo.

    Importante

    La adición de la propiedad loadBalancerIP al manifiesto YAML del equilibrador de carga está en desuso después de Kubernetes ascendente. Aunque se espera que el uso actual siga siendo el mismo y los servicios existentes funcionen sin modificaciones, se recomienda encarecidamente establecer anotaciones de servicio en su lugar. Para establecer anotaciones de servicio, puede usar service.beta.kubernetes.io/azure-pip-name para un nombre de IP pública o service.beta.kubernetes.io/azure-load-balancer-ipv4 para una dirección IPv4 y service.beta.kubernetes.io/azure-load-balancer-ipv6 para una dirección IPv6, como se muestra en el ejemplo de YAML.

    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:

    Agregar la anotación service.beta.kubernetes.io/azure-pip-name garantiza la creación de LoadBalancer más eficaz y es muy recomendable para evitar posibles limitaciones.

  3. 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. Esta acción publica un nombre de dominio completo (FQDN) para el servicio mediante los servidores DNS públicos de Azure y el dominio de nivel superior. 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
    
  4. Cree el servicio y la implementación con el comando kubectl apply.

    kubectl apply -f load-balancer-service.yaml
    
  5. Para ver la etiqueta DNS del equilibrador de carga, use el comando kubectl describe service:

    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.kuberenetes.io/azure-dns-label-name: <unique-service-label>
    

Solución de problemas

Si la dirección IP estática definida en la propiedad loadBalancerIP del manifiesto de servicio de Kubernetes no existe o no se ha creado en el grupo de recursos del nodo y no se han configurado delegaciones adicionales, se produce un error en la creación del servicio del equilibrador de carga. Para solucionar este problema, revise los eventos de creación del servicio con el comando kubectl describe. 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 de ejemplo siguiente se muestra una Warning en el Events: "user supplied IP address was not found". En este escenario, asegúrese de que ha creado la dirección IP pública estática en el grupo de recursos del nodo y de que la dirección IP especificada en el manifiesto de servicio de Kubernetes es correcta.

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              <none>
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:                <none>
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 controlar mejor el tráfico de red de 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.