Condividi tramite


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 nel 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 in grado di raggiungere l’IP privato. Queste applicazioni possono trovarsi all'interno della stessa rete virtuale o in un'altra rete virtuale connessa in peering. 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. Per impostazione predefinita, lo SKU Standard viene usato quando si crea un cluster nel servizio Azure Kubernetes. Quando si crea un tipo di servizio LoadBalancer, si otterrà lo stesso tipo di servizio di bilanciamento del carico che si ottiene effettuando 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 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 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 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.

  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 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

Operazioni preliminari

  1. Creare un manifesto del servizio denominato internal-lb-pls.yaml con il tipo di servizio LoadBalancer e le annotazioni azure-load-balancer-internal e azure-pls-create. 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 Servizio 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 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'esempio di output 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.

    # 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 le 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 una risorsa 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à distribuita la risorsa PLS. Questa subnet deve trovarsi 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 delimitato da spazi di fqdns associato a 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, altrimenti le connessioni avranno esito negativo. Facoltativo false
service.beta.kubernetes.io/azure-pls-visibility "sub1 sub2 sub3 … subN" oppure "*" Elenco separato da spazi degli ID sottoscrizione di Azure per cui è visibile il servizio di collegamento privato. Usare "*" per esporre il file PLS a tutte le subnet (meno restrittivo). Facoltativo Elenco [] vuoto che indica che è disponibile solo il controllo degli accessi in base al ruolo. Questo servizio di collegamento privato sarà disponibile solo agli 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 da 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 nelle subnet di Azure esistenti. È possibile ad esempio distribuire il cluster del servizio Azure Kubernetes in una rete privata connessa all'ambiente locali ed eseguire i 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 è connesso alla rete virtuale e alla subnet private, 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à 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 Creare, 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 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
    

Eliminare il servizio di bilanciamento del carico

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

È anche 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 servizio di bilanciamento del carico sottostante.

Passaggi successivi

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