Personalizzazione dell'instradamento ALB

Modificare le impostazioni predefinite per gli ALB che eseguono l'immagine Kubernetes Ingress.

A volte è possibile personalizzare l'instradamento per Ingress aggiungendo le annotazioni Kubernetes NGINX (nginx.ingress.kubernetes.io/<annotation>). Le annotazioni Kubernetes NGINX sono sempre applicate a tutti i percorsi dei servizi nella risorsa e non è possibile specificare i nomi dei servizi all'interno delle annotazioni. Le annotazioni personalizzate di IBM Cloud Kubernetes Service (ingress.bluemix.net/<annotation>) non sono supportate.

Kubernetes I controllori di Ingress (ALB) sui cluster creati a partire dal 31 gennaio 2022 non elaborano per impostazione predefinita le risorse Ingress che hanno annotazioni snippet (ad esempio, nginx.ingress.kubernetes.io/configuration-snippet), poiché tutti i nuovi cluster vengono distribuiti con la configurazione allow-snippet-annotations: "false" nell'ALB ConfigMap. Se si aggiungono gli snippet di configurazione consigliati qui, è necessario modificare ConfigMap (kube-system/ibm-k8s-controller-config) dell'ALB e cambiare allow-snippet-annotations: "false" in allow-snippet-annotations: "true".

Aggiunta di una porta del server a un'intestazione host

Per aggiungere una porta del server alla richiesta del client prima che la richiesta sia inoltrata all'applicazione di back-end, configurare un proxy ai servizi esterni in un' annotazione dello snippet del server o come campo di ibm-k8s-controller-config ConfigMap.

Instradamento di richieste in entrata con un ALB privato

Per instradare richieste in entrata alle tue applicazioni con un ALB privato, specifica l'annotazione della classe private-iks-k8s-nginx nella risorsa Ingress. Gli ALB privati sono configurati per utilizzare le risorse con questa classe.

kubernetes.io/ingress.class: "private-iks-k8s-nginx"

Autenticazione delle applicazioni con App ID

Configurare Ingress con IBM Cloud App ID per imporre l'autenticazione alle proprie applicazioni modificando specifici campi di Kubernetes Ingress. Per ulteriori informazioni, vedere Aggiunta dell'autenticazione App ID alle app.

Impostazione della dimensione massima del corpo della richiesta client

Per impostare la dimensione massima del corpo che il client può inviare come parte di una richiesta, utilizzare la seguente annotazione della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/proxy-body-size: 8m

Abilitazione e disabilitazione del buffer dei dati di risposta client

È possibile disabilitare o abilitare l'archiviazione dei dati di risposta sull'ALB mentre i dati vengono inviati al client. Tale impostazione viene disabilitata come impostazione predefinita. Per abilitare, imposta la seguente risorsa Ingress annotazione.

nginx.ingress.kubernetes.io/proxy-buffering: "on"

Personalizzazione dei timeout di connessione e lettura

Per impostare la quantità di tempo che l'ALB attende per connettersi e leggere dall'applicazione di back - end prima di considerarla non disponibile, utilizza le seguenti annotazioni.

nginx.ingress.kubernetes.io/proxy-connect-timeout: 62
nginx.ingress.kubernetes.io/proxy-read-timeout: 62

Personalizzazione delle azioni di errore

Per indicare azioni personalizzate che l'ALB può intraprendere per specifici errori di HTTP, impostare il campo custom-http-errors.

Modifica delle porte predefinite HTTP e HTTPS

Per modificare le porte predefinite per il traffico di rete HTTP (porta 80) e HTTPS (porta 443), modificare ciascun servizio ALB con i seguenti campi Kubernetes Ingress ibm-ingress-deploy-config ConfigMap.

Impostazione campo di esempio.

httpPort=8080
httpsPort=8443

Personalizzazione dell'intestazione della richiesta

Per aggiungere informazioni di intestazione a una richiesta del client prima di inoltrarla all'applicazione back-end, utilizzare il seguente campodella mappa di configurazione Kubernetes ibm-k8s-controller-config

proxy-set-headers: "ingress-nginx/custom-headers"

Per i requisiti custom-headers ConfigMap, consultare questo esempio.

Personalizzazione dell'intestazione della risposta

Per aggiungere informazioni di intestazione a una risposta client prima di inviarle al client, utilizza la seguente annotazione.

nginx.ingress.kubernetes.io/configuration-snippet: |
    more_set_headers "Request-Id: $req_id";

Aggiunta di definizioni di percorso ai servizi esterni

Per aggiungere definizioni di percorso a servizi esterni, come quelli ospitati in IBM Cloud, configurare un proxy ai servizi esterni in uno snippet di localizzazione. In alternativa, sostituire il proxy con un reindirizzamento permanente ai servizi esterni.

Reindirizzamento delle richieste non sicure

Per impostazione predefinita, le richieste insicure del client HTTP vengono reindirizzate a HTTPS. Per disabilitare questa impostazione, utilizzare il seguente campo e annotazione.

  • ibm-k8s-controller-config ConfigMap campo
    ssl-redirect: "false"
    
  • annotazionedella risorsa Ingress:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    

Abilitazione e disabilitazione dell' HTTP Sicurezza rigorosa dei trasporti

Imposta il browser per accedere al dominio solo tramite HTTPS. Questa opzione è abilitata per impostazione predefinita.

  • Per aggiungere l'età massima e la granularità del sottodominio, consultare questo blog NGINX.
  • Per disabilitare, impostare il campo ibm-k8s-controller-config configmap .
    hsts: false
    

Impostazione di un numero massimo di richieste keepalive

Per impostare il numero massimo di richieste che possono essere servite attraverso una connessione keepalive, utilizzare il seguente campo Kubernetes ibm-k8s-controller-config configmap.

keep-alive-requests: 100

Il valore predefinito per keep-alive-requests in Kubernetes Ingress è 100, che è molto inferiore al valore predefinito di 4096 in IBM Cloud Kubernetes Service Ingress. Se la configurazione di Ingress è stata migrata da IBM Cloud Kubernetes Service Ingress a Kubernetes Ingress, potrebbe essere necessario modificare keep-alive-requests per superare i test di prestazione esistenti.

Impostazione di un timeout massimo di richiesta keepalive

Per impostare il tempo massimo in cui una connessione keepalive rimane aperta tra il client e il server proxy ALB, utilizzare il seguente campo Kubernetes ibm-k8s-controller-config configmap.

keep-alive: 60

Impostazione di un numero massimo di buffer di intestazione client di grandi dimensioni

Per impostare il numero e la dimensione massima dei buffer che leggono le intestazioni delle richieste dei client di grandi dimensioni, utilizzare il seguente campo Kubernetes ibm-k8s-controller-config configmap.

large-client-header-buffers: 4 8k

Modifica del modo in cui l'ALB corrisponde all'URI della richiesta

Per modificare il modo in cui l'ALB confronta l'URI della richiesta con il percorso dell'applicazione, utilizzare la seguente annotazione della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/use-regex: "true"

Per ulteriori informazioni, consultare questo blog.

Aggiunta di configurazioni del blocco di ubicazioni personalizzate

Per aggiungere una configurazione personalizzata del blocco di localizzazione per un servizio, utilizzare la seguente annotazione della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/configuration-snippet: |
    more_set_headers "Request-Id: $req_id";

