Personalizzazione dell'instradamento ALB
Modifica le impostazioni predefinite per gli ALB che eseguono l'immagine Ingress Kubernetes.
A volte, puoi personalizzare l'instradamento per Ingress aggiungendo Kubernetes NGINX annotations (nginx.ingress.kubernetes.io/<annotation>
).
Le annotazioni Kubernetes NGINX sono sempre applicate a tutti i percorsi del servizio nella risorsa e non puoi specificare i nomi del servizio all'interno delle annotazioni. Le annotazioni IBM Cloud Kubernetes Service personalizzate (ingress.bluemix.net/<annotation>
)
non sono supportate.
Kubernetes Gli ALB (Ingress Controller) sui cluster creati a partire dal 31 gennaio 2022 non elaborano le risorse Ingress che hanno annotazioni di frammenti (ad esempio, nginx.ingress.kubernetes.io/configuration-snippet
) per impostazione
predefinita poiché tutti i nuovi cluster vengono distribuiti con la configurazione allow-snippet-annotations: "false"
nella ConfigMapdell'ALB. Se aggiungi degli snippet di configurazione consigliati qui, devi modificare
ConfigMap (kube-system/ibm-k8s-controller-config
) dell'ALB e modificare allow-snippet-annotations: "false"
in allow-snippet-annotations: "true"
.
Aggiunta di una porta del server a un'intestazione host
Per aggiungere una porta server alla richiesta client prima che la richiesta venga inoltrata alla tua applicazione di back-end, configura un proxy ai servizi esterni in un'annotazione del frammento del server
o come un campo 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
Configura Ingress con IBM Cloud App ID per applicare l'autenticazione per le tue applicazioni modificando specifici campi Ingress Kubernetes. Per ulteriori informazioni, vedi Aggiunta dell'autenticazione App ID alle applicazioni.
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, utilizza la seguente risorsa Kubernetes Ingress annotazione.
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 le azioni personalizzate che l'ALB può intraprendere per specifici errori di comunicazione ( 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 ogni servizio ALB con il seguente Kubernetes Ingresso ibm-ingress-deploy-config
ConfigMap
campi.
Impostazione campo di esempio.
httpPort=8080
httpsPort=8443
Personalizzazione dell'intestazione della richiesta
Per aggiungere le informazioni di intestazione a una richiesta client prima di inoltrare la richiesta alla tua applicazione di back-end, utilizza il seguente campo ibm-k8s-controller-config
configmap Kubernetes
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 percorsi a servizi esterni
Per aggiungere definizioni di percorsi a servizi esterni, come i servizi ospitati in IBM Cloud, configurare un proxy per i servizi esterni in un frammento di ubicazione. In alternativa, sostituire il proxy con un reindirizzamento permanente ai servizi esterni.
Reindirizzamento delle richieste non sicure
Per impostazione predefinita, le richieste client non sicure dell' HTTP e vengono reindirizzate a HTTPS. Per disabilitare questa impostazione, utilizzare il seguente campo e annotazione.
ibm-k8s-controller-config
ConfigMap 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 è attivata per impostazione predefinita.
- Per aggiungere la durata massima e la granularità del dominio secondario, vedi 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 è possibile soddisfare tramite una connessione keepalive, utilizza 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 hai migrato la tua configurazione
Ingress da IBM Cloud Kubernetes Service Ingress a Kubernetes Ingress, potresti dover modificare keep-alive-requests
per superare i test delle prestazioni esistenti.
Impostazione di un timeout massimo di richiesta keepalive
Per impostare il tempo massimo durante il quale una connessione keepalive rimane aperta tra il client e il server proxy ALB, utilizza 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 massimo e la dimensione dei buffer che leggono intestazioni di richiesta client di grandi dimensioni, utilizza 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 corrisponde all'URI della richiesta rispetto al percorso dell'applicazione, utilizza la seguente annotazione Kubernetes Ingress resource .
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 del blocco di ubicazioni personalizzata per un servizio, utilizza la seguente Kubernetes risorsa Ingress annotazione.
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, utilizza la seguente Kubernetes risorsa Ingress annotazioni. Si noti che l'autenticazione reciproca 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 proxy che legge la prima parte della risposta, utilizza la annotazionedella risorsa Ingress Kubernetes.
nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"
Configurazione dei numeri di buffer proxy
Per configurare il numero di buffer proxy per l'ALB, utilizza la seguente annotazione Kubernetes Ingress resource .
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, vedi la documentazione di NGINX.
Configurazione quando un ALB può passare una richiesta
Per impostare quando l'ALB può passare una richiesta al successivo server upstream, utilizza i seguenti campi Ingress Kubernetes.
-
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 del client dall'applicazione finale di back-end prima che la risposta venga inviata al client. Configurare la rimozione dell'intestazione della risposta in un frammento di ubicazioneoppure utilizzare il campo proxy_hide_header
come frammento di configurazione in ibm-k8s-controller-config
ConfigMap.
Riscrittura dei percorsi
Per instradare il traffico di rete in entrata su un percorso di dominio ALB a un percorso differente su cui è in attesa la tua applicazione di back - end, utilizza la seguente annotazione Kubernetes Ingress resource .
nginx.ingress.kubernetes.io/rewrite-target: /newpath
Personalizzare le configurazioni dei blocchi del server
Per aggiungere una configurazione del blocco del server personalizzato, utilizza la seguente annotazione Kubernetes Ingress resource .
nginx.ingress.kubernetes.io/server-snippet: |
location = /health {
return 200 'Healthy';
add_header Content-Type text/plain;
}
Abilitazione del supporto dei servizi SSL per crittografare il traffico
Per consentire il supporto dei servizi SSL per crittografare il traffico verso le applicazioni upstream che richiedono l' HTTPS, utilizzare l'annotazione del protocollo backend delle risorse di ingresso ( Kubernetes ) e le annotazioni di autenticazione del certificato 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 app con porte TCP non standard
Per accedere a un'app tramite una porta TCP non standard, segui questi passaggi.
-
Creare una
tcp-services
ConfigMap per specificare la porta TCP, come le seguenti porte di esempio. Per i requisiti dellatcp-services
ConfigMap, vedere questo blog.apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: kube-system data: 9000: "<namespace>/<service>:8080"
-
Creare il file ConfigMap nello spazio dei nomi
kube-system
.kubectl apply -f tcp-services.yaml -n kube-system
-
Specificare
tcp-services
ConfigMap come campo inibm-ingress-deploy-config
ConfigMap."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 soddisfatte tramite una connessione keepalive, utilizza 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 per cui una connessione keepalive rimane aperta tra il server proxy ALB e il server upstream della tua applicazione, utilizza il seguente campo Kubernetes ibm-k8s-controller-config
configmap
.
upstream-keepalive-timeout: 32
Personalizzazione della distribuzione ALB
Personalizza la distribuzione per gli ALB che eseguono l'immagine Ingress Kubernetes creando una 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
.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>"}' <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>"}'
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 TLS predefinito da applicare a qualsiasi dominio secondario configurato con ALB Ingress nel formato
secret_namespace/secret_name
. Per creare un segreto, puoi eseguire il comando ibmcloud ks ingress secret create. Se viene specificato un segreto per un certificato TLS diverso nella sezionespec.tls
di una risorsa Ingress e tale segreto esiste nello stesso spazio dei nomi della risorsa Ingress, tale segreto viene applicato invece di questo 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
- Abilitare il passthrough 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
oprivate-iks-k8s-nginx
nella tua risorsa Ingress, specifica la classe. logLevel
-
- Specificare il livello di log che si desidera utilizzare. Scegliere tra i 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
: ConfiguraNGINX
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
- Specifica una ConfigMap e lo spazio dei nomi in cui si trova la ConfigMap, come
kube-system/tcp-services
, che contiene informazioni sull'accesso al tuo servizio dell'app tramite una porta TCP non standard. 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.) Predefinito:
"false"
.
-
Crea la mappa di configurazione
ibm-ingress-deploy-config
nel 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 hai specificato porte non standard ( HTTP, HTTPS o TCP), devi aprire le porte su ogni 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>
-
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 specificarenodePort
. Dopo aver aggiunto la porta e applicato le modifiche, viene assegnato automaticamente unnodePort
... 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> ...
-
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
Applica l'autenticazione per le tue applicazioni configurando Ingress con IBM Cloud App ID.
-
Scegli un'istanza esistente oppure crea una nuova istanza App ID.
Un'istanza App ID può essere utilizzata in un solo spazio dei nomi nel cluster. Se vuoi configurare App ID per risorse Ingress in più spazi dei nomi, ripeti i passi in questa sezione per specificare un'istanza App ID univoca per le risorse Ingress in ciascun 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 il tuo nome univoco 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 viene autenticato ma gli viene rilasciato un token di accesso per l'accesso anonimo all'applicazione.
- Nella scheda Impostazioni di autenticazione, aggiungere gli URL di reindirizzamento per la propria applicazione 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 di IBM Cloud App ID, è necessario aggiungere
/sign_out
al proprio dominio nel formatohttps://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out
e includere questo URL nell'elenco degli URL di reindirizzamento. Se si desidera utilizzare una pagina di logout personalizzata, è necessario impostarewhitelist_domains
nel file ConfigMap per OAuth2-Proxy. Richiama l'endpointhttps://<hostname>/oauth2-<App_ID_service_instance_name>/sign_out
con il parametro di queryrd
o imposta l'intestazioneX-Auth-Request-Redirect
con 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, oppure si può includere l'opzione
--key
per utilizzare le credenziali della chiave di servizio esistente. 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>]
Quando il servizio viene collegato 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: una distribuzione OAuth2-Proxy per l'istanza del servizio App ID, un segreto che contiene la configurazione della distribuzione OAuth2-Proxy e una risorsa Ingress che configura gli ALB per instradare le richieste in entrata alla distribuzione OAuth2-Proxy per la tua 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>
- Verificare che il componente aggiuntivo ALB OAuth Proxy abbia uno stato di
Addon Ready
.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 ...
-
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 daOAuth2-Proxy
.... 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 } ...
-
Scegli quali token inviare nell'intestazione
Authorization
alla tua applicazione. Per ulteriori informazioni su ID e token di accesso, consulta la documentazione diApp ID.-
Per inviare solo
ID Token
, aggiungere la seguente annotazione:... annotations: nginx.ingress.kubernetes.io/auth-response-headers: Authorization ...
-
Per inviare solo
Access Token
, aggiungere le seguenti informazioni all'annotazioneconfiguration-snippet
. (Questo estende il frammento dal passo 5.2.)... 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
eID Token
, aggiungere le seguenti informazioni all'annotazioneconfiguration-snippet
. (Questo estende il frammento dal passo 5.2.)... 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 } ...
-
-
Facoltativo: se la tua applicazione supporta la strategia dell'applicazione Web in aggiunta o al posto della strategia API, 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
.
-
-
Riapplica le tue risorse Ingress per applicare l'autenticazione App ID. Una volta riapplicata una risorsa 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 Ingress separata per configurare l'instradamento per i messaggi di 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
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.
-
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
- Applicare la risorsa ConfigMap al componente aggiuntivo. Le modifiche vengono applicate automaticamente.
kubectl apply -f oauth2-<App_ID_service_instance_name>.yaml
- Creare un file YAML ConfigMap che specifica i valori per le impostazioni OAuth2-Proxy che si desidera modificare.
Per l'elenco delle modifiche per ogni versione del componente aggiuntivo ALB OAuth Proxy, consulta il IBM Cloud ALB OAuth Proxy.
Aggiornamento del componente aggiuntivo ALB OAuth Proxy
Per aggiornare il componente aggiuntivo ALB OAuth Proxy, è necessario prima disabilitare il componente aggiuntivo, quindi riabilitarlo e specificare la versione.
Il processo di aggiornamento non è interrotto poiché le istanze proxy OAuth2 supervisionate rimangono sul cluster anche quando il componente aggiuntivo è disabilitato.
- 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 preservare l'indirizzo IP di origine della richiesta del client in un cluster VPC, puoi abilitare il protocollo NGINX PROXY per tutti i programmi di bilanciamento del carico che espongono gli ALB Ingress nel tuo 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 configmap
e 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. Due indirizzi IP inutilizzati per ogni bilanciatore di carico devono essere disponibili in ogni sottorete durante la ricreazione del 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 successivamente 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 attivare la 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 la conservazione dell'IP di origine è abilitata, i bilanciatori di carico passano dall'inoltro del traffico a un pod ALB su un nodo worker diverso a un pod ALB sullo stesso nodo worker. 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-alb1
per un ALB pubblico oprivate-cr18e61e63c6e94b658596ca93d087eed9-alb1
per 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 diexternalTrafficPolicy
daCluster
aLocal
. -
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
"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:
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
"private-cr18e61e63c6e94b658596ca93d087eed9-alb1", "private-cr17e61e63c6e94b658596ca92d087eed9-alb2" patched
-
-
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
- 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.kubectl logs <ALB_pod_ID> nginx-ingress -n kube-system
- Ottieni l'ID di un pod per l'ALB che hai modificato.
-
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:
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
- Per ripristinare la conservazione dell'IP di origine per i tuoi ALB pubblici:
Configurazione di protocolli SSL e cifrature SSL a livello di HTTP
Abilitare i protocolli e i cifrari 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:
-
Modificare il file di configurazione della risorsa
ibm-k8s-controller-config
ConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
Aggiungi i protocolli e le cifrature SSL. Formattare i cifrari in base al formato dell'elenco dei cifrari 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 si dispone di dispositivi legacy che non supportano la Server Name Indication (SNI) e si utilizza un certificato TLS personalizzato nelle risorse di Ingress, è necessario modificare le impostazioni del server dell'ALB per utilizzare il certificato TLS personalizzato e il segreto TLS personalizzato.
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 a dispositivi che non supportano l'SNI, completare i passaggi seguenti per modificare le impostazioni del server predefinito dell'ALB con il 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.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>
-
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 della richiesta.
È possibile impostare i parametri di cui sopra nello spazio dei nomi ibm-k8s-controller-config
ConfigMap 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-alive
nel namespaceibm-k8s-controller-config
ConfigMap 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 l'I/O continuo su disco, è possibile abilitare il buffering dei registri e il timeout del flush per l'ALB modificando ibm-k8s-controller-config
Ingress 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-config
ConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
Impostare la soglia per quando l'ALB deve scrivere il contenuto del buffer nel log.
- Dimensione del buffer: Aggiungere il campo
buffer
e impostarlo su quanta memoria di log può essere contenuta nel buffer prima che l'ALB scriva il contenuto del buffer nel file di log. Ad esempio, se si utilizza il valore predefinito di100KB
, l'ALB scrive il contenuto del buffer nel file di registro ogni volta che il buffer raggiunge il contenuto di 100KB. - Intervallo di tempo: Aggiungere il campo
flush
e impostare la frequenza con cui l'ALB deve scrivere sul file di log. Ad esempio, se si utilizza il valore predefinito di5m
, l'ALB scrive il contenuto del buffer nel file di registro una volta ogni 5 minuti. - Intervallo di tempo o dimensione del buffer: Quando sono impostati entrambi i parametri
flush
ebuffer
, l'ALB scrive il contenuto del buffer nel file di registro in base al parametro di soglia che viene soddisfatto 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-config
ConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
Modifica i valori di
keep-alive-requests
ekeep-alive
.keep-alive-requests
: il numero di connessioni client keepalive che possono rimanere aperte all'ALB Ingress. L'impostazione predefinita è100
.keep-alive
: il timeout, in secondi, durante il quale la connessione client keepalive rimane aperta all'ALB Ingress. L'impostazione predefinita è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
Modifica l'impostazione predefinita per il numero di connessioni simultanee che possono essere gestite dai processi di lavoro NGINX per un ALB o il numero di processi di lavoro che possono verificarsi per un ALB.
Ogni ALB ha processi di lavoro NGINX che elaborano connessioni client e comunicano con i server upstream per le app 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 di lavoro NGINX per un ALB. Il valore predefinito è16384
. Si noti che il parametromax-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 parametromax-worker-open-files
. Se si imposta il valore dimax-worker-connections
su0
, viene utilizzato il valore permax-worker-open-files
. - Il campo
worker-processes
imposta il numero massimo di processi di lavoro 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 di lavoro devono eseguire livelli elevati di operazioni I/0.
-
Modificare la
ibm-k8s-controller-config
ConfigMap.kubectl edit cm ibm-k8s-controller-config -n kube-system
-
Modificare il valore di
max-worker-connections
oworker-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 processi di lavoro NGINX che elaborano connessioni client e comunicano con i server upstream per le app che l'ALB espone. Se i tuoi processi di lavoro stanno raggiungendo il numero massimo di file che possono essere aperti, potresti
visualizzare un errore Too many open files
nei tuoi log 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-config
ConfigMap.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.