Utiliser une adresse IP publique statique et une étiquette DNS avec l’équilibrage de charge d’Azure Kubernetes Service (AKS)

Lorsque vous créez une ressource d’équilibreur de charge dans un cluster Azure Kubernetes Service (AKS), l’adresse IP publique qui lui est attribuée est uniquement valide pour la durée de vie de cette ressource. Si vous supprimez le service Kubernetes, l’adresse IP et l’équilibreur de charge associés sont également supprimés. Si vous voulez affecter une adresse IP spécifique ou conserver une adresse IP pour des services Kubernetes redéployés, vous pouvez créer et utiliser une adresse IP publique statique.

Cet article vous montre comment créer une adresse IP publique statique et l’affecter à votre service Kubernetes.

Avant de commencer

  • La version 2.0.59 ou ultérieure d’Azure CLI doit être installée et configurée. Exécutez az --version pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.
  • Cet article traite de l’utilisation d’une adresse IP SKU standard avec un équilibreur de charge SKU standard. Pour plus d’informations, consultez Types d’adresses IP et méthodes d’allocation dans Azure.

Créer un cluster AKS

  1. Créez un groupe de ressources Azure à l’aide de la commande az group create.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. Créez un cluster AKS avec la commande az aks create.

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

Créer une adresse IP statique

  1. Obtenez le nom du groupe de ressources de nœud à l’aide de la commande az aks show et exécutez une requête sur la propriété nodeResourceGroup.

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. Créez une adresse IP publique statique dans le groupe de ressources du nœud à l’aide de la commande az network public ip create.

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

    Remarque

    Si vous utilisez une référence SKU d’équilibreur de charge De base dans votre cluster AKS, utilisez De base pour le paramètre --sku lors de la définition d’une adresse IP publique. Seules les adresses IP SKU De base fonctionnent avec l’équilibreur de charge SKU De base et seuls les adresses IP SKU Standard fonctionnent avec les équilibreurs de charge SKU Standard.

  3. Obtenez l’adresse IP publique statique à l’aide de la commande az network public-ip list. Spécifiez le nom du groupe de ressources du nœud et l’adresse IP publique que vous avez créés, puis interrogez ipAddress.

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

Créer un service utilisant l’adresse IP statique

  1. Vérifiez que l’identité de cluster utilisée par le cluster AKS dispose de permissions déléguées sur le groupe de ressources de l’adresse IP publique à l’aide de la commande 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}
    

    Important

    Si vous avez personnalisé votre adresse IP sortante, assurez-vous que l’identité de votre cluster dispose des autorisations d’accès tant à l’adresse IP publique sortante qu’à l’adresse IP publique entrante.

  2. Créez un fichier nommé load-balancer-service.yaml et copiez-le dans le contenu du fichier YAML suivant, en fournissant votre propre adresse IP publique créée à l’étape précédente et le nom du groupe de ressources de nœud.

    Important

    L’ajout de la propriété loadBalancerIP au manifeste YAML de l’équilibreur de charge est déprécié après Kubernetes en amont. Bien que l’utilisation actuelle reste la même et que les services existants soient censés fonctionner sans modification, nous recommandons vivement de définir des annotations de service à la place. Pour définir des annotations de service, vous pouvez utiliser service.beta.kubernetes.io/azure-pip-name pour nom d’adresse IP publique ou utiliser service.beta.kubernetes.io/azure-load-balancer-ipv4 pour adresse IPv4 et service.beta.kubernetes.io/azure-load-balancer-ipv6 pour adresse IPv6, comme illustré dans l’exemple 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
    

    Remarque

    L’annotation service.beta.kubernetes.io/azure-pip-name garantit la création de LoadBalancer de la manière la plus efficace possible et est fortement recommandée pour éviter toute limitation potentielle.

  3. Définissez une étiquette DNS publique sur le service à l’aide de l’annotation de service service.beta.kubernetes.io/azure-dns-label-name. Il publie un nom de domaine complet pour votre service en utilisant les serveurs DNS publics et le domaine de niveau supérieur Azure. La valeur de l’annotation devant être unique dans l’emplacement Azure, il est recommandé d’utiliser une étiquette suffisamment qualifiée. Azure ajoute automatiquement un suffixe par défaut à l’emplacement que vous avez sélectionné, tel que <location>.cloudapp.azure.com, au nom que vous fournissez, créant ainsi le nom de domaine complet.

    Remarque

    Si vous souhaitez publier le service sur votre propre domaine, consultez Azure DNS et le projet 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. Créez le service et le déploiement à l’aide de la commande kubectl apply.

    kubectl apply -f load-balancer-service.yaml
    
  5. Pour voir l’étiquette DNS de votre équilibreur de charge, utilisez la commande kubectl describe service.

    kubectl describe service azure-load-balancer
    

    L’étiquette DNS est répertoriée sous Annotations, comme indiqué dans l’exemple de sortie condensé suivant :

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

Résoudre les problèmes

Si l’adresse IP statique définie dans la propriété loadBalancerIP du manifeste du service Kubernetes n’existe pas ou n’a pas été créée dans le groupe de ressources de nœud et qu’aucune autre délégation n’est configurée, la création du service d’équilibreur de charge échoue. Pour résoudre les problèmes, examinez les événements de création du service avec la commande kubectl describe. Spécifiez le nom du service tel qu’il est spécifié dans le manifeste YAML, comme indiqué dans l’exemple suivant :

kubectl describe service azure-load-balancer

La sortie vous montre des informations sur la ressource du service Kubernetes. L’exemple de sortie suivant montre un Warning dans Events : « user supplied IP address was not found ». Dans ce scénario, vérifiez que vous avez créé l’adresse IP publique statique dans le groupe de ressources de nœud et que l’adresse IP spécifiée dans le manifeste de service Kubernetes est correcte.

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

Étapes suivantes

Pour plus de contrôle sur le trafic réseau vers vos applications, utilisez le module complémentaire de routage des applications pour AKS. Pour plus d’informations sur le module complémentaire de routage des applications, consultez Entrée NGINX managée avec le module complémentaire de routage d’application.