Configurazione dei load balancer e dei load balancer di rete

Scopri come definire i load balancer e i load balancer di rete Oracle Cloud Infrastructure di cui Kubernetes Engine (OKE) esegue il provisioning per un servizio Kubernetes di tipo LoadBalancer.

Creazione di load balancer interni

Puoi creare load balancer e load balancer di rete Oracle Cloud Infrastructure per controllare l'accesso ai servizi in esecuzione su un cluster:

  • Quando si crea un cluster nel workflow 'Creazione personalizzata', si seleziona una VCN esistente che contiene le risorse di rete che devono essere utilizzate dal nuovo cluster. Se si desidera utilizzare un load balancer o un load balancer di rete per controllare il traffico nella VCN, selezionare una subnet pubblica o privata esistente nella VCN per ospitarla.
  • Quando crei un cluster nel workflow 'Creazione rapida', la VCN creata automaticamente contiene una subnet regionale pubblica in cui ospitare un load balancer o un load balancer di rete. Se desideri ospitare un load balancer o un load balancer di rete in una subnet privata, puoi aggiungere una subnet privata alla VCN in un secondo momento.

In alternativa, puoi definire un servizio Kubernetes interno di tipo LoadBalancer (spesso definito semplicemente "load balancer interno") in un cluster per consentire ad altri programmi in esecuzione nella stessa VCN del cluster di accedere ai servizi nel cluster. È possibile eseguire il provisioning di un load balancer interno:

  • come load balancer o come load balancer di rete
  • con un indirizzo IP pubblico o con un indirizzo IP privato (assegnato dal servizio Load balancer o dal servizio Load balancer di rete)
  • in una subnet pubblica o in una subnet privata

Un load balancer o un load balancer di rete con un indirizzo IP pubblico viene definito pubblico. Un load balancer pubblico o di rete può essere gestito in hosting in una subnet pubblica o in una subnet privata.

Un load balancer o un load balancer di rete con un indirizzo IP privato viene definito privato. Un load balancer o un load balancer di rete privato può essere ospitato in una subnet pubblica o in una subnet privata.

Per impostazione predefinita, il provisioning dei load balancer interni viene eseguito con indirizzi IP pubblici e gestito in hosting in subnet pubbliche.

Ulteriori informazioni

Creare un load balancer interno come load balancer OCI

Per creare un load balancer interno come load balancer OCI con un indirizzo IP privato, ospitato nella subnet specificata per i load balancer al momento della creazione del cluster, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

service.beta.kubernetes.io/oci-load-balancer-internal: "true"

Per creare un load balancer interno come load balancer OCI con un indirizzo IP privato ospitato, ospitato in una subnet alternativa a quella specificata per i load balancer al momento della creazione del cluster, aggiungere entrambe le annotazioni riportate di seguito nella sezione dei metadati del file manifest.

service.beta.kubernetes.io/oci-load-balancer-internal: "true"
service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"

dove ocid1.subnet.oc1..aaaaaa....vdfw è l'OCID della subnet alternativa. La subnet alternativa può essere una subnet privata o pubblica.

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-internal: "true"
    service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 8100
  selector:
    app: nginx
Creare un load balancer di rete interno come load balancer di rete OCI

Per creare un load balancer di rete interno come load balancer di rete OCI con un indirizzo IP privato, ospitato nella subnet specificata per i load balancer al momento della creazione del cluster, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

oci-network-load-balancer.oraclecloud.com/internal: "true"

Per creare un load balancer di rete interno come load balancer di rete OCI con un indirizzo IP privato, ospitato in una subnet alternativa a quella specificata per i load balancer al momento della creazione del cluster, aggiungere entrambe le annotazioni riportate di seguito nella sezione dei metadati del file manifest.

oci-network-load-balancer.oraclecloud.com/internal: "true"
oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1..aaaaaa....vdfw"

dove ocid1.subnet.oc1..aaaaaa....vdfw è l'OCID della subnet privata. La subnet alternativa può essere una subnet privata o pubblica.

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/internal: "true"
    oci-network-load-balancer.oraclecloud.com/subnet: "ocid1.subnet.oc1..aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Specifica degli indirizzi IP pubblici riservati

Quando un servizio Kubernetes di tipo LoadBalancer viene distribuito su un cluster, Kubernetes Engine crea un load balancer pubblico o un load balancer di rete Oracle Cloud Infrastructure per accettare il traffico nel cluster. Per impostazione predefinita, al load balancer pubblico o al load balancer di rete di Oracle Cloud Infrastructure viene assegnato un indirizzo IP pubblico effimero. Tuttavia, un indirizzo IP pubblico effimero è temporaneo e dura solo per tutta la durata del load balancer pubblico o del load balancer di rete.

Se desideri che il load balancer pubblico o il load balancer di rete Oracle Cloud Infrastructure creato da Kubernetes Engine abbia lo stesso indirizzo IP pubblico dopo la distribuzione, puoi assegnargli un indirizzo IP pubblico riservato dal pool di indirizzi IP pubblici riservati. Per ulteriori informazioni sulla creazione e la visualizzazione di indirizzi IP pubblici riservati, vedere Indirizzo IP pubblico.

Per assegnare un indirizzo IP pubblico riservato al load balancer pubblico di Oracle Cloud Infrastructure o al load balancer di rete creato da Kubernetes Engine, aggiungere la proprietà LoadBalancerIP nella sezione delle specifiche del file manifest che definisce il servizio di tipo LoadBalancer e specificare l'indirizzo IP pubblico riservato.

Assegnare un indirizzo IP pubblico riservato a un load balancer pubblico

Esempio:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
spec:
  loadBalancerIP: 144.25.97.173
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
Assegnare un indirizzo IP pubblico riservato a un load balancer di rete pubblica

Esempio:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "nlb"
spec:
  loadBalancerIP: 144.25.97.173
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Tenere presente quanto riportato di seguito.

  • Se imposti la proprietà loadBalancerIP del servizio LoadBalancer, in seguito non potrai modificare direttamente l'indirizzo IP del load balancer pubblico o del load balancer di rete di Oracle Cloud Infrastructure creato da Kubernetes Engine. Se si desidera modificare l'indirizzo IP, eliminare il servizio LoadBalancer, specificare un indirizzo IP pubblico riservato diverso nel file manifesto e distribuire di nuovo il servizio LoadBalancer.
  • Se non si imposta la proprietà loadBalancerIP del servizio LoadBalancer, in seguito non sarà possibile passare direttamente all'indirizzo IP del load balancer pubblico o del load balancer di rete Oracle Cloud Infrastructure creato da Kubernetes Engine da un indirizzo IP effimero a un indirizzo IP pubblico riservato. Se si desidera cambiare l'indirizzo IP effimero in un indirizzo IP pubblico riservato, eliminare il servizio di tipo LoadBalancer, impostare la proprietà loadBalancerIP su un indirizzo IP pubblico riservato nel file manifesto e distribuire di nuovo il servizio di tipo LoadBalancer.
  • È possibile eliminare il servizio di tipo LoadBalancer e rilasciare l'indirizzo IP pubblico riservato per altri usi (ad esempio, per assegnarlo a un altro servizio di tipo LoadBalancer).
  • Non è possibile specificare un indirizzo IP pubblico riservato per un servizio di tipo LoadBalancer se lo stesso indirizzo IP è già assegnato a un'altra risorsa (ad esempio un'istanza di computazione o un altro servizio di tipo LoadBalancer).
  • Non è possibile aggiungere la proprietà loadBalancerIP al file manifest per un servizio di load balancer interno, ovvero un file manifest che include l'annotazione service.beta.kubernetes.io/oci-load-balancer-internal: "true" o oci-network-load-balancer.oraclecloud.com/internal: "true".
  • Per impostazione predefinita, l'indirizzo IP pubblico riservato specificato come proprietà loadBalancerIP di un servizio di tipo LoadBalancer nel file manifesto dovrebbe essere una risorsa nello stesso compartimento del cluster. Se si desidera specificare un indirizzo IP pubblico riservato in un compartimento diverso:

    • per i load balancer pubblici, aggiungere il criterio seguente alla tenancy:
      ALLOW any-user to read public-ips in tenancy where request.principal.type = 'cluster'
      ALLOW any-user to manage floating-ips in tenancy where request.principal.type = 'cluster'
    • per i load balancer di rete, aggiungere il criterio seguente alla tenancy:
      ALLOW any-user to use private-ips in TENANCY where ALL {request.principal.type = 'cluster', request.principal.compartment.id = 'target.compartment.id'}
      ALLOW any-user to manage public-ips in TENANCY where ALL {request.principal.type = 'cluster', request.principal.compartment.id = 'target.compartment.id'}

Specifica dei gruppi di sicurezza di rete (consigliata)

I gruppi di sicurezza di rete (NSG) di Oracle Cloud Infrastructure ti consentono di controllare il traffico in entrata e in uscita dalle risorse e tra le risorse. Le regole di sicurezza definite per un gruppo NSG garantiscono che tutte le risorse presenti in tale gruppo NSG abbiano lo stesso livello di sicurezza. Per ulteriori informazioni, vedere Gruppi di sicurezza di rete.

