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
- Questo articolo presuppone che si disponga di un cluster del servizio Azure Kubernetes esistente. Se è necessario un cluster del servizio Azure Kubernetes, è possibile crearne uno usando l'interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
- È necessaria l'interfaccia della riga di comando di Azure versione 2.0.59 o successiva. Eseguire
az --version
per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure. - Se si vuole usare una subnet o un gruppo di risorse esistente, l'identità del cluster del servizio Azure Kubernetes deve disporre dell'autorizzazione per gestire le risorse di rete. Per informazioni, vedere Usare la rete kubenet con i propri intervalli di indirizzi IP nel servizio Azure Kubernetes o Configurare la rete CNI di Azure nel servizio Azure Kubernetes. Se si sta configurando il servizio di bilanciamento del carico per l'uso di un indirizzo IP in una subnet diversa, assicurarsi che l'identità del cluster del servizio Azure Kubernetes disponga anche dell'accesso in lettura a tale subnet.
- Per altre informazioni sulle autorizzazioni, vedere Delegare l'accesso del servizio Azure Kubernetes ad altre risorse di Azure.
Creare un bilanciamento del carico interno
Creare un manifesto del servizio denominato
internal-lb.yaml
con il tipo diLoadBalancer
servizio e l'annotazioneazure-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
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
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.
- Impostare le annotazioni del servizio
- Aggiungere la proprietà LoadBalancerIP al manifesto YAML del servizio di bilanciamento del carico
Impostare le annotazioni del servizio usando
service.beta.kubernetes.io/azure-load-balancer-ipv4
per un indirizzo IPv4 eservice.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
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
Connettere il servizio Collegamento privato di Azure a Load Balancer interno
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.
Creare una connessione al servizio collegamento privato
Creare un manifesto del servizio denominato
internal-lb-pls.yaml
con il tipo diLoadBalancer
servizio e leazure-load-balancer-internal
annotazioni eazure-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
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
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
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
Creare un endpoint privato al servizio collegamento privato
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 servizioEXTERNAL-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.