Usare un servizio di bilanciamento del carico interno con il servizio Azure Kubernetes

Per limitare l'accesso alle applicazioni nel servizio Azure Kubernetes, è possibile creare e usare un bilanciamento del carico interno. Un servizio di bilanciamento del carico interno non ha un indirizzo IP pubblico e rende un servizio Kubernetes accessibile solo alle applicazioni in grado di raggiungere l’IP privato. Queste applicazioni possono trovarsi all'interno della stessa rete virtuale o in un'altra rete virtuale tramite peering di rete virtuale. Questo articolo descrive come usare un servizio di bilanciamento del carico interno con AKS.

Importante

A partire dal 30 settembre 2025, il servizio Azure Kubernetes non supporta più Load Balancer Basic. Per evitare potenziali interruzioni del servizio, è consigliabile usare Load Balancer Standard per le nuove distribuzioni e aggiornare le distribuzioni esistenti a Load Balancer Standard. Per altre informazioni sul ritiro, vedere il problema sul ritiro di GitHub e l'annuncio di ritiro degli aggiornamenti di Azure. Per rimanere informati sugli annunci e sugli aggiornamenti, seguire le note di rilascio di AKS.

Prima di iniziare

Creare un bilanciamento del carico interno

  1. Creare un manifesto del servizio denominato internal-lb.yaml con il tipo di servizio LoadBalancer e l'annotazione 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. Distribuire il servizio di bilanciamento del carico interno usando il comando kubectl apply. Questo comando crea un servizio di bilanciamento del carico di Azure nel gruppo di risorse del nodo connesso alla stessa rete virtuale del cluster del servizio Azure Kubernetes.

    kubectl apply -f internal-lb.yaml
    
  3. Visualizzare i dettagli del servizio usando il comando kubectl get service.

    kubectl get service internal-app
    

    L'indirizzo IP del servizio di bilanciamento del carico interno viene visualizzato nella colonna EXTERNAL-IP, come illustrato nell'output di esempio seguente. In questo contesto, External fa riferimento all'interfaccia esterna del servizio di bilanciamento del carico. Non significa che riceve un indirizzo IP pubblico esterno. Questo indirizzo IP viene assegnato dinamicamente dalla stessa subnet del cluster del servizio Azure Kubernetes.

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

Specificare un indirizzo IP

Quando si specifica un indirizzo IP per il servizio di bilanciamento del carico, l'indirizzo IP deve essere disponibile all'interno della subnet usata dal servizio di bilanciamento del carico. Per impostazione predefinita, il servizio di bilanciamento del carico usa la stessa subnet del cluster del servizio Azure Kubernetes. Non usare un indirizzo IP Azure riservato, un indirizzo IP già assegnato a un'altra risorsa o un indirizzo IP dal ciDR del servizio Kubernetes.

È possibile usare il az network vnet subnet listcomando dell'interfaccia della riga di comando di AzureGet-AzVirtualNetworkSubnetConfig o il cmdlet di PowerShell per ottenere le subnet nella rete virtuale.

Per altre informazioni sulle subnet, vedere Aggiungere un pool di nodi con una subnet univoca.

Se si vuole usare un indirizzo IP specifico con il servizio di bilanciamento del carico, sono disponibili due opzioni: impostare le annotazioni del servizio o aggiungere la proprietà LoadBalancerIP al manifestoYAML del servizio di bilanciamento del carico.

Importante

L'aggiunta della proprietà LoadBalancerIP al manifesto YAML del servizio di bilanciamento del carico verrà deprecata dopo Kubernetes upstream. Anche se l'utilizzo corrente rimane invariato e si prevede che i servizi esistenti funzionino senza modifiche, è consigliabile impostare invece le annotazioni del servizio. Per altre informazioni sulle annotazioni di servizio, vedere annotazioni supportate di Azure Load Balancer.

  1. Impostare le annotazioni del servizio usando service.beta.kubernetes.io/azure-load-balancer-ipv4 per un indirizzo IPv4 e service.beta.kubernetes.io/azure-load-balancer-ipv6 per un indirizzo 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
    
  2. Visualizzare i dettagli del servizio usando il comando kubectl get service.

    kubectl get service internal-app
    

    L'indirizzo IP nella colonna EXTERNAL-IP deve riflettere l'indirizzo IP specificato, come illustrato nell'output di esempio seguente:

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

