Compartir vía


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. En primer lugar, determine qué tipo de identidad administrada usa el clúster de AKS, asignado por el sistema o asignado por el usuario. Si no está seguro, ejecute el comando az aks show y consulte la propiedad type de la identidad.

    az aks show \
        --name myAKSCluster \
        --resource-group myResourceGroup \
        --query identity.type \
        --output tsv       
    

    Si el clúster usa una identidad administrada, el valor de la propiedad type será SystemAssigned o UserAssigned.

    Si el clúster está utilizando una entidad de servicio, el valor de la propiedad type será null. Considere la posibilidad de actualizar el clúster para usar una identidad administrada.

  2. Si el clúster de AKS usa una identidad administrada asignada por el sistema, consulte el identificador de entidad de seguridad de la identidad administrada de la siguiente manera:

    # Get the principal ID for a system-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.principalId \
        --output tsv)
    

    Si su clúster AKS utiliza una identidad administrada asignada por el usuario, el id. de entidad de seguridad será null. En su lugar, consulta el id. de cliente de la identidad administrada asignada al usuario:

    # Get the client ID for a user-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.userAssignedIdentities.*.clientId \
        --output tsv    
    
  3. Asigne permisos delegados para la identidad administrada que usa el clúster de AKS para el grupo de recursos de la dirección IP pública llamando al comando az role assignment create .

    # Get the resource ID for the node resource group.
    RG_SCOPE=$(az group show \
        --name <node resource group> \
        --query id \
        --output tsv)
    
    # Assign the Network Contributor role to the managed identity,
    # scoped to the node resource group.
    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.

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

  5. 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
    
  6. Cree el servicio y la implementación con el comando kubectl apply.

    kubectl apply -f load-balancer-service.yaml
    
  7. 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.