Utiliser un équilibreur de charge interne avec Azure Kubernetes Service (AKS)

Vous pouvez créer et utiliser un équilibreur de charge interne pour restreindre l’accès à vos applications dans Azure Kubernetes Service (AKS). Un équilibreur de charge interne n’a pas d’adresse IP publique et rend un service Kubernetes accessible uniquement aux applications qui peuvent atteindre l’adresse IP privée. Ces applications peuvent se trouver dans le même réseau virtuel ou dans un autre réseau virtuel via le peering de réseaux virtuels. Cet article explique comment créer et utiliser un équilibreur de charge interne avec AKS.

Notes

Azure Load Balancer se décline en deux références SKU : De base et Standard. La référence SKU Standard est utilisée par défaut quand vous créez un cluster AKS. Quand vous créez un type de service LoadBalancer, vous obtenez le même type d’équilibreur de charge que lorsque vous avez configuré le cluster. Pour plus d’informations, consultez Comparaison des références SKU d’Azure Load Balancer.

Avant de commencer

Créer un équilibrage de charge interne

  1. Créez un manifeste de service nommé internal-lb.yaml avec le type LoadBalancer de service et l’annotation azure-load-balancer-internal .

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Déployez l’équilibreur de charge interne à l’aide de la kubectl apply commande . Cette commande crée un équilibreur de charge Azure dans le groupe de ressources de nœud connecté au même réseau virtuel que votre cluster AKS.

    kubectl apply -f internal-lb.yaml
    
  3. Affichez les détails du service à l’aide de la kubectl get service commande .

    kubectl get service internal-app
    

    L’adresse IP de l’équilibreur de charge interne est affichée dans la EXTERNAL-IP colonne, comme indiqué dans l’exemple de sortie suivant. Dans ce contexte, Externe fait référence à l’interface externe de l’équilibreur de charge. Cela ne signifie pas qu’il reçoit une adresse IP publique externe. Cette adresse IP est affectée dynamiquement à partir du même sous-réseau que le cluster AKS.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.248.59   10.240.0.7    80:30555/TCP   2m
    

Spécifier une adresse IP

Quand vous spécifiez une adresse IP pour l’équilibreur de charge, l’adresse IP spécifiée doit se trouver dans le même sous-réseau que le cluster AKS, mais ne peut pas être déjà attribuée à une ressource. Par exemple, vous ne devez pas utiliser une adresse IP dans la plage désignée pour le sous-réseau Kubernetes au sein du cluster AKS.

Vous pouvez utiliser la az network vnet subnet list commande Azure CLI ou l’applet Get-AzVirtualNetworkSubnetConfig de commande PowerShell pour obtenir les sous-réseaux de votre réseau virtuel.

Pour plus d’informations sur les sous-réseaux, consultez Ajouter un pool de nœuds avec un sous-réseau unique.

Si vous souhaitez utiliser une adresse IP spécifique avec l’équilibreur de charge, vous avez deux options : définir le service d’annotations ou ajoutez la propriété loadBalancerIP au manifeste YAML de l’équilibreur de charge.

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.

  1. Définir des annotations de service utilisant service.beta.kubernetes.io/azure-load-balancer-ipv4 pour une adresse IPv4 et service.beta.kubernetes.io/azure-load-balancer-ipv6 pour une adresse IPv6.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  1. Affichez les détails du service à l’aide de la kubectl get service commande .

    kubectl get service internal-app
    

    L’adresse IP dans la EXTERNAL-IP colonne doit refléter l’adresse IP spécifiée, comme indiqué dans l’exemple de sortie suivant :

    NAME           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.0.184.168   10.240.0.25   80:30225/TCP   4m
    

Pour plus d’informations sur la configuration de votre équilibreur de charge dans un autre sous-réseau, consultez Spécifier un autre sous-réseau.

Avant de commencer

  1. Créez un manifeste de service nommé internal-lb-pls.yaml avec le type LoadBalancer de service et l’annotation azure-load-balancer-internal et azure-pls-create. Pour plus d’options, reportez-vous au document de conception Intégration du service Azure Private Link.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-pls-create: "true"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    
  2. Déployez l’équilibreur de charge interne à l’aide de la kubectl apply commande . Cette commande crée un équilibreur de charge Azure dans le groupe de ressources de nœud connecté au même réseau virtuel que votre cluster AKS. Cela crée également un objet du service Private Link qui se connecte à la configuration IP frontale de l’équilibreur de charge associé au service Kubernetes.

    kubectl apply -f internal-lb-pls.yaml
    
  3. Affichez les détails du service à l’aide de la kubectl get service commande .

    kubectl get service internal-app
    

    L’adresse IP de l’équilibreur de charge interne est affichée dans la EXTERNAL-IP colonne, comme indiqué dans l’exemple de sortie suivant. Dans ce contexte, Externe fait référence à l’interface externe de l’équilibreur de charge. Cela ne signifie pas qu’il reçoit une adresse IP publique externe.

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    internal-app   LoadBalancer   10.125.17.53  10.125.0.66   80:30430/TCP   64m
    
  4. Affichez les détails de l’objet service Private Link à l’aide de la az network private-link-service list commande .

    # Create a variable for the node resource group
    
    AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
    
    # View the details of the Private Link Service object
    
    az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
    

    Vous devez obtenir un résultat semblable à l’exemple de sortie qui suit :

    Name      Alias
    --------  -------------------------------------------------------------------------
    pls-xyz   pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
    