Configurazione dell'autenticazione reciproca

Per configurare l'autenticazione reciproca per l'ALB, utilizzare le seguenti annotazioni della risorsa Kubernetes Ingress. Si noti che la mutua autenticazione non può essere applicata alle porte personalizzate e deve essere applicata alla porta HTTPS.

nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
nginx.ingress.kubernetes.io/auth-tls-error-page: "http://www.mysite.com/error-cert.html"
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"

Configurazione della dimensione del buffer proxy

Per configurare la dimensione del buffer del proxy che legge la prima parte della risposta, utilizzare la seguente annotazione della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"

Configurazione dei numeri di buffer proxy

Per configurare il numero di buffer proxy per l'ALB, utilizzare la seguente annotazione della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/proxy-buffers-number: "4"

Configurazione della dimensione del buffer del proxy occupato

Per configurare la dimensione dei buffer proxy che possono essere occupati, utilizzare un frammento di posizione. Per ulteriori informazioni, consultare i documenti di NGINX.

Configurazione quando un ALB può passare una richiesta

Per impostare quando l'ALB può passare una richiesta al server upstream successivo, utilizzare i seguenti campi Kubernetes Ingress.

  • Impostazione globale: campi ibm-k8s-controller-config ConfigMap :

    retry-non-idempotent: true
    proxy-next-upstream: error timeout http_500
    
  • Impostazione per risorsa: annotazionidella risorsa Ingress:

    nginx.ingress.kubernetes.io/proxy-next-upstream: http_500
    nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: 50
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: 3
    

Limitazione della frequenza

Per limitare la frequenza di elaborazione delle richieste e il numero di connessioni per una chiave definita per i servizi, utilizza le annotazioni per la limitazione della frequenzadella risorsa Ingress.

Rimozione dell'intestazione della risposta

È possibile rimuovere le informazioni di intestazione incluse nella risposta al client dall'applicazione back-end prima che la risposta venga inviata al client. Configurare la rimozione dell'intestazione della risposta in uno snippet di localizzazione, oppure utilizzare il campo proxy_hide_header come snippet di configurazione nel file ibm-k8s-controller-config ConfigMap.

Riscrittura dei percorsi

Per instradare il traffico di rete in arrivo su un percorso del dominio ALB verso un percorso diverso su cui l'applicazione back-end è in ascolto, utilizzare la seguente annotazione della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/rewrite-target: /newpath

Personalizzare le configurazioni dei blocchi del server

Per aggiungere una configurazione personalizzata del blocco server, utilizzare la seguente annotazione della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/server-snippet: |
    location = /health {
    return 200 'Healthy';
    add_header Content-Type text/plain;
    }

Instradamento del traffico di rete in entrata

Per instradare sempre il traffico di rete in entrata verso lo stesso server upstream utilizzando un cookie appiccicoso, utilizzare le seguenti annotazioni della risorsa Kubernetes Ingress.

nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "cookie_name1"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/configuration-snippet: |
  more_set_headers "Set-Cookie: HttpOnly";

Il controllore di ingress Kubernetes aggiunge gli attributi Secure e HttpOnly ai cookie appiccicosi per impostazione predefinita, che non può essere modificata.

Consentire il supporto dei servizi di SSL per crittografare il traffico

Per consentire il supporto dei servizi SSL per crittografare il traffico verso le applicazioni upstream che richiedono HTTPS, utilizzare la risorsa Kubernetes Ingress annotazione del protocollo del backend e annotazioni di autenticazione del certificato di backend.

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/proxy-ssl-secret: app1-ssl-secret
nginx.ingress.kubernetes.io/proxy-ssl-verify-depth: 5
nginx.ingress.kubernetes.io/proxy-ssl-name: proxy-ssl-name=mydomain.com
nginx.ingress.kubernetes.io/proxy-ssl-verify: true

Accesso alle applicazioni con porte non standard TCP

Per accedere a un'applicazione tramite una porta non standard TCP, procedere come segue.

  1. Creare una tcp-services ConfigMap per specificare la porta TCP, come le seguenti porte di esempio. Per i requisiti del sito tcp-services ConfigMap, si veda questo blog.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tcp-services
      namespace: kube-system
    data:
      9000: "<namespace>/<service>:8080"
    
  2. Creare l' ConfigMap e nel namespace kube-system.

    kubectl apply -f tcp-services.yaml -n kube-system
    
  3. Specificare tcp-services ConfigMap come campo in ibm-ingress-deploy-config ConfigMap.

    "tcpServicesConfig":"kube-system/tcp-services"
    
  4. Modifica ogni Servizio ALB per aggiungere le porte.

Impostazione di un numero massimo di richieste keepalive upstream

Per impostare il numero massimo di richieste che possono essere servite attraverso una connessione keepalive, utilizzare il seguente campo Kubernetes ibm-k8s-controller-config ConfigMap.

upstream-keepalive-requests: 32

Impostazione del timeout massimo di keepalive upstream

Per impostare il tempo massimo in cui una connessione keepalive rimane aperta tra il server proxy ALB e il server upstream dell'applicazione, utilizzare il seguente campo Kubernetes ibm-k8s-controller-config configmap.

upstream-keepalive-timeout: 32

Personalizzazione della distribuzione ALB

