Provisioning dei load balancer OCI per i servizi Kubernetes di tipo LoadBalancer
Scopri come eseguire il provisioning di un load balancer OCI per un servizio Kubernetes di tipo LoadBalancer utilizzando Kubernetes Engine (OKE).
Un load balancer di Oracle Cloud Infrastructure (OCI) è un proxy di livello 4 (TCP) OSI e 7 (HTTP), che supporta funzioni come l'interruzione SSL e i criteri di instradamento HTTP avanzati. Offre la massima flessibilità, con scalabilità reattiva su e giù. Scegli una larghezza di banda minima personalizzata e una larghezza di banda massima facoltativa, entrambe comprese tra 10 Mbps e 8.000 Mbps. La larghezza di banda minima è sempre disponibile e offre disponibilità immediata per i carichi di lavoro.
Per ulteriori informazioni sui load balancer OCI, vedere Panoramica del load balancer.
Il provisioning di un load balancer OCI per un servizio Kubernetes di tipo LoadBalancer consente di:
- trasporto bilanciamento del carico Livello 4 e Livello 7 (TCP e HTTP) traffico
- arrestare SSL/TLS nel load balancer
Quando Kubernetes Engine esegue il provisioning di un load balancer 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 vengono create automaticamente per impostazione predefinita. Vedere Regole di sicurezza per i load balancer e i load balancer di rete.
Utilizzare le metriche del load balancer OCI per monitorare lo stato di un load balancer OCI di cui è stato eseguito il provisioning per un servizio Kubernetes di tipo LoadBalancer (vedere Metriche del load balancer).
Specifica dell'annotazione per un load balancer OCI
oci.oraclecloud.com/load-balancer-type: "lb"
Si noti che lb è il valore predefinito dell'annotazione oci.oraclecloud.com/load-balancer-type. Se l'annotazione non viene inclusa in modo esplicito nella definizione del servizio, viene utilizzato il valore predefinito dell'annotazione.
Considerare, ad esempio il file di configurazione nginx_lb.yaml. Definisce una distribuzione (kind: Deployment) per l'applicazione nginx, seguita da una definizione di un servizio di tipo LoadBalancer (type: LoadBalancer) che bilancia il traffico http sulla porta 80 per l'applicazione nginx.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxLa prima parte del file di configurazione definisce una distribuzione Nginx, richiedendo che venga ospitata in 3 pod che eseguono l'immagine nginx:latest e che accetti il traffico verso i container sulla porta 80.
La seconda parte del file di configurazione definisce il servizio Nginx, che utilizza il tipo LoadBalancer per bilanciare il traffico Nginx sulla porta 80 tra i pod disponibili.
Per creare la distribuzione e il servizio definiti in nginx_lb.yaml durante la connessione al cluster Kubernetes, immettere il comando riportato di seguito.
kubectl apply -f nginx_lb.yamlAl completamento della creazione della distribuzione e del load balancer, questo comando restituisce quanto riportato di seguito.
deployment "my-nginx" created
service "my-nginx-svc" created
Il load balancer potrebbe richiedere alcuni minuti per passare da uno stato in sospeso a completamente operativo. È possibile visualizzare lo stato corrente del cluster immettendo:
kubectl get allL'output del comando precedente mostra lo stato corrente:
NAME READY STATUS RESTARTS AGE
po/my-nginx-431080787-0m4m8 1/1 Running 0 3m
po/my-nginx-431080787-hqqcr 1/1 Running 0 3m
po/my-nginx-431080787-n8125 1/1 Running 0 3m
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/kubernetes 203.0.113.1 <NONE> 443/TCP 3d
svc/my-nginx-svc 203.0.113.7 192.0.2.22 80:30269/TCP 3m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/my-nginx 3 3 3 3 3m
NAME DESIRED CURRENT READY AGE
rs/my-nginx-431080787 3 3 3 3m
L'output mostra che la distribuzione my-nginx è in esecuzione su 3 pod (le voci po/my-nginx), che il load balancer è in esecuzione (svc/my-nginx-svc) e che dispone di un IP esterno (192.0.2.22) che i client possono utilizzare per connettersi all'applicazione distribuita nei pod.
Arresto di SSL/TLS nel load balancer (SSL frontend)
Quando esegui il provisioning di un load balancer Oracle Cloud Infrastructure (OCI) per un servizio Kubernetes di tipo LoadBalancer, puoi configurarlo per arrestare il traffico SSL/TLS. Questa configurazione, spesso definita SSL frontend, garantisce che il traffico cifrato proveniente da Internet venga decifrato nel load balancer prima di essere inoltrato ai nodi di lavoro.
L'implementazione dell'interruzione SSL a livello di load balancer comporta l'offload del processo di decifrazione intensivo dai pod delle applicazioni, la semplificazione della gestione dei certificati e il miglioramento delle prestazioni backend.
Tenere presente che è possibile implementare la cifratura SSL point-to-point completa tra client e pod delle applicazioni in esecuzione sui nodi di lavoro. A tale scopo, configurare l'interruzione SSL nel load balancer (come descritto in questa sezione) e implementare anche il protocollo SSL backend tra il load balancer e i nodi di lavoro (vedere Implementazione di SSL/TLS tra il load balancer e i nodi di lavoro (backend SSL)).
Scegliere un metodo di gestione dei certificati per SSL frontend
A seconda dei requisiti di sicurezza e del modo in cui gestisci il ciclo di vita dei certificati, scegli uno dei seguenti metodi per implementare la cifratura SSL frontend:
-
Segreti Kubernetes: ottimali per i certificati gestiti all'interno del cluster o da provider di terze parti (ad esempio Let's Encrypt). Per i passi di implementazione dettagliati, consulta la sezione relativa all'interruzione di SSL/TLS nel load balancer mediante i segreti Kubernetes.
-
Servizio certificati OCI: consigliato per gli ambienti di produzione, questo metodo utilizza la gestione dei certificati nativi di OCI per abilitare funzioni come la rotazione automatica dei certificati senza richiedere aggiornamenti del file manifesto. Per ulteriori informazioni, vedere Arresto di SSL/TLS presso il load balancer mediante il servizio OCI Certificates.
Si noti che questi metodi si escludono a vicenda per un determinato servizio di tipo LoadBalancer. Per evitare conflitti di configurazione, è necessario scegliere un segreto Kubernetes o un mapping di certificati OCI nativo.
Configurazione delle suite e dei protocolli di cifratura per i listener
Indipendentemente dal metodo di gestione dei certificati scelto, puoi specificare la suite di cifratura e i protocolli SSL utilizzati dal load balancer per il listener frontend.
Le suite di cifratura determinano la sicurezza, la compatibilità e la velocità del traffico HTTPS. Per ulteriori informazioni, vedere Suite di cifratura per i load balancer. Per specificare la suite di cifratura da utilizzare con il listener frontend del load balancer, aggiungere l'annotazione seguente nella sezione dei metadati del file manifest:
oci.oraclecloud.com/oci-load-balancer-ssl-config: '{"CipherSuiteName":"<cipher-suite-name>", "Protocols":["<tls-version>"]}'Dove:
-
"CipherSuiteName":"<cipher-suite-name>"è il nome di una suite di cifratura predefinita preconfigurata da Oracle Cloud Infrastructure (vedere Suite di cifratura predefinite del load balancer) o di una suite di cifratura creata personalmente. Ad esempio,"CipherSuiteName":"oci-default-http2-tls-12-13-ssl-cipher-suite-v1" -
"Protocols":["<tls-version>"]specifica una o più versioni TLS in una lista delimitata da virgole. Ad esempio,"Protocols":["TLSv1.2", "TLSv1.3"]
Ad esempio:
oci.oraclecloud.com/oci-load-balancer-ssl-config: '{"CipherSuiteName":"oci-default-http2-tls-12-13-ssl-cipher-suite-v1", "Protocols":["TLSv1.2", "TLSv1.3"]}'
Se non si include l'annotazione oci.oraclecloud.com/oci-load-balancer-ssl-config ma si include l'annotazione service.beta.kubernetes.io/oci-load-balancer-tls-secret, viene utilizzata la suite di cifratura oci-default-ssl-cipher-suite-v1.
Interruzione di SSL/TLS nel load balancer mediante segreti Kubernetes
I segreti Kubernetes offrono un modo per gestire i certificati SSL/TLS localmente all'interno del cluster. Questo metodo è standard per i certificati gestiti manualmente o da provider di terze parti (ad esempio Let's Encrypt). Sebbene questo metodo offra il controllo diretto sui dati dei certificati all'interno di Kubernetes, richiede aggiornamenti manuali al segreto ogni volta che un certificato scade.
In questo esempio viene fornita una panoramica della configurazione e della creazione di un load balancer con supporto SSL.
Prendere in considerazione il seguente file di configurazione, nginx-demo-svc-ssl.yaml, che definisce una distribuzione Nginx ed espone tramite un load balancer che serve http sulla porta 80 e https sulla porta 443. Questo esempio crea un load balancer Oracle Cloud Infrastructure definendo un servizio con un tipo di LoadBalancer (type: LoadBalancer).
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-ssl-ports: "443"
oci.oraclecloud.com/oci-load-balancer-listener-ssl-config: '{"CipherSuiteName":"oci-default-http2-tls-12-13-ssl-cipher-suite-v1", "Protocols":["TLSv1.3"]}'
service.beta.kubernetes.io/oci-load-balancer-tls-secret: ssl-certificate-secret
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 80Le annotazioni del load balancer sono di particolare importanza, come descritto qui.
Le porte su cui supportare il traffico https sono definite dal valore dell'annotazione service.beta.kubernetes.io/oci-load-balancer-ssl-ports. È possibile dichiarare più porte SSL utilizzando una lista separata da virgole per il valore dell'annotazione. Ad esempio, è possibile impostare il valore dell'annotazione su "443, 3000" per supportare SSL sulle porte 443 e 3000.
La suite di cifratura da utilizzare con il load balancer è definita dal valore dell'annotazione oci.oraclecloud.com/oci-load-balancer-listener-ssl-config.
Il segreto TLS richiesto, ssl-certificate-secret, deve essere creato in Kubernetes. In questo esempio viene creato e utilizzato un certificato autofirmato. Tuttavia, in un ambiente di produzione, lo scenario più comune è quello di utilizzare un certificato pubblico firmato da un'autorità di certificazione.
Il comando seguente crea un certificato autofirmato, tls.crt, con la chiave corrispondente, tls.key:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
Dopo aver creato il certificato, è necessario memorizzarlo e memorizzarne la chiave come segreto in Kubernetes. Il nome del segreto deve corrispondere al nome dell'annotazione service.beta.kubernetes.io/oci-load-balancer-tls-secret della definizione del load balancer. Utilizzare il comando seguente per creare un segreto TLS in Kubernetes, i cui valori di chiave e certificato sono impostati rispettivamente da --key e --cert.
kubectl create secret tls ssl-certificate-secret --key tls.key --cert tls.crt
È necessario creare il segreto Kubernetes prima di poter creare il servizio, poiché il servizio fa riferimento al segreto nella relativa definizione. Creare il servizio utilizzando il comando seguente:
kubectl create -f manifests/demo/nginx-demo-svc-ssl.yaml
Guardare il servizio e attendere l'assegnazione di un indirizzo IP pubblico (EXTERNAL-IP) al servizio Nginx (nginx-service) immettendo:
kubectl get svc --watchL'output del comando precedente mostra l'IP del load balancer da utilizzare per connettersi al servizio.
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service 192.0.2.1 198.51.100.1 80:30274/TCP 5m
Il load balancer è ora in esecuzione. Ciò significa che ora è possibile accedere al servizio come indicato di seguito.
- utilizzando http, immettendo:
curl http://198.51.100.1 - uso di https, immettendo:
curl --insecure https://198.51.100.1Il flag "
--insecure" viene utilizzato per accedere al servizio utilizzando https a causa dell'uso di certificati autofirmati in questo esempio. Non utilizzare questo flag in un ambiente di produzione in cui il certificato pubblico è stato firmato da un'autorità di certificazione.
Nota: quando si elimina un cluster, un load balancer creato in modo dinamico quando viene creato un servizio non verrà rimosso. Prima di eliminare un cluster, eliminare il servizio, che a sua volta comporterà la rimozione del load balancer. La sintassi di questo comando è la seguente:
kubectl delete svc SERVICE_NAME
Ad esempio, per eliminare il servizio dall'esempio precedente, immettere:
kubectl delete svc nginx-service
Aggiornamento dei certificati TLS dei load balancer esistenti mediante i segreti Kubernetes
Per aggiornare il certificato TLS di un load balancer esistente, effettuare le operazioni riportate di seguito.
- Ottenere un nuovo certificato TLS. In un ambiente di produzione, lo scenario più comune è quello di utilizzare un certificato pubblico firmato da un'autorità di certificazione.
-
Crea un nuovo segreto Kubernetes. Ad esempio, immettendo:
kubectl create secret tls new-ssl-certificate-secret --key new-tls.key --cert new-tls.crt - Modificare la definizione del servizio in modo che faccia riferimento al nuovo segreto Kubernetes modificando l'annotazione
service.beta.kubernetes.io/oci-load-balancer-tls-secretnella configurazione del servizio. Ad esempio:apiVersion: v1 kind: Service metadata: name: nginx-service annotations: service.beta.kubernetes.io/oci-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/oci-load-balancer-tls-secret: new-ssl-certificate-secret spec: selector: app: nginx type: LoadBalancer ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 80 - Aggiornare il servizio. Ad esempio, immettendo:
kubectl apply -f new-nginx-demo-svc-ssl.yaml
Interruzione di SSL/TLS nel load balancer mediante il servizio OCI Certificates
Il servizio OCI Certificates fornisce un modo per gestire i certificati SSL/TLS in modo nativo all'interno di Oracle Cloud Infrastructure. Questo metodo è consigliato per gli ambienti di produzione in quanto consente al load balancer OCI di utilizzare automaticamente i certificati rinnovati, offrendo diversi vantaggi di livello enterprise:
- Rotazione senza tempi di inattività: quando un certificato viene rinnovato in OCI, il load balancer riprende automaticamente la nuova versione senza richiedere un'applicazione manifest.
- Gestione centralizzata: gestisci tutti i certificati frontend da un singolo dashboard OCI anziché da più spazi di nomi Kubernetes.
- Sicurezza avanzata: le chiavi private vengono memorizzate in modo sicuro all'interno di OCI e non vengono mai esposte come testo normale all'interno del cluster Kubernetes.
Prerequisiti per l'integrazione dei certificati OCI
Per utilizzare questa integrazione nativa, è necessario assicurarsi che siano in atto le seguenti operazioni:
-
Criterio IAM: concedere l'autorizzazione principal risorsa del cluster per gestire i certificati nel compartimento:
Allow any-user to manage certificate-authority-family in compartment <compartment-name> where ALL {request.principal.type = 'cluster'} -
OCID certificato: è necessario disporre dell'OCID del certificato foglia che si desidera che il load balancer presenti ai client. Il certificato deve trovarsi nella stessa area del load balancer.
- Stato risorsa: il certificato deve essere creato o importato nel servizio Certificati OCI e deve essere in stato Attivo.
Configurazione del mapping dei certificati
Poiché un load balancer OCI può supportare più certificati per listener diversi, è necessario utilizzare un ConfigMap per mappare le porte del listener alle rispettive risorse del certificato OCI Certificates. Quando si applica ConfigMap, un aggiornamento del load balancer OCI viene attivato immediatamente.
Creare ConfigMap: creare un
Ad esempio:ConfigMapnello stesso spazio di nomi del servizio di tipo LoadBalancer e definire un mapping in cui la chiave è la porta del listener e il valore è un array JSON contenente l'OCID del certificato foglia.apiVersion:v1 kind:ConfigMap metadata: name:lb-tls-mapping data: "443":"[\"ocid1.certificate.oc1.iad.example_leaf_ocid\"]"-
Annotate the Service: aggiungere l'annotazione
oci-load-balancer.oraclecloud.com/tls-certificate-mapal file manifesto del servizio di tipo LoadBalancer per collegarlo aConfigMap.
Nota: le annotazioni tls-certificate-map e oci-load-balancer-tls-secret si escludono a vicenda. Se vengono forniti entrambi, il provisioning del load balancer non riuscirà con un errore sslConfiguration violation.
Esempio di manifesto SSL frontend
apiVersion: v1
kind: Service
metadata:
name: secure-frontend-service
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-ssl-ports: "443"
oci-load-balancer.oraclecloud.com/tls-certificate-map: "lb-tls-mapping"
spec:
selector:
app: my-app
type: LoadBalancer
ports:
- name: https
port: 443
targetPort: 8080
---
apiVersion: v1
kind: ConfigMap
metadata:
name: lb-tls-mapping
data:
"443": "[\"ocid1.certificate.oc1.iad.example_leaf_ocid\"]"
Implementazione di SSL/TLS tra il load balancer e i nodi di lavoro (backend SSL)
Quando Kubernetes Engine esegue il provisioning di un load balancer per un servizio Kubernetes di tipo LoadBalancer, è possibile specificare che si desidera implementare SSL tra il load balancer e i server backend (nodi di lavoro) nel set backend. Questa configurazione è nota come SSL backend. Per implementare il protocollo SSL backend, è necessario associare un certificato SSL al set backend del load balancer.
Tenere presente che è possibile implementare la cifratura SSL point-to-point completa tra client e pod delle applicazioni in esecuzione sui nodi di lavoro. A tale scopo, associare un certificato SSL al set backend del load balancer (come descritto in questa sezione) e creare un load balancer con l'interruzione SSL (vedere Arresto di SSL/TLS dal load balancer (SSL frontend)).
Sebbene l'interruzione SSL frontend protegga la connessione tra il client e il load balancer, il protocollo SSL backend protegge la connessione tra il load balancer e i nodi di lavoro. Questa configurazione garantisce che il traffico rimanga cifrato anche durante il viaggio attraverso la rete cloud virtuale (VCN) interna, fornendo un ulteriore livello di difesa approfondita.
Quando si implementa il protocollo SSL backend, il load balancer decifra il traffico in entrata utilizzando un certificato frontend, esegue tutte le ispezioni o l'instradamento di livello 7 necessarie, quindi esegue di nuovo la cifratura del traffico prima di inviarlo ai pod di destinazione. Questo è un requisito comune per gli ambienti ad alta sicurezza, in cui il traffico in chiaro è limitato ad ogni hop.
Metodo di gestione dei certificati per SSL backend
Quando si implementa il protocollo SSL backend, si utilizzano i segreti Kubernetes per gestire la cifratura backend utilizzando i certificati memorizzati nel cluster. Questo metodo richiede aggiornamenti manuali del segreto e del manifesto alla scadenza dei certificati. Per i dettagli di implementazione, vedere Implementazione di SSL/TLS tra il load balancer e i nodi di lavoro utilizzando i segreti Kubernetes.
Tenere presente che i pod dell'applicazione devono essere configurati per accettare e arrestare le connessioni SSL/TLS sulle porte di destinazione.
Configurazione delle suite e dei protocolli di cifratura per i set backend
Puoi specificare la suite di cifratura e i protocolli SSL utilizzati dal load balancer per il set backend.
Le suite di cifratura determinano la sicurezza, la compatibilità e la velocità del traffico HTTPS (per ulteriori informazioni, vedere Suite di cifratura per i load balancer). Per specificare la suite di cifratura da utilizzare con il set backend del load balancer, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:
oci.oraclecloud.com/oci-load-balancer-backendset-ssl-config: '{"CipherSuiteName":"<cipher-suite-name>", "Protocols":["<tls-version>"]}'Dove:
-
"CipherSuiteName":"<cipher-suite-name>"è il nome di una suite di cifratura predefinita preconfigurata da Oracle Cloud Infrastructure (vedere Suite di cifratura predefinite del load balancer) o di una suite di cifratura creata personalmente. Ad esempio,"CipherSuiteName":"oci-default-http2-tls-12-13-ssl-cipher-suite-v1" -
"Protocols":["<tls-version>"]specifica una o più versioni TLS in una lista delimitata da virgole. Ad esempio,"Protocols":["TLSv1.2", "TLSv1.3"]
Ad esempio:
oci.oraclecloud.com/oci-load-balancer-backendset-ssl-config: '{"CipherSuiteName":"oci-default-http2-tls-12-13-ssl-cipher-suite-v1", "Protocols":["TLSv1.2", "TLSv1.3"]}'
Se non si include l'annotazione oci.oraclecloud.com/oci-load-balancer-backendset-ssl-config ma si include l'annotazione service.beta.kubernetes.io/oci-load-balancer-tls-backendset-secret, viene utilizzata la suite di cifratura oci-wider-compatible-ssl-cipher-suite-v1.
Implementazione di SSL/TLS tra il load balancer e i nodi di lavoro utilizzando i segreti Kubernetes
I segreti Kubernetes offrono un modo per gestire i certificati SSL/TLS localmente all'interno del cluster per la comunicazione backend. Questo metodo viene utilizzato quando si gestiscono i propri certificati o si utilizza un'autorità di certificazione di terze parti per proteggere il collegamento tra il load balancer e i nodi di lavoro. Garantisce che il traffico interno sia cifrato, ma richiede la rotazione manuale del certificato CA memorizzato nel segreto.
Per specificare il certificato da associare al set backend, aggiungere la seguente annotazione nella sezione metadati del file manifest:
service.beta.kubernetes.io/oci-load-balancer-tls-backendset-secret: <value>dove <value> è il nome di un segreto Kubernetes creato per contenere un certificato firmato e la chiave privata del certificato. Tenere presente che è necessario creare il segreto Kubernetes prima di poter creare il servizio, poiché il servizio fa riferimento al segreto nella relativa definizione.
Nell'esempio riportato di seguito viene creato e utilizzato un certificato con firma automatica, che in genere è accettabile per la comunicazione interna tra il load balancer e il set backend. Tuttavia, se lo si preferisce, è possibile utilizzare un certificato pubblico firmato da un'autorità di certificazione.
Ad esempio:
-
Generare una chiave privata immettendo:
openssl genrsa -out ca.key 2048 -
Generare un certificato immettendo:
openssl req -x509 -new -nodes -key ca.key -subj "/CN=nginxsvc/O=nginxsvc" -days 10000 -out ca.crt -
Memorizza il certificato e la chiave come segreti in Kubernetes immettendo:
kubectl create secret generic ca-ser-secret --from-file=tls.crt=tls.crt --from-file=tls.key=tls.key --from-file=ca.crt=ca.crt - Definire una distribuzione Nginx ed esporla tramite un load balancer che serve http sulla porta 80 e https sulla porta 443.
(type: LoadBalancer. apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
metadata:
name: nginx-service
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci.oraclecloud.com/oci-load-balancer-backendset-ssl-config: '{"CipherSuiteName":"oci-default-http2-tls-12-13-ssl-cipher-suite-v1", "Protocols":["TLSv1.2", "TLSv1.3"]}'
service.beta.kubernetes.io/oci-load-balancer-tls-backendset-secret: ca-ser-secret
service.beta.kubernetes.io/oci-load-balancer-ssl-ports: "443"
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
La comunicazione tra il load balancer e i nodi di lavoro nel set backend viene cifrata utilizzando la chiave e il certificato memorizzati nel segreto Kubernetes ca-ser-secret creato in precedenza.
Specifica delle forme alternative del load balancer
La forma di un load balancer Oracle Cloud Infrastructure specifica la larghezza di banda totale massima (ovvero, in entrata e in uscita). Per impostazione predefinita, i load balancer vengono creati con una forma 100Mbps. Sono disponibili altre forme, tra cui 400Mbps e 8000Mbps.
Per specificare una forma alternativa per un load balancer, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:
service.beta.kubernetes.io/oci-load-balancer-shape: <value>dove value è la larghezza di banda della forma (ad esempio, 100Mbps, 400Mbps, 8000Mbps).
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-shape: 400Mbps
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxNell'area deve essere disponibile una quota di load balancer sufficiente per la forma specificata. Immettere il seguente comando kubectl per confermare che la creazione del load balancer non è riuscita a causa della mancanza di quota:
kubectl describe service <service-name>Si noti che Oracle consiglia di implementare i servizi Kubernetes di tipo LoadBalancer come load balancer flessibili ed economici anziché come load balancer a forma fissa (dinamica) (vedere Specifica delle forme flessibili del load balancer).
Specifica delle forme flessibili del load balancer
La forma di un load balancer Oracle Cloud Infrastructure specifica la larghezza di banda totale massima (ovvero, in entrata e in uscita). Come descritto nella sezione Specifica delle forme alternative del load balancer, è possibile specificare forme diverse del load balancer.
Inoltre, puoi specificare una forma flessibile per un load balancer Oracle Cloud Infrastructure, definendo una larghezza di banda minima e massima per il load balancer.
Per specificare una forma flessibile per un load balancer, aggiungere le annotazioni riportate di seguito nella sezione dei metadati del file manifest.
service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "<min-value>"
service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "<max-value>"Dove:
-
"<min-value>"è la larghezza di banda minima per il load balancer, in Mbps (ad esempio, "10") -
"<max-value>"è la larghezza di banda massima per il load balancer, in Mbps (ad esempio, "100")
Tenere presente che non si include un'unità di misura quando si specificano valori di larghezza di banda per le forme flessibili del load balancer (a differenza delle forme predefinite). Ad esempio, specificare la larghezza di banda minima come 10 anziché come 10Mbps.
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxSpecifica del timeout di connessione al load balancer
Quando si esegue il provisioning di un load balancer Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, è possibile specificare il tempo di inattività massimo (in secondi) consentito tra due operazioni di ricezione successive o due operazioni di invio successive tra il client e i server backend.
Per specificare in modo esplicito un tempo massimo di inattività, aggiungere la seguente annotazione nella sezione metadati del file manifesto:
service.beta.kubernetes.io/oci-load-balancer-connection-idle-timeout: <value>dove value è il numero di secondi.
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-connection-idle-timeout: 100
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxSe non si specifica in modo esplicito un tempo massimo di inattività, viene utilizzato un valore predefinito. Il valore predefinito dipende dal tipo di listener:
- per i listener TCP, il tempo massimo di inattività predefinito è di 300 secondi
- per i listener HTTP, il tempo massimo di inattività predefinito è di 60 secondi
Specifica del numero massimo di connessioni del load balancer consentite ai server backend
Quando esegui il provisioning di un load balancer Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, puoi specificare il numero massimo di connessioni simultanee che il load balancer può effettuare ai server backend (nodi worker) nel set backend.
Per specificare in modo esplicito il numero massimo di connessioni simultanee consentite tra il load balancer e ogni singolo server backend nel set backend, aggiungere l'annotazione seguente nella sezione dei metadati del file manifesto:
oci-load-balancer.oraclecloud.com/backendset-backend-max-connections: "<value>"dove <value> è un valore valido per il numero di connessioni consentite, come indicato di seguito.
- Numero compreso tra
"256"e"65535"(inclusi). Se si specifica un numero al di fuori di questo intervallo (ad eccezione di0), viene restituito un errore. "0". Se si specifica 0 come numero massimo di connessioni consentite, è consentito un numero infinito di connessioni tra il load balancer e ogni singolo server backend nel set backend.
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
annotations:
oci-load-balancer.oraclecloud.com/backendset-backend-max-connections: "256"
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80Tenere presente quanto riportato di seguito.
- Il numero specificato per l'annotazione non viene utilizzato solo come valore della proprietà
backendMaxConnectionsdel set backend, ma viene ereditato anche da ogni singolo server backend come valore della relativa proprietàmaxConnections. Di conseguenza, il numero specificato viene utilizzato come numero di connessioni consentite tra il load balancer e ogni singolo server backend nel set backend e non come numero totale complessivo di connessioni consentite tra il load balancer e il set backend. - Se non si include l'annotazione nel manifesto (o successivamente si rimuove l'annotazione), è consentito un numero infinito di connessioni tra il load balancer e ciascun server backend.
- Per informazioni correlate sulla specifica del numero massimo di connessioni concorrenti al listener del load balancer consentite dallo stesso indirizzo IP di origine, vedere Specifica delle regole di connessione del listener massimo.
Specifica delle regole di connessione del listener massimo
Quando Kubernetes Engine esegue il provisioning di un load balancer Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, puoi specificare il numero massimo di connessioni concorrenti al listener del load balancer che sono consentite dallo stesso indirizzo IP di origine. È possibile utilizzare un'annotazione per definire un valore predefinito per il numero massimo di connessioni listener che si applica a tutti gli indirizzi IP. L'annotazione definisce una regola di connessione del listener massima per il load balancer. Se non si imposta questo valore massimo predefinito, non è previsto alcun limite al numero di connessioni che un indirizzo IP può effettuare al listener.
Per ulteriori informazioni sul numero massimo di regole di connessione del listener, vedere Numero massimo di regole di connessione del listener nella documentazione del load balancer OCI.
Per specificare il numero massimo di connessioni listener concorrenti consentite dallo stesso indirizzo IP di origine, aggiungere l'annotazione oci.oraclecloud.com/oci-load-balancer-rule-sets nella sezione dei metadati del file manifesto. Si noti che si specifica il valore dell'annotazione come JSON formattato, come indicato di seguito.
oci.oraclecloud.com/oci-load-balancer-rule-sets: |
{
"<rule-set-name>": {
"items": [
{
"action": "IP_BASED_MAX_CONNECTIONS",
"maxConnectionsPerIp": <value>
}
]
}
}
dove:
-
<rule-set-name>è il nome scelto per il set di regole (di lunghezza compresa tra 1 e 32 caratteri). Ad esempio,IpLimitRuleSet. -
<value>è il numero massimo di connessioni listener simultanee consentite dallo stesso indirizzo IP di origine.
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci.oraclecloud.com/oci-load-balancer-rule-sets: |
{
"IpLimitRuleSet": {
"items": [
{
"action": "IP_BASED_MAX_CONNECTIONS",
"maxConnectionsPerIp": 20
}
]
}
}
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxQuesta configurazione crea un set di regole di connessione listener massimo denominato IpLimitRuleSet che limita ogni indirizzo IP di origine a un massimo di 20 connessioni concorrenti.
Per modificare successivamente il numero massimo di connessioni concorrenti, aggiornare l'annotazione oci.oraclecloud.com/oci-load-balancer-rule-sets e riapplicare il file manifesto.
Quando si utilizza l'annotazione oci.oraclecloud.com/oci-load-balancer-rule-sets, tenere presente quanto riportato di seguito.
-
Quando si applica un file manifesto contenente l'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-sets, tenere presente che Kubernetes Engine presuppone la gestione di tutti i set di regole del load balancer. Kubernetes Engine non solo aggiunge il set di regole specificato dall'annotazione, ma elimina anche qualsiasi altro set di regole attualmente associato al load balancer. -
Se in seguito si desidera eliminare un set di regole, specificare un oggetto JSON vuoto come valore dell'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-sets, come indicato di seguito.oci.oraclecloud.com/oci-load-balancer-rule-sets: "{}"Quando si specifica un oggetto JSON vuoto come valore dell'annotazione, Kubernetes Engine elimina tutti i set di regole associati al load balancer e rinuncia alla gestione dei set di regole del load balancer.
-
Se si rimuove semplicemente l'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-setsdal manifesto e si applica il manifesto, Kubernetes Engine interrompe la gestione dei set di regole del load balancer. Tenere presente che se si rimuove l'annotazione, Kubernetes Engine non elimina alcun set di regole associato al load balancer. -
Se si apportano modifiche dirette ai set di regole del load balancer (non consigliato) anziché utilizzare l'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-sets, tenere presente il punto seguente. Se successivamente si applica un file manifesto contenente l'annotazioneoci.oraclecloud.com/oci-load-balancer-rule-sets, Kubernetes Engine aggiunge il set di regole specificato dall'annotazione ed elimina qualsiasi altro set di regole associato al load balancer. Pertanto, se si desidera mantenere le modifiche dirette apportate ai set di regole del load balancer, non includere l'annotazioneoci.oraclecloud.com/oci-load-balancer-rule-setsnel file manifesto.
Specifica delle regole di intestazione HTTP
Quando Kubernetes Engine esegue il provisioning di un load balancer per un servizio Kubernetes di tipo LoadBalancer, è possibile specificare la dimensione massima dell'intestazione HTTP accettata dai listener del load balancer. È possibile specificare la dimensione massima dell'intestazione HTTP utilizzando un'annotazione per specificare la dimensione (in KB) del buffer utilizzato per leggere l'intestazione. I valori consentiti per la dimensione del buffer sono 8, 16, 32 e 64. L'annotazione definisce una regola di intestazione HTTP per il load balancer. La regola di intestazione HTTP si applica a tutti i listener del load balancer, su tutte le porte.
Per ulteriori informazioni sulle regole di intestazione HTTP, vedere Regole di intestazione HTTP nella documentazione di OCI Load Balancer.
Per specificare la dimensione massima dell'intestazione HTTP accettata dai listener del load balancer, aggiungere l'annotazione oci.oraclecloud.com/oci-load-balancer-rule-sets nella sezione dei metadati del file manifest. Si noti che si specifica il valore dell'annotazione come JSON formattato, come indicato di seguito.
oci.oraclecloud.com/oci-load-balancer-rule-sets: |
{
"<rule-set-name>": {
"items": [
{
"action": "HTTP_HEADER",
"httpLargeHeaderSizeInKB": <value>
}
]
}
}dove:
-
<rule-set-name>è il nome scelto per il set di regole, con una lunghezza compresa tra 1 e 32 caratteri. Ad esempio,header-size. -
<value>è la dimensione massima dell'intestazione HTTP in KB ed è una delle seguenti:8,16,32o64.
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
oci.oraclecloud.com/oci-load-balancer-rule-sets: |
{
"header-size": {
"items": [
{
"action": "HTTP_HEADER",
"httpLargeHeaderSizeInKB": 16
}
]
}
}
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxPer modificare successivamente la dimensione massima dell'intestazione HTTP, aggiornare l'annotazione oci.oraclecloud.com/oci-load-balancer-rule-sets e riapplicare il file manifesto.
Quando si utilizza l'annotazione oci.oraclecloud.com/oci-load-balancer-rule-sets, tenere presente quanto riportato di seguito.
-
Quando si applica un file manifesto contenente l'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-sets, tenere presente che Kubernetes Engine presuppone la gestione di tutti i set di regole del load balancer. Kubernetes Engine non solo aggiunge il set di regole specificato dall'annotazione, ma elimina anche qualsiasi altro set di regole attualmente associato al load balancer. -
Se in seguito si desidera eliminare un set di regole, specificare un oggetto JSON vuoto come valore dell'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-sets, come indicato di seguito.oci.oraclecloud.com/oci-load-balancer-rule-sets: "{}"Quando si specifica un oggetto JSON vuoto come valore dell'annotazione, Kubernetes Engine elimina tutti i set di regole associati al load balancer e rinuncia alla gestione dei set di regole del load balancer.
-
Se si rimuove semplicemente l'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-setsdal file manifesto e si applica il file manifesto, Kubernetes Engine interrompe la gestione dei set di regole del load balancer. Tenere presente che se si rimuove l'annotazione, Kubernetes Engine non elimina alcun set di regole associato al load balancer. -
Se si apportano modifiche dirette ai set di regole del load balancer (non consigliato) anziché utilizzare l'annotazione
oci.oraclecloud.com/oci-load-balancer-rule-sets, tenere presente il punto seguente. Se successivamente si applica un file manifesto contenente l'annotazioneoci.oraclecloud.com/oci-load-balancer-rule-sets, Kubernetes Engine aggiunge il set di regole specificato dall'annotazione ed elimina qualsiasi altro set di regole associato al load balancer. Pertanto, se si desidera mantenere le modifiche dirette apportate ai set di regole del load balancer, non includere l'annotazioneoci.oraclecloud.com/oci-load-balancer-rule-setsnel file manifesto.
Specifica dei protocolli del listener
Quando Kubernetes Engine esegue il provisioning di un load balancer 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 del load balancer quando Kubernetes Engine esegue il provisioning di un load balancer per un servizio Kubernetes di tipo LoadBalancer, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:
service.beta.kubernetes.io/oci-load-balancer-backend-protocol: <value>dove <value> è il protocollo che definisce il tipo di traffico accettato dal listener. Ad esempio "HTTP". I protocolli validi includono "HTTP", "TCP" e "GRPC".
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: my-nginx-svc
labels:
app: nginx
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-backend-protocol: "HTTP"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginxTenere presente che se si specifica GRPC come protocollo, è necessario configurare entrambi gli elementi riportati di seguito.
- SSL frontend, utilizzando le annotazioni
service.beta.kubernetes.io/oci-load-balancer-ssl-ports,oci.oraclecloud.com/oci-load-balancer-ssl-listener-configeservice.beta.kubernetes.io/oci-load-balancer-tls-secret. Per ulteriori informazioni, vedere Arresto di SSL/TLS presso il load balancer (SSL Frontend). - SSL backend, utilizzando le annotazioni
oci.oraclecloud.com/oci-load-balancer-backendset-ssl-configeservice.beta.kubernetes.io/oci-load-balancer-tls-backendset-secret. Per ulteriori informazioni, vedere Implementazione di SSL/TLS tra il load balancer e i nodi di lavoro (backend SSL).
Ad esempio:
apiVersion: v1
kind: Service
metadata:
name: hello-grpc-service
annotations:
oci.oraclecloud.com/load-balancer-type: "lb"
service.beta.kubernetes.io/oci-load-balancer-ssl-ports: "443"
service.beta.kubernetes.io/oci-load-balancer-tls-secret: ssl-certificate-secret
service.beta.kubernetes.io/oci-load-balancer-backend-protocol: "GRPC"
oci.oraclecloud.com/oci-load-balancer-listener-ssl-config: '{"CipherSuiteName":"oci-default-http2-ssl-cipher-suite-v1", "Protocols":["TLSv1.2"]}'
oci.oraclecloud.com/oci-load-balancer-backendset-ssl-config: '{"CipherSuiteName":"oci-default-http2-ssl-cipher-suite-v1", "Protocols":["TLSv1.2"]}'
service.beta.kubernetes.io/oci-load-balancer-tls-backendset-secret: ca-ser-secret
spec:
type: LoadBalancer
selector:
app: hello-grpc
ports:
- port: 443
name: grpc
targetPort: 50051Specifica delle opzioni di gestione delle liste di sicurezza durante il provisioning di un load balancer 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 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 per un servizio Kubernetes di tipo LoadBalancer, aggiungere la seguente annotazione nella sezione dei metadati del file manifesto:
service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: <value>dove <value> è uno dei seguenti:
-
"None": (consigliato) 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 ai load balancer (vedere Regole di sicurezza per i load balancer e i load balancer di rete). -
"All": (predefinito) vengono gestite tutte le regole della lista di sicurezza necessarie per i servizi del load balancer. -
"Frontend": vengono gestite solo le regole della lista di sicurezza per i servizi di entrata nel load balancer. È 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 service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode su None.
Nei cluster con nodi gestiti, se non si specifica in modo esplicito una modalità di gestione o si specifica un valore non valido, vengono gestite tutte le regole della lista di sicurezza (equivalente a "All"). Tenere presente che in questo caso, Kubernetes Engine crea una regola di sicurezza che consente il traffico in entrata da 0.0.0.0/0 (o dagli intervalli di porte di origine specificati nel file manifest) alle porte del listener. 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: "lb"
service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "Frontend"
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx