Usare gli IP pubblici a livello di istanza nel servizio Azure Kubernetes (AKS)
I nodi del servizio Azure Kubernetes non richiedono i propri IP pubblici per la comunicazione. Tuttavia, gli scenari possono richiedere che i nodi in un pool di nodi ricevano i propri indirizzi IP pubblici dedicati. Uno scenario comune riguarda i carichi di lavoro di gioco, in cui una console deve stabilire una connessione diretta a una macchina virtuale cloud per ridurre al minimo gli hop. Questo scenario può essere ottenuto nel servizio Azure Kubernetes usando l'IP pubblico del nodo.
Fare clic su Crea un nuovo gruppo di risorse.
az group create --name <resourceGroup> --location <region>
Creare un nuovo cluster del servizio Azure Kubernetes e collegare un IP pubblico per i nodi. Ogni nodo nel pool di nodi riceve un IP pubblico univoco. È possibile verificarlo esaminando le istanze del set di scalabilità di macchine virtuali.
az aks create \
--resource-group <resourceGroup> \
--name <aksClusterName> \
--location <region> \
--enable-node-public-ip \
--generate-ssh-keys
Per i cluster del servizio Azure Kubernetes esistenti, è possibile anche aggiungere un nuovo pool di nodi e collegare un IP pubblico per i nodi.
az aks nodepool add --resource-group <resourceGroup> --cluster-name <aksClusterName> --name <newNodePool> --enable-node-public-ip
Usare un prefisso IP pubblico
Sono molti i vantaggi dell'uso di un prefisso IP pubblico. Il servizio Azure Kubernetes supporta l'uso di indirizzi da un prefisso IP pubblico esistente per i nodi passando l'ID risorsa con il flag --node-public-ip-prefix-id
durante la creazione di un nuovo cluster o l'aggiunta di un pool di nodi.
Innanzitutto, creare un prefisso IP pubblico usando il comando az network public-ip prefix create:
az network public-ip prefix create --length 28 --location <region> --name <publicIPPrefixName> --resource-group <resourceGroup>
Visualizzare l'output e prendere nota dell'id
per il prefisso:
{
...
"id": "/subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName>",
...
}
Infine, quando si crea un nuovo cluster o si aggiunge un nuovo pool di nodi, usare il flag --node-public-ip-prefix-id
e passare l'ID risorsa del prefisso:
az aks create \
--resource-group <resourceGroup> \
--name <aksClusterName> \
--location <region> \
--enable-node-public-ip \
--node-public-ip-prefix-id /subscriptions/<subscription-id>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/publicIPPrefixes/<publicIPPrefixName> \
--generate-ssh-keys
Individuare IP pubblici per i nodi
Per individuare gli IP pubblici per i nodi è possibile usare le seguenti procedure:
- Usare il comando
az vmss list-instance-public-ips
dell'interfaccia della riga di comando di Azure. - Usare i comandi di PowerShell o Bash.
- È possibile anche individuare gli IP pubblici nel portale di Azure visualizzando le istanze nel set di scalabilità di macchine virtuali.
Importante
Il gruppo di risorse del nodo contiene i nodi e i relativi IP pubblici. Usare il gruppo di risorse del nodo durante l'esecuzione dei comandi per individuare gli IP pubblici per i nodi.
az vmss list-instance-public-ips --resource-group <MC_region_aksClusterName_region> --name <virtualMachineScaleSetName>
Usare tag IP pubblici in indirizzi IP pubblici del nodo
I tag di IP pubblici possono essere usati negli IP pubblici dei nodi per applicare la funzionalità Preferenza di routing di Azure.
Requisiti
- È necessario il servizio Azure Kubernetes versione 1.29 o successiva.
Creare un nuovo cluster usando la preferenza di routing Internet
az aks create \
--name <aksClusterName> \
--location <region> \
--resource-group <resourceGroup> \
--enable-node-public-ip \
--node-public-ip-tags RoutingPreference=Internet \
--generate-ssh-keys
Aggiungere un pool di nodi con la preferenza di routing Internet
az aks nodepool add --cluster-name <aksClusterName> \
--name <nodePoolName> \
--location <region> \
--resource-group <resourceGroup> \
--enable-node-public-ip \
--node-public-ip-tags RoutingPreference=Internet
Consentire le connessioni alle porte host e aggiungere pool di nodi ai gruppi di sicurezza delle applicazioni
I nodi del servizio Azure Kubernetes che usano IP pubblici dei nodi che ospitano i servizi nell'indirizzo host devono avere una regola del gruppo di sicurezza di rete aggiunta per consentire il traffico. L'aggiunta delle porte desiderate nella configurazione del pool di nodi creerà le regole di autorizzazione appropriate nel gruppo di sicurezza di rete del cluster.
Se nella subnet è presente un gruppo di sicurezza di rete con un cluster che usa una rete virtuale bring-your-own, è necessario aggiungere una regola di autorizzazione a tale gruppo di sicurezza di rete. Ciò può essere limitato ai nodi di un determinato pool di nodi aggiungendo il pool di nodi a un gruppo di sicurezza delle applicazioni (ASG). Un ASG verrà creato per impostazione predefinita nel gruppo di risorse gestite se sono specificate le porte host consentite. I nodi possono anche essere aggiunti a uno o più gruppi di sicurezza di rete personalizzati specificando l'ID risorsa dei gruppi di sicurezza di rete nei parametri del pool di nodi.
Formato della specifica della porta host
Quando si specifica l'elenco di porte da consentire, usare un elenco separato da virgole con voci nel formato di port/protocol
o startPort-endPort/protocol
.
Esempi:
- 80/tcp
- 80/tcp,443/tcp
- 53/udp,80/tcp
- 50000-60000/tcp
Requisiti
- È necessario il servizio Azure Kubernetes versione 1.29 o successiva.
Creare un nuovo cluster con porte consentite e gruppi di sicurezza delle applicazioni
az aks create \
--resource-group <resourceGroup> \
--name <aksClusterName> \
--nodepool-name <nodePoolName> \
--nodepool-allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp\
--nodepool-asg-ids "<asgId>,<asgId>" \
--generate-ssh-keys
Aggiungere un nuovo pool con porte consentite e gruppi di sicurezza delle applicazioni
az aks nodepool add \
--resource-group <resourceGroup> \
--cluster-name <aksClusterName> \
--name <nodePoolName> \
--allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
--asg-ids "<asgId>,<asgId>"
Aggiornare le porte consentite e i gruppi di sicurezza delle applicazioni per un pool di nodi
az aks nodepool update \
--resource-group <resourceGroup> \
--cluster-name <aksClusterName> \
--name <nodePoolName> \
--allowed-host-ports 80/tcp,443/tcp,53/udp,40000-60000/tcp,40000-50000/udp \
--asg-ids "<asgId>,<asgId>"
Assegnare automaticamente le porte host per i carichi di lavoro dei pod (ANTEPRIMA)
Quando gli IP pubblici sono configurati nei nodi, è possibile usare le porte host per consentire ai pod di ricevere direttamente il traffico senza dover configurare un servizio di bilanciamento del carico. Ciò è particolarmente utile in scenari come il gioco, in cui la natura temporanea dell'IP del nodo e della porta non è un problema perché un servizio matchmaker in un nome host noto può fornire l'host e la porta corretti da usare in fase di connessione. Tuttavia, poiché un solo processo in un host può essere in ascolto sulla stessa porta, l'uso di applicazioni con porte host può causare problemi con la pianificazione. Per evitare questo problema, il servizio Azure Kubernetes consente al sistema di assegnare dinamicamente una porta disponibile in fase di pianificazione, impedendo i conflitti.
Avviso
Il traffico della porta host del pod verrà bloccato dalle regole predefinite del gruppo di sicurezza di rete sul cluster. Questa funzione deve essere combinata con l'autorizzazione delle porte host sul pool di nodi per consentire il flusso del traffico.
Importante
Le funzionalità di anteprima del servizio Azure Kubernetes sono disponibili in modalità self-service e opzionale. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:
Requisiti
- È necessario il servizio Azure Kubernetes versione 1.29 o successiva.
Registrare il flag di funzionalità "PodHostPortAutoAssignPreview"
Registrare il flag di funzionalità PodHostPortAutoAssignPreview
usando il comando az feature register, come illustrato nell'esempio seguente:
az feature register --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"
Sono necessari alcuni minuti per visualizzare lo stato Registered. Verificare lo stato della registrazione usando il comando az feature show:
az feature show --namespace "Microsoft.ContainerService" --name "PodHostPortAutoAssignPreview"
Quando lo stato diventa Registrato, aggiornare la registrazione del provider di risorse Microsoft.ContainerService usando il comando az provider register:
az provider register --namespace Microsoft.ContainerService
Assegnare automaticamente una porta host a un pod
L'attivazione dell'assegnazione automatica delle porte host viene eseguita distribuendo un carico di lavoro senza porte host e applicando l'annotazione kubernetes.azure.com/assign-hostports-for-containerports
con l'elenco di porte che richiedono assegnazioni di porte host. Il valore dell'annotazione deve essere specificato come elenco delimitato da virgole di voci come port/protocol
, dove la porta è un singolo numero di porta definito nella specifica Pod e il protocollo è tcp
o udp
.
Le porte verranno assegnate dall'intervallo 40000-59999
e saranno univoche nel cluster. Le porte assegnate verranno aggiunte anche alle variabili di ambiente all'interno del pod, in modo che l'applicazione possa determinare quali porte sono state assegnate. Il nome della variabile di ambiente sarà nel formato seguente (esempio in basso): <deployment name>_PORT_<port number>_<protocol>_HOSTPORT
, quindi un esempio potrebbe essere mydeployment_PORT_8080_TCP_HOSTPORT: 41932
.
Di seguito è riportato un esempio di distribuzione echoserver
, che mostra il mapping delle porte host per le porte 8080 e 8443:
apiVersion: apps/v1
kind: Deployment
metadata:
name: echoserver-hostport
labels:
app: echoserver-hostport
spec:
replicas: 3
selector:
matchLabels:
app: echoserver-hostport
template:
metadata:
annotations:
kubernetes.azure.com/assign-hostports-for-containerports: 8080/tcp,8443/tcp
labels:
app: echoserver-hostport
spec:
nodeSelector:
kubernetes.io/os: linux
containers:
- name: echoserver-hostport
image: k8s.gcr.io/echoserver:1.10
ports:
- name: http
containerPort: 8080
protocol: TCP
- name: https
containerPort: 8443
protocol: TCP
Quando viene applicata la distribuzione, le voci hostPort
saranno incluse nel file YAML dei singoli pod:
$ kubectl describe pod echoserver-hostport-75dc8d8855-4gjfc
<cut for brevity>
Containers:
echoserver-hostport:
Container ID: containerd://d0b75198afe0612091f412ee7cf7473f26c80660143a96b459b3e699ebaee54c
Image: k8s.gcr.io/echoserver:1.10
Image ID: k8s.gcr.io/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 Ports: 8080/TCP, 8443/TCP
Host Ports: 46645/TCP, 49482/TCP
State: Running
Started: Thu, 12 Jan 2023 18:02:50 +0000
Ready: True
Restart Count: 0
Environment:
echoserver-hostport_PORT_8443_TCP_HOSTPORT: 49482
echoserver-hostport_PORT_8080_TCP_HOSTPORT: 46645
Passaggi successivi
Informazioni sull'uso di più pool di nodi nel servizio Azure Kubernetes.
Informazioni sull'uso dei bilanciamenti del carico e delle zone di disponibilità nel servizio Azure Kubernetes
Azure Kubernetes Service