Usare un indirizzo IP pubblico statico e l'etichetta DNS con il bilanciamento del carico del servizio Azure Kubernetes
Quando si crea una risorsa del servizio di bilanciamento del carico in un cluster del servizio Azure Kubernetes, l'indirizzo IP pubblico assegnato è valido solo per la durata della risorsa. Se si elimina il servizio Kubernetes, vengono eliminati anche il bilanciamento del carico e l'indirizzo IP associati. Se si vuole assegnare un indirizzo IP specifico o mantenere un indirizzo IP per i servizi Kubernetes ridistribuiti, è possibile creare e usare un indirizzo IP pubblico statico.
Questo articolo illustra come creare un indirizzo IP pubblico statico e assegnarlo al servizio Kubernetes.
Operazioni preliminari
- È necessario che sia installata e configurata l'interfaccia della riga di comando di Azure 2.0.59 o versione 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. - Questo articolo illustra l'uso di un indirizzo IP dello SKU Standard con un servizio di bilanciamento del carico Standard. Per altre informazioni, vedere Tipi di indirizzi IP e metodi di allocazione in Azure.
Creare un cluster del servizio Azure Kubernetes
Creare un gruppo di risorse di Azure usando il comando
az group create
.az group create --name myNetworkResourceGroup --location eastus
Creare un cluster del servizio Azure Kubernetes usando il comando
az aks create
.az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
Creare un indirizzo IP statico
Ottenere il nome del gruppo di risorse del nodo usando il comando
az aks show
e la query per la proprietànodeResourceGroup
.az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
Creare un indirizzo IP pubblico statico nel gruppo di risorse del nodo usando il comando
az network public ip create
.az network public-ip create \ --resource-group <node resource group name> \ --name myAKSPublicIP \ --sku Standard \ --allocation-method static
Nota
Se nel cluster del servizio Azure Kubernetes si usa un servizio di bilanciamento del carico dello SKU Basic, usare Basic per il parametro
--sku
quando si definisce un IP pubblico. Solo gli indirizzi IP SKU Basic funzionano con il servizio di bilanciamento del carico dello SKU Basic e solo gli indirizzi IP SKU Standard funzionano con servizi di bilanciamento del carico dello SKU Standard.Ottenere l'indirizzo IP pubblico statico usando il comando
az network public-ip list
. Specificare il nome del gruppo di risorse del nodo e dell'indirizzo IP pubblico creato ed eseguire una query per ilipAddress
.az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
Creare un servizio usando l'indirizzo IP statico
Determinare prima di tutto il tipo di identità gestita usato dal cluster del servizio Azure Kubernetes, assegnato dal sistema o dall'utente. Se non si è certi, chiamare il comando az aks show ed eseguire una query per la proprietà type dell'identità.
az aks show \ --name myAKSCluster \ --resource-group myResourceGroup \ --query identity.type \ --output tsv
Se il cluster usa un'identità gestita, il valore della proprietà type sarà SystemAssigned o UserAssigned.
Se il cluster usa un'entità servizio, il valore della proprietà type sarà Null. Prendere in considerazione l'aggiornamento del cluster per usare un'identità gestita.
Se il cluster del servizio Azure Kubernetes usa un'identità gestita assegnata dal sistema, eseguire una query sull'ID dell’entità di sicurezza dell'identità gestita come indicato di seguito:
# Get the principal ID for a system-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.principalId \ --output tsv)
Se il cluster del servizio Azure Kubernetes usa un'identità gestita assegnata dall'utente, l'ID dell’entità di sicurezza sarà Null. Eseguire invece una query per l'ID client dell'identità gestita assegnata dall'utente:
# Get the client ID for a user-assigned managed identity. CLIENT_ID=$(az aks show \ --name myAKSCluster \ --resource-group myNetworkResourceGroup \ --query identity.userAssignedIdentities.*.clientId \ --output tsv
Assegnare autorizzazioni delegate per l'identità gestita usata dal cluster del servizio Azure Kubernetes per il gruppo di risorse dell’indirizzo IP pubblico chiamando il comando
az role assignment create
.# Get the resource ID for the node resource group. RG_SCOPE=$(az group show \ --name <node resource group> \ --query id \ --output tsv) # Assign the Network Contributor role to the managed identity, # scoped to the node resource group. az role assignment create \ --assignee ${CLIENT_ID} \ --role "Network Contributor" \ --scope ${RG_SCOPE}
Importante
Se è stato personalizzato l'indirizzo IP in uscita, assicurarsi che l'identità del cluster disponga delle autorizzazioni sia per l'indirizzo IP pubblico in uscita che per l'indirizzo IP pubblico in ingresso.
Creare un file denominato
load-balancer-service.yaml
e copiarlo nel contenuto del file YAML seguente, specificando il proprio indirizzo IP pubblico creato nel passaggio precedente e il nome del gruppo di risorse del nodo.Importante
L'aggiunta della proprietà
loadBalancerIP
al manifesto YAML del servizio di bilanciamento del carico è deprecata seguendo 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 impostare le annotazioni del servizio, è possibile usareservice.beta.kubernetes.io/azure-pip-name
per il nome IP pubblico oppure usareservice.beta.kubernetes.io/azure-load-balancer-ipv4
per un indirizzo IPv4 eservice.beta.kubernetes.io/azure-load-balancer-ipv6
per un indirizzo IPv6, come illustrato nell'esempio YAML.apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer
Nota
L'aggiunta dell'annotazione
service.beta.kubernetes.io/azure-pip-name
garantisce la creazione di LoadBalancer più efficiente ed è consigliabile evitare potenziali limitazioni.Impostare un'etichetta DNS pubblica sul servizio usando l'annotazione del servizio
service.beta.kubernetes.io/azure-dns-label-name
. In questo modo viene pubblicato un nome di dominio completo (FQDN) per il servizio usando i server DNS pubblici di Azure e il dominio di primo livello. Il valore dell'annotazione deve essere univoco all'interno della posizione di Azure, quindi è consigliabile usare un'etichetta sufficientemente qualificata. Azure aggiunge automaticamente un suffisso predefinito nel percorso selezionato, ad esempio<location>.cloudapp.azure.com
, al nome specificato, creando il nome FQDN.Nota
Per pubblicare il servizio nel proprio dominio, vedere DNS di Azure e il progetto external-dns.
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name> service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label> name: azure-load-balancer spec: type: LoadBalancer ports: - port: 80 selector: app: azure-load-balancer
Creare il servizio e la distribuzione usando il comando
kubectl apply
.kubectl apply -f load-balancer-service.yaml
Per visualizzare l'etichetta DNS per il servizio di bilanciamento del carico, usare il comando
kubectl describe service
.kubectl describe service azure-load-balancer
L'etichetta DNS verrà elencata sotto il
Annotations
, come illustrato nell'output di esempio condensato seguente:Name: azure-load-balancer Namespace: default Labels: <none> Annotations: service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
Risoluzione dei problemi
Se l'indirizzo IP statico definito nella proprietà loadBalancerIP
del manifesto del servizio Kubernetes non esiste o non è stato creato nel gruppo di risorse del nodo e non sono state configurate altre deleghe, la creazione del servizio di bilanciamento del carico non riesce. Per risolvere i problemi, esaminare gli eventi di creazione del servizio usando il comando kubectl describe
. Specificare il nome del servizio indicato nel manifesto YAML, come illustrato nell'esempio seguente:
kubectl describe service azure-load-balancer
L'output mostra informazioni sulla risorsa del servizio Kubernetes. L'output di esempio seguente mostra un Warning
nel Events
: "user supplied IP address was not found
". In questo scenario, verificare che sia stato creato l'indirizzo IP pubblico statico nel gruppo di risorse del nodo e che l'indirizzo IP specificato nel manifesto del servizio Kubernetes sia corretto.
Name: azure-load-balancer
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=azure-load-balancer
Type: LoadBalancer
IP: 10.0.18.125
IP: 40.121.183.52
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32582/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreatingLoadBalancer 7s (x2 over 22s) service-controller Creating load balancer
Warning CreatingLoadBalancerFailed 6s (x2 over 12s) service-controller Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found
Passaggi successivi
Per un maggiore controllo sul traffico di rete verso le applicazioni, usare il componente aggiuntivo di instradamento dell'applicazione per il servizio Azure Kubernetes. Per altre informazioni sul componente aggiuntivo di instradamento dell'applicazione, vedere Ingresso NGINX gestito con il componente aggiuntivo di instradamento dell'applicazione.
Azure Kubernetes Service