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-configConfigMap campossl-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-configconfigmap .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-configConfigMap :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;
}
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.
-
Creare una
tcp-servicesConfigMap per specificare la porta TCP, come le seguenti porte di esempio. Per i requisiti del sitotcp-servicesConfigMap, si veda questo blog.apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: kube-system data: 9000: "<namespace>/<service>:8080" -
Creare l' ConfigMap e nel namespace
kube-system.kubectl apply -f tcp-services.yaml -n kube-system -
Specificare
tcp-servicesConfigMap come campo inibm-ingress-deploy-configConfigMap."tcpServicesConfig":"kube-system/tcp-services" -
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.
-
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
-
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 sezionespec.tlsdi 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-nginxoprivate-iks-k8s-nginxnella 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 inNGINX.3: Mostra i dettagli sulle modifiche del servizio, della regola Ingress e dell'endpoint in formato JSON.5: ConfiguraNGINXin 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-servicesche 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.
-
Crea la mappa di configurazione
ibm-ingress-deploy-confignel tuo cluster.kubectl create -f ibm-ingress-deploy-config.yaml -
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 -
Se si sono specificate porte non standard HTTP, HTTPS o TCP, è necessario aprire le porte su ciascun servizio ALB.
- 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.
-
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:
- 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.
- Scegli la stessa regione in cui è distribuito il tuo cluster.
- Fai clic su Crea.
-
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.
- Nella console di gestione App ID, passa a Gestisci autenticazione.
- 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.
- 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_outal proprio dominio nel formatohttps://<hostname>/oauth2-<App_ID_service_instance_name>/sign_oute includere questo URL nell'elenco degli URL di reindirizzamento. Se si vuole utilizzare una pagina di logout personalizzata, è necessario impostarewhitelist_domainsnel campo ConfigMap per OAuth2-Proxy. Richiama l'endpointhttps://<hostname>/oauth2-<App_ID_service_instance_name>/sign_outcon il parametro di queryrdo imposta l'intestazioneX-Auth-Request-Redirectcon la tua pagina di logout personalizzata. Per ulteriori dettagli, consultare Scollegamento. -
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
--keyper 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> -
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-.- 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 ``` - Abilitare il componente aggiuntivo
-
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.- 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`. - Aggiungi la seguente annotazione
-
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 -
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
Bearernell'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.
-
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.
-
Facoltativo: puoi personalizzare il funzionamento predefinito di OAuth2-Proxy creando una ConfigMap Kubernetes.
- 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.
- Disabilita il componente aggiuntivo.
ibmcloud ks cluster addon disable alb-oauth-proxy --cluster CLUSTER_NAME_OR_ID - Elencare le versioni dei componenti aggiuntivi disponibili e decidere quale versione si desidera utilizzare.
ibmcloud ks cluster addon versions --addon alb-oauth-proxy - 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.
-
Facoltativo Completare i seguenti passaggi se si utilizza Cloud Internet Services (CIS).
- Attivare l'impostazione True client IP header nella console CIS, facendo clic su Sicurezza > Avanzate > True client IP header.
- Modificare
kube-system/ibm-k8s-controller-config configmape impostareallow-snippet-annotations: "true". - Aggiungere l'annotazione
nginx.ingress.kubernetes.io/server-snippet: real_ip_header CF-Connecting-IP;.
-
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 -
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 -
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:
-
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:
-
Ottieni l'ID dell'ALB per il quale vuoi abilitare l'IP di origine. I servizi ALB hanno un formato simile a
public-cr18e61e63c6e94b658596ca93d087eed9-alb1per un ALB pubblico oprivate-cr18e61e63c6e94b658596ca93d087eed9-alb1per un ALB privato.kubectl get svc -n kube-system | grep alb -
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 -
In
spec, modifica il valore diexternalTrafficPolicydaClusteraLocal. -
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 ``` - Per impostare la conservazione dell'IP di origine per un singolo ALB:
-
Verifica che l'IP di origine venga conservato nei log dei tuoi pod ALB.
- 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 ``` -
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. -
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:
-
Modifica il file di configurazione della risorsa
ibm-k8s-controller-configConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system -
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 -
Salva il file di configurazione.
-
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.
-
Modifica la risorsa Ingress
alb-default-server.kubectl edit ingress alb-default-server -n kube-system -
Nella sezione
spec.tls, modifica il valore dell'impostazionehosts.secretNamecon 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> -
Salva il file di risorse.
-
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.
-
Aggiornare i parametri
client-header-timeout,client-body-timeout, ekeep-alivenel namespaceibm-k8s-controller-configConfigMap all'interno dello spazio dei nomikube-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 -
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.
-
Modificare la
ibm-k8s-controller-configConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system -
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 ... - Dimensione del buffer: aggiungere il campo “
-
Salva e chiudi il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.
-
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.
-
Modificare la
ibm-k8s-controller-configConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Modifica i valori di
keep-alive-requestsekeep-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 ... -
Salva e chiudi il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.
-
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-connectionsimposta 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 parametromax-worker-connectionsinclude 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 parametromax-worker-open-files. Se si imposta il valore dimax-worker-connectionssu0, viene utilizzato il valore permax-worker-open-files. - Il campo
worker-processesimposta 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.
-
Modificare la
ibm-k8s-controller-configConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Modificare il valore di
max-worker-connectionsoworker-processes.apiVersion: v1 data: max-worker-connections: 16384 worker-processes: "auto" kind: ConfigMap metadata: name: ibm-k8s-controller-config ... -
Salva il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.
-
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.
-
Modificare la
ibm-k8s-controller-configConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system -
Modificare il valore di
max-worker-open-files.apiVersion: v1 data: max-worker-open-files: 0 kind: ConfigMap metadata: name: ibm-k8s-controller-config ... -
Salva il file di configurazione. Le modifiche vengono applicate automaticamente ai tuoi ALB.
-
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.