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

È possibile creare e usare un servizio di bilanciamento del carico interno per limitare l'accesso alle applicazioni in servizio Azure Kubernetes (servizio Azure Kubernetes). Un servizio di bilanciamento del carico interno non ha un indirizzo IP pubblico e rende un servizio Kubernetes accessibile solo alle applicazioni che possono raggiungere l'INDIRIZZO IP privato. Queste applicazioni possono trovarsi all'interno della stessa rete virtuale o in un'altra rete virtuale tramite il peering reti virtuali. Questo articolo illustra come creare e usare un servizio di bilanciamento del carico interno con il servizio Azure Kubernetes.

Nota

Azure Load Balancer è disponibile in due SKU: Basic e Standard. Lo SKU Standard viene usato per impostazione predefinita quando si crea un cluster del servizio Azure Kubernetes. Quando si crea un tipo di servizio LoadBalancer , si otterrà lo stesso tipo di servizio di bilanciamento del carico di quando è stato effettuato il provisioning del cluster. Per altre informazioni, vedere Confronto tra SKU di Load Balancer.

Operazioni preliminari

Creare un bilanciamento del carico interno

  1. Creare un manifesto del servizio denominato internal-lb.yaml con il tipo di LoadBalancer servizio 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 kubectl apply comando . 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 kubectl get service comando .

    kubectl get service internal-app
    

    L'indirizzo IP del servizio di bilanciamento del EXTERNAL-IP carico interno viene visualizzato nella colonna , 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 specificato deve trovarsi nella stessa subnet del cluster del servizio Azure Kubernetes, ma non può essere già assegnato a una risorsa. Ad esempio, non è consigliabile usare un indirizzo IP nell'intervallo designato per la subnet Kubernetes all'interno del cluster del servizio Azure Kubernetes.

È possibile usare il comando dell'interfaccia della az network vnet subnet list riga di comando di Azure o il Get-AzVirtualNetworkSubnetConfig 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 manifesto YAML del servizio di bilanciamento del carico.

Importante

L'aggiunta della proprietà LoadBalancerIP al manifesto YAML del servizio di bilanciamento del carico è 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.

  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
    
  1. Visualizzare i dettagli del servizio usando il kubectl get service comando .

    kubectl get service internal-app
    

    L'indirizzo IP nella EXTERNAL-IP colonna 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

Operazioni preliminari

  • È necessario Kubernetes versione 1.22.x o successiva.
  • È necessario un gruppo di risorse esistente con una rete virtuale e una subnet. Questo gruppo di risorse è il punto in cui si crea l'endpoint privato. Se queste risorse non sono disponibili, vedere Creare una rete virtuale e una subnet.
  1. Creare un manifesto del servizio denominato internal-lb-pls.yaml con il tipo di LoadBalancer servizio e le azure-load-balancer-internal annotazioni e azure-pls-create . Per altre opzioni, vedere il documento di progettazione di integrazione dei servizi 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 kubectl apply comando . 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 associato al servizio Kubernetes.

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

    kubectl get service internal-app
    

    L'indirizzo IP del servizio di bilanciamento del EXTERNAL-IP carico interno viene visualizzato nella colonna , 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 service collegamento privato usando il az network private-link-service list comando .

    # 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 az network private-endpoint create comando .

    # 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
    

Personalizzazioni PLS tramite annotazioni

Di seguito sono riportate le annotazioni che possono essere usate per personalizzare la risorsa PLS.

Annotazione Valore Descrizione Richiesto Valore predefinito
service.beta.kubernetes.io/azure-pls-create "true" Valore booleano che indica se è necessario creare un file PLS. Richiesto
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 verrà 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 verrà distribuito il file PLS. Questa subnet deve trovarsi nella stessa rete virtuale del pool back-end. Gli INDIRIZZI 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 di 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 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 delimitato da spazi di fqdns associato al pls. Facoltativo []
service.beta.kubernetes.io/azure-pls-proxy-protocol "true" oppure "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. Si noti che il servizio back-end DEVE supportare il protocollo PROXY o che le connessioni avranno esito negativo. Facoltativo false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" oppure "*" Elenco separato di spazi degli ID sottoscrizione di Azure per cui è visibile il servizio collegamento privato. Usare "*" per esporre il file PLS a tutti i sub (meno restrittivo). Facoltativo Elenco [] vuoto che indica solo il controllo degli accessi in base al ruolo: questo servizio di collegamento privato sarà disponibile solo per gli utenti con autorizzazioni di controllo degli accessi in base al ruolo all'interno della directory. (Più restrittivo)
service.beta.kubernetes.io/azure-pls-auto-approval "sub1 sub2 sub3 … subN" Elenco separato di spazi degli ID sottoscrizione di Azure. Ciò consente di approvare automaticamente le richieste di connessione PE dalle sottoscrizioni elencate nel file PLS. Questa operazione funziona solo quando la visibilità è impostata su "*". Facoltativo []

Usare le 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 subnet di Azure esistenti. Ad esempio, è possibile distribuire il cluster del servizio Azure Kubernetes in una rete privata connessa all'ambiente locale ed eseguire servizi accessibili solo internamente.

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

Non è necessario apportare modifiche ai passaggi precedenti per distribuire un servizio di bilanciamento del carico interno che usa una rete privata in un cluster del servizio Azure Kubernetes. Il servizio di bilanciamento del carico viene creato nello stesso gruppo di risorse del cluster del servizio Azure Kubernetes, ma è invece 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

Nota

L'identità del cluster usata dal cluster del servizio Azure Kubernetes deve avere almeno il ruolo Collaboratore rete nella risorsa di rete virtuale. È possibile visualizzare l'identità del cluster usando il az aks show comando , ad esempio az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity". È possibile assegnare il ruolo Collaboratore rete usando il az role assignment create comando , 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 subnet di rete 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 del servizio EXTERNAL-IP 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
    

Eliminare il servizio di bilanciamento del carico

Il servizio di bilanciamento del carico viene eliminato quando vengono eliminati tutti i relativi servizi.

Come per qualsiasi risorsa Kubernetes, è possibile eliminare direttamente un servizio, ad esempio kubectl delete service internal-app, che elimina anche il servizio di bilanciamento del carico di Azure sottostante.

Passaggi successivi

Per altre informazioni sui servizi Kubernetes, vedere la documentazione dei servizi Kubernetes.