Personalizzare la distribuzione per gli ALB che eseguono l'immagine Kubernetes Ingress creando un'immagine ibm-ingress-deploy-config ConfigMap.

  1. Ottieni i nomi dei servizi che espongono ogni ALB.

    • Cluster classici:
        kubectl get svc -n kube-system | grep alb
        ```
    * Cluster VPC: nell'output, cerca un nome servizio formattato come `public-crc204dl7w0qf6n6sp7tug`.
    
    ```sh {: pre}
        kubectl get svc -n kube-system | grep LoadBalancer
        ```
    

Creazione di una ConfigMap per la personalizzazione della distribuzione Ingress

  1. Crea un file YAML per una mappa di configurazione ibm-ingress-deploy-config. Per ogni ID ALB, puoi specificare una o più delle seguenti impostazioni facoltative. Tenere presente che è possibile specificare solo le impostazioni che si desidera configurare e non è necessario specificare tutte le impostazioni.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ibm-ingress-deploy-config
      namespace: kube-system
    data:
      <alb1-id>: '{"deepInspect":"<true|false>", "defaultBackendService":"<service_name>", "defaultCertificate":"<namespace>/<secret_name>", "defaultConfig":"<namespace>/<configmap-name>","enableSslPassthrough":"<true|false>", "httpPort":"<port>", "httpsPort":"<port>", "ingressClass":"<class>", "logLevel":<log_level>, "replicas":<number_of_replicas>, "tcpServicesConfig":"<kube-system/tcp-services>", "enableIngressValidation":"<true|false>", "tolerations":[{"key":"<key>","operator":"<Exists|Equal>","value":"<value>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>", "tolerationSeconds": <number_of_seconds>},{"key":"<key>","operator":"<Exists|Equal>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>"}]}'
      <alb2-id>: '{"deepInspect":"<true|false>", "defaultBackendService":"<service_name>", "defaultCertificate":"<namespace>/<secret_name>", "enableSslPassthrough":"<true|false>", "httpPort":"<port>", "httpsPort":"<port>", "ingressClass":"<class>","logLevel":<log_level>, "replicas":<number_of_replicas>, "tcpServicesConfig":"<kube-system/tcp-services>", "enableIngressValidation":"<true|false>", "tolerations":[{"key":"<key>","operator":"<Exists|Equal>","value":"<value>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>", "tolerationSeconds": <number_of_seconds>},{"key":"<key>","operator":"<Exists|Equal>","effect":"<NoSchedule|PreferNoSchedule|NoExecute>"}]}'
    
    deepInspect
    Abilita o disabilita Ingress object security deep inspector. Quando abilitato, gli ALB esaminano i valori di configurazione nelle risorse Ingress prima dell'elaborazione. Per ulteriori informazioni, consulta il codice sorgente ingress - nginx.
    Questa funzione è disponibile per ALB versioni 1.2.0 e successive e abilitata per impostazione predefinita.
    defaultBackendService
    Specificare il nome di un servizio predefinito facoltativo per ricevere le richieste quando non viene configurato alcun host o non viene trovato alcun host corrispondente. Questo servizio sostituisce il servizio predefinito fornito da IBMche genera un messaggio 404. È possibile utilizzare questo servizio per configurare pagine di errori personalizzate o per verificare le connessioni.
    defaultCertificate
    Un segreto per un certificato predefinito TLS da applicare a qualsiasi sottodominio configurato con ALB di ingresso nel formato secret_namespace/secret_name. Per creare un segreto, puoi eseguire il comando ibmcloud ks ingress secret create. Se nella sezione spec.tls di una risorsa Ingress viene specificato un segreto per un certificato TLS diverso e tale segreto esiste nello stesso spazio dei nomi della risorsa Ingress, tale segreto viene applicato al posto del segreto predefinito.
    defaultConfig
    Specifica una configmap predefinita per i tuoi ALB. Immettere l'ubicazione della configmap che si desidera utilizzare nel formato namespace/configmap-name. Ad esempio, kube-system/ibm-k8s-controller-config.
    enableAnnotationValidation
    Abilitare o disabilitare la convalida dell'annotazione dell'oggetto Ingress. Quando abilitato, gli ALB convalidano i valori di annotazione nelle risorse Ingress prima dell'elaborazione. Per ulteriori informazioni, consulta il codice sorgente ingress - nginx.
    Questa funzione è disponibile per le versione ALB 1.9.0 e successive e abilitata per impostazione predefinita.
    enableSslPassthrough
    Abilita il passthrough di SSL per l'ALB. La connessione TLS non viene terminata e ne viene eseguito il pass-through senza alcuna variazione.
    httpPort, httpsPort
    Esporre le porte non predefinite per l'Ingress ALB aggiungendo le porte HTTP o HTTPS che si desidera aprire.
    ingressClass
    Se hai specificato una classe diversa da public-iks-k8s-nginx o private-iks-k8s-nginx nella tua risorsa Ingress, specifica la classe.
    logLevel
    Specificare il livello di log che si desidera utilizzare. Scegli uno dei seguenti valori.
    2: Mostra i dettagli utilizzando il comando **diff** per mostrare le modifiche nella configurazione in NGINX.
    3: Mostra i dettagli sulle modifiche del servizio, della regola Ingress e dell'endpoint in formato JSON.
    5: Configura NGINX in modalità debug.
    Per ulteriori informazioni sulla registrazione, consultare Debug Logging.
    replicas
    Per impostazione predefinita, ogni ALB ha 2 repliche. Amplia le capacità di elaborazione degli ALB aumentando il numero di pod ALB. Per ulteriori informazioni, vedi Aumento del numero di repliche del pod ALB.
    tcpServicesConfig
    Specificare un ConfigMap e lo spazio dei nomi in cui si trova il ConfigMap, come ad esempio kube-system/tcp-services che contiene informazioni sull'accesso al servizio dell'applicazione attraverso una porta non standard TCP.
    enableIngressValidation
    Abilita la distribuzione del webhook di convalida Ingress per questo ALB. Il webhook convalida le risorse Ingress prima di essere applicato al cluster per evitare configurazioni non valide. (L'ALB elaborerà solo le risorse Ingress che appartengono alla classe Ingress che espone.) Impostazione predefinita: "false".
    tolerations
    Specificare ulteriori tolleranze personalizzate per le capsule ALB. Per ulteriori informazioni, vedere Tinte e tolleranze.
  2. Crea la mappa di configurazione ibm-ingress-deploy-config nel tuo cluster.

    kubectl create -f ibm-ingress-deploy-config.yaml
    
  3. Per applicare le modifiche, aggiorna i tuoi ALB. Nota che potrebbero essere necessari fino a 5 minuti per applicare le modifiche ai tuoi ALB.

    ibmcloud ks ingress alb update -c CLUSTER_NAME_OR_ID
    
  4. Se si sono specificate porte non standard HTTP, HTTPS o TCP, è necessario aprire le porte su ciascun servizio ALB.

    1. Per ogni servizio ALB che hai trovato nel passo 1, modifica il file YAML.
        kubectl edit svc -n kube-system <alb_svc_name>
        ```
    2. Nella sezione `spec.ports`, aggiungere le porte che si desidera aprire. Per impostazione predefinita, sono aperte le porte 80 e 443. Se si desidera mantenere aperti 80 e 443, non rimuoverli da questo file. Qualsiasi porta che non sia specificata viene chiusa. Non specificare un `nodePort`. Dopo aver aggiunto la porta e applicato le modifiche, viene assegnato automaticamente un `nodePort`
    
    ```sh {: screen}
        ...
        ports:
        - name: port-80
          nodePort: 32632
          port: 80
          protocol: TCP
          targetPort: 80
        - name: port-443
          nodePort: 32293
          port: 443
          protocol: TCP
          targetPort: 443
        - name: <new_port>
          port: <port>
          protocol: TCP
          targetPort: <port>
        ...
        ```
    3. Salva e chiudi il file. Le modifiche vengono applicate automaticamente.
    
    
    
    

Personalizzazione della classe Ingress

Una classe Ingress associa un nome classe a un tipo di controller Ingress. Utilizza la risorsa IngressClass per personalizzare classi Ingress.

Aggiunta dell'autenticazione App ID alle applicazioni