Puoi utilizzare i gruppi NSG per controllare l'accesso al load balancer o al load balancer di rete Oracle Cloud Infrastructure di cui Kubernetes Engine esegue il provisioning per un servizio Kubernetes di tipo LoadBalancer.

Quando si utilizzano i gruppi NSG per controllare l'accesso, devono esistere regole di sicurezza appropriate per consentire il traffico in entrata e in uscita verso e dalla subnet del load balancer o del load balancer di rete. Vedere Regole di sicurezza per i load balancer e i load balancer di rete.

Se decidi di utilizzare i gruppi NSG per controllare l'accesso ai load balancer o ai load balancer di rete:

  • I gruppi NSG e le regole di sicurezza possono essere gestiti interamente per l'utente da oci-cloud-controller-manager (vedere Specifica delle opzioni di gestione delle regole di sicurezza per i load balancer e i load balancer di rete).
  • Puoi gestire i gruppi NSG e le regole di sicurezza personalmente e aggiungere il load balancer o il load balancer di rete ai gruppi NSG esistenti (come descritto in questa sezione).
  • È possibile fare in modo che oci-cloud-controller-manager gestisca alcune regole di sicurezza in un gruppo NSG, mentre si gestiscono altre regole di sicurezza in un gruppo NSG diverso.

Per controllare l'accesso utilizzando un gruppo NSG gestito, includere annotazioni nel file manifest per specificare il gruppo NSG a cui si desidera aggiungere il load balancer o il load balancer di rete.

Aggiungere un load balancer a un gruppo NSG esistente

Per aggiungere il load balancer Oracle Cloud Infrastructure creato da Kubernetes Engine a un gruppo NSG gestito, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

oci.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"

dove <nsg-ocid> è l'OCID di un gruppo NSG esistente.

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-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
Aggiungere un load balancer di rete a un gruppo NSG esistente

Per aggiungere il load balancer di rete Oracle Cloud Infrastructure creato da Kubernetes Engine a un gruppo NSG gestito, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

oci-network-load-balancer.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"

dove <nsg-ocid> è l'OCID di un gruppo NSG esistente.

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/oci-network-security-groups: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....vdfw"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Tenere presente quanto riportato di seguito.

  • Il gruppo NSG specificato deve trovarsi nella stessa VCN del load balancer o del load balancer di rete Oracle Cloud Infrastructure.
  • Se il gruppo NSG specificato appartiene a un altro compartimento del cluster, in un criterio IAM è necessario includere un'istruzione criterio simile alla seguente:
    ALLOW any-user to use network-security-groups in TENANCY where ALL { request.principal.type = 'cluster' }

    Se si considera questa istruzione dei criteri troppo permissiva, è possibile limitare l'autorizzazione a specificare in modo esplicito il compartimento a cui appartiene il gruppo NSG e/o a specificare in modo esplicito il cluster. Ad esempio:

    Allow any-user to use network-security-groups in compartment <compartment-ocid> where all { request.principal.id = '<cluster-ocid>' }
  • È possibile specificare fino a cinque gruppi NSG, in un elenco separato da virgole, nel formato seguente:
    oci.oraclecloud.com/oci-network-security-groups: "<nsg1-ocid>,<nsg2-ocid>,<nsg3-ocid>,<nsg4-ocid>,<nsg5-ocid>"
  • Per rimuovere un load balancer o un load balancer di rete da un gruppo NSG o modificare il gruppo NSG in cui si trova il load balancer o il load balancer di rete, aggiornare l'annotazione e riapplicare il file manifesto.
  • Se decidi di controllare l'accesso a un load balancer o a un load balancer di rete Oracle Cloud Infrastructure utilizzando un gruppo NSG gestito dall'utente, Oracle consiglia di disabilitare la gestione delle liste di sicurezza Kubernetes aggiungendo una delle annotazioni seguenti nella sezione dei metadati del file manifest rispettivamente per il load balancer o il load balancer di rete:

    service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "None"
    oci-network-load-balancer.oraclecloud.com/security-list-management-mode:  "None"

    In alternativa, è possibile aggiungere la seguente annotazione equivalente:

    oci.oraclecloud.com/security-rule-management-mode: "None" 

    Se si segue il suggerimento e si aggiunge l'annotazione, la gestione della lista di sicurezza Kubernetes non è abilitata. È necessario impostare i gruppi NSG con regole di sicurezza in entrata e in uscita per i pool di nodi e per l'endpoint API Kubernetes. Per ulteriori informazioni, vedere Configurazione delle regole di sicurezza nei gruppi di sicurezza di rete e/o nelle liste di sicurezza e Configurazioni delle risorse di rete di esempio. È inoltre necessario impostare i gruppi NSG con regole di sicurezza in entrata e in uscita per la porta di integrità kube-proxy, per l'intervallo di porte di controllo dello stato e per i load balancer.

Specifica delle opzioni di gestione delle regole di sicurezza per i load balancer e i load balancer di rete

Le regole di sicurezza controllano l'accesso ai load balancer e ai load balancer di rete Oracle Cloud Infrastructure di cui viene eseguito il provisioning per i servizi Kubernetes di tipo LoadBalancer. Le regole di sicurezza possono essere gestite (ovvero create, aggiornate ed eliminate) nei modi riportati di seguito.

  • In un gruppo di sicurezza di rete o in un gruppo NSG (consigliato) Le regole di sicurezza in un gruppo NSG si applicano a qualsiasi risorsa Kubernetes aggiunta al gruppo NSG. Pertanto, i gruppi NSG possono fornire un controllo dell'accesso dettagliato alle singole risorse.
  • In una lista di sicurezza. Le regole di sicurezza in una lista di sicurezza si applicano a tutte le risorse Kubernetes in una subnet. Gli elenchi di sicurezza non forniscono un controllo dell'accesso con filtro alle singole risorse nella subnet.

Per informazioni importanti sul funzionamento delle regole di sicurezza e un confronto generale tra liste di sicurezza e gruppi di sicurezza di rete, vedere Regole di sicurezza.

Nota

Se le regole di sicurezza vengono gestite nelle liste di sicurezza, la configurazione e la gestione della sicurezza possono diventare complicate quando l'infrastruttura è complessa e quando si utilizzano strumenti come Terraform. 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 questi motivi, Oracle consiglia di utilizzare i gruppi di sicurezza di rete (NSG) e l'annotazione oci.oraclecloud.com/security-rule-management-mode per gestire le regole di sicurezza.

È possibile gestire le regole di sicurezza personalmente, creando, aggiornando ed eliminando le regole in base alle esigenze. In alternativa, è possibile specificare che oci-cloud-controller-manager (che viene eseguito sul piano di controllo del cluster) deve gestire automaticamente alcune o tutte le regole di sicurezza. Kubernetes Engine utilizza oci-cloud-controller-manager per eseguire il provisioning dei load balancer e dei load balancer di rete per i servizi Kubernetes di tipo LoadBalancer.

È possibile utilizzare annotazioni diverse per specificare se oci-cloud-controller-manager gestisce le regole di sicurezza per un load balancer o un load balancer di rete in un gruppo NSG o in una lista di sicurezza, come riportato di seguito.

Indipendentemente dalle annotazioni utilizzate e indipendentemente dal fatto che l'utente o oci-cloud-controller-manager gestisca le regole di sicurezza in una lista di sicurezza o in un gruppo NSG, è inoltre possibile specificare l'OCID di uno o più gruppi NSG aggiuntivi a cui si desidera che oci-cloud-controller-manager aggiunga il load balancer o il load balancer di rete. In questo caso, utilizzare l'annotazione oci.oraclecloud.com/oci-network-security-groups o oci-network-load-balancer.oraclecloud.com/oci-network-security-groups. Si noti che oci-cloud-controller-manager non gestisce le regole di sicurezza nei gruppi NSG aggiuntivi specificati da queste annotazioni, pertanto è responsabilità dell'utente gestire le regole di sicurezza. Per ulteriori informazioni sull'uso delle annotazioni oci.oraclecloud.com/oci-network-security-groups o oci-network-load-balancer.oraclecloud.com/oci-network-security-groups, vedere Specifica dei gruppi di sicurezza di rete (consigliato).

Utilizzo dell'annotazione oci.oraclecloud.com/security-rule-management-mode per gestire le regole di sicurezza nei gruppi NSG e nelle liste di sicurezza

Criteri IAM obbligatori per la gestione delle regole di sicurezza nei gruppi NSG

Per consentire a oci-cloud-controller-manager di gestire le regole di sicurezza per il load balancer di un cluster nei gruppi NSG, è necessario concedere al cluster l'autorizzazione per gestire i gruppi NSG. Ad esempio, per concedere questa autorizzazione in un determinato compartimento:

ALLOW any-user to manage network-security-groups in compartment <compartment-name> where request.principal.type = 'cluster' 