Per altre informazioni sulla configurazione del servizio di bilanciamento del carico in una subnet diversa, vedere Specificare una subnet diversa.

Importante

collegamento privato Servizio presenta le restrizioni seguenti:

  • collegamento privato Servizio supporta solo il traffico IPv4 e supporta solo i protocolli di trasporto TCP e UDP.
  • Se il servizio usa externalTrafficPolicy: Local, la subnet del servizio collegamento privato deve essere diversa dalla subnet del pod. Per usare la stessa subnet, impostare su externalTrafficPolicyCluster.
  • Se si abilita il protocollo PROXY e si usa externalTrafficPolicy: Local, è necessario configurare un probe di integrità personalizzato perché il probe di integrità predefinito ha esito negativo.

Per altre informazioni, vedere Limitazioni del servizio collegamento privato e restrizioni di integrazione del servizio collegamento privato di Azure.

  1. Creare un manifesto del servizio denominato internal-lb-pls.yaml con il tipo di servizio LoadBalancer, azure-load-balancer-internal e le azure-pls-create annotazioni. Per altre opzioni, vedere il documento di progettazione Integrazione del servizio di collegamento privato di Azure.

    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. Distribuire il servizio di bilanciamento del carico interno usando il comando kubectl apply. Questo comando crea un servizio di bilanciamento del carico di Azure nel gruppo di risorse del nodo connesso alla stessa rete virtuale del cluster del servizio Azure Kubernetes. Crea anche un oggetto Service collegamento privato che si connette alla configurazione IP front-end del servizio di bilanciamento del carico interno associato all'oggetto servizio Kubernetes.

    kubectl apply -f internal-lb-pls.yaml
    
  3. Visualizzare i dettagli del servizio usando il comando kubectl get service.

    kubectl get service internal-app
    

    L'indirizzo IP del servizio di bilanciamento del carico interno viene visualizzato nella colonna EXTERNAL-IP, come illustrato nell'output di esempio seguente. In questo contesto, External fa riferimento all'interfaccia esterna del servizio di bilanciamento del carico. Non significa che riceve un indirizzo IP pubblico esterno.

    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. Visualizzare i dettagli dell'oggetto Servizio collegamento privato usando il comando az network private-link-service list.

    # 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
    

    L'output dovrebbe essere simile all'output di esempio seguente:

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

Un endpoint privato consente di connettersi privatamente all'oggetto Servizio Kubernetes tramite il servizio collegamento privato creato.

Creare l'endpoint privato usando il comando az network private-endpoint create. Sostituire pls-xyz con il nome del servizio collegamento privato restituito nel passaggio precedente.

Impostare --resource-group sul gruppo di risorse di destinazione in cui si vuole creare l'endpoint privato. Impostare --vnet-name e --subnet sulla rete virtuale e la subnet che contengono l'endpoint privato. Impostare --private-connection-resource-id sull'ID risorsa del servizio collegamento privato recuperato in AKS_PLS_ID.

# Create variables for the Private Link Service