Applicate l'autenticazione per le vostre applicazioni configurando Ingress con IBM Cloud App ID.

  1. Scegli un'istanza esistente oppure crea una nuova istanza App ID.

    Un'istanza di App ID può essere utilizzata in un solo spazio dei nomi del cluster. Se si desidera configurare App ID per le risorse di Ingress in più spazi dei nomi, ripetere i passaggi di questa sezione per specificare un'istanza App ID unica per le risorse di Ingress in ogni spazio dei nomi.

    • Per utilizzare un'istanza esistente, assicurarsi che il nome dell'istanza del servizio contenga solo caratteri alfanumerici minuscoli e che la sua lunghezza non superi i 25 caratteri. Per modificare il nome, seleziona Rinomina servizio dal menu delle ulteriori opzioni nella tua pagina dei dettagli dell'istanza del servizio.
    • Per eseguire il provisioning di una nuova istanza App ID:
      1. Sostituisci il nome del servizio con un nome univoco a tua scelta per l'istanza del servizio. Il nome dell'istanza di servizio deve contenere solo caratteri alfanumerici minuscoli e non può essere più lungo di 25 caratteri.
      2. Scegli la stessa regione in cui è distribuito il tuo cluster.
      3. Fai clic su Crea.
  2. Aggiungi gli URL di reindirizzamento per la tua applicazione. Un URL di reindirizzamento è l'endpoint di callback della tua applicazione. Per impedire attacchi di phishing, IBM Cloud App ID convalida l'URL della richiesta rispetto all'elenco di elementi consentiti (allowlist) degli URL di reindirizzamento.

    1. Nella console di gestione App ID, passa a Gestisci autenticazione.
    2. Nella scheda Provider di identità, assicurati di avere un Provider di identità selezionato. Se non viene selezionato alcun Identity Provider, l'utente non verrà autenticato, ma gli verrà rilasciato un token di accesso per l'accesso anonimo all'app.
    3. Nella scheda " Impostazioni di autenticazione ", aggiungi gli URL di reindirizzamento per la tua app nel formato https://<hostname>/oauth2-<App_ID_service_instance_name>/callback. Notare che tutte le lettere nel nome dell'istanza del servizio devono essere specificate in minuscolo.

    Se si utilizza la funzione di logout IBM Cloud App ID, è necessario aggiungere /sign_out al proprio dominio nel formato https://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out e includere questo URL nell'elenco degli URL di reindirizzamento. Se si vuole utilizzare una pagina di logout personalizzata, è necessario impostare whitelist_domains nel campo ConfigMap per OAuth2-Proxy. Richiama l'endpoint https://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out con il parametro di query rd o imposta l'intestazione X-Auth-Request-Redirect con la tua pagina di logout personalizzata. Per ulteriori dettagli, consultare Scollegamento.

  3. Esegui il bind dell'istanza del servizio App ID al tuo cluster. Il comando crea una chiave di servizio per l'istanza del servizio; in alternativa, è possibile includere l'opzione --key per utilizzare le credenziali della chiave di servizio già esistenti. Assicurati di eseguire il bind dell'istanza del servizio allo stesso spazio dei nomi in cui sono presenti le tue risorse Ingress. Notare che tutte le lettere nel nome dell'istanza del servizio devono essere specificate in minuscolo.

    ibmcloud ks cluster service bind --cluster CLUSTER_NAME_OR_ID --namespace NAMESPACE --service APP_ID_SERVICE_INSTANCE_NAME [--key SERVICE_INSTANCE_KEY]
    

    Una volta che il servizio è stato associato correttamente al cluster, viene creato un segreto del cluster che contiene le credenziali dell'istanza del servizio. Output della CLI di esempio:

    ibmcloud ks cluster service bind --cluster mycluster --namespace mynamespace --service appid1
    Binding service instance to namespace...
    OK
    Namespace:    mynamespace
    Secret name:  binding-<service_instance_name>
    
  4. Abilitare il componente aggiuntivo ALB OAuth Proxy nel cluster. Questo componente aggiuntivo crea e gestisce le seguenti risorse Kubernetes: un'installazione client OAuth2-Proxy per l'istanza di servizio App ID, un segreto che contiene la configurazione dell'installazione client OAuth2-Proxy e una risorsa Ingress che configura gli ALB per instradare le richieste in arrivo all'installazione client OAuth2-Proxy per l'istanza App ID. Il nome di ciascuna di queste risorse inizia con oauth2-.

    1. Abilitare il componente aggiuntivo alb-oauth-proxy.
        ibmcloud ks cluster addon enable alb-oauth-proxy --cluster CLUSTER_NAME_OR_ID
        ```
    2. Verificare che lo stato del componente aggiuntivo “ALB OAuth Proxy” sia “ `Addon Ready` ”.
    ```sh {: pre}
        ibmcloud ks cluster addon ls --cluster CLUSTER_NAME_OR_ID
        ```
    
  5. Nelle risorse Ingress per le applicazioni dove vuoi aggiungere l'autenticazione App ID, assicurati che il nome della risorsa non superi i 25 caratteri di lunghezza. Quindi, aggiungere le seguenti annotazioni alla sezione metadata.annotations.

    1. Aggiungi la seguente annotazione auth-url. Questa annotazione specifica l' URL e dell' OAuth2-Proxy e per la tua istanza di App ID, che funge da OIDC Relying Party (RP) per App ID. Notare che tutte le lettere nel nome dell'istanza del servizio devono essere specificate in minuscolo.
        ...
        annotations:
           nginx.ingress.kubernetes.io/auth-url: https://oauth2-<App_ID_service_instance_name>.<namespace_of_Ingress_resource>.svc.cluster.local/oauth2-<App_ID_service_instance_name>/auth
        ...
        ```
    2. A volte il cookie di autenticazione utilizzato da `OAuth2-Proxy` supera i 4 KB. Quindi è diviso in due parti. Il seguente frammento deve essere aggiunto per garantire che entrambi i cookie possano essere aggiornati correttamente da `OAuth2-Proxy`.
    ```yaml {: codeblock}
        ...
        annotations:
            nginx.ingress.kubernetes.io/configuration-snippet: |
            auth_request_set $_oauth2_<App_ID_service_instance_name>_upstream_1 $upstream_cookie__oauth2_<App_ID_service_instance_name>_1;
            access_by_lua_block {
                if ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 ~= "" then
                ngx.header["Set-Cookie"] = "_oauth2_<App_ID_service_instance_name>_1=" .. ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 .. ngx.var.auth_cookie:match("(; .*)")
                end
            }
        ...
        ```
    
    3. Scegli quali token inviare nell'intestazione `Authorization` alla tua applicazione. Per ulteriori informazioni su ID e token di accesso, consulta la [documentazione diApp ID](/docs/appid?topic=appid-tokens){: external}.
        * Per inviare solo `ID Token`, aggiungere la seguente annotazione:
    
            ```yaml {: codeblock}
            ...
            annotations:
                nginx.ingress.kubernetes.io/auth-response-headers: Authorization
            ...
            ```
        * Per inviare solo `Access Token`, aggiungere le seguenti informazioni all'annotazione `configuration-snippet`. (Questo estende il frammento dal passo 5.2.)
    
            ```yaml {: codeblock}
            ...
            annotations:
                nginx.ingress.kubernetes.io/configuration-snippet: |
                auth_request_set $_oauth2_<App_ID_service_instance_name>_upstream_1 $upstream_cookie__oauth2_<App_ID_service_instance_name>_1;
                auth_request_set $access_token $upstream_http_x_auth_request_access_token;
                access_by_lua_block {
                    if ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 ~= "" then
                    ngx.header["Set-Cookie"] = "_oauth2_<App_ID_service_instance_name>_1=" .. ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 .. ngx.var.auth_cookie:match("(; .*)")
                    end
                    if ngx.var.access_token ~= "" then
                    ngx.req.set_header("Authorization", "Bearer " .. ngx.var.access_token)
                    end
                }
            ...
            ```
        * Per inviare `Access Token` e `ID Token`, aggiungere le seguenti informazioni all'annotazione `configuration-snippet`. (Questo estende il frammento dal passo 5.2.)
            ```yaml {: codeblock}
            ...
             annotations:
                nginx.ingress.kubernetes.io/configuration-snippet: |
                auth_request_set $_oauth2_<App_ID_service_instance_name>_upstream_1 $upstream_cookie__oauth2_<App_ID_service_instance_name>_1;
                auth_request_set $access_token $upstream_http_x_auth_request_access_token;
                auth_request_set $id_token $upstream_http_authorization;
                access_by_lua_block {
                    if ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 ~= "" then
                    ngx.header["Set-Cookie"] = "_oauth2_<App_ID_service_instance_name>_1=" .. ngx.var._oauth2_<App_ID_service_instance_name>_upstream_1 .. ngx.var.auth_cookie:match("(; .*)")
                    end
                    if ngx.var.id_token ~= "" and ngx.var.access_token ~= "" then
                    ngx.req.set_header("Authorization", "Bearer " .. ngx.var.access_token .. " " .. ngx.var.id_token:match("%s*Bearer%s*(.*)"))
                    end
                }
            ...
            ```
    4. Facoltativo: se la tua applicazione supporta la [strategia dell'applicazione Web](/docs/appid?topic=appid-key-concepts#term-web-strategy) in aggiunta o al posto della [strategia API](/docs/appid?topic=appid-key-concepts#term-api-strategy), aggiungi l'annotazione `nginx.ingress.kubernetes.io/auth-signin: https://$host/oauth2-<App_ID_service_instance_name>/start?rd=$escaped_request_uri`. Nota che tutte le lettere nel nome dell'istanza del servizio devono essere in minuscolo.
        * Se si specifica questa annotazione e l'autenticazione per un client fallisce, il client viene reindirizzato all' URL dell' OAuth2-Proxy per l'istanza App ID. Questo OAuth2-Proxy, che funge da OIDC Relying Party (RP) per App ID, reindirizza il client alla pagina di accesso di App ID per l'autenticazione.
        * Se non specifichi questa annotazione, un client deve autenticarsi con un token di connessione valido. Se l'autenticazione per un client non riesce, la richiesta del client viene rifiutata con un messaggio di errore `401 Unauthorized`.
    
    
  6. Riapplica le tue risorse Ingress per applicare l'autenticazione App ID. Dopo aver riapplicato una risorsa di Ingress con le annotazioni appropriate, il componente aggiuntivo ALB OAuth Proxy distribuisce una distribuzione OAuth2-Proxy, crea un servizio per la distribuzione e crea una risorsa di Ingress separata per configurare l'instradamento dei messaggi della distribuzione OAuth2-Proxy. Non eliminare queste risorse aggiuntive.

    kubectl apply -f <app_ingress_resource>.yaml -n namespace
    
  7. Verifica che l'autenticazione App ID sia applicata per le tue applicazioni.

    • Se le tue app supportano la strategia delle app web: accedi all' URL e della tua app in un browser web. Se l' App ID viene applicato correttamente, si viene reindirizzati a una pagina di accesso per l'autenticazione App ID.
    • Se le tue applicazioni supportano la Strategia API: specifica il tuo token di accesso Bearer nell'intestazione di autorizzazione delle richieste alle applicazioni. Per ottenere il token di accesso, consulta la documentazione diApp ID. Se App ID è applicato correttamente, la richiesta viene autenticata correttamente e viene instradata alla tua applicazione. Se invii richieste alle tue applicazioni senza un token di accesso nell'intestazione Authorization o se il token di accesso non è accettato da App ID, la richiesta viene rifiutata.
  8. Opzionale: se si utilizzano i criteri di rete o un'altra soluzione firewall sul cluster per limitare il traffico in uscita, è necessario assicurarsi di consentire l'accesso al servizio pubblico AppID's dal cluster. Per ottenere l'intervallo di indirizzi IP per questo servizio, inoltrare una richiesta tramite l'assistenza clienti.

  9. Facoltativo: puoi personalizzare il funzionamento predefinito di OAuth2-Proxy creando una ConfigMap Kubernetes.

    1. Creare un file YAML ConfigMap che specifica i valori per le impostazioni OAuth2-Proxy che si desidera modificare.
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: oauth2-<App_ID_service_instance_name>
          namespace: <ingress_resource_namespace>
        data:
          auth_logging: <true|false>
          # Log all authentication attempts.
          auth_logging_format:
          # Format for authentication logs. For more info, see https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#logging-configuration
          cookie_csrf_expire: "15m"
          # Expiration time for CSRF cookie. Default is "15m".
          cookie_csrf_per_request: <true|false>
          # Enable multiple CSRF cookies per request, making it possible to have parallel requests. Default is "false".
          cookie_domains:
          # A list of optional domains to force cookies to. The longest domain that matches the request’s host is used. If there is no match for the request’s host, the shortest domain is used. Example: sub.domain.com,example.com
          cookie_expire: "168h0m0s"
          # Expiration time for cookies. Default: "168h0m0s".
          cookie_samesite: ""
          # SameSite attribute for cookies. Supported values: "lax", "strict", "none", or "".
          email_domains: ""
          # Authenticate IDs that use the specified email domain. To authenticate IDs that use any email domain, use "*". Default: "". Example: example.com,example2.com
          pass_access_token: <true|false>
          # Pass the OAuth access token to the backend app via the X-Forwarded-Access-Token header.
          request_logging: <true|false>
          # Log all requests to the backend app.
          request_logging_format:
          # Format for request logs. For more info, see https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#request-log-format
          scope:
          # Scope of the OAuth authentication. For more info, see https://oauth.net/2/scope/
          set_authorization_header: <true|false>
          # Set the Authorization Bearer response header when the app responds to the Ingress ALB, such when using the NGINX auth_request mode.
          set_xauthrequest: <true|false>
          # Set X-Auth-Request-User, X-Auth-Request-Email, and X-Auth-Request-Preferred-Username response headers when the app responds to the Ingress ALB, such as when using the NGINX auth_request mode.
          standard_logging: <true|false>
          # Log standard runtime information.
          standard_logging_format:
          # Format for standard logs. For more info, see https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#standard-log-format
          tls_secret_name:
          # The name of a secret that contains the server-side TLS certificate and key to enable TLS between the OAuth2-Proxy and the Ingress ALB. By default, the TLS secret defined in your Ingress resources is used.
          whitelist_domains:
          # Allowed domains for redirection after authentication. Default: "". Example: example.com,*.example2.com For more info, see: https://oauth2-proxy.github.io/oauth2-proxy/configuration/overview#command-line-options
          oidc_extra_audiences:
          # Additional audiences which are allowed to pass verification.
          cookie_refresh:
          # Refresh the cookie after this duration. Example: "15m". To use this feature, you must enable "Refresh token" for the AppID instance. For more info, see: /docs/appid?topic=appid-managing-idp&interface=ui#idp-token-lifetime
        ```
    2. Applicare la risorsa ConfigMap al componente aggiuntivo. Le modifiche vengono applicate automaticamente.
    ```sh {: pre}
        kubectl apply -f oauth2-<App_ID_service_instance_name>.yaml
        ```
    

Per l'elenco delle modifiche apportate a ciascuna versione del componente aggiuntivo ALB OAuth Proxy, consultare il registro delle modifiche del componente aggiuntivo IBM Cloud ALB OAuth Proxy.

Aggiornamento del componente aggiuntivo ALB OAuth Proxy

Per aggiornare il componente aggiuntivo ALB OAuth Proxy, è necessario prima disattivare il componente aggiuntivo, quindi riattivarlo e specificare la versione.

Il processo di aggiornamento non comporta interruzioni, poiché le istanze di OAuth2 Proxy supervisionate rimangono nel cluster anche quando il componente aggiuntivo è disattivato.

  1. Disabilita il componente aggiuntivo.
    ibmcloud ks cluster addon disable alb-oauth-proxy --cluster CLUSTER_NAME_OR_ID
    
  2. Elencare le versioni dei componenti aggiuntivi disponibili e decidere quale versione si desidera utilizzare.
    ibmcloud ks cluster addon versions --addon alb-oauth-proxy
    
  3. Abilitare il componente aggiuntivo e specificare l'opzione --version. Se non si specifica una versione, la versione predefinita è abilitata.
    ibmcloud ks cluster addon enable alb-oauth-proxy --cluster CLUSTER_NAME_OR_ID [--version VERSION]
    

Conservazione dell'indirizzo IP di origine

Per impostazione predefinita, gli indirizzi IP di origine delle richieste client non sono conservati dall'ALB Ingress. Per preservare gli indirizzi IP di origine, puoi abilitare il protocollo PROXY nei cluster VPC o modificare il externalTrafficPolicy nei cluster classici.

Abilitazione del protocollo PROXY nei cluster VPC

Per conservare l'indirizzo IP di origine della richiesta del client in un cluster VPC, è possibile abilitare il protocollo NGINX PROXY per tutti i bilanciatori di carico che espongono gli ALB di ingresso nel cluster.

  1. Facoltativo Completare i seguenti passaggi se si utilizza Cloud Internet Services (CIS).

    1. Attivare l'impostazione True client IP header nella console CIS, facendo clic su Sicurezza > Avanzate > True client IP header.
    2. Modificare kube-system/ibm-k8s-controller-config configmap e impostare allow-snippet-annotations: "true".
    3. Aggiungere l'annotazione nginx.ingress.kubernetes.io/server-snippet: real_ip_header CF-Connecting-IP;.
  2. Abilitare il protocollo PROXY. Per ulteriori informazioni sui parametri di questo comando, vedi il riferimento CLI. Dopo aver eseguito questo comando, vengono creati nuovi programmi di bilanciamento del carico con la configurazione del protocollo PROXY aggiornata. Durante la ricreazione di ciascun bilanciatore di carico, in ogni sottorete devono essere disponibili due indirizzi IP non utilizzati per ciascun bilanciatore di carico. Dopo che questi programmi di bilanciamento del carico sono stati creati, i programmi di bilanciamento del carico ALB esistenti vengono eliminati. Questo processo di ricreazione del programma di bilanciamento del carico potrebbe causare interruzioni del servizio.

    ibmcloud ks ingress lb proxy-protocol enable --cluster CLUSTER_NAME_OR_ID --cidr SUBNET_CIDR --header-timeout TIMEOUT
    
  3. Conferma che il protocollo PROXY è abilitato per i programmi di bilanciamento del carico che espongono gli ALB nel tuo cluster.

    ibmcloud ks ingress lb get --cluster CLUSTER_NAME_OR_ID
    
  4. Per disattivare in seguito il protocollo PROXY, è possibile eseguire il seguente comando:

    ibmcloud ks ingress lb proxy-protocol disable --cluster CLUSTER_NAME_OR_ID
    

Modifica di externalTrafficPolicy nei cluster classici

Conserva l'indirizzo IP di origine per le richieste client in un cluster classico.

Nei cluster Classic, l'aumento del numero di repliche ALB a più di 2 aumenta il numero di repliche, ma quando il 'externalTrafficPolicy è configurato come 'Local, le repliche superiori a 2 non vengono utilizzate. Nel cluster sono presenti solo 2 pod di load balancer (in una configurazione attiva-passiva) e, a causa di questa politica di traffico, inoltrano il traffico in entrata solo al pod ALB sullo stesso nodo.

Per impostazione predefinita, l'indirizzo IP di origine della richiesta client non viene conservato. Quando una richiesta client alla tua applicazione viene inviata al tuo cluster, la richiesta viene instradata a un pod per il servizio di programma di bilanciamento del carico che espone l'ALB. Se sullo stesso nodo di lavoro del pod del servizio del programma di bilanciamento del carico non esiste un pod dell'applicazione, il programma di bilanciamento inoltra la richiesta a un pod dell'applicazione su un nodo di lavoro diverso. L'indirizzo IP di origine del pacchetto viene modificato nell'indirizzo IP pubblico del nodo di lavoro su cui viene eseguito il pod dell'applicazione.

Per conservare l'indirizzo IP di origine originale della richiesta del client, è possibile abilitare la funzione di conservazione dell'IP di origine. La conservazione dell'IP del client è utile quando, ad esempio, i server delle applicazioni devono applicare le politiche di sicurezza e di controllo dell'accesso.

Quando è abilitata la conservazione dell'IP di origine, i bilanciatori di carico passano dall'inoltrare il traffico verso un pod ALB su un nodo di lavoro diverso a un pod ALB sullo stesso nodo di lavoro. Le tue applicazioni potrebbero riscontrare un tempo di inattività durante questo turno. Se disabiliti un ALB, eventuali modifiche all'IP di origine che apporti al servizio di bilanciamento del carico che espone l'ALB andranno perse. Quando riabiliti l'ALB, devi abilitare di nuovo l'IP di origine.

Per abilitare la conservazione dell'IP di origine, modifica il servizio del programma di bilanciamento del carico che espone un ALB Ingress:

  1. Abilita la conservazione dell'IP di origine per un singolo ALB o per tutti gli ALB nel tuo cluster.

    • Per impostare la conservazione dell'IP di origine per un singolo ALB:
      1. Ottieni l'ID dell'ALB per il quale vuoi abilitare l'IP di origine. I servizi ALB hanno un formato simile a public-cr18e61e63c6e94b658596ca93d087eed9-alb1 per un ALB pubblico o private-cr18e61e63c6e94b658596ca93d087eed9-alb1 per un ALB privato.

        kubectl get svc -n kube-system | grep alb
        
      2. Apri il file YAML per il servizio del programma di bilanciamento del carico che espone l'ALB.

        kubectl edit svc <ALB_ID> -n kube-system
        
      3. In spec, modifica il valore di externalTrafficPolicy da Cluster a Local.

      4. Salva e chiudi il file di configurazione. L'output è simile al seguente:

        service "public-cr18e61e63c6e94b658596ca93d087eed9-alb1" edited
        
    • Per impostare la conservazione dell'IP di origine per tutti gli ALB pubblici nel tuo cluster, esegui questo comando:
        kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^public" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Local"}}'; done
        ```
        Output di esempio
    
        ```sh {: screen}
        "public-cr18e61e63c6e94b658596ca93d087eed9-alb1", "public-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched
        ```
    * Per impostare la conservazione dell'IP di origine per tutti gli ALB privati nel tuo cluster, esegui questo comando:
    ```sh {: pre}
        kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^private" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Local"}}'; done
        ```
        Output di esempio
    
        ```sh {: screen}
        "private-cr18e61e63c6e94b658596ca93d087eed9-alb1", "private-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched
        ```
    
  2. Verifica che l'IP di origine venga conservato nei log dei tuoi pod ALB.

    1. Ottieni l'ID di un pod per l'ALB che hai modificato.
        kubectl get pods -n kube-system | grep alb
        ```
    2. Apri i log relativi a tale pod ALB. Verifica che l'indirizzo IP per il campo `client` sia l'indirizzo IP della richiesta client invece dell'indirizzo IP del servizio del programma di bilanciamento del carico.
    ```sh {: pre}
        kubectl logs <ALB_pod_ID> nginx-ingress -n kube-system
        ```
    
  3. Ora, quando nelle intestazioni ricerchi le richieste inviate alla tua applicazione di back-end, puoi vedere l'indirizzo IP del client nell'intestazione x-forwarded-for.

  4. Se non vuoi più conservare l'IP di origine, puoi ripristinare le modifiche apportate al servizio.

    • Per ripristinare la conservazione dell'IP di origine per i tuoi ALB pubblici:
        kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^public" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'; done
        ```
    * Per ripristinare la conservazione dell'IP di origine per i tuoi ALB privati:
    ```sh {: pre}
        kubectl get svc -n kube-system | grep alb | awk '{print $1}' | grep "^private" | while read alb; do kubectl patch svc $alb -n kube-system -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'; done
        ```
    
    
    

Configurazione di protocolli SSL e cifrature SSL a livello di HTTP

Abilitare i protocolli e gli algoritmi di crittografia " SSL " a livello globale HTTP modificando il file ibm-k8s-controller-config ConfigMap.

Ad esempio, se hai ancora dei client legacy che richiedono il supporto TLS 1.0 o 1.1, devi abilitare manualmente queste versioni TLS per sovrascrivere l'impostazione predefinita dei soli TLS 1.2 e TLS 1.3.

Quando specifichi i protocolli abilitati per tutti gli host, i parametri TLSv1.1 e TLSv1.2 (1.1.13, 1.0.12) funzionano solo se viene utilizzato OpenSSL 1.0.1 o superiore. Il parametro TLSv1.3 (1.13.0) funziona solo quando viene utilizzato OpenSSL 1.1.1 sviluppato con il supporto TLSv1.3.

Per modificare la mappa di configurazione per l'abilitazione di protocolli e cifrature SSL:

  1. Modifica il file di configurazione della risorsa ibm-k8s-controller-config ConfigMap.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Aggiungi i protocolli e le cifrature SSL. Formattare i codici di cifratura secondo il formato dell'elenco dei codici di cifratura della libreria OpenSSL.

    apiVersion: v1
    data:
      ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3"
      ssl-ciphers: "HIGH:!aNULL:!MD5:!CAMELLIA:!AESCCM:!ECDH+CHACHA20"
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      namespace: kube-system
    
  3. Salva il file di configurazione.

  4. Verifica che le modifiche alla mappa di configurazione siano state applicate. Le modifiche vengono applicate automaticamente ai tuoi ALB.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Invio del tuo certificato personalizzato ai client legacy

Se disponi di dispositivi legacy che non supportano la Server Name Indication (SNI) e utilizzi un certificato personalizzato TLS nelle tue risorse Ingress, devi modificare le impostazioni del server ALB per utilizzare il tuo certificato personalizzato TLS e il tuo segreto personalizzato TLS.

Quando crei un cluster classico, viene generato un certificato Let's Encrypt per il segreto Ingress predefinito fornito da IBM. Se crei un segreto personalizzato nel tuo cluster e lo specifichi per la terminazione TLS nelle tue risorse Ingress, l'ALB Ingress invia al client il certificato per il tuo segreto personalizzato invece del certificato Let's Encrypt predefinito. Tuttavia, se un client non supporta SNI, l'impostazione predefinita dell'ALB Ingress è il certificato Let's Encrypt in quanto il segreto predefinito viene elencato nelle impostazioni server predefinite dell'ALB. Per inviare il certificato personalizzato ai dispositivi che non supportano SNI, segui questi passaggi per modificare le impostazioni predefinite del server ALB in modo da utilizzare il tuo segreto personalizzato.

I certificati Let' s Encrypt generati per impostazione predefinita non sono destinati all'utilizzo in produzione. Per i carichi di lavoro di produzione, porta il tuo certificato personalizzato.

  1. Modifica la risorsa Ingress alb-default-server.

    kubectl edit ingress alb-default-server -n kube-system
    
  2. Nella sezione spec.tls, modifica il valore dell'impostazione hosts.secretName con il nome del tuo segreto personalizzato che contiene il tuo certificato personalizzato. Esempio:

    spec:
        rules:
        ...
        tls:
        - hosts:
        - invalid.mycluster-<hash>-0000.us-south.containers.appdomain.cloud
        secretName: <custom_secret_name>
    
  3. Salva il file di risorse.

  4. Verifica che ora la risorsa punti al nome del tuo segreto personalizzato. Le modifiche vengono applicate automaticamente ai tuoi ALB.

    kubectl get ingress alb-default-server -n kube-system -o yaml
    

Gestione fine delle connessioni

Le impostazioni client-header-timeout, client-body-timeout e keep-alive sono configurazioni cruciali che dettano il tempo in cui le connessioni rimangono attive tra i client, il controller Ingress e i server backend. Questi timeout svolgono un ruolo importante nell'ottimizzazione della gestione delle richieste, in particolare quando si tratta di connessioni client di lunga durata, di risposte ritardate dai server di backend e di salvaguardare risorse preziose dall'essere occupate inutilmente.

client-header-timeout definisce il tempo massimo di attesa del server per un'intestazione completa del client. Allo stesso modo, client-body-timeout indica la durata dell'attesa del server per l'invio del corpo della richiesta da parte del client. Entrambi i timeout devono essere in linea con il parametro keep-alive, che regola il tempo in cui il server mantiene aperta la connessione in attesa di ulteriori richieste. Se questi timeout non coincidono con l'impostazione keep-alive, NGINX termina la connessione, il che potrebbe portare a un comportamento inatteso del client o al fallimento delle richieste.

È possibile impostare questi parametri nel file ibm-k8s-controller-config ConfigMap, nello spazio dei nomi kube-system.

apiVersion: v1
kind: ConfigMap
metadata:
  name: ibm-k8s-controller-config
  namespace: kube-system
data:
  ...
  client-body-timeout: "100"
  client-header-timeout: "100"
  keep-alive: "100"

Per ulteriori informazioni, consultare la sezione client-header-timeout, client-body-timeout e keep-alive nella documentazione di Ingress Nginx.

Regolazione dei timeout

Se i cluster sono esposti con IBM Cloud Cloud Internet Services (CIS) / Cloudflare e utilizzano il Web Application Firewall (WAF) o il bilanciamento del carico globale, è necessario impostare i parametri client-header-timeout, client-body-timeout e keep-alive nella risorsa ibm-k8s-controller-config situata all'interno dello spazio dei nomi kube-system su valori superiori a 900 secondi per evitare la chiusura prematura delle connessioni. Per ulteriori informazioni, consultare la documentazione di Cloudflare.

  1. Aggiornare i parametri client-header-timeout, client-body-timeout, e keep-alive nel namespace ibm-k8s-controller-config ConfigMap all'interno dello spazio dei nomi kube-system. Un esempio di comando per impostare ogni parametro a 905 secondi è il seguente:

    kubectl patch cm --patch '{"data": {"client-header-timeout": "905", "client-body-timeout": "905", "keep-alive": "905"}}' --type=merge -n kube-system ibm-k8s-controller-config
    
  2. Solo per i cluster VPC: è necessario modificare anche il timeout della connessione inattiva per il bilanciatore di carico VPC. Regolare il timeout del servizio public-cr<clusterid> LoadBalancer. Un esempio di comando che imposta 910 secondi è il seguente:

    kubectl annotate svc -n kube-system public-cr<clusterid> service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout="910"
    

Ottimizzazione delle prestazioni ALB

Per ottimizzare le prestazioni dei tuoi ALB Ingress, puoi modificare le impostazioni predefinite in base alle tue necessità.

Abilitazione del buffering di log e del timeout di scarico

Per impostazione predefinita, l'ALB Ingress registra ogni richiesta appena arriva. Se hai un ambiente utilizzato in modo intensivo, la registrazione di ciascuna richiesta appena arriva può aumentare notevolmente l'utilizzo di I/O del disco. Per evitare operazioni di I/O su disco continue, è possibile abilitare il buffering dei log e il timeout di flush per l'ALB modificando l'Ingress " ibm-k8s-controller-config " ConfigMap. Quando il buffering è abilitato, invece di eseguire un'operazione di scrittura separata per ciascuna voce di log, l'ALB memorizza in buffer una serie di voci e le scrive insieme nel file in una singola operazione.

  1. Modificare la ibm-k8s-controller-config ConfigMap.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Imposta la soglia oltre la quale l'ALB deve scrivere i contenuti memorizzati nel buffer nel log.

    • Dimensione del buffer: aggiungere il campo “ buffer ” e impostarlo in modo da specificare la quantità di memoria di log che può essere contenuta nel buffer prima che l’ALB scriva il contenuto bufferizzato nel file di log. Ad esempio, se si utilizza il valore predefinito di “ 100KB ”, l’ALB scrive il contenuto del buffer nel file di log ogni volta che il buffer raggiunge “ 100KB ” di contenuto del log.
    • Intervallo di tempo: aggiungere il campo “ flush ” e impostarlo in base alla frequenza con cui l’ALB deve effettuare le scritture nel file di log. Ad esempio, se si utilizza il valore predefinito di “ 5m ”, l’ALB scrive il contenuto del buffer nel file di log una volta ogni 5 minuti.
    • Intervallo di tempo o dimensione del buffer: quando sono impostati sia “ flush ” che “ buffer ”, l’ALB scrive il contenuto del buffer nel file di log in base al parametro di soglia che viene raggiunto per primo.
    apiVersion: v1
    kind: ConfigMap
    data:
        access-log-params: "buffer=100KB, flush=5m"
      metadata:
    name: ibm-k8s-controller-config
    ...
    
  3. Salva e chiudi il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.

  4. Verifica che i log per un ALB ora contengano contenuto nel buffer scritto in base alla dimensione della memoria o all'intervallo di tempo che hai impostato.

    kubectl logs -n kube-system <ALB_ID> -c nginx-ingress
    

Modifica del numero o della durata delle connessioni keepalive

Le connessioni keepalive possono avere un impatto significativo sulle prestazioni riducendo l'utilizzo di CPU e rete necessario per aprire e chiudere le connessioni. Per ottimizzare le prestazioni dei tuoi ALB, puoi modificare il numero massimo di connessioni keepalive tra l'ALB e il client e la durata possibile delle connessioni keepalive.

  1. Modificare la ibm-k8s-controller-config ConfigMap.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Modifica i valori di keep-alive-requests e keep-alive.

    • keep-alive-requests: il numero di connessioni client keepalive che possono rimanere aperte all'ALB Ingress. Il valore predefinito è 100.
    • keep-alive: il timeout, in secondi, durante il quale la connessione client keepalive rimane aperta all'ALB Ingress. Il valore predefinito è 75.
    apiVersion: v1
    data:
      keep-alive-requests: 100
      keep-alive: 75
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Salva e chiudi il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.

  4. Verifica che le modifiche alla mappa di configurazione siano state applicate.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Modifica del numero di connessioni simultanee o di processi di lavoro

Modificare l'impostazione predefinita per il numero di connessioni simultanee che i processi worker di NGINX per un ALB possono gestire o il numero di processi worker che possono verificarsi per un ALB.

Ogni ALB ha NGINX processi worker che elaborano le connessioni client e comunicano con i server upstream per le applicazioni che l'ALB espone. Modificando il numero di processi di lavoro per ogni ALB o il numero di connessioni che i processi di lavoro possono gestire, puoi gestire il numero massimo di client che un ALB può gestire. Calcolare il numero massimo di connessioni client con la seguente formula maximum clients = worker_processes * worker_connections.

  • Il campo max-worker-connections imposta il numero massimo di connessioni simultanee che possono essere gestite dai processi worker di NGINX per un ALB. Il valore predefinito è 16384. Si noti che il parametro max-worker-connections include tutte le connessioni che i proxy ALB, non solo le connessioni con client. Inoltre, il numero effettivo di connessioni simultanee non può superare il limite del numero massimo di file aperti, impostato dal parametro max-worker-open-files. Se si imposta il valore di max-worker-connections su 0, viene utilizzato il valore per max-worker-open-files.
  • Il campo worker-processes imposta il numero massimo di processi worker NGINX per un ALB. Il valore predefinito è "auto", che indica che il numero di processi di lavoro corrisponde al numero di core sul nodo di lavoro in cui è distribuito l'ALB. È possibile modificare questo valore in un numero se i processi worker devono eseguire livelli elevati di operazioni I/0.
  1. Modificare la ibm-k8s-controller-config ConfigMap.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Modificare il valore di max-worker-connections o worker-processes.

    apiVersion: v1
    data:
      max-worker-connections: 16384
      worker-processes: "auto"
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Salva il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.

  4. Verifica che le modifiche alla mappa di configurazione siano state applicate.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Modifica del numero di file aperti per i processi di lavoro

Modifica il massimo predefinito per il numero di file che possono essere aperti da ogni processo del nodo di lavoro per un ALB.

Ogni ALB ha NGINX processi worker che elaborano le connessioni client e comunicano con i server upstream per le applicazioni che l'ALB espone. Se i processi worker stanno raggiungendo il numero massimo di file che possono essere aperti, si potrebbe vedere un errore Too many open files nei log di NGINX. Per default, il parametro max-worker-open-files è impostato su 0, che indica che viene usato il valore della seguente formula: system limit of maximum open files / worker-processes - 1024. Se si modifica il valore in un altro numero intero, la formula non viene più applicata.

  1. Modificare la ibm-k8s-controller-config ConfigMap.

    kubectl edit cm ibm-k8s-controller-config -n kube-system
    
  2. Modificare il valore di max-worker-open-files.

    apiVersion: v1
    data:
      max-worker-open-files: 0
    kind: ConfigMap
    metadata:
      name: ibm-k8s-controller-config
      ...
    
  3. Salva il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.

  4. Verifica che le modifiche alla mappa di configurazione siano state applicate.

    kubectl get cm ibm-k8s-controller-config -n kube-system -o yaml
    

Ottimizzazione delle prestazioni del kernel

Per ottimizzare le prestazioni dei tuoi ALB Ingress, puoi anche modificare i parametri sysctl del kernel Linux sui nodi di lavoro. Dei nodi di lavoro viene eseguito automaticamente il provisioning con la regolazione del kernel ottimizzata; ti invitiamo pertanto a modificare queste impostazioni sono se hai degli specifici requisiti di ottimizzazione delle prestazioni.