Inoltre, per consentire a oci-cloud-controller-manager di creare un gruppo di sicurezza di rete, è necessario concedere al cluster l'autorizzazione per gestire le reti VCN o per gestire le famiglie di reti virtuali. Ad esempio, specificando una o più delle seguenti istruzioni criteri:

  • ALLOW any-user to manage vcns in compartment <compartment-name> where request.principal.type = 'cluster'
  • ALLOW any-user to manage virtual-network-family in compartment <compartment-name> where request.principal.type = 'cluster'

Utilizzo dell'annotazione oci.oraclecloud.com/security-rule-management-mode

Per specificare che oci-cloud-controller-manager deve gestire le regole di sicurezza per un load balancer o un load balancer di rete in un gruppo NSG (come consigliato da Oracle), è innanzitutto necessario impostare i criteri IAM necessari. Vedere Criteri IAM obbligatori per la gestione delle regole di sicurezza nei gruppi NSG. Dopo aver impostato i criteri IAM dei prerequisiti, è possibile aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

oci.oraclecloud.com/security-rule-management-mode: "NSG"

oci-cloud-controller-manager gestisce tutte le regole di sicurezza necessarie per l'ingresso nel load balancer o nel servizio load balancer di rete, in un gruppo NSG creato appositamente da oci-cloud-controller-manager. Questo gruppo NSG è noto come gruppo NSG frontend e consente il traffico in entrata verso il load balancer o il load balancer di rete da 0.0.0.0/0 o dal blocco CIDR di origine (e sull'intervallo di porte di origine) se specificato nel file manifest. L'OCI-Cloud-controller-manager crea le seguenti regole di sicurezza nel gruppo NSG frontend:

