Provisioning dei load balancer di rete OCI per i servizi Kubernetes di tipo LoadBalancer
Scopri come eseguire il provisioning di un load balancer di rete OCI per un servizio Kubernetes di tipo LoadBalancer utilizzando Kubernetes Engine (OKE).
Questa sezione descrive come eseguire il provisioning di un load balancer di rete OCI per un servizio Kubernetes di tipo LoadBalancer.
Un load balancer di rete Oracle Cloud Infrastructure è una soluzione di bilanciamento del carico non proxy che esegue il bilanciamento del carico pass-through dei carichi di lavoro OSI layer 3 e layer 4 (TCP/UDP/ICMP). Offre un indirizzo IP virtuale (VIP) regionale elasticamente scalabile che può essere scalato in base al traffico del client senza alcun requisito di configurazione della larghezza di banda minima o massima. Offre inoltre i vantaggi dell'alta disponibilità del flusso, dell'indirizzo IP di origine e destinazione e della conservazione delle porte.
Per ulteriori informazioni sui load balancer di rete di Oracle Cloud Infrastructure, vedere Panoramica del load balancer di rete flessibile.
Il provisioning di un load balancer di rete OCI per un servizio Kubernetes di tipo LoadBalancer consente di:
- traffico del bilanciamento del carico con throughput elevato e bassa latenza
- preservare gli indirizzi IP e le porte di origine e destinazione
- gestire il traffico TCP e UDP
Tenere presente che quando Kubernetes Engine esegue il provisioning di un load balancer di rete OCI per un servizio Kubernetes di tipo LoadBalancer, le regole di sicurezza per consentire il traffico in entrata e in uscita verso e dalla subnet del load balancer di rete non vengono create automaticamente per impostazione predefinita. Devi definire regole di sicurezza appropriate per consentire il traffico in entrata e in uscita da e verso la subnet del load balancer o del load balancer di rete. Vedere Regole di sicurezza per i load balancer e i load balancer di rete.
Utilizzare le metriche del load balancer di rete OCI per monitorare lo stato di un load balancer di rete OCI di cui è stato eseguito il provisioning per un servizio Kubernetes di tipo LoadBalancer (vedere Metriche del load balancer di rete).
Specifica dell'annotazione per un load balancer di rete OCI
Per eseguire il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:
oci.oraclecloud.com/load-balancer-type: "nlb"
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
Si noti che lb
è il valore predefinito dell'annotazione oci.oraclecloud.com/load-balancer-type
. Se non si include esplicitamente l'annotazione nella definizione del servizio, viene utilizzato il valore predefinito dell'annotazione e viene eseguito il provisioning di un load balancer (anziché di un load balancer di rete).
Interruzione delle richieste nel nodo di ricezione
Quando si esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, è possibile specificare che le richieste vengano terminate all'indirizzo IP del client specificato nelle intestazioni dei pacchetti IP, anziché essere impostate come proxy su altri nodi di lavoro nel cluster.
Per impostazione predefinita, le richieste vengono inviate tramite proxy ad altri nodi di lavoro nel cluster.
La specifica che le richieste vengono terminate all'indirizzo IP del client (anziché essere proxy) può migliorare le prestazioni nei cluster di grandi dimensioni con migliaia di nodi di lavoro eliminando il traffico tra i nodi di lavoro. La specifica che le richieste vengono arrestate all'indirizzo IP del client può anche semplificare l'implementazione e rimuovere potenziali problemi di sicurezza consentendo di impostare le regole di sicurezza (in un gruppo di sicurezza di rete (consigliato) e/o una lista di sicurezza) per i nodi di lavoro nel cluster che consentono solo il traffico in entrata dal blocco CIDR del load balancer di rete.
Per terminare le richieste all'indirizzo IP del client, aggiungere la seguente impostazione nella sezione specifica del file manifesto:
externalTrafficPolicy: Local
Per delegare le richieste ad altri nodi di lavoro nel cluster, aggiungere la seguente impostazione nella sezione delle specifiche del file manifesto:
externalTrafficPolicy: Cluster
Si noti che Cluster
è il valore predefinito dell'impostazione externalTrafficPolicy
. Se l'impostazione non viene inclusa in modo esplicito nella definizione del servizio, viene utilizzato il valore predefinito dell'impostazione.
Inoltre, se externalTrafficPolicy
è impostato su Cluster
, gli indirizzi IP del client non vengono conservati indipendentemente dal valore dell'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source
. Le richieste non riescono con un errore se externalTrafficPolicy
è impostato su Cluster
e l'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source
è impostata in modo esplicito su true
o false
. Vedere Preserving the Client IP Address.
Per terminare le richieste all'indirizzo IP del client, è inoltre necessario aver impostato le regole di sicurezza riportate di seguito.
- È necessario aver impostato una regola di sicurezza (in un gruppo di sicurezza di rete (consigliato) e/o una lista di sicurezza) per i nodi di lavoro nel cluster per consentire il traffico in entrata dal blocco CIDR in cui vengono effettuate le connessioni client a tutte le porte dei nodi (
30000 to 32767
). Se l'applicazione è esposta a Internet, impostare il blocco CIDR Origine della regola di sicurezza su 0.0.0.0/0. In alternativa, impostare il blocco CIDR Origine della regola di sicurezza su un blocco CIDR specifico (ad esempio, se le connessioni client provengono da una subnet specifica).Stato Origine Protocollo/destinazione. Porta descrizione; Con conservazione dello stato 0.0.0.0/0 o CIDR subnet TUTTI/30000-32767 Consenti ai nodi di lavoro di ricevere connessioni tramite il load balancer di rete OCI. -
È necessario aver impostato le regole di sicurezza di entrata e uscita per il load balancer di rete, come descritto in Regole di sicurezza per i load balancer e i load balancer di rete.
Ad esempio, ecco una definizione di servizio Kubernetes per terminare le richieste all'indirizzo IP del client (anziché essere proxy):
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "nlb"
oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
type: LoadBalancer
externalTrafficPolicy: Local
ports:
- port: 80
selector:
app: nginx
Conservazione dell'indirizzo IP client
Quando si esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, è possibile specificare se conservare o impedire la conservazione dell'indirizzo IP del client nelle intestazioni dei pacchetti IP.
È possibile preservare gli indirizzi IP dei client solo quando le richieste vengono terminate negli indirizzi IP dei client specificati nelle intestazioni dei pacchetti IP. In altre parole, quando l'impostazione externalTrafficPolicy
è impostata su Local
. Se externalTrafficPolicy
è impostato su Cluster
, gli indirizzi IP dei client non vengono preservati. Vedere Terminazione delle richieste nel nodo di ricezione.
Per impedire la conservazione degli indirizzi IP dei client, aggiungere la seguente annotazione nella sezione dei metadati del file manifesto:
oci-network-load-balancer.oraclecloud.com/is-preserve-source: "false"
Per conservare l'indirizzo IP del client, aggiungere la seguente annotazione nella sezione dei metadati del file manifesto:
oci-network-load-balancer.oraclecloud.com/is-preserve-source: "true"
Si noti che true
è il valore predefinito dell'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source
. Se l'annotazione non viene inclusa in modo esplicito nella definizione del servizio, viene utilizzato il valore predefinito dell'annotazione.
Inoltre, se externalTrafficPolicy
è impostato su Cluster
, gli indirizzi IP del client non vengono conservati indipendentemente dal valore dell'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source
. Le richieste non riescono con un errore se externalTrafficPolicy
è impostato su Cluster
e l'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source
è impostata in modo esplicito su true
o false
. Pertanto, non aggiungere l'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source
se externalTrafficPolicy
è impostato su Cluster
.
È possibile preservare gli indirizzi IP dei client quando si utilizzano i pool di nodi gestiti, ma non quando si utilizzano i pool di nodi virtuali.
Per preservare l'indirizzo IP del client, è necessario anche impostare le regole di sicurezza riportate di seguito.
- È necessario aver impostato una regola di sicurezza (in un gruppo di sicurezza di rete (consigliato) e/o una lista di sicurezza) per i nodi di lavoro nel cluster per consentire il traffico in entrata dal blocco CIDR in cui vengono effettuate le connessioni client a tutte le porte dei nodi (
30000 to 32767
). Se l'applicazione è esposta a Internet, impostare il blocco CIDR Origine della regola di sicurezza su 0.0.0.0/0. In alternativa, impostare il blocco CIDR Origine della regola di sicurezza su un blocco CIDR specifico (ad esempio, se le connessioni client provengono da una subnet specifica).Stato Origine Protocollo/destinazione. Porta descrizione; Con conservazione dello stato 0.0.0.0/0 o CIDR subnet TUTTI/30000-32767 Consenti ai nodi di lavoro di ricevere connessioni tramite il load balancer di rete OCI. -
È necessario aver impostato le regole di sicurezza di entrata e uscita per il load balancer di rete, come descritto in Regole di sicurezza per i load balancer e i load balancer di rete.
Ad esempio, ecco una definizione di servizio Kubernetes che impedisce la conservazione dell'indirizzo IP del client:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "nlb"
oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
oci-network-load-balancer.oraclecloud.com/is-preserve-source: "false"
spec:
type: LoadBalancer
externalTrafficPolicy: Local
ports:
- port: 80
selector:
app: nginx
Visualizzazione delle applicazioni TCP e UDP
Quando Kubernetes Engine esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, è possibile definire il tipo di traffico accettato dal listener specificando il protocollo su cui il listener accetta le richieste di connessione.
Se non si specifica esplicitamente un protocollo, come valore predefinito viene utilizzato "TCP".
Per specificare in modo esplicito il protocollo del listener quando Kubernetes Engine esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, aggiungere la seguente impostazione nella sezione delle specifiche del file manifesto:
protocol: <value>
dove <value>
è il protocollo che definisce il tipo di traffico accettato dal listener. Ad esempio "UDP". I protocolli validi includono "UDP" e "TCP".
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
type: LoadBalancer
ports:
- port: 80
protocol: UDP
selector:
app: nginx
Specifica del criterio del set backend
Quando Kubernetes Engine esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, è possibile definire un criterio per il set backend in modo da specificare come distribuire il traffico in entrata ai server backend.
Per ulteriori informazioni vedere Specifica dei criteri del set backend.
Specifica delle opzioni di gestione delle liste di sicurezza durante il provisioning di un load balancer di rete OCI
Potresti riscontrare problemi di scalabilità e di altro tipo se utilizzi la funzione di gestione delle liste di sicurezza Kubernetes in distribuzioni complesse e con strumenti come Terraform. Per questi motivi, Oracle sconsiglia di utilizzare la funzione di gestione degli elenchi di sicurezza Kubernetes negli ambienti di produzione.
Tenere inoltre presente che la possibilità di utilizzare gli elenchi di sicurezza per gestire le regole di sicurezza non sarà più valida nelle prossime release. Per questo motivo, Oracle consiglia di utilizzare i gruppi di sicurezza di rete (NSG) e l'annotazione oci.oraclecloud.com/security-rule-management-mode
(vedere Specifica delle opzioni di gestione delle regole di sicurezza per i load balancer e i load balancer di rete).
Puoi utilizzare la funzione di gestione delle liste di sicurezza per configurare la modalità di gestione delle regole delle liste di sicurezza per un load balancer di rete Oracle Cloud Infrastructure di cui Kubernetes Engine esegue il provisioning per un servizio Kubernetes di tipo LoadBalancer. Questa funzione è utile se non hai mai utilizzato Kubernetes o per le distribuzioni di base.
Per specificare in che modo la funzione di gestione delle liste di sicurezza Kubernetes gestisce le liste di sicurezza quando Kubernetes Engine esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, aggiungere la seguente annotazione nella sezione dei metadati del file manifesto:
oci-network-load-balancer.oraclecloud.com/security-list-management-mode: <value>
dove <value>
è uno dei seguenti:
"None"
: (impostazione predefinita e consigliata) Nessuna gestione delle liste di sicurezza abilitata. È necessario impostare una regola di sicurezza che consenta il traffico in entrata verso le porte appropriate per gli intervalli di porte dei nodi, la porta di integrità kube-proxy e gli intervalli di porte per il controllo dello stato. Inoltre, devi impostare regole di sicurezza per consentire il traffico in entrata verso i load balancer di rete (vedere Regole di sicurezza per i load balancer e i load balancer di rete)."All"
: vengono gestite tutte le regole della lista di sicurezza necessarie per i servizi del load balancer di rete."Frontend"
: vengono gestite solo le regole della lista di sicurezza per i servizi del load balancer di rete in entrata. È necessario impostare una regola di sicurezza che consenta il traffico in entrata verso le porte appropriate per gli intervalli di porte dei nodi, la porta di integrità kube-proxy e gli intervalli di porte per il controllo dello stato.
Oracle consiglia di impostare in modo esplicito oci-network-load-balancer.oraclecloud.com/security-list-management-mode
su None
.
Nei cluster con nodi gestiti, se non si specifica in modo esplicito una modalità di gestione, la gestione delle liste di sicurezza non è abilitata (equivalente a "None"
). Nei cluster con nodi virtuali, la gestione delle liste di sicurezza non viene mai abilitata e sarà sempre necessario configurare manualmente le regole di sicurezza (equivalente a "None"
).
Tenere presente che esistono limiti al numero di regole di entrata e uscita consentite in una lista di sicurezza (vedere Limiti della lista di sicurezza). Se il numero di regole di entrata o uscita supera il limite e <value>
è impostato su "All"
o "Frontend"
, la creazione o l'aggiornamento del load balancer non riesce.
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "nlb"
oci-network-load-balancer.oraclecloud.com/security-list-management-mode: "Frontend"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx