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

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.

Vedere Applicazione di tag definite al load balancer.

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 true, il load balancer viene conservato. Se non viene specificato, false è l'impostazione predefinita e il load balancer viene eliminato se si elimina IngressClass.

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 false, le richieste TLS vengono interrotte nel listener del load balancer e le richieste tra il set backend e i backend vengono scambiate in testo normale.

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
È possibile verificare lo stato dei controlli di idoneità pod immettendo:
kubectl get pods -o wide -w
Output di esempio:
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.

  1. Definire una nuova risorsa in entrata in un file .yaml. Vedere Crea risorsa in entrata.
  2. Nella sezione metadata: aggiungere un elemento annotations: e impostare l'annotazione oci-native-ingress.oraclecloud.com/protocol su TCP 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:
    ...
  3. Nella sezione rules: del manifesto delle risorse Ingress, aggiungere una regola per ogni listener che deve ricevere il traffico TCP:
    • (consigliato) Impostare paths.pathType su ImplementationSpecific.
    • 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 a my-second-svc:8081, è possibile impostare un file manifesto della risorsa Ingress 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 
    
  4. 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:

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'annotazione oci-native-ingress.oraclecloud.com/id (a meno che non sia stato impostato oci-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 risorse Ingress, 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'annotazione oci-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.

  1. 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:

    1. 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
    2. 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.
  2. 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:
      1. 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 omettere ca.cert, a condizione di includere l'intera catena di certificati come valore di tls.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
      2. Creare la risorsa segreta immettendo kubectl create -f <filename>.yaml

  3. Aggiungere il segreto Kubernetes in un file manifesto delle risorse Ingress:
    1. Definire una nuova risorsa in entrata in un file .yaml. Vedere Crea risorsa in entrata.
    2. Nella sezione spec: del file manifesto, aggiungere un elemento tls: 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
    3. 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
    4. 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.

  1. 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.

  2. Prendere nota dell'OCID del certificato.
  3. Aggiungere l'OCID del certificato a un file manifesto della risorsa Ingress:
    1. Definire una nuova risorsa in entrata in un file .yaml. Vedere Crea risorsa in entrata.
    2. Nella sezione metadata: aggiungere un elemento annotations: 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:
      ...
    3. Nella sezione rules: del manifesto delle risorse Ingress, 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
    4. 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 e oci-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'annotazione oci-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 risorsa Ingress)
    • applica l'annotazione oci-native-ingress.oraclecloud.com/https-listener-port (se presente nel file manifesto della risorsa Ingress) per creare un singolo listener per tutto il traffico
  • Indipendentemente dalle annotazioni oci-native-ingress.oraclecloud.com/http-listener-port e oci-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 risorse Ingress 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 risorse Ingress 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 che oci-native-ingress.oraclecloud.com/https-listener-port in un file manifesto delle risorse Ingress che definisce solo i backend HTTP, il controller di entrata nativo OCI ignora l'annotazione oci-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 che oci-native-ingress.oraclecloud.com/https-listener-port in un file manifesto delle risorse Ingress che definisce solo i backend HTTPS, il controller di entrata nativo OCI ignora l'annotazione oci-native-ingress.oraclecloud.com/http-listener-port e non crea un listener HTTP.

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.