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

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 à l’aide de la az aks create commande.

    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 de nœud à l’aide de la az network public-ip create commande.

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

    Important

    AKS ne prend plus en charge l’équilibreur de charge Basic. Si votre cluster utilise un Load Balancer de base, effectuez une mise à niveau vers Standard Load Balancer avant de configurer une adresse IP publique statique.

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

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

Créer un service Kubernetes avec l’adresse IP statique

  1. Créez un fichier nommé load-balancer-service.yaml et copiez-le dans le contenu du fichier YAML suivant. Indiquez le nom de la ressource IP publique (myAKSPublicIP) que vous avez créé dans la section Créer une adresse IP statique et le nom du groupe de ressources de nœud.

    Par défaut, l’identité du plan de contrôle AKS dispose des autorisations du rôle Contributeur sur le groupe de ressources du nœud. Par conséquent, l’adresse IP publique que vous créez dans cet article n’exige pas d’attribution de rôle supplémentaire. Si vous utilisez une adresse IP publique entrante ou sortante dans un autre groupe de ressources, accordez à l’identité du plan de contrôle les autorisations requises sur ce groupe de ressources. Pour plus d’informations, consultez Identités managées dans AKS.

    Important

    La propriété loadBalancerIP d’un manifeste de service Kubernetes est déconseillée après Kubernetes en amont. Les services existants continuent de fonctionner sans modification, mais utilisent plutôt des annotations de service.

    Annotation Purpose
    service.beta.kubernetes.io/azure-pip-name Spécifiez le nom de la ressource IP publique.
    service.beta.kubernetes.io/azure-load-balancer-ipv4 Spécifiez une adresse IPv4.
    service.beta.kubernetes.io/azure-load-balancer-ipv6 Spécifiez une adresse 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
    

    Remarque

    L’ajout de l’annotation service.beta.kubernetes.io/azure-pip-name garantit la création la plus efficace du LoadBalancer et est fortement recommandé afin d’éviter d’éventuels problèmes de limitation.

  2. 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 doit être unique au sein de l’emplacement Azure ; nous vous recommandons donc d’utiliser un libellé suffisamment explicite. 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
    
  3. Avant de créer le service, vérifiez que votre cluster dispose d’une charge de travail avec des pods qui utilisent l’étiquette app: azure-load-balancer . Le manifeste de service sélectionne les pods avec cette étiquette, mais ne crée pas de déploiement.

  4. Créez le service à l’aide de la kubectl apply commande.

    kubectl apply -f load-balancer-service.yaml
    
  5. Vérifiez que le service sélectionne au moins un pod en cours d’exécution et prêt.

    kubectl get pods -l app=azure-load-balancer
    
  6. Pour voir l’étiquette DNS de votre équilibreur de charge, utilisez la commande kubectl describe.

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

Résolution des problèmes

Cette section suppose que vous avez terminé la création d’une adresse IP statique, a tenté les étapes de création d’un service Kubernetes avec l’adresse IP statique et d’avoir un cluster AKS en cours d’exécution. Pour récupérer le nom du groupe de ressources de nœud, utilisez az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv.

Si la ressource IP publique nommée dans l’annotation service.beta.kubernetes.io/azure-pip-name n’existe pas dans le groupe de ressources spécifié par service.beta.kubernetes.io/azure-load-balancer-resource-group, ou si l’identité du plan de contrôle AKS ne peut pas accéder à ce groupe de ressources, la création du service d’équilibreur de charge échoue. Pour résoudre les problèmes, passez en revue les annotations de service et les événements de création à l’aide de la kubectl describe commande. 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 le Events: «user supplied IP address was not found ». Dans ce scénario, vérifiez que l’annotation azure-pip-name correspond au nom de la ressource IP publique statique et que l’annotation azure-load-balancer-resource-group correspond au groupe de ressources qui le contient.

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

É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 l’entrée NGINX gérée avec le module complémentaire de routage d’application.