Configurazione di OCI Native Ingress Controller
Scopri come configurare e personalizzare il controller di entrata nativo OCI per bilanciare il carico e instradare il traffico in entrata ai pod del servizio in esecuzione sui nodi di lavoro in un cluster Kubernetes.
Dopo aver installato il controller in entrata nativo OCI (come programma standalone o come componente aggiuntivo cluster) e aver creato le risorse necessarie relative all'ingresso Kubernetes per utilizzarlo, è possibile configurare il controller in entrata nativo OCI effettuando le operazioni riportate di seguito.
- Specifica delle regole di instradamento per il controller di entrata nativo OCI
- Personalizzazione del funzionamento del controller di entrata nativo OCI mediante annotazioni
- Impostazione di un controllo di idoneità pod
- Impostazione dei listener TCP
- Aggiunta del supporto per le richieste HTTPS/TLS
- Aggregazione delle porte del listener HTTP/HTTPS
- Conservazione del load balancer dopo l'eliminazione di IngressClass
- Applicazione di tag al load balancer
Specifica delle regole di instradamento per il controller di entrata nativo OCI
Per specificare il modo in cui il load balancer OCI creato dal controller di entrata nativo OCI (installato come programma standalone o come componente aggiuntivo del cluster) instrada le richieste in entrata, specificare le regole di instradamento nel file manifesto Ingress
.
Instrada richieste in base all'host
È possibile configurare il controller di entrata nativo OCI per instradare una richiesta in entrata in base al nome dominio nell'intestazione host della richiesta (l'host a cui è stata originariamente inviata la richiesta).
Per instradare una richiesta a un determinato servizio backend e a una determinata porta in base all'host, creare una regola di instradamento nel file manifesto Ingress
. Se l'host corrisponde alla regola di instradamento, il controller di entrata nativo OCI instrada la richiesta al servizio backend e alla porta associati.
Ad esempio, è possibile definire la regola seguente per instradare le richieste inviate originariamente a http://foo.bar.com
a un servizio backend denominato ServiceA sulla porta 80. Tutto il traffico in entrata originariamente inviato a http://foo.bar.com
viene instradato a ServiceA sulla porta 80.
kind: Ingress
...
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: /
backend:
serviceName: ServiceA
servicePort: 80
Instrada le richieste a servizi backend diversi in base al percorso
Puoi configurare il controller di entrata nativo OCI per instradare le richieste in entrata a diversi servizi backend, in base agli elementi nel percorso a cui le richieste sono state originariamente inviate.
Per instradare una richiesta a un determinato servizio backend e a una determinata porta in base al percorso, creare una regola di instradamento nel file manifesto Ingress
. Se il percorso corrisponde alla regola di instradamento, il controller di entrata nativo OCI instrada la richiesta al servizio backend e alla porta associati. È possibile specificare più percorsi nella stessa regola per instradare le richieste a backend diversi.
Ad esempio, è possibile definire la regola seguente per instradare le richieste in base al percorso al quale la richiesta è stata originariamente inviata:
- Se il percorso inizia con /app1, il controller di entrata nativo OCI instrada la richiesta a un servizio backend denominato ServiceA sulla porta 80.
- Se il percorso inizia con /app2, il controller di entrata nativo OCI instrada la richiesta a un servizio backend denominato ServiceB sulla porta 443.
Poiché la regola non specifica un host, la regola si applica a tutto il traffico in entrata.
kind: Ingress
...
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /app1
backend:
serviceName: ServiceA
servicePort: 80
- pathType: Prefix
path: /app2
backend:
serviceName: ServiceB
servicePort: 443
Instrada richieste in base a host e percorso
È possibile configurare il controller di entrata nativo OCI per instradare una richiesta in entrata in base sia al nome di dominio nell'intestazione host della richiesta (l'host a cui è stata originariamente inviata la richiesta) che agli elementi nel percorso a cui è stata inviata la richiesta originale.
Per instradare una richiesta a un servizio e a una porta backend specifici in base all'host e al percorso, creare una regola di instradamento nel file manifesto Ingress
. Se l'host e il percorso corrispondono alla regola di instradamento, il controller di entrata nativo OCI instrada la richiesta al servizio backend e alla porta associati.
Ad esempio, è possibile definire la regola seguente per instradare le richieste inviate originariamente a http://foo.bar.com/app1
a un servizio backend denominato foo sulla porta 80:
kind: Ingress
...
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: /app1
backend:
serviceName: foo
servicePort: 80
Instrada le richieste a un backend predefinito
Puoi configurare il controller di entrata nativo OCI per instradare le richieste in entrata a un backend predefinito. È possibile configurare un backend predefinito per gestire le richieste che non corrispondono ad alcuna regola di instradamento.
Ad esempio, è possibile definire il seguente defaultBackend
per instradare le richieste che non corrispondono ad altre regole nel file manifesto Ingress
a un servizio backend denominato ServiceC sulla porta 8080.
Tenere presente che se non si specificano altre regole in un file manifesto Ingress
, è necessario specificare un valore defaultBackend
.
kind: Ingress
...
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /app1
backend:
serviceName: ServiceA
servicePort: 80
- pathType: Prefix
path: /app2
backend:
serviceName: ServiceB
servicePort: 443
defaultBackend:
service:
name: ServiceC
port:
number: 8080
Personalizzazione del funzionamento del controller di entrata nativo OCI mediante annotazioni
È possibile aggiungere annotazioni ai file manifesto delle risorse IngressClass
o Ingress
per personalizzare il funzionamento del controller di entrata nativo OCI (installato come programma standalone o come componente aggiuntivo cluster).
Personalizzazione del comportamento generale mediante annotazioni
È possibile aggiungere annotazioni ai file manifesto delle risorse IngressClass
o Ingress
per personalizzare il funzionamento generale del controller di entrata nativo OCI.
Annotazione | descrizione; | Aggiungi annotazione a questo manifesto risorse | Esempio |
---|---|---|---|
oci-native-ingress.oraclecloud.com/id |
OCID di un load balancer OCI esistente da utilizzare, anziché crearne uno nuovo. Tenere presente che se si specifica un load balancer esistente, il controller di entrata nativo OCI gestisce il load balancer e aggiorna le relative proprietà in base alle esigenze per allinearsi ai valori nei file manifesto delle risorse IngressClassParameters, IngressClass e Ingress. |
IngressClass |
oci-native-ingress.oraclecloud.com/id: ocid1.loadbalancer.oc1.iad.aaaaaaaan___u7a |
oci-native-ingress.oraclecloud.com/defined-tags |
Una o più tag definite da applicare al load balancer in formato JSON. | IngressClass |
oci-native-ingress.oraclecloud.com/defined-tags: '{"tag-namespace-1": {"key1": "value1", "key2": "value2"}, "tag-namespace-2": {"key1": "value1"}}' |
oci-native-ingress.oraclecloud.com/freeform-tags |
Una o più tag in formato libero da applicare al load balancer in formato JSON. Vedere Applicazione di tag in formato libero al load balancer. |
IngressClass |
oci-native-ingress.oraclecloud.com/freeform-tags: '{"key1": "value1", "key2": "value2"}' |
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true" |
Indica se conservare il load balancer se viene eliminato IngressClass. Se si imposta Vedere Conservazione del load balancer dopo l'eliminazione di IngressClass. |
IngressClass |
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true" |
oci-native-ingress.oraclecloud.com/network-security-group-ids |
Uno o più OCID dei gruppi di sicurezza di rete (NSG) a cui aggiungere il load balancer in una lista delimitata da virgole. Se non specificato, il load balancer non viene aggiunto ad alcun gruppo NSG. | IngressClass |
oci-native-ingress.oraclecloud.com/network-security-group-ids: 'ocid1.networksecuritygroup.oc1.iad.agx___kby, ocid1.networksecuritygroup.oc1.iad.ahr___mlo' |
oci-native-ingress.oraclecloud.com/waf-policy-ocid |
OCID di un criterio Web Application Firewall (WAF) esistente. Vedere Criteri di Web Application Firewall. | IngressClass |
oci-native-ingress.oraclecloud.com/waf-policy-ocid: ocid1.webappfirewallpolicy.oc1.iad.ama___aqq |
oci-native-ingress.oraclecloud.com/protocol |
Protocollo da utilizzare per il listener nel load balancer. Una delle opzioni HTTP2 o TCP. Tenere presente che se si specifica HTTP2 come protocollo, è necessario un listener configurato con TLS. |
Ingress |
oci-native-ingress.oraclecloud.com/protocol: "HTTP2" |
oci-native-ingress.oraclecloud.com/backend-tls-enabled |
Indica se i pod del servizio backend possono ricevere le richieste TLS. Se impostato su |
Ingress |
oci-native-ingress.oraclecloud.com/backend-tls-enabled: "false" |
oci-native-ingress.oraclecloud.com/http-listener-port |
Creare una singola porta listener per tutti i percorsi HTTP in questo ingresso, anziché creare una porta listener per ogni porta servizio. I criteri di instradamento vengono configurati di conseguenza. |
Ingress |
oci-native-ingress.oraclecloud.com/http-listener-port: "100" |
oci-native-ingress.oraclecloud.com/https-listener-port |
Creare una singola porta listener per tutti i percorsi HTTPS in entrata anziché creare una porta listener per ogni porta servizio. I criteri di instradamento vengono configurati di conseguenza. | Ingress |
oci-native-ingress.oraclecloud.com/https-listener-port: "500" |
oci-native-ingress.oraclecloud.com/policy |
Criterio che deve essere utilizzato dal set backend del load balancer per la distribuzione del traffico. | Ingress |
oci-native-ingress.oraclecloud.com/policy: "ROUND_ROBIN" |
Personalizzazione del funzionamento del controllo dello stato mediante annotazioni
È possibile aggiungere annotazioni al manifesto delle risorse Ingress
per personalizzare i controlli dello stato eseguiti dal load balancer creato dal controller di entrata nativo OCI. Per ulteriori informazioni sui controlli di integrità del load balancer, vedere Controlli di integrità per i load balancer.
Annotazione | descrizione; | Aggiungi annotazione a questo manifesto risorse | Esempio |
---|---|---|---|
oci-native-ingress.oraclecloud.com/healthcheck-protocol |
Protocollo da utilizzare per i controlli dello stato del set backend del load balancer. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-protocol: "HTTP" |
oci-native-ingress.oraclecloud.com/healthcheck-port |
Porta da utilizzare per i controlli dello stato del set backend del load balancer. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-port: "80" |
oci-native-ingress.oraclecloud.com/healthcheck-path |
Percorso da utilizzare per i controlli dello stato del set backend del load balancer. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-path: "/test" |
oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds |
Intervallo tra i controlli dello stato del set backend del load balancer. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-interval-milliseconds: "1000" |
oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds |
Periodo di tempo trascorso il quale il controllo dello stato del set backend del load balancer viene considerato non riuscito. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-timeout-milliseconds: "750" |
oci-native-ingress.oraclecloud.com/healthcheck-retries |
Numero di nuovi tentativi dopo i quali il controllo dello stato del set backend del load balancer viene considerato non riuscito. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-retries: "5" |
oci-native-ingress.oraclecloud.com/healthcheck-return-code |
Codice di stato che il set backend del load balancer deve restituire in risposta a un controllo dello stato per essere considerato in buono stato. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-return-code: "200" |
oci-native-ingress.oraclecloud.com/healthcheck-response-regex |
Espressione regolare per l'analisi del corpo della risposta dal set backend del load balancer. È possibile specificare qualsiasi valore regex (ad esempio * o / ) o un valore vuoto. | Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-response-regex: "*" |
oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext |
Indica se inviare un controllo dello stato al backend del load balancer senza SSL (solo HTTP). Se non viene specificato, false è l'impostazione predefinita. |
Ingress |
oci-native-ingress.oraclecloud.com/healthcheck-force-plaintext: "true" |
Impostazione di un controllo di idoneità pod
I gate di prontezza pod sono condizioni aggiuntive incluse in un file manifesto pod 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 utilizza il controller in entrata nativo OCI (come programma standalone o come componente aggiuntivo cluster) con un cluster con rete pod nativa VCN come tipo di rete, è possibile specificare che il controller in entrata nativo OCI deve inserire un gate di idoneità pod nella specifica pod di ogni pod creato in un determinato spazio di nomi. Tenere presente che non è possibile utilizzare il controller di entrata nativo OCI per inserire i controlli di idoneità dei pod nelle specifiche dei pod se il cluster dispone di overlay multicanale come tipo di rete.
Specificare che il controller di entrata nativo OCI deve inserire un gate di idoneità pod nella specifica pod di ogni pod creato in un determinato spazio di nomi immettendo:
kubectl label ns <namespace> podreadiness.ingress.oraclecloud.com/pod-readiness-gate-inject=enabled
Il controller di entrata nativo OCI inserisce una condizione nella specifica pod di ogni pod creato nello spazio di nomi. Ad esempio:
kind: Pod
...
spec:
readinessGates:
- conditionType: podreadiness.ingress.oraclecloud.com/k8s_6b5b1b3a38
kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testecho-7cdcfff87f-b6xt4 1/1 Running 0 35s 10.0.10.242 10.0.10.135 <none> 0/1
testecho-7cdcfff87f-b6xt4 1/1 Running 0 72s 10.0.10.242 10.0.10.135 <none> 1/1
Impostazione dei listener TCP
Puoi utilizzare il controller di entrata nativo OCI (come programma standalone o come componente aggiuntivo cluster) per impostare i listener del load balancer come listener TCP. Ogni listener TCP inoltra semplicemente il traffico TCP ricevuto su una determinata porta al servizio backend specificato per tale porta in un file manifesto delle risorse Ingress
, senza eseguire alcun instradamento del livello di trasporto 7.
L'annotazione oci-native-ingress.oraclecloud.com/protocol
viene impostata per specificare che il controller di entrata nativo OCI deve creare un listener TCP per ogni porta univoca inclusa nelle regole di instradamento in un file manifesto delle risorse Ingress
.
Per specificare che il controller di entrata nativo OCI deve creare listener TCP, effettuare le operazioni riportate di seguito.
- Definire una nuova risorsa in entrata in un file .yaml. Vedere Crea risorsa in entrata.
- Nella sezione
metadata:
aggiungere un elementoannotations:
e impostare l'annotazioneoci-native-ingress.oraclecloud.com/protocol
suTCP
nel formato seguente:kind: Ingress metadata: name: <i-name> annotations: oci-native-ingress.oraclecloud.com/protocol: TCP spec: ...
dove
name: <i-name>
è il nome scelto per la risorsa in entrata.Ad esempio:
kind: Ingress metadata: name: ingress-pass-through annotations: oci-native-ingress.oraclecloud.com/protocol: TCP spec: ...
- Nella sezione
rules:
del manifesto delle risorseIngress
, aggiungere una regola per ogni listener che deve ricevere il traffico TCP:- (consigliato) Impostare
paths.pathType
suImplementationSpecific
. - Impostare
paths.backend.service.name
sul nome del servizio backend. - Impostare
paths.backend.service.port.number
sulla porta sulla quale ascoltare il traffico TCP e sulla quale inoltrare il traffico TCP.
Ad esempio, se si desidera un listener TCP in ascolto sulla porta 8080 per inoltrare il traffico TCP a
my-first-svc:8080
e un listener TCP in ascolto sulla porta 8081 per inoltrare il traffico TCP amy-second-svc:8081
, è possibile impostare un file manifesto della risorsaIngress
come indicato di seguito.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-pass-through annotations: oci-native-ingress.oraclecloud.com/protocol: TCP spec: rules: - http: paths: - pathType: ImplementationSpecific backend: service: name: my-first-svc port: number: 8080 - http: paths: - pathType: ImplementationSpecific backend: service: name: my-second-svc port: number: 8081
- (consigliato) Impostare
-
Creare la risorsa immettendo
kubectl create -f <filename>.yaml
Aggiunta del supporto per le richieste HTTPS/TLS
Puoi utilizzare il controller di ingresso nativo OCI (sia come programma standalone che come componente aggiuntivo cluster) per supportare la comunicazione HTTPS sicura. Utilizzando il controller in entrata nativo OCI, puoi impostare i listener e i set backend del load balancer OCI per gestire il traffico cifrato utilizzando TLS (in precedenza SSL).
Quando si utilizza il controller di entrata nativo OCI per supportare la comunicazione HTTPS, sono disponibili due opzioni:
- Opzione 1: OCI Native Ingress Controller ottiene il certificato dal servizio Certificates utilizzando un segreto Kubernetes: si crea un segreto Kubernetes e si specifica il nome del segreto in un file manifesto delle risorse
Ingress
. Il controller di entrata nativo OCI utilizza il segreto Kubernetes per ottenere un certificato e un bundle CA (bundle di autorità certificati) dal servizio OCI Certificates. Il controller di entrata nativo OCI associa il certificato e il bundle CA al listener e al set backend. - Opzione 2: si ottiene un certificato dal servizio Certificati: si crea manualmente un certificato nel servizio OCI Certificates. Specificare quindi l'OCID del certificato nel file manifesto della risorsa
Ingress
come annotazione. Il controller di entrata nativo OCI associa il certificato al listener e al set backend.
Quando si gestisce il traffico HTTPS, il load balancer OCI creato dal controller di entrata nativo OCI implementa TLS end-to-end per impostazione predefinita. Il load balancer utilizza i certificati per accettare una richiesta cifrata TLS da un client, quindi utilizza le regole di instradamento per inoltrare la richiesta al set backend appropriato. Il set backend crea una nuova connessione TLS con backend in esecuzione nel cluster (utilizzando il bundle CA come autorità di attendibilità per la nuova connessione).
Tenere presente quanto riportato di seguito.
- Se si elimina una risorsa
IngressClass
, il controller di entrata nativo OCI elimina il load balancer creato oppure elimina il load balancer esistente specificato dall'annotazioneoci-native-ingress.oraclecloud.com/id
(a meno che non sia stato impostatooci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
). Tenere tuttavia presente che il controller in entrata non elimina le risorse create nel servizio OCI Certificates. L'utente è responsabile dell'eliminazione di tali risorse del servizio Certificati. In particolare, se hai specificato un segreto Kubernetes nel manifesto delle risorseIngress
, tieni presente che sei responsabile dell'eliminazione di qualsiasi risorsa del servizio Certificati creata automaticamente dal controller di entrata nativo OCI. - I certificati ottenuti dal servizio OCI Certificates di tipo Importato non possono essere ruotati automaticamente. Se si desidera che i certificati vengano ruotati automaticamente, ottenere manualmente un certificato nel servizio OCI Certificates specificando che si desidera che il certificato venga emesso da una CA interna del servizio Certificates (i certificati sono di tipo Emessi dalla CA interna). È possibile configurare i certificati di tipo Emessi dalla CA interna in modo che vengano ruotati automaticamente.
- Se si specifica un segreto Kubernetes nel file manifesto delle risorse
Ingress
, i certificati ottenuti dal controller di entrata nativo OCI dal servizio Certificati sono di tipo Importato e pertanto non vengono ruotati automaticamente. Tuttavia, puoi rinnovare manualmente il certificato ottenuto dal servizio Certificati modificando i dettagli del certificato server corrente specificato nel segreto Kubernetes esistente. Quando si modificano i dettagli del certificato del server, il controller di entrata nativo OCI aggiorna i dettagli corrispondenti del certificato ottenuto dal servizio Certificati.Tenere presente che la modifica delle informazioni sull'oggetto nel certificato del server corrente (Nome comune, Nome organizzazione, Nomi alternativi oggetto) non è supportata dal servizio Certificati. Se si desidera modificare le informazioni sull'oggetto, eliminare il segreto Kubernetes originale e creare un nuovo segreto con lo stesso nome. Il controller di entrata nativo OCI ottiene un nuovo certificato di tipo Importato e un nuovo bundle CA dal servizio Certificati e li associa al listener e al set backend (sostituendo il certificato e il bundle CA precedenti).
- Un listener può essere associato a un solo certificato. Pertanto, non creare più risorse in entrata con regole che specificano la stessa combinazione di servizio/porta backend, ma in cui le risorse in entrata utilizzano certificati diversi.
- Per impostazione predefinita, il load balancer OCI creato dal controller di entrata nativo OCI implementa TLS end-to-end. Il load balancer interrompe la richiesta TLS sul listener e viene stabilita una nuova connessione TLS tra il set backend e i backend. Tuttavia, se i backend non eseguono un server HTTPS e si desidera pertanto che la connessione tra il set backend e i backend sia in testo normale, impostare l'annotazione
oci-native-ingress.oraclecloud.com/backend-tls-enabled
su"false"
. Quando l'annotazioneoci-native-ingress.oraclecloud.com/backend-tls-enabled
è impostata su"false"
, il load balancer può accettare il traffico cifrato da un client, ma il traffico tra il load balancer e i backend non viene cifrato.
Opzione 1: OCI Native Ingress Controller ottiene il certificato dal servizio Certificates utilizzando un segreto Kubernetes
Per configurare il controller di entrata nativo OCI per ottenere un certificato dal servizio OCI Certificates, effettuare le operazioni riportate di seguito.
- Ottenere una coppia di chiavi pubblica e privata TLS e un certificato.
Negli ambienti di produzione è possibile ottenere un certificato TLS dall'autorità di certificazione scelta inviando una richiesta di firma certificato. Durante il processo di richiesta del certificato vengono generate una chiave pubblica e la chiave privata corrispondente.
Negli ambienti di sviluppo e test è possibile creare un certificato con firma automatica e generare una chiave privata utilizzando uno strumento quale OpenSSL. Ad esempio, utilizzando OpenSSL 3.0 o versioni successive:
-
Generare una coppia di chiavi pubblica e privata immettendo i seguenti comandi:
openssl genrsa -out rootCA.key 4096
openssl req -x509 -addext basicConstraints=critical,CA:TRUE -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt -subj /CN=RootCA
-
Generare un certificato immettendo i seguenti comandi:
openssl genrsa -out server.key 4096
openssl req -new -sha256 -key server.key -subj /C=US/ST=CA/O=MyOrg,Inc./CN=my.example.com -out server.csr
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256
In questo esempio:
rootCA.key
contiene la coppia di chiavi per la CA root.rootCA.crt
contiene il certificato CA root.server.key
contiene la coppia di chiavi per generare il certificato del server.server.csr
contiene la richiesta di firma del certificato per il certificato del server.server.crt
contiene il certificato del server generato.
-
- Creare una risorsa segreta Kubernetes in uno dei seguenti modi:
-
Utilizzando il comando
kubectl create secret generic
, immettere:kubectl create secret generic <k8s-secret-name> --type=kubernetes.io/tls --from-file=ca.crt=<path-and-filename>.crt --from-file=tls.crt=<path-and-filename>.crt --from-file=tls.key=<path-and-filename>.key
Dove:
<k8s-secret-name>
è il nome scelto per il segreto Kubernetes--from-file=ca.crt=<path-and-filename>.crt
specifica il percorso del file che contiene il certificato CA radice. Ad esempio,--from-file=ca.crt=rootCA.crt
--from-file=tls.crt=<path-and-filename>.crt
specifica il percorso del file contenente il certificato del server generato. Ad esempio,--from-file=tls.crt=server.crt
--from-file=tls.key=<path-and-filename>.key
specifica il percorso del file che contiene la chiave privata generata. Ad esempio,--from-file=tls.key=server.key
Ad esempio:
kubectl create secret generic example-tls-secret --type=kubernetes.io/tls --from-file=ca.crt=rootCA.crt --from-file=tls.crt=server.crt --from-file=tls.key=server.key
- Utilizzo di un file manifesto della risorsa
Secret
:-
Definire il segreto Kubernetes in un file .yaml nel formato:
apiVersion: v1 kind: Secret metadata: name: <k8s-secret-name> type: kubernetes.io/tls data: ca.crt: <base64-encoded-certificate-chain> tls.crt: <base64-encoded-server-certificate> tls.key: <base64-encoded-private-key>
Dove:
name: <k8s-secret-name>
è il nome scelto per la risorsa segreta Kubernetes.ca.crt: <base64-encoded-certificate-chain>
è il contenuto del file (o dei file) contenente i certificati intermedi che formano una catena di certificati dal certificato foglia all'autorità di certificazione. Si noti che è possibile omettereca.cert
, a condizione di includere l'intera catena di certificati come valore ditls.cert
(nel qual caso, avviare la catena di certificati con il contenuto del file contenente il certificato del server generato, seguito dai certificati rimanenti).tls.crt: <base64-encoded-server-certificate>
è il contenuto del file contenente il certificato del server generato.tls.key: <base64-encoded-private-key>
è il contenuto del file contenente la chiave privata generata.
Ad esempio:
apiVersion: v1 kind: Secret metadata: name: example-tls-secret type: kubernetes.io/tls data: ca.crt : MIIFGERTegcDFRTuSDGfghREdE______Jre tls.crt: MIIC2DCCAcCgAwIBAgIBATANBg______kqh tls.key: MIIEpgIBAAKCAQEA7yn3bRHQ5F______HMQ
-
Creare la risorsa segreta immettendo
kubectl create -f <filename>.yaml
-
-
- Aggiungere il segreto Kubernetes in un file manifesto delle risorse
Ingress
:- Definire una nuova risorsa in entrata in un file .yaml. Vedere Crea risorsa in entrata.
- Nella sezione
spec:
del file manifesto, aggiungere un elementotls:
che specifichi sia l'host che deve ricevere il traffico HTTPS che il nome del segreto Kubernetes, nel formato:kind: Ingress ... spec: tls: - hosts: - <host-name> secretName: <k8s-secret-name>
Ad esempio:
kind: Ingress ... spec: tls: - hosts: - my.example.com secretName: example-tls-secret
- Nella sezione
rules:
del file manifesto aggiungere una regola per l'host che riceverà il traffico HTTPS e specificare 443 come porta di ascolto del traffico HTTPS.Ad esempio:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: acme-tls-secret-ingress spec: tls: - hosts: - my.example.com secretName: example-tls-secret rules: - host: "my.example.com" http: paths: - pathType: Prefix path: "/TLSPath" backend: service: name: tls-test port: number: 443
-
Creare la risorsa immettendo
kubectl create -f <filename>.yaml
Quando crei la risorsa in entrata, il controller in entrata nativo OCI utilizza il segreto Kubernetes per ottenere un certificato di tipo Importato e un bundle CA (bundle Autorità certificati) dal servizio OCI Certificates. Il controller di entrata nativo OCI associa il certificato al listener e il bundle CA al set backend.
Quando il listener in ascolto sulla porta 443 riceve una richiesta HTTPS all'host specificato, il listener utilizza il certificato per l'arresto TLS. Il listener utilizza quindi la regola di instradamento per inoltrare la richiesta al set backend. Il set backend crea una nuova connessione TLS con i backend in esecuzione nel cluster (utilizzando il bundle CA come autorità di attendibilità per la nuova connessione).
Opzione 2: ottenere il certificato dal servizio Certificati
Per configurare il controller di entrata nativo OCI in modo che utilizzi un certificato ottenuto dal servizio OCI Certificates, effettuare le operazioni riportate di seguito.
- Creare un certificato nel servizio OCI Certificates in uno dei modi riportati di seguito.
- importando un certificato emesso da un'autorità di certificazione di terze parti (il certificato sarà di tipo Importato);
- emettendo il certificato internamente da una CA del servizio Certificati (il certificato sarà di tipo Emesso dalla CA interna).
Non creare un certificato da gestire esternamente (di tipo Emesso dalla CA interna, gestito esternamente). Per ulteriori informazioni, vedere Creazione di un certificato.
- Prendere nota dell'OCID del certificato.
- Aggiungere l'OCID del certificato a un file manifesto della risorsa
Ingress
:- Definire una nuova risorsa in entrata in un file .yaml. Vedere Crea risorsa in entrata.
- Nella sezione
metadata:
aggiungere un elementoannotations:
che specifichi l'OCID del certificato creato nel servizio OCI Certificates nel formato seguente:kind: Ingress metadata: name: <i-name> annotations: oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid> spec: ...
Dove:
name: <i-name>
è il nome scelto per la risorsa in entrata.oci-native-ingress.oraclecloud.com/certificate-ocid: <certificate-ocid>
è l'OCID del certificato creato nel servizio OCI Certificates
Ad esempio:
kind: Ingress metadata: name: acme-tls-certificate-ingress annotations: oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc spec: ...
- Nella sezione
rules:
del manifesto delle risorseIngress
, aggiungere una regola per l'host che deve ricevere il traffico HTTPS e specificare 443 come porta su cui ascoltare il traffico HTTPS.Ad esempio:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: acme-tls-certificate-ingress annotations: oci-native-ingress.oraclecloud.com/certificate-ocid: ocid1.certificate.oc1.iad.amaaaaaa______gabc spec: rules: - host: "my.example.com" http: paths: - pathType: Prefix path: "/TLSPath" backend: service: name: tls-test port: number: 443
-
Creare la risorsa immettendo
kubectl create -f <filename>.yaml
Le conseguenze della creazione della risorsa in entrata dipendono dalla modalità di creazione del certificato nel servizio OCI Certificates:
- Se il certificato è stato creato importando un certificato emesso da un'autorità di certificazione di terze parti, il certificato è di tipo Importato. Il controller di entrata nativo OCI associa il certificato al listener, crea un bundle CA dalla catena di certificati e associa il bundle CA al set backend. Tenere presente che non è possibile configurare certificati di tipo Importati per la rotazione automatica.
- Se il certificato è stato creato emettendolo internamente da una CA del servizio Certificati, tale certificato è di tipo Emesso dalla CA interna. Il controller di entrata nativo OCI associa il certificato al listener, ottiene l'OCID della CA e associa tale OCID al set backend. È possibile configurare i certificati di tipo Emessi dalla CA interna in modo che vengano ruotati automaticamente.
Quando il listener in ascolto sulla porta 443 riceve una richiesta HTTPS all'host specificato, il listener utilizza il certificato per l'arresto TLS. Il listener utilizza quindi la regola di instradamento per inoltrare la richiesta al set backend. Il set backend crea una nuova connessione TLS con i backend in esecuzione nel cluster (utilizzando il bundle CA o la CA identificata dal relativo OCID come autorità sicura per la nuova connessione).
Aggregazione delle porte del listener HTTP/HTTPS
Quando si utilizza il controller di entrata nativo OCI (sia come programma standalone che come componente aggiuntivo cluster) è possibile aggregare tutto il traffico HTTP in una singola porta listener e, allo stesso modo, è possibile aggregare tutto il traffico HTTPS in una singola porta.
Per impostazione predefinita, il controller di entrata nativo OCI crea un listener del load balancer OCI per ogni porta del servizio backend definita in un file manifesto Ingress
. Il controller di entrata nativo OCI crea anche un criterio di instradamento per ogni porta del listener. Tuttavia, è possibile utilizzare l'annotazione oci-native-ingress.oraclecloud.com/http-listener-port
e/o l'annotazione oci-native-ingress.oraclecloud.com/https-listener-port
per creare un singolo listener e criterio di instradamento per tutte le richieste HTTP e/o un singolo listener e criterio di instradamento per tutte le richieste HTTPS.
Ad esempio, è possibile definire un'entrata con regole per quattro servizi backend, ciascuno in ascolto su una porta diversa, come indicato di seguito.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sample-ingress
spec:
tls:
- hosts:
- "foo.bar.com3"
- "foo.bar.com4"
secretName: secret_name
rules:
- host: "foo.bar.com1"
http:
paths:
- pathType: Prefix
path: "/testecho1"
backend:
service:
name: testecho1
port:
number: 80
- host: "foo.bar.com2"
http:
paths:
- pathType: Prefix
path: "/testecho2"
backend:
service:
name: testecho2
port:
number: 81
- host: "foo.bar.com3"
http:
paths:
- pathType: Prefix
path: "/testecho3"
backend:
service:
name: testecho3
port:
number: 443
- host: "foo.bar.com4"
http:
paths:
- pathType: Prefix
path: "/testecho4"
backend:
service:
name: testecho4
port:
number: 444
In questo esempio il file manifesto Ingress
definisce quattro servizi:
- testecho1, in ascolto sulla porta 80 per il traffico HTTP
- testecho2, in ascolto sulla porta 81 per il traffico HTTP
- testecho3, in ascolto sulla porta 443 per il traffico HTTPS
- testecho4, in ascolto sulla porta 444 per il traffico HTTPS
Per impostazione predefinita, il controller di entrata nativo OCI crea:
- Quattro listener nel load balancer (due listener in ascolto sulle porte 80 e 81 per il traffico HTTP e due listener in ascolto sulle porte 443 e 444 per il traffico HTTPS).
- Quattro criteri di instradamento (uno per ogni porta listener).
Per semplificare l'amministrazione, è possibile decidere di disporre di un singolo listener in ascolto del traffico HTTP e di un singolo listener in ascolto del traffico HTTPS impostando le annotazioni come indicato di seguito.
oci-native-ingress.oraclecloud.com/http-listener-port: "100"
oci-native-ingress.oraclecloud.com/https-listener-port: "500"
Con le annotazioni impostate come mostrato, il controller di entrata nativo OCI crea:
- un singolo listener che ascolta il traffico HTTP sulla porta 100 e un singolo criterio di instradamento per la porta 100 con percorsi per i backend sulle porte testecho1:80 e testecho2:81
- un singolo listener che ascolta il traffico HTTPS sulla porta 500 e un singolo criterio di instradamento per la porta 500 con percorsi per i backend sulle porte testecho3:443 e testecho4:444
Tenere presente quanto riportato di seguito.
-
È possibile impostare le annotazioni
oci-native-ingress.oraclecloud.com/http-listener-port
eoci-native-ingress.oraclecloud.com/https-listener-port
indipendentemente l'una dall'altra, in modo da non dover impostare entrambe le annotazioni. -
Se il file manifesto della risorsa
Ingress
include l'annotazioneoci-native-ingress.oraclecloud.com/certificate-ocid
, il controller di entrata nativo OCI considera tutti gli host da configurare per TLS. In questo caso, il controller di entrata nativo OCI:- ignora l'annotazione
oci-native-ingress.oraclecloud.com/http-listener-port
(se presente nel file manifesto della risorsaIngress
) - applica l'annotazione
oci-native-ingress.oraclecloud.com/https-listener-port
(se presente nel file manifesto della risorsaIngress
) per creare un singolo listener per tutto il traffico
- ignora l'annotazione
- Indipendentemente dalle annotazioni
oci-native-ingress.oraclecloud.com/http-listener-port
eoci-native-ingress.oraclecloud.com/https-listener-port
, il controller di entrata nativo OCI crea solo listener HTTP e/o HTTPS (e i criteri di instradamento corrispondenti) se necessario per i servizi backend definiti nel manifesto delle risorse in entrata. Ad esempio:- Se si include l'annotazione
oci-native-ingress.oraclecloud.com/http-listener-port
in un file manifesto delle risorseIngress
che non definisce un backend HTTP, il controller di entrata nativo OCI non crea un listener HTTP. - Se si include l'annotazione
oci-native-ingress.oraclecloud.com/https-listener-port
in un file manifesto delle risorseIngress
che non definisce un backend HTTPS, il controller di entrata nativo OCI non crea un listener HTTPS. - Se si includono sia le annotazioni
oci-native-ingress.oraclecloud.com/http-listener-port
cheoci-native-ingress.oraclecloud.com/https-listener-port
in un file manifesto delle risorseIngress
che definisce solo i backend HTTP, il controller di entrata nativo OCI ignora l'annotazioneoci-native-ingress.oraclecloud.com/https-listener-port
e non crea un listener HTTPS. - Se si includono sia le annotazioni
oci-native-ingress.oraclecloud.com/http-listener-port
cheoci-native-ingress.oraclecloud.com/https-listener-port
in un file manifesto delle risorseIngress
che definisce solo i backend HTTPS, il controller di entrata nativo OCI ignora l'annotazioneoci-native-ingress.oraclecloud.com/http-listener-port
e non crea un listener HTTP.
- Se si include l'annotazione
Conservazione del load balancer dopo l'eliminazione di IngressClass
È possibile specificare che si desidera che il controller di entrata nativo OCI conservi il load balancer per una risorsa IngressClass
se si elimina IngressClass
stesso.
L'annotazione oci-native-ingress.oraclecloud.com/delete-protection-enabled
viene utilizzata nel file manifesto IngressClass
per specificare se il load balancer viene eliminato. Impostare l'annotazione su true
per conservare il load balancer se si elimina IngressClass
. Impostare l'annotazione su false
(o non includere l'annotazione nel file manifesto) per eliminare il load balancer se si elimina IngressClass
. Ad esempio:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: <ic-name>
annotations:
oci-native-ingress.oraclecloud.com/delete-protection-enabled: "true"
spec:
...
Se si elimina una risorsa IngressClass
e si utilizza l'annotazione per conservare il load balancer, il controller di entrata nativo OCI conserva il load balancer stesso, ma cancella le associazioni con altre risorse di supporto, ad esempio i gruppi di sicurezza di rete, le tag e un firewall dell'applicazione Web. Il controller di entrata nativo OCI elimina anche il set backend default_ingress BackendSet
creato.
Tenere tuttavia presente che il controller in entrata nativo OCI non elimina le risorse del load balancer OCI (ascoltatori, set backend) create per le risorse Ingress
che attualmente fanno riferimento al file IngressClass
eliminato. Pertanto, prima di eliminare una risorsa IngressClass
, eliminare qualsiasi risorsa Ingress
che faccia riferimento a IngressClass
nel relativo file manifesto. Se prima non si eliminano tali risorse Ingress
, le risorse OCI create per tali risorse continueranno a esistere nel load balancer.
Applicazione di tag al load balancer
È possibile specificare che si desidera che il controller di entrata nativo OCI applichi tag definite e tag in formato libero a un load balancer che crea (per una risorsa IngressClass
) o gestisce (se specificato dall'annotazione oci-native-ingress.oraclecloud.com/id
). L'applicazione di tag consente di raggruppare risorse eterogenee in vari compartimenti e di aggiungere annotazioni alle risorse con i propri metadati. Per ulteriori informazioni sulle tag, vedere Applicazione di tag alle risorse correlate al cluster Kubernetes.
Applicazione delle tag definite al load balancer
Le tag definite vengono impostate e gestite da un amministratore di tag. Una tag definita è composta da uno spazio di nomi tag, una chiave e un valore. Lo spazio di nomi e la definizione della chiave di tag devono essere impostati in una tenancy prima di poter applicare una tag definita a una risorsa.
Per specificare che il controller di entrata nativo OCI deve applicare le tag definite al load balancer, utilizzare l'annotazione oci-native-ingress.oraclecloud.com/defined-tags
nel file manifesto IngressClass
nel formato seguente:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: <ic-name>
annotations:
oci-native-ingress.oraclecloud.com/defined-tags: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}'
spec:
...
Dove:
<tag-namespace>
è lo spazio di nomi tag a cui appartiene la tag.<tag-key>
è il nome di una tag definita da applicare al load balancer.<tag-value>
è un valore per il tag di un elenco di valori predefinito, un nuovo valore o un valore vuoto (a seconda della modalità di impostazione del tag definito).
Il valore dell'annotazione oci-native-ingress.oraclecloud.com/defined-tags
è una stringa JSON che consente di specificare più spazi di nomi tag, chiavi di tag e valori di tag in formato JSON.
Ad esempio:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: my-ingress-class
annotations:
oci-native-ingress.oraclecloud.com/defined-tags: '{"Operations": {"CostCenter": "42", "Department": "001"}, "Sales": {"Region": "US"}}'
spec:
...
La modifica di una delle tag nell'annotazione oci-native-ingress.oraclecloud.com/defined-tags
del manifesto IngressClass
fa sì che il controller di entrata nativo OCI riapplichi al load balancer tutte le tag definite specificate dall'annotazione. Tuttavia, se una tag definita contiene una variabile di tag, il controller di entrata nativo OCI riapplica la tag definita al load balancer solo se la tag non è già presente.
Tenere presente che per consentire al controller in entrata nativo OCI di applicare tag definite a un load balancer, è necessario che esista un criterio IAM adatto per consentire al controller in entrata nativo OCI di utilizzare lo spazio di nomi tag appropriato. Per ulteriori informazioni, fare riferimento agli argomenti sotto riportati.
Applicazione di tag in formato libero al load balancer
Le tag in formato libero non sono gestite da un amministratore di tag. Una tag in formato libero è composta da una chiave e da un valore. A differenza delle tag definite, le tag in formato libero non appartengono a uno spazio di nomi tag.
Per specificare che il controller di entrata nativo OCI deve applicare tag in formato libero al load balancer, utilizzare l'annotazione oci-native-ingress.oraclecloud.com/freeform-tags
nel file manifesto IngressClass
nel formato seguente:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: <ic-name>
annotations:
oci-native-ingress.oraclecloud.com/freeform-tags: '{"<tag-key>": "<tag-value>"}'
spec:
...
Dove:
<tag-key>
è un nome per la tag in formato libero da applicare al load balancer.<tag-value>
è un valore per la tag in formato libero da applicare al load balancer.
Il valore dell'annotazione oci-native-ingress.oraclecloud.com/freeform-tags
è una stringa JSON che consente di specificare più chiavi di tag e valori di tag in formato JSON.
Ad esempio:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: my-ingress-class
annotations:
oci-native-ingress.oraclecloud.com/freeform-tags: '{"Project": "Red", "Version": "Alpha"}'
spec:
...
La modifica di una delle tag nell'annotazione oci-native-ingress.oraclecloud.com/freeform-tags
del manifesto IngressClass
fa sì che il controller di entrata nativo OCI riapplichi al load balancer tutte le tag in formato libero specificate dall'annotazione.
L'applicazione della tag predefinita al load balancer
Le impostazioni predefinite delle tag sono impostate per un compartimento specifico. I valori predefiniti delle tag sono specifici del compartimento. Le impostazioni predefinite delle tag specificano le tag definite che vengono applicate automaticamente a tutte le risorse create in un compartimento specifico al momento della creazione.
Quando si utilizza il controller di entrata nativo OCI versione 1.4.0 (o successiva), i valori predefiniti delle tag vengono applicati automaticamente ai load balancer creati dal controller di entrata nativo OCI. Successivamente, il controller di entrata nativo OCI conserva un valore predefinito di tag applicato a un load balancer a meno che non venga soddisfatta una delle seguenti condizioni:
- È possibile rimuovere manualmente un valore predefinito di tag applicato automaticamente a un load balancer.
- È possibile specificare un valore predefinito di tag come tag definita utilizzando l'annotazione
oci-native-ingress.oraclecloud.com/defined-tags
(nel qual caso, il controller di entrata nativo OCI considera il valore predefinito di tag come qualsiasi altra tag definita).
I valori predefiniti delle tag con i valori applicati dall'utente non sono supportati. Se è stata impostata un'impostazione predefinita di tag con un valore applicato dall'utente per un compartimento in cui il controller di entrata nativo OCI deve creare o gestire un load balancer, è necessario utilizzare l'annotazione oci-native-ingress.oraclecloud.com/defined-tags
per specificare l'impostazione predefinita della tag come tag definita.
Per i load balancer creati utilizzando una versione del controller di ingresso nativo OCI precedente alla versione 1.4.0 o quando si utilizza l'annotazione oci-native-ingress.oraclecloud.com/id
per specificare che il controller di ingresso nativo OCI deve gestire un load balancer esistente, tenere presente che i valori predefiniti delle tag non sono supportati. In entrambi i casi, per applicare o mantenere un valore predefinito di tag, utilizzare l'annotazione oci-native-ingress.oraclecloud.com/defined-tags
per specificare il valore predefinito di tag come tag definito.