Un point de terminaison privé vous permet de vous connecter en privé à votre objet du service Kubernetes via le service Private Link que vous avez créé.

  • Créez le point de terminaison privé en utilisant la commande az network private-endpoint create.

    # Create a variable for the private link service
    
    AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --query "[].id" -o tsv)
    
    # Create the private endpoint
    
    $ az network private-endpoint create \
        -g myOtherResourceGroup \
        --name myAKSServicePE \
        --vnet-name myOtherVNET \
        --subnet pe-subnet \
        --private-connection-resource-id $AKS_PLS_ID \
        --connection-name connectToMyK8sService
    

Personnalisations PLS via des annotations

Voici des annotations qui peuvent être utilisées pour personnaliser la ressource PLS.

Annotation Valeur Description Obligatoire Par défaut
service.beta.kubernetes.io/azure-pls-create "true" Booléen indiquant si un PLS doit être créé. Requis
service.beta.kubernetes.io/azure-pls-name <PLS name> Chaîne spécifiant le nom de la ressource PLS à créer. Facultatif "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name Chaîne spécifiant le nom du groupe de ressources où la ressource PLS sera créée Facultatif MC_ resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> Chaîne indiquant le sous-réseau sur lequel le PLS sera déployé. Ce sous-réseau doit exister dans le même réseau virtuel que le pool principal. Les adresses IP NAT PLS sont allouées dans ce sous-réseau. Facultatif Si service.beta.kubernetes.io/azure-load-balancer-internal-subnet, ce sous-réseau ILB est utilisé. Sinon, le sous-réseau par défaut du fichier de configuration est utilisé.
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] Nombre total d’adresses IP NAT privées à allouer. Facultatif 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" Liste d’adresses IP IPv4 statiques à allouer, séparées par des espaces. (IPv6 n’est pas pris en charge actuellement.) Le nombre total d’adresses IP ne doit pas être supérieur au nombre d’adresses IP spécifié dans service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count. S’il y a moins d’adresses IP spécifiées, le reste est alloué dynamiquement. La première adresse IP de la liste est définie sur Primary. Facultatif Toutes les adresses IP sont allouées dynamiquement.
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" Liste des noms de domaine complets (FQDN) associés au PLS. Facultatif []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" ou "false" Booléen indiquant si le protocole TCP PROXY doit être activé sur le PLS pour transmettre des informations de connexion, y compris l’ID de lien et l’adresse IP source. Notez que le service backend DOIT prendre en charge le protocole PROXY. Dans le cas contraire, les connexions échouent. Facultatif false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" ou "*" Liste des ID d’abonnement Azure, séparés par des espaces, pour lesquels le service de liaison privée est visible. Utilisez "*" pour exposer le PLS à tous les abonnements (moins restrictif). Facultatif Liste vide [] indiquant uniquement le contrôle d’accès en fonction du rôle : ce service de liaison privée est uniquement disponible pour les utilisateurs disposant d’autorisations de contrôle d’accès en fonction du rôle dans votre répertoire. (plus restrictif)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Liste des ID d’abonnement Azure, séparés par des espaces. Cela permet aux demandes de connexion PE des abonnements répertoriés dans le PLS d’être approuvées automatiquement. Cela fonctionne uniquement lorsque la visibilité est définie sur « * ». Facultatif []

Utiliser des réseaux privés

Lorsque vous créez votre cluster AKS, vous pouvez configurer des paramètres de réseau avancés. Ces paramètres vous permettent de déployer le cluster sur un réseau virtuel Azure existant et ses sous-réseaux. Par exemple, vous pouvez déployer votre cluster AKS sur un réseau privé connecté à votre environnement local et exécuter des services accessibles uniquement en interne.

Pour plus d’informations, découvrez comment configurer vos propres sous-réseaux de réseau virtuel avec Kubenet ou Azure CNI.

Il n’est pas nécessaire de modifier les étapes précédentes pour déployer un équilibreur de charge interne dans un cluster AKS qui utilise un réseau privé. L’équilibreur de charge est créé dans le même groupe de ressources que votre cluster AKS, mais il est connecté à votre réseau privé virtuel et à son sous-réseau, comme indiqué dans l’exemple suivant :

$ kubectl get service internal-app

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
internal-app   LoadBalancer   10.1.15.188   10.0.0.35     80:31669/TCP   1m

Remarque

L’identité du cluster utilisé par le cluster AKS doit au moins avoir le rôle de contributeur réseau sur la ressource réseau virtuelle. Vous pouvez afficher l’identité de la grappe à l’aide de la commande az aks show, comme az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity". Vous pouvez attribuer le rôle de contributeur réseau à l’aide d’une commande az role assignment create telle que az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor".

Si vous souhaitez définir un rôle personnalisé à la place, vous avez besoin des autorisations suivantes :

  • Microsoft.Network/virtualNetworks/subnets/join/action
  • Microsoft.Network/virtualNetworks/subnets/read

Pour plus d’informations, voir Ajouter, modifier ou supprimer un sous-réseau de réseau virtuel.

Spécifier un autre sous-réseau

  • Ajoutez l’annotation azure-load-balancer-internal-subnet à votre service pour spécifier un sous-réseau pour votre équilibreur de charge. Le sous-réseau spécifié doit se trouver dans le même réseau virtuel que votre cluster AKS. Une fois déployé, l’adresse EXTERNAL-IP de l’équilibreur de charge fait partie du sous-réseau spécifié.

    apiVersion: v1
    kind: Service
    metadata:
      name: internal-app
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
        service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet"
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: internal-app
    

Supprimer l’équilibreur de charge

L’équilibreur de charge est supprimé lorsque tous ses services sont supprimés.

À l’image de toute ressource Kubernetes, vous pouvez directement supprimer un service, tel que kubectl delete service internal-app, supprimant par la même occasion l’équilibreur de charge Azure sous-jacent.

Étapes suivantes

Pour en savoir plus sur les services Kubernetes, consultez la documentation des services Kubernetes.