AKS_PLS_NAME=pls-xyz
AKS_PLS_ID=$(az network private-link-service show -g $AKS_MC_RG --name $AKS_PLS_NAME --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

È possibile usare le annotazioni seguenti per personalizzare la risorsa PLS:

Annotazione valore Descrizione Obbligatoria Predefinito
service.beta.kubernetes.io/azure-pls-create "true" Valore booleano che indica se è necessario creare una risorsa PLS. Obbligatoria
service.beta.kubernetes.io/azure-pls-name <PLS name> Stringa che specifica il nome della risorsa PLS da creare. Facoltativo "pls-<LB frontend config name>"
service.beta.kubernetes.io/azure-pls-resource-group Resource Group name Stringa che specifica il nome del gruppo di risorse in cui viene creata la risorsa PLS Facoltativo MC_resource
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet <Subnet name> Stringa che indica la subnet in cui viene distribuito il file PLS. Questa subnet deve esistere nella stessa rete virtuale del pool back-end. Gli IP NAT PLS vengono allocati all'interno di questa subnet. Facoltativo Se service.beta.kubernetes.io/azure-load-balancer-internal-subnet, viene usata questa subnet ILB. In caso contrario, viene usata la subnet predefinita dal file di configurazione.
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count [1-8] Numero totale di indirizzi IP NAT privati da allocare. Facoltativo 1
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address "10.0.0.7 ... 10.0.0.10" Elenco separato da spazi di indirizzi IP IPv4 statici da allocare. IPv6 non è attualmente supportato. Il numero totale di indirizzi IP non deve essere maggiore del numero di indirizzi IP specificato in service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count. Se sono stati specificati meno indirizzi IP, il resto viene allocato in modo dinamico. Il primo indirizzo IP nell'elenco è impostato su Primary. Facoltativo Tutti gli indirizzi IP vengono allocati dinamicamente.
service.beta.kubernetes.io/azure-pls-fqdns "fqdn1 fqdn2" Elenco separato da spazi di nomi di dominio completi associati al pls. Facoltativo []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" o "false" Valore booleano che indica se il protocollo PROXY TCP deve essere abilitato nel PLS per passare le informazioni di connessione, inclusi l'ID di collegamento e l'indirizzo IP di origine. Il servizio back-end DEVE supportare il protocollo PROXY o la connessione non riesce. Facoltativo false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" o "*" Elenco separato da spazi di ID sottoscrizione Azure per cui è visibile il servizio collegamento privato. Usare "*" per esporre il file PLS a tutte le subnet (meno restrittivo). Facoltativo Elenco [] vuoto che indica solo il controllo degli accessi in base al ruolo: questo servizio collegamento privato è disponibile solo per gli utenti con le autorizzazioni di controllo degli accessi in base al ruolo necessarie Azure, inclusi gli utenti autorizzati nei tenant. (Più restrittivo)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Elenco delimitato da spazi di ID sottoscrizione Azure i cui richieste di connessione PE ai PLS vengono approvati automaticamente. L'elenco di approvazione automatica deve essere un subset dell'elenco di visibilità. Facoltativo []

Usare un servizio di bilanciamento del carico interno con reti private

Quando si crea il cluster servizio Azure Kubernetes è possibile specificare impostazioni di rete avanzate. Queste impostazioni consentono di distribuire il cluster in una rete virtuale e nelle subnet di Azure esistenti. Per esempio, si può distribuire il cluster servizio Azure Kubernetes in una rete privata connessa all'ambiente locale e nell'esecuzione dei servizi accessibili solo internamente.

Per altre informazioni, vedere Configurare le proprie subnet di rete virtuale con Kubenet o con Azure CNI.

Non sono necessarie modifiche dei passaggi precedenti per distribuire un servizio di bilanciamento del carico interno in un cluster AKS. Il servizio di bilanciamento del carico viene creato nel gruppo di risorse del nodo per il cluster del servizio Azure Kubernetes e connesso alla rete virtuale privata e alla subnet, come illustrato nell'esempio seguente:

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

Note

L'identità usata dal cluster del servizio Azure Kubernetes deve avere almeno il ruolo di Collaboratore di rete nella risorsa della rete virtuale. È possibile visualizzare l'identità del cluster usando il comando az aks show, ad esempio az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity". È possibile assegnare il ruolo Collaboratore di rete usando il comando az role assignment create, ad esempio az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor".

Se invece si vuole definire un ruolo personalizzato, sono necessarie le autorizzazioni seguenti:

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

Per altre informazioni, vedere Aggiungere, modificare o eliminare una sottorete virtuale.

Specificare una subnet diversa

Aggiungere l'annotazione azure-load-balancer-internal-subnet al servizio per specificare una subnet per il servizio di bilanciamento del carico. La subnet specificata deve essere nella stessa rete virtuale del cluster servizio Azure Kubernetes. Quando viene distribuito, l'indirizzo EXTERNAL-IP del servizio di bilanciamento del carico fa parte della subnet specificata.

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

Impostare il valore dell'annotazione service.beta.kubernetes.io/azure-load-balancer-internal-subnet sulla stringa del nome della subnet, ad esempio "apps-subnet".

Eliminare il servizio di bilanciamento del carico

Il servizio di bilanciamento del carico viene eliminato quando si eliminano tutti i relativi servizi Kubernetes.

È possibile eliminare direttamente un servizio come per qualsiasi risorsa di Kubernetes, ad esempio kubectl delete service internal-app, operazione che comporta anche l'eliminazione del bilanciamento del carico sottostante.

Passaggi successivi

Altre informazioni sui servizi Kubernetes sono disponibili nella documentazione relativa ai servizi Kubernetes.