Direzione Origine Protocollo/destinazione. Porta descrizione;
Ingresso 0.0.0.0/0 (o blocco CIDR di origine, se specificato nel file manifesto) Porte specificate nel file manifesto. Consenti traffico in entrata al load balancer OCI.
Uscita Gruppo NSG backend (se l'OCID di un gruppo NSG backend è specificato nel file manifest) ALL/(Nodeport per servizio) Consenti traffico ai nodi di lavoro.
Uscita Gruppo NSG backend (se l'OCID di un gruppo NSG backend è specificato nel file manifest) Porta di controllo dello stato TCP/ (10256)

Se l'indirizzo IP di origine viene conservato, la porta di controllo dello stato viene selezionata automaticamente dal servizio.

Consenti al load balancer o al load balancer di rete OCI di comunicare con kube-proxy sui nodi di lavoro per la porta di controllo stato.

Se si desidera che oci-cloud-controller-manager gestisca le regole di sicurezza per il traffico in entrata verso i nodi di lavoro nel set backend, insieme al traffico in uscita dal load balancer o dal servizio del load balancer di rete, è necessario specificare l'OCID di un gruppo NSG esistente da utilizzare a tale scopo. Questo NSG è noto come backend NSG. Oci-cloud-controller-manager aggiunge regole di uscita solo al gruppo NSG frontend se si specifica un gruppo NSG backend. Per specificare il gruppo NSG da utilizzare come gruppo NSG backend, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

oci.oraclecloud.com/oci-backend-network-security-group: "<nsg-ocid>"

dove <NSG-OCID> è l'OCID di un gruppo NSG esistente che si trova entrambi nella stessa VCN del cluster, nonché un gruppo NSG a cui sono già state aggiunte le istanze di computazione che ospitano nodi di lavoro. Ad esempio:

oci.oraclecloud.com/oci-backend-network-security-group: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....cwex"

È possibile specificare gli OCID di più gruppi NSG backend in una lista delimitata da virgole. Ad esempio:

oci.oraclecloud.com/oci-backend-network-security-group: "ocid1.networksecuritygroup.oc1.phx.aaaaaa....cwex,ocid1.networksecuritygroup.oc1.phx.aaaaaa....jfle,ocid1.networksecuritygroup.oc1.phx.aaaaaa....pkrj"

Le istanze di computazione che ospitano i nodi di lavoro nel set backend devono essere già state aggiunte al gruppo NSG backend specificato come valore dell'annotazione oci.oraclecloud.com/oci-backend-network-security-group. È possibile aggiungere le istanze di computazione al gruppo NSG backend in uno dei modi riportati di seguito.

  • Specificando il gruppo NSG quando si crea un pool di nodi (nel caso di nodi gestiti e nodi virtuali).
  • Aggiungendo manualmente le VNIC primarie delle istanze di computazione che ospitano i nodi di lavoro nel gruppo NSG utilizzando il servizio di computazione (nel caso di nodi gestiti). Ad esempio, utilizzando le pagine della console del servizio di computazione (o l'interfaccia CLI o l'API del servizio di computazione).

oci-cloud-controller-manager crea le seguenti regole di sicurezza nel gruppo NSG backend:

Direzione Origine Protocollo/destinazione. Porta descrizione;
Ingresso OCID NSG frontend Porta di controllo dello stato TCP/ (10256)

Se l'indirizzo IP di origine viene conservato, la porta di controllo dello stato viene selezionata automaticamente dal servizio.

Consenti al load balancer o al load balancer di rete OCI di comunicare con kube-proxy sui nodi di lavoro per i controlli dello stato.
Ingresso OCID NSG frontend ALL/(Nodeport per servizio) Consenti al load balancer o al load balancer di rete OCI di comunicare con i nodi di lavoro.

Se non si specifica un OCID per il gruppo NSG backend, oci-cloud-controller-manager non gestisce le regole di sicurezza per il traffico in entrata verso i nodi di lavoro nel set backend né le regole di sicurezza per il traffico in uscita dal load balancer o dal load balancer di rete.

È inoltre possibile impostare l'annotazione oci.oraclecloud.com/security-rule-management-mode su altri valori per specificare che si desidera gestire le regole di sicurezza personalmente oppure si desidera che oci-cloud-controller-manager gestisca le regole di sicurezza nelle liste di sicurezza. La sintassi completa per l'annotazione è la seguente:

oci.oraclecloud.com/security-rule-management-mode: <value>

dove <value> è uno dei seguenti:

  • "NSG": (consigliato) oci-cloud-controller-manager gestisce tutte le regole di sicurezza necessarie per l'ingresso nel load balancer o nel servizio load balancer di rete in un gruppo di sicurezza di rete (NSG) creato a tale scopo.
  • "None": (impostazione predefinita per i load balancer di rete) Non è abilitata la gestione delle liste di sicurezza e oci-cloud-controller-manager non gestisce le regole di sicurezza. È responsabilità dell'utente 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 le regole di sicurezza per consentire il traffico in entrata ai load balancer e ai load balancer di rete (vedere Regole di sicurezza per i load balancer e i load balancer di rete). Ciò equivale all'impostazione di service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode o oci-network-load-balancer.oraclecloud.com/security-list-management-mode su "None".
  • "SL-All": (impostazione predefinita per i load balancer) oci-cloud-controller-manager gestisce tutte le regole di sicurezza necessarie per le operazioni di entrata e uscita dal load balancer o dal servizio load balancer di rete in una lista di sicurezza. Ciò equivale all'impostazione di service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode o oci-network-load-balancer.oraclecloud.com/security-list-management-mode su "All".
  • "SL-Frontend": oci-cloud-controller-manager gestisce solo le regole di sicurezza per i servizi di load balancer e load balancer di rete in entrata, in una lista di sicurezza. È responsabilità dell'utente 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. Ciò equivale all'impostazione di service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode o oci-network-load-balancer.oraclecloud.com/security-list-management-mode su "Frontend".

Nei cluster con nodi gestiti, se non si specifica in modo esplicito una modalità di gestione o si specifica un valore non valido, oci-cloud-controller-manager gestisce tutte le regole di sicurezza necessarie per l'entrata e l'uscita da e verso il load balancer o il servizio load balancer di rete, in una lista di sicurezza (equivalente a "SL-All"). Tenere presente che in questo caso, oci-cloud-controller-manager 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 manifesto) 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 quanto riportato di seguito.

  • Se si includono sia l'annotazione oci.oraclecloud.com/security-rule-management-mode che una delle annotazioni service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode o oci-network-load-balancer.oraclecloud.com/security-list-management-mode nel file manifesto, oci-cloud-controller-manager utilizza sempre oci.oraclecloud.com/security-rule-management-mode e ignora l'altra annotazione.
  • Sono previsti limiti al numero di regole di entrata e uscita consentite sia nelle liste di sicurezza che nei gruppi di sicurezza di rete (vedere rispettivamente Limiti delle liste di sicurezza e Limiti dei gruppi di sicurezza di rete). Se il numero di regole di entrata o uscita supera il limite, la creazione o l'aggiornamento del load balancer o del gruppo di sicurezza di rete non riesce.
  • È possibile aggiungere un load balancer o un load balancer di rete a un massimo di cinque gruppi NSG. Se il numero di gruppi NSG supera il limite, viene restituito un errore.
  • Se il servizio Kubernetes di tipo LoadBalancer viene eliminato, le risorse OCI create da OCI-cloud-controller-manager (il gruppo NSG frontend e le regole di sicurezza create nel gruppo NSG frontend o nel gruppo NSG backend) vengono rimosse. Il gruppo NSG backend e tutte le regole di sicurezza non create da oci-cloud-controller-manager non vengono rimossi.
  • Quando si esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, è possibile utilizzare l'annotazione is-preserve-source: "true" per specificare la conservazione dell'indirizzo IP del client nelle intestazioni dei pacchetti IP (valido solo quando l'annotazione externalTrafficPolicy è impostata su "Local"). In questo caso, oci-cloud-controller-manager crea le regole di sicurezza nel gruppo NSG backend per consentire l'accesso ai nodi di lavoro nel set backend dai blocchi CIDR specificati da loadBalancerSourceRanges nel manifesto del servizio LoadBalancer. Se i blocchi CIDR non vengono specificati da loadBalancerSourceRanges, oci-cloud-controller-manager crea una regola di sicurezza per consentire l'accesso da Internet (0.0.0.0/0) sul numero di porta specificato da nodePort.
  • Il gruppo NSG backend specificato come valore dell'annotazione oci.oraclecloud.com/oci-backend-network-security-group deve trovarsi nella stessa VCN del cluster.
  • Le istanze di computazione che ospitano i nodi di lavoro nel set backend devono essere già state aggiunte al gruppo NSG backend specificato come valore dell'annotazione oci.oraclecloud.com/oci-backend-network-security-group.

Esempi di annotazioni di gestione delle regole di sicurezza

Esempio 1: creare un nuovo gruppo NSG frontend con regole di sicurezza gestite e gestire regole di sicurezza in un gruppo NSG backend esistente

In questo esempio:

  • Si desidera che oci-cloud-controller-manager crei un gruppo NSG frontend per un load balancer e gestisca le regole di sicurezza in tale gruppo NSG.
  • Si desidera che oci-cloud-controller-manager utilizzi un gruppo NSG backend esistente e gestisca le regole di sicurezza in tale gruppo NSG.

Specificare "NSG" come valore dell'annotazione oci.oraclecloud.com/security-rule-management-mode e specificare l'OCID del gruppo NSG esistente come valore dell'annotazione oci.oraclecloud.com/oci-backend-network-security-group:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    oci.oraclecloud.com/oci-backend-network-security-group: <nsg_ocid> 
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

In questo caso:

  • oci-cloud-controller-manager crea il gruppo NSG frontend per il load balancer e gestisce le relative regole di sicurezza.
  • oci-cloud-controller-manager gestisce le regole di sicurezza del gruppo NSG backend con l'OCID specificato dall'annotazione oci-backend-network-security-group.

Tenere presente quanto riportato di seguito.

  • Il gruppo NSG backend specificato come valore dell'annotazione oci.oraclecloud.com/oci-backend-network-security-group deve trovarsi nella stessa VCN del cluster.
  • Le istanze di computazione che ospitano i nodi di lavoro nel set backend devono essere già state aggiunte al gruppo NSG backend specificato come valore dell'annotazione oci.oraclecloud.com/oci-backend-network-security-group.

Esempio 2: creare un nuovo gruppo NSG frontend con regole di sicurezza gestite e gestire manualmente le regole di sicurezza in un gruppo NSG backend esistente

In questo esempio:

  • Si desidera che oci-cloud-controller-manager crei un gruppo NSG frontend per un load balancer e gestisca le regole di sicurezza in tale gruppo NSG.
  • Si desidera definire manualmente le regole di sicurezza per controllare il traffico dal front-end del load balancer al back-end in un gruppo NSG creato e gestito. Ad esempio, potresti voler creare regole di sicurezza per evitare che il traffico venga instradato da LB ai nodi di lavoro.

È possibile specificare "NSG" come valore dell'annotazione oci.oraclecloud.com/security-rule-management-mode:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

In questo caso:

  • oci-cloud-controller-manager crea il gruppo NSG frontend per il load balancer e gestisce le relative regole di sicurezza.
  • Sei responsabile della creazione e della gestione delle regole di sicurezza in un gruppo NSG backend per controllare il traffico dal gruppo NSG frontend al gruppo NSG backend.

Esempio 3: creare un nuovo gruppo NSG frontend con regole di sicurezza gestite e gestire regole di sicurezza in un gruppo NSG backend esistente (ma le annotazioni vengono utilizzate in modo errato)

In questo esempio:

  • Si desidera che oci-cloud-controller-manager crei un gruppo NSG frontend per un load balancer e gestisca le regole di sicurezza in tale gruppo NSG.
  • Si desidera che oci-cloud-controller-manager utilizzi un gruppo NSG backend esistente e gestisca le regole di sicurezza in tale gruppo NSG. Specificare tuttavia le annotazioni in modo errato.

Specificare correttamente "NSG" come valore dell'annotazione oci.oraclecloud.com/security-rule-management-mode. Tuttavia, si include erroneamente l'annotazione service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode e si omette l'annotazione oci.oraclecloud.com/oci-backend-network-security-group:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "All"
  spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

In questo caso:

  • oci-cloud-controller-manager crea il gruppo NSG frontend per il load balancer e gestisce le relative regole di sicurezza.
  • oci-cloud-controller-manager ignora l'annotazione service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode (poiché è presente l'annotazione oci.oraclecloud.com/security-rule-management-mode).
  • Sei responsabile della creazione e della gestione delle regole di sicurezza in un gruppo NSG backend per controllare il traffico dal gruppo NSG frontend al gruppo NSG backend (poiché l'annotazione oci.oraclecloud.com/oci-backend-network-security-group non è presente).

Esempio 4: creare un nuovo gruppo NSG frontend con regole di sicurezza gestite, disporre di regole di sicurezza gestite in un gruppo NSG backend esistente e aggiungere il load balancer a un gruppo NSG esistente

In questo esempio:

  • Si desidera che oci-cloud-controller-manager crei un gruppo NSG frontend per un load balancer e gestisca le regole di sicurezza in tale gruppo NSG.
  • Si desidera che oci-cloud-controller-manager utilizzi un gruppo NSG backend esistente e gestisca le regole di sicurezza in tale gruppo NSG.
  • Si desidera che oci-cloud-controller-manager aggiunga il load balancer a un gruppo NSG esistente con regole di sicurezza gestite dall'utente.

È necessario specificare:

  • "NSG" come valore dell'annotazione oci.oraclecloud.com/security-rule-management-mode.
  • OCID del gruppo NSG esistente che si desidera venga utilizzato da oci-cloud-controller-manager, come valore dell'annotazione oci.oraclecloud.com/oci-backend-network-security-group.
  • OCID del gruppo NSG esistente a cui si desidera che oci-cloud-controller-manager aggiunga il load balancer.

Il manifesto è il seguente:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"    
    oci.oraclecloud.com/security-rule-management-mode: "NSG"
    oci.oraclecloud.com/oci-backend-network-security-group: <nsg_ocid>
    oci.oraclecloud.com/oci-network-security-groups: "<nsg-ocid>"
  spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

In questo caso:

  • oci-cloud-controller-manager crea il gruppo NSG frontend per il load balancer e gestisce le relative regole di sicurezza.
  • oci-cloud-controller-manager gestisce le regole di sicurezza del gruppo NSG backend con l'OCID specificato dall'annotazione oci.oraclecloud.com/oci-backend-network-security-group.
  • oci-cloud-controller-manager aggiunge il load balancer al gruppo NSG specificato dall'annotazione oci.oraclecloud.com/oci-network-security-groups.

Specifica dei parametri di controllo dello stato

I load balancer e i load balancer di rete Oracle Cloud Infrastructure applicano un criterio di controllo dello stato per monitorare continuamente i server backend. Un controllo dello stato è un test per confermare la disponibilità del server backend e può essere una richiesta o un tentativo di connessione. Se un server non supera il controllo dello stato, il load balancer o il load balancer di rete eliminano temporaneamente la rotazione del server. Se il server supera successivamente il controllo dello stato, il load balancer o il load balancer di rete lo restituisce alla rotazione.

I criteri di controllo dello stato includono un numero di parametri, ciascuno dei quali ha un valore predefinito. Quando Kubernetes Engine esegue il provisioning di un load balancer o di un load balancer di rete OCI per un servizio Kubernetes di tipo LoadBalancer, è possibile eseguire l'override dei valori predefiniti dei parametri di controllo dello stato includendo le annotazioni nella sezione dei metadati del file manifest. In seguito sarà possibile aggiungere, modificare ed eliminare tali annotazioni. Se si elimina un'annotazione che ha specificato un valore per un parametro di controllo dello stato, il load balancer o il load balancer di rete utilizza invece il valore predefinito del parametro.

Configurare i parametri di controllo dello stato per i load balancer

Per configurare i parametri di controllo dello stato quando Kubernetes Engine esegue il provisioning di un load balancer per un servizio Kubernetes di tipo LoadBalancer, aggiungere le annotazioni riportate di seguito nella sezione dei metadati del file manifesto.

  • Per specificare il numero di richieste di controllo dello stato non riuscite da tentare prima che un server backend venga considerato in cattivo stato, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

    service.beta.kubernetes.io/oci-load-balancer-health-check-retries: "<value>"

    dove <value> è il numero di richieste di controllo dello stato non riuscite.

  • Per specificare l'intervallo tra le richieste di controllo dello stato, aggiungere la seguente annotazione nella sezione metadati del file manifesto:

    service.beta.kubernetes.io/oci-load-balancer-health-check-interval: "<value>"

    dove <value> è un valore numerico in millisecondi. Il minimo è 1000.

  • Per specificare il tempo massimo di attesa di una risposta a una richiesta di controllo dello stato, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

    service.beta.kubernetes.io/oci-load-balancer-health-check-timeout: "<value>"

    dove <value> è un valore numerico in millisecondi. Controllo dello stato riuscito solo se il load balancer riceve una risposta entro questo periodo di timeout.

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-health-check-retries: "5"
    service.beta.kubernetes.io/oci-load-balancer-health-check-interval: "15000"
    service.beta.kubernetes.io/oci-load-balancer-health-check-timeout: "4000"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
Configurare i parametri di controllo dello stato per i load balancer di rete

Per configurare i parametri di controllo dello stato quando Kubernetes Engine esegue il provisioning di un load balancer di rete per un servizio Kubernetes di tipo LoadBalancer, aggiungere le annotazioni riportate di seguito nella sezione dei metadati del file manifest.

  • Per specificare il numero di richieste di controllo dello stato non riuscite da tentare prima che un server backend venga considerato in cattivo stato, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

    oci-network-load-balancer.oraclecloud.com/health-check-retries: "<value>"

    dove <value> è il numero di richieste di controllo dello stato non riuscite.

  • Per specificare l'intervallo tra le richieste di controllo dello stato, aggiungere la seguente annotazione nella sezione metadati del file manifesto:

    oci-network-load-balancer.oraclecloud.com/health-check-interval: "<value>"

    dove <value> è un valore numerico in millisecondi. Il minimo è 1000.

  • Per specificare il tempo massimo di attesa di una risposta a una richiesta di controllo dello stato, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

    oci-network-load-balancer.oraclecloud.com/health-check-timeout: "<value>"

    dove <value> è un valore numerico in millisecondi. Controllo dello stato riuscito solo se il load balancer di rete riceve una risposta entro questo periodo di timeout.

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/health-check-retries: "5"
    oci-network-load-balancer.oraclecloud.com/health-check-interval: "15000"
    oci-network-load-balancer.oraclecloud.com/health-check-timeout: "4000"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Tenere presente che se non si specificano in modo esplicito i valori dei parametri di controllo dello stato includendo annotazioni nella sezione metadati del file manifesto, vengono utilizzati i valori predefiniti riportati di seguito.

Annotazione del load balancer Annotazione del load balancer di rete

Valore predefinito utilizzato

service.beta.kubernetes.io/oci-load-balancer-health-check-retries oci-network-load-balancer.oraclecloud.com/health-check-retries "3"
service.beta.kubernetes.io/oci-load-balancer-health-check-interval oci-network-load-balancer.oraclecloud.com/health-check-interval "10.000"
service.beta.kubernetes.io/oci-load-balancer-health-check-timeout oci-network-load-balancer.oraclecloud.com/health-check-timeout "3.000"

Per ulteriori informazioni sui criteri di controllo dello stato del load balancer e del load balancer di rete di Oracle Cloud Infrastructure, vedere:

Selezione dei nodi di lavoro da includere nei set backend

Il traffico in entrata verso un load balancer o un load balancer di rete Oracle Cloud Infrastructure viene distribuito tra i server backend in un set backend. Per impostazione predefinita, quando Kubernetes Engine esegue il provisioning di un load balancer o di un load balancer di rete Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, tutti i nodi di lavoro nel cluster vengono inclusi nel set backend.

Tuttavia, hai la possibilità di selezionare solo un subset di nodi di lavoro in un cluster da includere nel set backend di un determinato load balancer o load balancer di rete. L'inclusione di subset dei nodi di lavoro di un cluster nei set backend di diversi load balancer e load balancer di rete consente di presentare un singolo cluster Kubernetes come più cluster logici (servizi).

Selezionare i nodi di lavoro da includere nel set backend del load balancer

Per selezionare i nodi di lavoro da includere nel set backend 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:

oci.oraclecloud.com/node-label-selector: <label>

dove <label> è una o più chiavi e valori di etichetta, identificati mediante la notazione standard del selettore di etichette Kubernetes. Ad esempio, lbset=set1

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/node-label-selector: lbset=set1
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Selezionare i nodi di lavoro da includere nel set backend del load balancer di rete

Per selezionare i nodi di lavoro da includere nel set backend 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 manifest:

oci-network-load-balancer.oraclecloud.com/node-label-selector: <label>

dove <label> è una o più chiavi e valori di etichetta, identificati mediante la notazione standard del selettore di etichette Kubernetes. Ad esempio, lbset=set1

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/node-label-selector: lbset=set1
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Utilizzare la notazione standard del selettore di etichette Kubernetes per specificare le chiavi e i valori di etichetta nelle annotazioni nella sezione dei metadati del file manifesto. Per ulteriori informazioni sulla notazione standard del selettore di etichette Kubernetes, vedere Selettori di etichette nella documentazione di Kubernetes.

La tabella fornisce alcuni esempi di notazione standard del selettore di etichette Kubernetes.

Annotazione del load balancer Annotazione del load balancer di rete

Includere nel set backend:

oci.oraclecloud.com/node-label-selector: lbset=set1 oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset=set1

Tutti i nodi di lavoro con la chiave etichetta lbset che ha il valore set1

oci.oraclecloud.com/node-label-selector: lbset in (set1, set3) oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset in (set1, set3)

Tutti i nodi di lavoro con la chiave etichetta lbset che ha il valore set1 o set3

oci.oraclecloud.com/node-label-selector: lbset oci-network-load-balancer.oraclecloud.com/node-label-selector: lbset Tutti i nodi di lavoro con la chiave etichetta lbset, indipendentemente dal relativo valore.
oci.oraclecloud.com/node-label-selector: env=prod,lbset in (set1, set3) oci-network-load-balancer.oraclecloud.com/node-label-selector: env=prod,lbset in (set1, set3)

Tutti i nodi di lavoro con la chiave etichetta env che ha il valore prod e con la chiave etichetta lbset che ha il valore set1 o il valore set3

oci.oraclecloud.com/node-label-selector: env!=test oci-network-load-balancer.oraclecloud.com/node-label-selector: env!=test

Tutti i nodi di lavoro con la chiave etichetta env che non hanno il valore test

Specifica dei criteri del set backend

Quando Kubernetes Engine esegue il provisioning di un load balancer o 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 la modalità di distribuzione del traffico in entrata ai server backend.

Ulteriori informazioni

Specifica di un criterio del set backend per un load balancer

Per specificare un criterio per il set backend 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:

oci.oraclecloud.com/loadbalancer-policy: <value>

dove <value> è uno dei seguenti:

  • "ROUND_ROBIN": instrada sequenzialmente il traffico in entrata a ciascun server di un elenco di set backend.
  • "LEAST_CONNECTIONS": instrada il traffico delle richieste non permanenti in entrata verso il server backend con il minor numero di connessioni attive.
  • "IP_HASH": instrada il traffico di richieste non permanenti in entrata dallo stesso client allo stesso server backend, a condizione che tale server sia disponibile, utilizzando l'indirizzo IP di origine della richiesta in entrata come chiave di hashing.

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/loadbalancer-policy: "LEAST_CONNECTIONS"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Se non si specifica in modo esplicito un criterio per il set backend, come valore predefinito viene utilizzato "ROUND_ROBIN".

Specifica di un criterio del set backend per un load balancer di rete

Per specificare un criterio per il set backend 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 manifest:

oci-network-load-balancer.oraclecloud.com/backend-policy: <value>

dove <value> è uno dei seguenti:

  • "TWO_TUPLE": instrada il traffico in entrata in base all'hash a 2 tuple (IP di origine, IP di destinazione).
  • "THREE_TUPLE": instrada il traffico in entrata in base all'hash a 3 tuple (IP di origine, IP di destinazione, protocollo).
  • "FIVE_TUPLE": instrada il traffico in entrata in base all'hash a 5 tuple (IP e porta di origine, IP e porta di destinazione, protocollo).

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/backend-policy: "THREE_TUPLE"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Se non si specifica in modo esplicito un criterio per il set backend, come valore predefinito viene utilizzato "FIVE_TUPLE".

Specifica dei controlli di idoneità pod

Nota

È possibile specificare i punti di prontezza pod per i cluster con nodi virtuali, ma non per i cluster con nodi gestiti.

Quando Kubernetes Engine esegue il provisioning di un load balancer o di un load balancer di rete Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, è possibile utilizzare un gate di idoneità pod per garantire che il traffico venga instradato solo ai pod che sono stati aggiunti correttamente al set backend e che sono pronti a ricevere il traffico. Tenere presente che è possibile specificare i punti di idoneità dei pod per i pod in esecuzione sui nodi virtuali, ma non per i pod in esecuzione sui nodi gestiti. Non definire i gate di idoneità pod per i pod in esecuzione sui nodi gestiti.

I gate di prontezza pod sono condizioni aggiuntive per indicare che un pod è pronto a ricevere traffico. I punti di prontezza dei pod consentono di implementare complessi controlli di prontezza personalizzati e possono aiutare a ottenere zero tempi di inattività durante le distribuzioni in sequenza. Per ulteriori informazioni, consulta i dettagli sulla disponibilità dei pod nella documentazione di Kubernetes.

Quando si esegue il provisioning di un load balancer o di un load balancer di rete, il set backend comprende gli indirizzi IP delle repliche pod di una distribuzione con condizione Ready. L'aggiornamento della distribuzione (ad esempio, per utilizzare una nuova immagine) attiva la sostituzione delle repliche pod esistenti con nuove repliche pod. Tuttavia, la sostituzione di tutte le repliche pod può richiedere del tempo e causare l'indisponibilità backend perché:

  • Le repliche pod esistenti potrebbero essere interrotte prima che il set backend sia stato aggiornato con gli indirizzi IP delle nuove repliche pod.
  • Il set backend potrebbe essere aggiornato con gli indirizzi IP delle nuove repliche pod prima che le nuove repliche pod siano pronte per ricevere il traffico.

La specifica dell'uso di un controllo di idoneità pod garantisce che i backend siano sempre disponibili per il load balancer o il load balancer di rete. I pod esistenti non vengono interrotti fino a quando non vengono aggiunti nuovi pod al set backend e i nuovi pod sono pronti a ricevere traffico.

Per specificare che Kubernetes Engine deve inserire un controllo di prontezza pod nella specifica pod di ogni pod creato in un determinato spazio di nomi, aggiungere l'etichetta loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled allo spazio di nomi immettendo:

kubectl label ns <namespace> loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled

L'esempio riportato di seguito mostra come creare un load balancer con un controllo di idoneità pod.

In primo luogo, assegnare un'etichetta allo spazio di nomi pdr per specificare il gate di idoneità pod per lo spazio di nomi immettendo:

kubectl label ns pdr loadbalancer.oci.oraclecloud.com/pod-readiness-gate-inject=enabled

L'output del comando conferma che lo spazio di nomi è stato etichettato:

namespace/pdr labeled

Quindi, distribuire Nginx nello spazio di nomi pdr immettendo:

kubectl apply -f https://raw.githubusercontent.com/oracle-devrel/oci-oke-virtual-nodes/main/nginx-svc/nginx.yaml -n pdr

Elencare i pod nello spazio di nomi pdr immettendo:

kubectl get pods -n pdr

Ora puoi dimostrare l'uso del pod readiness gate aggiornando la versione dell'immagine nel manifesto Nginx e riapplicando il manifesto, in modo che i pod esistenti vengano sostituiti con nuovi pod.

Scaricare il file manifesto Nginx da https://raw.githubusercontent.com/oracle-devrel/oci-oke-virtual-nodes/main/nginx-svc/nginx.yaml, quindi modificare la versione dell'immagine in nginx:1.25.1, come mostrato di seguito.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.1
...

Per riapplicare il manifesto, inserendo:

kubectl apply -f ./nginx.yaml -n pdr

Osservare i nuovi pod in fase di implementazione immettendo:

kubectl get pods -o wide -n pdr

Ad esempio:

NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
nginx-678976847c-8bqs7   1/1     Running   0          44m   10.0.10.153   10.0.10.253   <none>           1/1
nginx-678976847c-ttqms   1/1     Running   0          47m   10.0.10.201   10.0.10.253   <none>           1/1

Osservare lo stato di uno dei nuovi pod immettendo:

kubectl describe pod <pod-name> -n pdr

Ad esempio:

kubectl describe pod nginx-678976847c-ttqms  -n pdr

L'output del comando conferma lo stato del controllo di idoneità podreadiness.loadbalancer.oraclecloud.com. Ad esempio:

...
Readiness Gates:
  Type                                                             Status
  podreadiness.loadbalancer.oraclecloud.com/f913fe603a9be9b5d51f   True 
Conditions:
  Type                                                             Status
  podreadiness.loadbalancer.oraclecloud.com/f913fe603a9be9b5d51f   True 
  PodScheduled                                                     True 
  Initialized                                                      True 
  Ready                                                            True 
  ContainersReady                                                  True 

Specifica di IPMode per regolare il routing del traffico

Quando Kubernetes Engine esegue il provisioning di un load balancer o di un load balancer di rete Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, puoi specificare come instradare il traffico proveniente da un cluster all'indirizzo IP del load balancer o del load balancer di rete.

Nei cluster che eseguono Kubernetes versione 1.30 o successiva, il gate di controllo delle funzioni Kubernetes LoadBalancerIPMode è abilitato e il campo ipMode di un servizio di tipo LoadBalancer ha il valore predefinito "VIP". Quando ipMode ha il valore "VIP", il traffico inviato all'indirizzo IP di un servizio di tipo LoadBalancer da un pod all'interno del cluster viene instradato direttamente ai pod dell'applicazione per ottimizzare le prestazioni, ignorando il servizio LoadBalancer. Per ulteriori informazioni, vedere Specifica IPMode dello stato del load balancer nella documentazione di Kubernetes.

Tuttavia, in alcune situazioni, potresti decidere che l'instradamento del traffico direttamente ai pod dell'applicazione non è appropriato. Ad esempio, se il traffico che ha origine all'interno di un cluster viene instradato direttamente ai pod dell'applicazione, non è possibile implementare l'arresto SSL a livello di load balancer.

Per specificare come instradare il traffico inviato all'indirizzo IP del load balancer o del load balancer di rete dall'interno del cluster, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

oci.oraclecloud.com/ingress-ip-mode: <value>

dove <value> è uno dei seguenti:

  • "VIP": tutto il traffico proveniente dal cluster e inviato all'indirizzo IP di un servizio di tipo LoadBalancer viene instradato direttamente ai pod dell'applicazione per ottimizzare le prestazioni, ignorando il servizio LoadBalancer.
  • "proxy": tutto il traffico proveniente dal cluster e inviato all'indirizzo IP di un servizio di tipo LoadBalancer viene instradato al load balancer o al load balancer di rete Oracle Cloud Infrastructure di cui è stato eseguito il provisioning per il servizio LoadBalancer. Il load balancer o il load balancer di rete inoltra quindi il traffico ai pod dell'applicazione.

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/ingress-ip-mode: "proxy"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Se non si specifica l'annotazione oci.oraclecloud.com/ingress-ip-mode o successivamente si rimuove l'annotazione, la proprietà ipMode di un servizio di tipo LoadBalancer avrà il valore predefinito "VIP".

Tenere inoltre presente che quando si utilizza un load balancer di rete privato con l'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source impostata su true, il load balancer di rete prevede una limitazione nota che non consente il traffico in cui il nodo di origine e il nodo backend di destinazione sono lo stesso nodo. Questa limitazione impedisce la comunicazione tra pod sullo stesso nodo tramite il load balancer di rete quando vengono soddisfatte tutte le condizioni riportate di seguito.

  • L'annotazione oci.oraclecloud.com/ingress-ip-mode viene impostata su proxy .
  • L'annotazione oci-network-load-balancer.oraclecloud.com/is-preserve-source viene impostata su true .
  • Il load balancer di rete è privato.

Specifica delle famiglie di indirizzi IP per i load balancer e i load balancer di rete

Quando Kubernetes Engine esegue il provisioning di un load balancer o di un load balancer di rete Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, la subnet del load balancer determina il controllo di cui si dispone sulla famiglia di indirizzi IP dell'indirizzo IP su cui il load balancer o il load balancer di rete riceve il traffico.

  • Se la subnet è una subnet a stack singolo IPv4, la subnet viene configurata solo per l'indirizzamento IPv4. Al load balancer o al load balancer di rete viene assegnato solo un indirizzo IPv4 su cui ricevere il traffico esterno. Non è possibile modificare la famiglia di indirizzi IP dell'indirizzo IP su cui il load balancer o il load balancer di rete riceve traffico esterno.
  • Se la subnet è una subnet a doppio stack IPv4/IPv6, viene configurata sia per l'indirizzamento IPv4 che per l'indirizzamento IPv6. Il load balancer o il load balancer di rete possono essere allocati sia a un indirizzo IPv4 che a un indirizzo IPv6 su cui ricevere traffico esterno. In questa situazione, è possibile utilizzare i campi spec.ipFamilyPolicy e spec.ipFamilies di Kubernetes nel file manifesto del servizio per specificare se il load balancer o il load balancer di rete ricevono traffico esterno solo all'indirizzo IPv4 o solo all'indirizzo IPv6 oppure sia all'indirizzo IPv4 che all'indirizzo IPv6.

Tenere presente che la famiglia di indirizzi IP utilizzata per il traffico tra il listener e il set backend viene determinata in modo diverso per i load balancer e i load balancer di rete.

  • Load balancer: il traffico tra un listener del load balancer e il set backend utilizza sempre gli indirizzi IPv4.
  • load balancer di rete: il traffico tra un listener del load balancer di rete e il set backend utilizza la stessa famiglia di indirizzi IP dell'indirizzo IP su cui il listener del load balancer di rete riceve il traffico esterno.

La tabella mostra l'interazione tra la famiglia di indirizzi IP della subnet del load balancer, le impostazioni di spec.ipFamilyPolicy e spec.ipFamilies, la famiglia di indirizzi IP da cui vengono allocati gli indirizzi IP al load balancer o al load balancer di rete e il protocollo IP tra il listener e il set backend. Si noti che vengono visualizzate solo combinazioni valide.

Famiglia di indirizzi IP subnet ipFamilyPolicy impostato su: ipFamilies impostato su: Famiglia di indirizzi IP dell'endpoint del load balancer di rete Famiglia di indirizzi IP del load balancer Da listener del load balancer di rete a traffico del set backend Da listener del load balancer a traffico del set backend
IPv4 SingleStack IPv4 IPv4 IPv4 IPv4 IPv4
IPv4/IPv6 SingleStack IPv4 IPv4 IPv4 IPv4 IPv4
IPv4/IPv6 SingleStack IPv6 IPv6 non supportata IPv6 non supportata
IPv4 PreferDualStack IPv4 IPv4 IPv4 IPv4 IPv4
IPv4 PreferDualStack IPv6 IPv4 IPv4 IPv4 IPv4
IPv4 PreferDualStack IPv4,IPv6 IPv4 IPv4 IPv4 IPv4
IPv4 PreferDualStack IPv6,IPv4 IPv4 IPv4 IPv4 IPv4
IPv4/IPv6 PreferDualStack IPv4 IPv4(primario) e IPv6 IPv4(primario) e IPv6 IPv4(primario) e IPv6 IPv4
IPv4/IPv6 PreferDualStack IPv6 IPv6(primario) e IPv4 IPv6(primario) e IPv4 IPv6(primario) e IPv4 IPv4
IPv4/IPv6 PreferDualStack IPv4,IPv6 IPv4(primario) e IPv6 IPv4(primario) e IPv6 IPv4(primario) e IPv6 IPv4
IPv4/IPv6 PreferDualStack IPv6,IPv4 IPv6(primario) e IPv4 IPv6(primario) e IPv4 IPv6(primario) e IPv4 IPv4
IPv4/IPv6 RequireDualStack IPv4,IPv6 IPv4(primario) e IPv6 IPv4(primario) e IPv6 IPv4(primario) e IPv6 IPv4
IPv4/IPv6 RequireDualStack IPv6,IPv4 IPv6(primario) e IPv4 IPv6(primario) e IPv4 IPv6(primario) e IPv4 IPv4

Tenere presente che se si utilizza l'annotazione service.beta.kubernetes.io/oci-load-balancer-subnet1 per specificare una subnet alternativa alla subnet specificata per i load balancer al momento della creazione del cluster, assicurarsi che la famiglia di indirizzi della subnet alternativa sia compatibile con i campi spec.ipFamilyPolicy e spec.ipFamilies nel manifesto del servizio.

Per ulteriori informazioni sul supporto IPv4 e IPv6 in Kubernetes, vedere IPv4/IPv6 dual-stack nella documentazione di Kubernetes.

Esempio1:

In questo esempio:

  • Si desidera utilizzare la subnet specificata per i load balancer al momento della creazione del cluster.
  • Si desidera distribuire il servizio di tipo LoadBalancer solo se può essere assegnato sia a un indirizzo IPv4 che a un indirizzo IPv6, quindi impostare ipFamilyPolicy: RequireDualStack.
  • Si desidera che l'indirizzo IP primario del load balancer sia un indirizzo IPv6 (e che il relativo indirizzo secondario sia un indirizzo IPv4), in modo da impostare spec.ipFamilies: IPv6,IPv4.
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb" 
spec:
  type: LoadBalancer
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv6
  - IPv4
  ports:
  - name: http
    port: 80
    targetPort: 80
  selector:
    app: nginx

In questo esempio, la subnet del load balancer del cluster è una subnet IPv4/IPv6 a doppio stack, pertanto la distribuzione riesce. Al load balancer viene assegnato un indirizzo IPv6 come indirizzo primario e un indirizzo IPv4 come indirizzo secondario.

Esempio2:

In questo esempio:

  • Si desidera ospitare il servizio di tipo LoadBalancer in una subnet alternativa a quella specificata per i load balancer al momento della creazione del cluster, pertanto è possibile utilizzare l'annotazione service.beta.kubernetes.io/oci-load-balancer-subnet1 per specificare l'OCID della subnet alternativa.
  • Si desidera allocare sia gli indirizzi IPv4 che IPv6 al servizio di tipo LoadBalancer se il servizio è ospitato in una sottorete IPv4/IPv6 a doppio stack. In caso contrario, se il servizio è ospitato in un singolo stack IPv4 subnet, si desidera che venga allocato un indirizzo IP al servizio da tale famiglia di indirizzi IP. Quindi si imposta ipFamilyPolicy: PreferDualStack.
  • Si desidera che l'indirizzo IP primario del load balancer sia un indirizzo IPv4 e che il relativo indirizzo secondario sia un indirizzo IPv6, se supportato dalla subnet, in modo da impostare spec.ipFamilies: IPv4,IPv6.
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
  labels:
    app: nginx
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    service.beta.kubernetes.io/oci-load-balancer-subnet1: "ocid1.subnet.oc1..aaaaaa....vdfw"  
spec:
  type: LoadBalancer
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
  - IPv4
  - IPv6
  ports:
  - name: http
    port: 80
    targetPort: 80
  selector:
    app: nginx

In questo esempio, la subnet alternativa è una subnet a doppio stack IPv4/IPv6, pertanto la distribuzione è riuscita. Al load balancer viene assegnato un indirizzo IPv4 come indirizzo primario e un indirizzo IPv6 come indirizzo secondario.

Assegnazione di indirizzi specifici IPv4 e IPv6 ai load balancer di rete

Quando Kubernetes Engine esegue il provisioning di un load balancer di rete Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, il servizio Load Balancer di rete assegna uno o più indirizzi IP al load balancer di rete.

Il servizio Load Balancer di rete assegna un indirizzo IPv4 privato e, nel caso di un load balancer di rete esterno, assegna anche un indirizzo IPv4 pubblico aggiuntivo. Se la subnet del load balancer di rete è compatibile, il servizio Load Balancer di rete può anche assegnare un indirizzo IPv6 (vedere Specifica delle famiglie di indirizzi IP per i load balancer e i load balancer di rete).

Nei cluster che eseguono Kubernetes versione 1.29 o successiva, è possibile specificare l'indirizzo IP da assegnare al load balancer di rete, anziché selezionare l'indirizzo IP da assegnare al servizio Load Balancer di rete. L'indirizzo IP che puoi assegnare dipende dalla famiglia di indirizzi IP della subnet del load balancer di rete, come indicato di seguito.

  • IPv4: se la subnet del load balancer di rete è una subnet a stack singolo IPv4 o una subnet a doppio stack IPv4/IPv6, è possibile assegnare un indirizzo IPv4 privato al load balancer di rete.
  • IPv4 e IPv6: se la subnet del load balancer di rete è una subnet a doppio stack IPv4/IPv6, è possibile assegnare un indirizzo IPv4 privato o entrambi e un indirizzo IPv6 al load balancer di rete.

Per specificare un indirizzo IPv4 privato da assegnare a un load balancer di rete, aggiungere l'annotazione seguente nella sezione dei metadati del file manifesto:

oci-network-load-balancer.oraclecloud.com/assigned-private-ipv4: "<ipv4-address>"

dove <ipv4-address> è un indirizzo IPv4 valido, dal blocco CIDRIPv4 CIDR IPv4 specificato per la subnet del load balancer di rete. Ad esempio:

oci-network-load-balancer.oraclecloud.com/assigned-private-ipv4: "10.0.0.1"

Per specificare un indirizzo IPv6 da assegnare a un load balancer di rete, aggiungere l'annotazione seguente nella sezione dei metadati del file manifesto:

oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "<ipv6-address>"

dove <ipv6-address> è un indirizzo ULA o GUA IPv6 valido, dal blocco CIDR IPv6 specificato per la subnet del load balancer di rete. Ad esempio:

  • oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "fd8a:4b3c:7d91:abcd::1"
  • oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "2607:9b80:9a0a:9a7e:abcd:ef01:2345:6789"

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/assigned-private-ipv4: "10.0.0.1"
    oci-network-load-balancer.oraclecloud.com/assigned-ipv6: "fd8a:4b3c:7d91:abcd::1"
spec:
  type: LoadBalancer
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv6
  - IPv4
  ports:
  - port: 80
  selector:
    app: nginx

È tua responsabilità specificare un indirizzo IP valido. Affinché un indirizzo IP sia valido, devono essere soddisfatte le seguenti condizioni:

  • L'indirizzo IP deve essere nel formato corretto per l'annotazione utilizzata (IPv4 o IPv6).
  • L'indirizzo IP deve provenire dal blocco CIDR appropriato specificato per la subnet del load balancer di rete.
  • L'indirizzo IP non deve essere già utilizzato da un'altra risorsa.

Tenere presente quanto riportato di seguito.

  • Se l'indirizzo IP non è nel formato corretto o non proviene dal blocco CIDR appropriato, la richiesta di creazione del load balancer di rete non viene accettata.
  • Se l'indirizzo IP è nel formato corretto e dal blocco CIDR appropriato, ma l'indirizzo IP è già in uso da un'altra risorsa, la richiesta di creazione del load balancer di rete viene accettata. Tuttavia, la richiesta di lavoro associata non riuscirà e il compartimento conterrà un load balancer di rete in stato Non riuscito.
  • Se l'indirizzo IP è valido, il load balancer di rete viene creato con l'indirizzo IP specificato assegnatogli.

Nascondere l'indirizzo IP privato di un load balancer di rete

Quando Kubernetes Engine esegue il provisioning di un load balancer di rete Oracle Cloud Infrastructure pubblico per un servizio Kubernetes di tipo LoadBalancer, il servizio Load balancer di rete assegna sia un indirizzo IP pubblico che un indirizzo IP privato al load balancer di rete. L'indirizzo IP privato viene utilizzato per i controlli dello stato e la conversione dell'indirizzo della porta (PAT, port address translation), ma non può ricevere traffico esterno dalla rete VCN (inclusa la rete Internet pubblica).

Per visualizzare gli indirizzi IP pubblici e privati assegnati dal servizio Load balancer di rete al load balancer di rete, immettere il comando kubectl get service (o simile). Ad esempio:

kubectl get service my-nginx-svc -o json | jq .status

{
  "loadBalancer": {
    "ingress": [
      {
        "ip": "203.0.113.2"
      },
      {
        "ip": "10.30.3.24"
      }
    ]
  }
}

In alcuni casi, potresti solo voler esporre l'indirizzo IP pubblico del load balancer di rete e nascondere l'indirizzo IP privato. Ad esempio:

  • Quando si utilizza il componente aggiuntivo ExternalDNS, è possibile specificare un nome DNS descrittivo per il load balancer di rete includendo l'annotazione external-dns.alpha.kubernetes.io/hostname nel file manifesto del servizio Kubernetes di tipo LoadBalancer. ExternalDNS crea un record DNS per il load balancer di rete nel provider DNS esterno configurato per il cluster. Il record DNS mappa il nome DNS sia all'indirizzo IP pubblico che all'indirizzo IP privato. Di conseguenza, se il traffico esterno utilizza il nome DNS, è possibile che il traffico venga instradato all'indirizzo IP privato del load balancer di rete, anche se l'indirizzo IP privato non può ricevere traffico esterno.
  • È possibile impostare l'automazione che utilizza il comando kubectl get service (o simile) per ottenere l'indirizzo IP del load balancer di rete. Se il tuo caso d'uso include l'instradamento del traffico esterno, desideri solo l'indirizzo IP pubblico del load balancer di rete. Tuttavia, per impostazione predefinita, il comando kubectl get service restituisce sia l'indirizzo IP pubblico del load balancer di rete che il relativo indirizzo IP privato.

Per specificare che il comando kubectl get service (o simile) restituisce solo l'indirizzo IP pubblico del load balancer di rete, aggiungere la seguente annotazione nella sezione dei metadati del file manifesto:

oci-network-load-balancer.oraclecloud.com/external-ip-only: "true"

Si noti che "false" è il valore predefinito dell'annotazione oci-network-load-balancer.oraclecloud.com/external-ip-only. Se non si include l'annotazione in modo esplicito nella definizione del servizio, il comando kubectl get service (o simile) restituisce sia l'indirizzo IP pubblico del load balancer di rete che l'indirizzo IP privato

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/external-ip-only: "true"
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx

Se si include l'annotazione oci-network-load-balancer.oraclecloud.com/external-ip-only: "true" nel file manifesto, quando si immette il comando kubectl get service (o simile), viene restituito solo l'indirizzo IP pubblico. Ad esempio:

kubectl get service my-nginx-svc -o json | jq .status

{
  "loadBalancer": {
    "ingress": [
      {
        "ip": "203.0.113.2"
      }
    ]
  }
}

Impedire ai nodi di gestire il traffico

Puoi escludere determinati nodi di lavoro dalla lista di server backend nel set backend di un load balancer o di un load balancer di rete Oracle Cloud Infrastructure. Per ulteriori informazioni, vedere node.kubernetes.io/exclude-from-external-load-balancers.

Applicazione di tag ai load balancer e ai load balancer di rete

Puoi aggiungere tag a un load balancer o a un load balancer di rete di cui Kubernetes Engine esegue il provisioning per un servizio Kubernetes di tipo LoadBalancer. L'applicazione di tag consente di raggruppare risorse eterogenee in vari compartimenti e di aggiungere annotazioni alle risorse con i propri metadati. Vedere Applicazione di tag ai load balancer.

Abilitazione del protocollo proxy

Quando Kubernetes Engine esegue il provisioning di un load balancer o di un load balancer di rete Oracle Cloud Infrastructure per un servizio Kubernetes di tipo LoadBalancer, è possibile specificare se abilitare la funzione di protocollo proxy con listener basati su TCP. L'abilitazione del protocollo proxy consente di trasportare in modo sicuro le informazioni di connessione di trasporto, ad esempio l'indirizzo IP di un client, attraverso più livelli di proxy, al server backend. Sono disponibili le seguenti versioni del protocollo proxy:

  • La versione 1, che utilizza un'intestazione basata su testo per passare informazioni tra i proxy ed è la migliore per piccole implementazioni.
  • La versione 2, che utilizza un'intestazione basata su testo e binaria per una maggiore efficienza nella produzione e nell'analisi, è la migliore per le implementazioni più grandi.

I load balancer di cui è stato eseguito il provisioning dal protocollo proxy di supporto del motore Kubernetes versione 1 e 2. Load balancer di rete di cui è stato eseguito il provisioning dal protocollo proxy di supporto del motore Kubernetes versione 2.

Ulteriori informazioni

Abilitazione del protocollo proxy per i load balancer

Per abilitare il protocollo proxy per i load balancer di cui è stato eseguito il provisioning da Kubernetes Engine, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

service.beta.kubernetes.io/oci-load-balancer-connection-proxy-protocol-version: "<value>"

dove "<value>" è uno dei seguenti:

  • "1" per specificare che si desidera abilitare il protocollo proxy versione 1 su tutti i listener del load balancer.
  • "2" per specificare che si desidera abilitare il protocollo proxy versione 2 su tutti i listener del load balancer.

Dopo aver abilitato la funzione di protocollo proxy per i load balancer, tenere presente quanto riportato di seguito.

  • Non è possibile disabilitare la funzione del protocollo proxy nei listener del load balancer.
  • È possibile passare dal protocollo proxy versione 1 a quello proxy versione 2 aggiornando l'annotazione.
  • Se successivamente si rimuove l'annotazione dal file manifesto o si annulla l'impostazione dell'annotazione (impostando "<value>" su ""), l'ultima impostazione applicata correttamente per "<value>" viene conservata in tutti i listener.
Abilitazione e disabilitazione del protocollo proxy per i load balancer di rete

Per abilitare il protocollo proxy per i load balancer di rete di cui è stato eseguito il provisioning da Kubernetes Engine, aggiungere la seguente annotazione nella sezione dei metadati del file manifest:

oci-network-load-balancer.oraclecloud.com/is-ppv2-enabled: "<value>"

dove "<value>" è uno dei seguenti:

  • "true" per specificare che si desidera abilitare il protocollo proxy versione 2 su tutti i listener del load balancer di rete.
  • "false" per specificare che si desidera disabilitare il protocollo proxy versione 2 su tutti i listener del load balancer di rete.

Dopo aver abilitato la funzione di protocollo proxy per i load balancer di rete, tenere presente quanto riportato di seguito.

  • È possibile disabilitare la funzione del protocollo proxy nei listener del load balancer di rete impostando "<value>" su "false".
  • Se successivamente si rimuove l'annotazione dal file manifesto o si annulla l'impostazione dell'annotazione (impostando "<value>" su "") o si specifica un valore non valido (ad esempio "enable") per l'annotazione, l'ultima impostazione applicata correttamente per "<value>" viene conservata in tutti i listener.