Panoramica
Questa pagina fornisce una panoramica completa di ciò che puoi configurare tramite Kubernetes Ingress su Google Cloud. Il documento confronta anche le funzionalità supportate per Ingress su Google Cloud e fornisce istruzioni per la configurazione di Ingress utilizzando il controller predefinito, i parametri FrontendConfig e i parametri BackendConfig.
Questa pagina è rivolta agli esperti di networking che progettano e progettano la rete per la propria organizzazione e installano, configurano e supportano le apparecchiature di rete. Per approfondire i ruoli comuni e le attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud, consulta Ruoli e attività comuni degli utenti di GKE Enterprise.
Confronto delle funzioni
La tabella seguente fornisce un elenco delle funzionalità supportate per Ingress su Google Cloud. Viene indicata anche la disponibilità della funzionalità, Disponibilità generale (GA) o Beta.
Classe Ingress | Ingresso esterno | Ingresso interno | Ingress multi-cluster |
---|---|---|---|
Controller Ingress | Controller Ingress in hosting su Google | ||
Tipo di bilanciatore del carico Google Cloud | Bilanciatore del carico HTTP(S) esterno | Bilanciatore del carico HTTP(S) interno | Bilanciatore del carico HTTP(S) esterno |
Ambito cluster | Cluster singolo | Cluster singolo | Cluster multipli |
Ambito del bilanciatore del carico | Globale | Regionale | Globale |
Supporto dell'ambiente | GKE | GKE | GKE |
Supporto per il VPC condiviso | GA | GA | GA |
Annotazioni del servizio | |||
Bilanciamento del carico nativo del container (NEG) | GA | GA | GA |
HTTPS dal bilanciatore del carico ai backend | GA | GA | GA |
HTTP/2 | GA | GA Solo TLS |
GA |
Annotazioni Ingress | |||
Indirizzi IP statici | GA | GA | GA |
Certificati basati su secret Kubernetes | GA | GA | GA |
Certificati SSL con gestione indipendente | GA | GA | GA |
Certificati SSL gestiti da Google | GA | GA | |
FrontendConfig | |||
Norme SSL | GA | GA con gateway | GA |
Reindirizzamento da HTTP a HTTPS | GA
1.17.13-gke.2600+GA |
GA | |
BackendConfig | |||
Timeout del servizio di backend | GA | GA | GA |
Cloud CDN | GA | GA | |
Timeout per svuotamento della connessione | GA | GA | GA |
Configurazione del controllo di integrità del bilanciatore del carico personalizzato | GA | GA | GA |
Criterio di sicurezza di Google Cloud Armor | GA
1.19.10-gke.700G |
GA | |
Configurazione del logging degli accessi HTTP | GA | GA | GA |
Identity-Aware Proxy (IAP) | GA | GA | GA |
Affinità sessione | GA | GA | GA |
Intestazioni delle richieste definite dall'utente | GA | GA | |
Intestazioni delle risposte personalizzate | GA
1.25-gke+G |
GA
1.25-gke+G |
BQuesta funzionalità è disponibile in versione beta a partire dalla versione specificata. Le funzionalità senza una versione elencata sono supportate per tutte le versioni GKE disponibili.
GQuesta funzionalità è supportata come GA a partire dalla versione specificata.
Configurare Ingress utilizzando il controller predefinito
Non puoi configurare manualmente le funzionalità di LoadBalancer utilizzando Google Cloud SDK o la console Google Cloud. Devi utilizzare le risorse Kubernetes BackendConfig o FrontendConfig.
Quando crei un Ingress utilizzando il controller predefinito, puoi scegliere il tipo di bilanciatore del carico (un bilanciatore del carico delle applicazioni esterno o uno interno) utilizzando un'annotazione sull'oggetto Ingress. Puoi scegliere se GKE deve creare NEG a livello di zona o utilizzare gruppi di istanze utilizzando un'annotazione su ogni oggetto Service.
Le definizioni di risorse personalizzate (CRD) FrontendConfig e BackendConfig ti consentono di personalizzare ulteriormente il bilanciatore del carico. Questi CRD ti consentono di definire gerarchicamente funzionalità aggiuntive del bilanciatore del carico, in modo più strutturato rispetto alle annotazioni. Per utilizzare Ingress (e questi CRD), devi attivare il componente aggiuntivo per il bilanciamento del carico HTTP. Il bilanciamento del carico HTTP è attivo per impostazione predefinita nei cluster GKE e non devi disattivarlo.
A FrontendConfigs viene fatto riferimento in un oggetto Ingress e può essere utilizzato solo con Ingress esterni. I BackendConfig sono riferite da un oggetto Service. Per la coerenza della configurazione, è possibile fare riferimento agli stessi CRD da più oggetti Service o Ingress. Le CRD FrontendConfig e BackendConfig condividono lo stesso ciclo di vita delle risorse Ingress e Service corrispondenti e spesso vengono implementate insieme.
Il seguente diagramma illustra come:
Un'annotazione in un oggetto Ingress o MultiClusterIngress fa riferimento a una CRD FrontendConfig. Il CRD FrontendConfig fa riferimento a un criterio SSL di Google Cloud.
Un'annotazione su un oggetto Service o MultiClusterService fa riferimento a una CRD di BackendConfig. Il CRD BackendConfig specifica le impostazioni personalizzate per il controllo di integrità del servizio di backend corrispondente.
Associare FrontendConfig a Ingress
FrontendConfig può essere utilizzato solo con ingressi esterni.
Puoi associare un FrontendConfig a un Ingress o a unMultiClusterIngress
.
In entrata
Utilizza l'annotazione networking.gke.io/v1beta1.FrontendConfig
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
networking.gke.io/v1beta1.FrontendConfig: "FRONTENDCONFIG_NAME"
...
Sostituisci FRONTENDCONFIG_NAME
con il nome di FrontendConfig.
MultiClusterIngress
Utilizza l'annotazione networking.gke.io/frontend-config
:
apiVersion: networking.gke.io/v1
kind: MultiClusterIngress
metadata:
annotations:
networking.gke.io/frontend-config: "FRONTENDCONFIG_NAME"
...
Sostituisci FRONTENDCONFIG_NAME
con il nome di FrontendConfig.
Associare BackendConfig a Ingress
Puoi utilizzare l'annotazione cloud.google.com/backend-config
o beta.cloud.google.com/backend-config
per specificare il nome di un BackendConfig.
Stessa configurazione di backend per tutte le porte di servizio
Per utilizzare la stessa configurazione di backend per tutte le porte, utilizza la chiave default
nell'annotazione. Il controller Ingress utilizza la stessa configurazione di backend ogni volta che crea un servizio di backend del bilanciatore del carico per fare riferimento a una delle porte del servizio.
default
sia per le risorse Ingress sia per quelle MultiClusterIngress.
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"default": "my-backendconfig"}'
...
BackendConfig univoco per porta del servizio
Per Ingress e MultiClusterIngress, puoi specificare un BackendConfig personalizzato per una o più porte utilizzando una chiave corrispondente al nome o al numero della porta. Il controller Ingress utilizza il BackendConfig specifico quando crea un servizio di backend del bilanciatore del carico per una porta del servizio a cui si fa riferimento.GKE 1.16-gke.3 e versioni successive
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"ports": {
"SERVICE_REFERENCE_A":"BACKENDCONFIG_REFERENCE_A",
"SERVICE_REFERENCE_B":"BACKENDCONFIG_REFERENCE_B"
}}'
spec:
ports:
- name: PORT_NAME_1
port: PORT_NUMBER_1
protocol: TCP
targetPort: 50000
- name: PORT_NAME_2
port: PORT_NUMBER_2
protocol: TCP
targetPort: 8080
...
Tutte le versioni supportate
apiVersion: v1
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"ports": {
PORT_NAME_1:"BACKENDCONFIG_REFERENCE_A",
PORT_NAME_2:"BACKENDCONFIG_REFERENCE_B"
}}'
spec:
ports:
- name: PORT_NAME_1
port: PORT_NUMBER_1
protocol: TCP
targetPort: 50000
- name: PORT_NAME_2
port: PORT_NUMBER_2
protocol: TCP
targetPort: 8080
...
Sostituisci quanto segue:
BACKENDCONFIG_REFERENCE_A
: il nome di un'entità BackendConfig esistente.BACKENDCONFIG_REFERENCE_B
: il nome di un'entità BackendConfig esistente.SERVICE_REFERENCE_A
: utilizza il valore diPORT_NUMBER_1
oPORT_NAME_1
. Questo perché l'annotazione BackendConfig di un servizio può fare riferimento al nome della porta (spec.ports[].name
) o al numero della porta (spec.ports[].port
).SERVICE_REFERENCE_B
: utilizza il valore diPORT_NUMBER_2
oPORT_NAME_2
. Questo perché l'annotazione BackendConfig di un servizio può fare riferimento al nome della porta (spec.ports[].name
) o al numero della porta (spec.ports[].port
).
Quando fai riferimento alla porta del servizio per numero, devi utilizzare il valore port
anziché targetPort
. Il numero di porta utilizzato qui serve solo per associare BackendConfig; non controlla la porta a cui il bilanciatore del carico invia il traffico o i probe del controllo di integrità:
Quando utilizzi il bilanciamento del carico nativo del container, il bilanciatore del carico invia il traffico a un endpoint in un gruppo di endpoint di rete (corrispondente a un indirizzo IP del pod) sulla porta del servizio a cui si fa riferimento
targetPort
(che deve corrispondere a uncontainerPort
per un pod di servizio). In caso contrario, il bilanciatore del carico invia il traffico all'indirizzo IP di un nodo sulla porta del servizio a cui fa riferimentonodePort
.Quando utilizzi un BackendConfig per fornire un controllo di integrità del bilanciatore del carico personalizzato, il numero di porta utilizzato per il controllo di integrità del bilanciatore del carico può essere diverso dal numero
spec.ports[].port
del servizio. Per informazioni dettagliate sui numeri di porta per i controlli di integrità, consulta Configurazione di controllo di integrità personalizzati.
Configurazione delle funzionalità di Ingress tramite i parametri FrontendConfig
La sezione seguente mostra come impostare FrontendConfig per attivare funzionalità specifiche di Ingress.
Criteri SSL
I criteri SSL ti consentono di specificare un insieme di versioni e crittografi TLS utilizzati dal bilanciatore del carico per terminare il traffico HTTPS proveniente dai client. Devi prima
creare un criterio SSL
al di fuori di GKE. Una volta creato, puoi fare riferimento a questo valore in un
FrontendConfig
CRD.
Il campo sslPolicy
in FrontendConfig fa riferimento al nome di un criterio SSL nello stesso progetto Google Cloud del cluster GKE. Collega il criterio SSL al proxy HTTPS di destinazione,
che è stato creato per il bilanciatore del carico HTTP(S) esterno da Ingress. La stessa risorsa FrontendConfig e lo stesso criterio SSL possono essere richiamati da più risorse Ingress. Se un criterio SSL a cui viene fatto riferimento viene modificato, la modifica viene propagata ai front-end Google (GFEs) che alimentano il bilanciatore del carico HTTP(S) esterno creato da Ingress.
Il seguente manifest FrontendConfig attiva un criterio SSL denominato
gke-ingress-ssl-policy
:
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: my-frontend-config
spec:
sslPolicy: gke-ingress-ssl-policy
Reindirizzamenti da HTTP a HTTPS
Un bilanciatore del carico HTTP esterno può reindirizzare le richieste HTTP non criptate a un bilanciatore del carico HTTPS che utilizza lo stesso indirizzo IP. Quando crei un Ingress con i reindirizzamenti da HTTP a HTTPS abilitati, entrambi i bilanciatori del carico vengono creati automaticamente. Le richieste all'indirizzo IP esterno dell'Ingress sulla porta 80 vengono reindirizzate automaticamente allo stesso indirizzo IP esterno sulla porta 443. Questa funzionalità si basa sui reindirizzamenti da HTTP a HTTPS forniti da Cloud Load Balancing.
Per supportare il reindirizzamento da HTTP a HTTPS, è necessario configurare un Ingress per gestire il traffico sia HTTP che HTTPS. Se HTTP o HTTPS sono disattivati, il reindirizzamento non funzionerà.
I reindirizzamenti da HTTP ad HTTPS vengono configurati utilizzando il campo redirectToHttps
in una risorsa personalizzata FrontendConfig
. I reindirizzamenti sono abilitati per l'intera risorsa Ingress, pertanto per tutti i servizi a cui fa riferimento l'Ingress verranno abilitati i reindirizzamenti HTTPS.
Il seguente manifest FrontendConfig
consente i reindirizzamenti da HTTP a HTTPS. Imposta il
campo spec.redirectToHttps.enabled
su true
per attivare i reindirizzamenti HTTPS. Il campo spec.responseCodeName
è facoltativo. Se viene omesso, viene utilizzato un reindirizzamento 301 Moved
Permanently
.
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: my-frontend-config
spec:
redirectToHttps:
enabled: true
responseCodeName: RESPONSE_CODE
Sostituisci RESPONSE_CODE
con una delle seguenti opzioni:
MOVED_PERMANENTLY_DEFAULT
per restituire un codice di risposta di reindirizzamento 301 (valore predefinito seresponseCodeName
non è specificato).FOUND
per restituire un codice di risposta di reindirizzamento 302.SEE_OTHER
per restituire un codice di risposta di reindirizzamento 303.TEMPORARY_REDIRECT
per restituire un codice di risposta di reindirizzamento 307.PERMANENT_REDIRECT
per restituire un codice di risposta di reindirizzamento 308.
Quando i reindirizzamenti sono abilitati, il controller Ingress crea un bilanciatore del carico come mostrato nel seguente diagramma:
Per verificare che il reindirizzamento funzioni, utilizza un comando curl
:
curl http://IP_ADDRESS
Sostituisci IP_ADDRESS
con l'indirizzo IP del tuo Ingress.
La risposta mostra il codice di risposta di reindirizzamento che hai configurato. Ad esempio,
l'esempio seguente è per un FrontendConfig
configurato con un
301: MovedPermanently
reindirizzamento:
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://35.244.160.59/">here</A>.</BODY></HTML>
Configurazione delle funzionalità di Ingress tramite i parametri BackendConfig
Le sezioni riportate di seguito mostrano come impostare BackendConfig per attivare funzionalità Ingress specifiche. Le modifiche a una risorsa BackendConfig vengono costantemente riconciliate, quindi non è necessario eliminare e ricreare Ingress per verificare che le modifiche a BackendConfig vengano applicate.
Per informazioni sulle limitazioni di BackendConfig, consulta la sezione Limitazioni.
Timeout del servizio di backend
Puoi utilizzare un BackendConfig per impostare un periodo di timeout del servizio di backend in secondi. Se non specifichi un valore, il valore predefinito è 30 secondi.
Il seguente manifest BackendConfig specifica un timeout di 40 secondi:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
timeoutSec: 40
Cloud CDN
Puoi attivare Cloud CDN utilizzando un BackendConfig.
Il seguente manifest BackendConfig mostra tutti i campi disponibili quando viene attivata Cloud CDN:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
cdn:
enabled: CDN_ENABLED
cachePolicy:
includeHost: INCLUDE_HOST
includeProtocol: INCLUDE_PROTOCOL
includeQueryString: INCLUDE_QUERY_STRING
queryStringBlacklist: QUERY_STRING_DENYLIST
queryStringWhitelist: QUERY_STRING_ALLOWLIST
cacheMode: CACHE_MODE
clientTtl: CLIENT_TTL
defaultTtl: DEFAULT_TTL
maxTtl: MAX_TTL
negativeCaching: NEGATIVE_CACHING
negativeCachingPolicy:
code: NEGATIVE_CACHING_CODE
ttl: NEGATIVE_CACHING_TTL
requestCoalescing: REQ_COALESCING
serveWhileStale: SERVE_WHILE_STALE
signedUrlCacheMaxAgeSec: SIGNED_MAX_AGE
signedUrlKeys:
keyName: KEY_NAME
keyValue: KEY_VALUE
secretName: SECRET_NAME
Sostituisci quanto segue:
CDN_ENABLED
: se impostato sutrue
, Cloud CDN è attivato per questo backend di Ingress.INCLUDE_HOST
: se impostato sutrue
, le richieste a host diversi vengono memorizzate nella cache separatamente.INCLUDE_PROTOCOL
: se impostato sutrue
, le richieste HTTP e HTTPS vengono memorizzate nella cache separatamente.INCLUDE_QUERY_STRING
: se impostato sutrue
, i parametri della stringa di query vengono inclusi nella chiave della cache in base aqueryStringBlacklist
oqueryStringWhitelist
. Se non è impostato nessuno dei due, viene inclusa l'intera stringa di query. Se impostato sufalse
, l'intera stringa di query viene esclusa dalla chiave della cache.QUERY_STRING_DENYLIST
: specifica un array di stringhe con i nomi dei parametri della stringa di query da escludere dalle chiavi cache. Tutti gli altri parametri sono inclusi. Puoi specificarequeryStringBlacklist
oqueryStringWhitelist
, ma non entrambi.QUERY_STRING_ALLOWLIST
: specifica un array di stringhe con i nomi dei parametri delle stringhe di query da includere nelle chiavi cache. Tutti gli altri parametri sono esclusi. PuoiqueryStringBlacklist
oqueryStringWhitelist
, ma non entrambi.
I seguenti campi sono supportati solo nelle versioni GKE 1.23.3-gke.900 e successive che utilizzano GKE Ingress. Non sono supportati con Ingress multi-cluster:
CACHE_MODE
: la modalità cache.CLIENT_TTL
,DEFAULT_TTL
eMAX_TTL
: configurazione del TTL. Per ulteriori informazioni, consulta la sezione Utilizzare le impostazioni e gli override TTL.NEGATIVE_CACHING
: se impostato sutrue
, la memorizzazione nella cache negativa è attivata. Per ulteriori informazioni, consulta la sezione Utilizzare la memorizzazione nella cache negativa.NEGATIVE_CACHING_CODE
eNEGATIVE_CACHING_TTL
: configurazione della memorizzazione nella cache negativa. Per ulteriori informazioni, consulta la sezione Utilizzare la memorizzazione nella cache negativa.REQ_COALESCING
: se impostato sutrue
, il collasso è attivo. Per ulteriori informazioni, consulta la sezione Combinazione (unione) delle richieste.SERVE_WHILE_STALE
: tempo, in secondi, dopo la scadenza della risposta durante il quale Cloud CDN continua a pubblicare una versione obsoleta. Per ulteriori informazioni, consulta la pagina Pubblicazione di contenuti non aggiornati.SIGNED_MAX_AGE
: tempo massimo in secondi per cui le risposte possono essere memorizzate nella cache. Per ulteriori informazioni, consulta Personalizzare facoltativamente il tempo massimo della cache.KEY_NAME
,KEY_VALUE
eSECRET_NAME
: configurazione della chiave dell'URL firmato. Per ulteriori informazioni, consulta la sezione Creare chiavi di richiesta firmate.
Espandi la sezione seguente per vedere un esempio che esegue il deployment di Cloud CDN tramite Ingress e convalida la memorizzazione nella cache dei contenuti dell'applicazione.
Timeout per svuotamento della connessione
Puoi configurare il timeout per lo svuotamento delle connessioni utilizzando un BackendConfig. Il timeout per lo svuotamento della connessione è il tempo, in secondi, di attesa per lo svuotamento delle connessioni. Per la durata specificata del timeout, alle richieste esistenti al backend rimosso viene concesso il tempo di completarsi. Il bilanciatore del carico non invia nuove richieste al backend rimosso. Una volta raggiunta la durata del timeout, tutte le connessioni rimanenti al backend vengono chiuse. La durata del timeout può variare da 0 a 3600 secondi. Il valore predefinito è 0, che disattiva anche lo svuotamento della connessione.
Il seguente manifest BackendConfig specifica un timeout per lo svuotamento della connessione di 60 secondi:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
connectionDraining:
drainingTimeoutSec: 60
Configurazione del controllo di integrità personalizzato
Esistono diversi modi in cui GKE configura i controlli di integrità del bilanciatore del carico Google Cloud durante il deployment tramite Ingress. Per scoprire di più su come GKE Ingress esegue il deployment dei controlli di integrità, consulta Controlli di integrità di Ingress.
Un BackendConfig ti consente di controllare con precisione le impostazioni del controllo di integrità del bilanciatore del carico.
Puoi configurare più servizi GKE in modo che facciano riferimento allo stesso
BackendConfig come a un modello riutilizzabile. Per i parametri healthCheck
, viene creato un controllo di integrità Google Cloud unico per ogni servizio di backend corrispondente a ogni servizio GKE.
Il seguente manifest di BackendConfig mostra tutti i campi disponibili durante la configurazione di un controllo di integrità dell'integrità di BackendConfig:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
healthCheck:
checkIntervalSec: INTERVAL
timeoutSec: TIMEOUT
healthyThreshold: HEALTH_THRESHOLD
unhealthyThreshold: UNHEALTHY_THRESHOLD
type: PROTOCOL
requestPath: PATH
port: PORT
Sostituisci quanto segue:
INTERVAL
: specifica il valorecheck-interval
in secondi per ogni sonda di controllo di integrità. Si tratta del tempo che intercorre dall'inizio del controllo di un sondatore all'inizio del controllo successivo. Se ometti questo parametro, viene utilizzato il valore predefinito di 5 secondi di Google Cloud. Per ulteriori dettagli sull'implementazione, consulta Più sonde e frequenza.TIMEOUT
: specifica il tempo di attesa di Google Cloud per una risposta a un'indagine. Il valore diTIMEOUT
deve essere minore o uguale aINTERVAL
. Le unità di misura sono in secondi. Ogni prova richiede unHTTP 200 (OK)
codice di risposta da inviare prima del timeout della prova.HEALTH_THRESHOLD
eUNHEALTHY_THRESHOLD
: specifica il numero di tentativi di connessione sequenziali che devono essere riusciti o non riusciti, per almeno uno scanner, per modificare il stato di salute da integro a non integro o viceversa. Se ometti uno di questi parametri, Google Cloud utilizza il valore predefinito 2.PROTOCOL
: specifica un protocollo utilizzato dai sistemi di probe per il controllo di integrità.BackendConfig
supporta solo la creazione di controlli di integrità utilizzando i protocolli HTTP, HTTPS o HTTP2. Per ulteriori informazioni, consulta Criteri di esito positivo per HTTP, HTTPS e HTTP/2. Non puoi omettere questo parametro.PATH
: per i controlli di integrità HTTP, HTTPS o HTTP2, specifica ilrequest-path
a cui deve connettersi il sistema di monitoraggio. Se ometti questo parametro, Google Cloud utilizza il valore predefinito/
.PORT
: un BackendConfig supporta solo l'indicazione della porta di controllo di integrità del bilanciatore del carico utilizzando un numero di porta. Se ometti questo parametro, Google Cloud utilizza il valore predefinito80
.Quando utilizzi il balance del carico nativo del container, devi selezionare una porta corrispondente a un
containerPort
di un pod di pubblicazione (indipendentemente dal fatto che acontainerPort
sia fatto riferimento da untargetPort
del servizio). Poiché il bilanciatore del carico invia direttamente i controlli all'indirizzo IP del pod, non sei limitato aicontainerPort
a cui fa riferimento iltargetPort
di un servizio. I sistemi di probe del controllo di integrità si connettono all'indirizzo IP di un pod di servizio sulla porta specificata.Per i backend dei gruppi di istanze, devi selezionare una porta corrispondente a una
nodePort
esposta dal servizio. I sistemi di probe del controllo di integrità si connettono quindi a ciascun nodo su quella porta.
Per configurare GKE Ingress con un controllo di integrità HTTP personalizzato, consulta GKE Ingress con controllo di integrità HTTP personalizzato.
Criterio di sicurezza di Google Cloud Armor per le istanze di ingresso
I criteri di sicurezza di Google Cloud Armor ti aiutano a proteggere le tue applicazioni con bilanciamento del carico dagli attacchi basati sul web. Dopo aver configurato un criterio di sicurezza di Google Cloud Armor, puoi farvi riferimento utilizzando un BackendConfig.
Aggiungi il nome del criterio di sicurezza a BackendConfig. Il seguente manifest
BackendConfig specifica un criterio di sicurezza denominato
example-security-policy
:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
namespace: cloud-armor-how-to
name: my-backendconfig
spec:
securityPolicy:
name: "example-security-policy"
Due fonti attendibili
Anche se configurate tramite GKE, le API BackendService
Compute Engine sottostanti possono comunque essere utilizzate per modificare direttamente i criteri di sicurezza da applicare. Vengono create due fonti attendibili: GKE e Compute Engine. Il comportamento del controller GKE Ingress in risposta al campo securityPolicy
all'interno di BackendConfig
è documentato nella tabella seguente. Per evitare conflitti e comportamenti inaspettati, ti consigliamo di utilizzare BackendConfig
GKE
per la gestione dei criteri di sicurezza da utilizzare.
Campo BackendConfig | Valore | Comportamento |
---|---|---|
spec.securityPolicy.name |
CloudArmorPolicyName |
Il controller GKE Ingress imposta il criterio Google Cloud Armor denominato CloudArmorPolicyName sul bilanciatore del carico. GKE Ingress Controller sostituisce qualsiasi criterio impostato in precedenza. |
spec.securityPolicy.name |
Stringa vuota ("" ) |
Il controller Ingress di GKE rimuove qualsiasi criterio Google Cloud Armor configurato dal bilanciatore del carico. |
spec.securityPolicy |
nil |
Il controller di ingressi GKE utilizza la configurazione impostata sull'oggetto BackendService configurato tramite l'API Compute Engine utilizzando la console Google Cloud, gcloud CLI o Terraform. |
Per configurare Ingress di GKE con la protezione di Google Cloud Armor, consulta Ingress abilitato per Google Cloud Armor.
Log degli accessi HTTP
Ingress può registrare tutte le richieste HTTP inviate dai client a Cloud Logging. Puoi attivare e disattivare il logging degli accessi utilizzando BackendConfig e impostare la frequenza di campionamento del logging degli accessi.
Per configurare il logging degli accessi, utilizza il campo logging
in BackendConfig. Se viene omesso, il logging degli accessi assume il comportamento predefinito.logging
Questo dipende dalla versione di GKE.
Puoi configurare i seguenti campi:
enable
: se impostato sutrue
, la registrazione degli accessi verrà attivata per questo Ingress e i log saranno disponibili in Cloud Logging. In caso contrario, il logging degli accessi è disattivato per questo Ingress.sampleRate
: specifica un valore compreso tra 0,0 e 1,0, dove 0,0 indica che nessun pacchetto viene registrato e 1,0 indica che viene registrato il 100% dei pacchetti. Questo campo è pertinente solo seenable
è impostato sutrue
.sampleRate
è un campo facoltativo, ma se è configurato, è necessario impostare ancheenable: true
, altrimenti viene interpretato comeenable: false
.
Il seguente manifest BackendConfig attiva la registrazione degli accessi e imposta la frequenza di campionamento sul 50% delle richieste HTTP per una determinata risorsa Ingress:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
logging:
enable: true
sampleRate: 0.5
Identity-Aware Proxy
Per configurare BackendConfig per
IAP Identity-Aware Proxy,
devi specificare i valori enabled
e secretName
per il blocco iap
in BackendConfig. Per specificare questi valori, assicurati di disporre dell'autorizzazione compute.backendServices.update
.
Il seguente manifest BackendConfig abilita Identity-Aware Proxy:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
iap:
enabled: true
oauthclientCredentials:
secretName: my-secret
Attivare gli acquisti in-app con il client OAuth gestito da Google
A partire da GKE 1.29.4-gke.1043000, l'IAP può essere configurato per utilizzare il client OAuth gestito da Google utilizzando un BackendConfig. Per decidere se utilizzare il client OAuth di Google o un client OAuth personalizzato, consulta Quando utilizzare una configurazione OAuth personalizzata nella documentazione IAP.
Per attivare l'IAP con il client OAuth gestito da Google, non fornire le OAuthCredentials in BackendConfig. Per gli utenti che hanno già configurato l'IAP utilizzando OAuthCredentials, non esiste un percorso di migrazione per passare all'utilizzo del client OAuth gestito da Google. Devi ricreare il backend (rimuovi il servizio dall'Ingress e ricollegalo). Ti consigliamo di eseguire questa operazione durante un periodo di manutenzione, in quanto causerà un tempo di riposo. È possibile anche il percorso di migrazione opposto, ovvero passare da OAuthClient gestito da Google a OAuthCredentials.
Il seguente manifest BackendConfig abilita Identity-Aware Proxy con il client OAuth gestito da Google:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
iap:
enabled: true
Per istruzioni complete, consulta Abilitazione di IAP per GKE nella documentazione di IAP.
Identity-Aware Proxy con Ingress interno
Per configurare Ingress interno per l'IAP, devi utilizzare il livello Premium. Se non utilizzi il livello Premium, non puoi visualizzare o creare bilanciatori del carico delle applicazioni interni con Identity-Aware Proxy. Per utilizzare Ingress interno per l'IAP, devi disporre anche di un abbonamento a Chrome Enterprise Premium.
Per configurare un ingresso GKE sicuro con autenticazione basata su Identity-Aware Proxy, consulta l'esempio Ingresso abilitato per IAP.
Affinità sessione
Puoi utilizzare un BackendConfig per impostare l'affinità alla sessione sull'IP del client o sul cookie generato.
Affinità IP client
Per utilizzare un file BackendConfig per impostare l'affinità IP del client, imposta affinityType
su "CLIENT_IP"
, come nell'esempio seguente:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
sessionAffinity:
affinityType: "CLIENT_IP"
Affinità cookie generata
Per utilizzare un file BackendConfig per impostare
l'affinità dei cookie generati
, imposta affinityType
su
GENERATED_COOKIE
nel file manifest di BackendConfig. Puoi anche utilizzare
affinityCookieTtlSec
per impostare il periodo di tempo per cui il cookie deve rimanere attivo.
Il seguente manifest imposta il tipo di affinità su cookie generato e assegna ai cookie un TTL di 50 secondi:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
sessionAffinity:
affinityType: "GENERATED_COOKIE"
affinityCookieTtlSec: 50
Intestazioni delle richieste definite dall'utente
Puoi utilizzare un file BackendConfig per configurare intestazioni di richiesta definite dall'utente. Il bilanciatore del carico aggiunge le intestazioni specificate alle richieste inoltrate ai backend.
Il bilanciatore del carico aggiunge le intestazioni delle richieste personalizzate solo alle richieste del client, non ai probe del controllo di integrità. Se il tuo backend richiede un'intestazione specifica per l'autorizzazione che non è presente nel pacchetto del controllo di integrità, il controllo di integrità potrebbe non riuscire.
Per attivare le intestazioni delle richieste definite dall'utente, specifica un elenco di intestazioni nella proprietà customRequestHeaders
della risorsa BackendConfig. Specifica ogni
intestazione come stringa header-name:header-value
.
Il seguente manifest BackendConfig aggiunge tre intestazioni di richiesta:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
customRequestHeaders:
headers:
- "X-Client-Region:{client_region}"
- "X-Client-City:{client_city}"
- "X-Client-CityLatLong:{client_city_lat_long}"
Intestazioni delle risposte personalizzate
Per attivare le intestazioni di risposta personalizzate, specifica un elenco di intestazioni nella proprietà customResponseHeaders
della risorsa BackendConfig. Specifica ogni
intestazione come stringa header-name:header-value
.
Gli intestazioni di risposta personalizzate sono disponibili solo nei cluster GKE 1.25 e versioni successive.
Il seguente manifest BackendConfig è un esempio per aggiungere un'intestazione di risposta HTTP Strict Transport Security (HSTS):
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
customResponseHeaders:
headers:
- "Strict-Transport-Security: max-age=28800; includeSubDomains"
Esercizio: impostazione dei timeout di Ingress utilizzando un servizio di backend
L'esercizio seguente mostra i passaggi necessari per configurare i timeout e lo svuotamento della connessione con un Ingress con una risorsa BackendConfig.
Per configurare le proprietà di backend di un Ingress, completa le seguenti attività:
- Crea un deployment.
- Crea un file BackendConfig.
- Crea un servizio e associa una delle sue porte a BackendConfig.
- Crea un Ingress e associalo alla coppia (Service, port).
- Convalida le proprietà del servizio di backend.
- Pulizia.
Creazione di un deployment
Prima di creare un BackendConfig e un servizio, devi creare un deployment.
Il seguente manifest di esempio è per un deployment denominato
my-deployment.yaml
:
# my-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
purpose: bsc-config-demo
replicas: 2
template:
metadata:
labels:
purpose: bsc-config-demo
spec:
containers:
- name: hello-app-container
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
Crea il deployment eseguendo il seguente comando:
kubectl apply -f my-deployment.yaml
Creazione di un oggetto BackendConfig
Utilizza BackendConfig per specificare le funzionalità di Ingress che vuoi utilizzare.
Questo manifest BackendConfig, denominato my-backendconfig.yaml
, specifica:
- Un timeout di 40 secondi.
- Un timeout per lo svuotamento della connessione di 60 secondi.
# my-backendconfig.yaml
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
timeoutSec: 40
connectionDraining:
drainingTimeoutSec: 60
Crea BackendConfig eseguendo il seguente comando:
kubectl apply -f my-backendconfig.yaml
Crea un Service
Un BackendConfig corrisponde a una singola combinazione di servizio e porta, anche se un servizio ha più porte. Ogni porta può essere associata a un singolo CRD di BackendConfig. Se una porta di servizio viene richiamata da un Ingress e se la porta di servizio è associata a un BackendConfig, il servizio di backend del bilanciamento del carico HTTP(S) prende parte alla sua configurazione da BackendConfig.
Di seguito è riportato un esempio di manifest del servizio denominato my-service.yaml
:
# my-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
purpose: bsc-config-demo
annotations:
cloud.google.com/backend-config: '{"ports": {"80":"my-backendconfig"}}'
cloud.google.com/neg: '{"ingress": true}'
spec:
type: ClusterIP
selector:
purpose: bsc-config-demo
ports:
- port: 80
protocol: TCP
targetPort: 8080
L'annotazione cloud.google.com/backend-config
specifica una mappatura tra le porte
e gli oggetti BackendConfig. In my-service.yaml
:
- Qualsiasi pod con l'etichetta
purpose: bsc-config-demo
è membro del servizio. - La porta TCP 80 del servizio è associata a un BackendConfig denominato
my-backendconfig
. L'annotazionecloud.google.com/backend-config
lo specifica. - Una richiesta inviata alla porta 80 del servizio viene inoltrata a uno dei pod membri sulla porta 8080.
Per creare il servizio, esegui il seguente comando:
kubectl apply -f my-service.yaml
Creare una risorsa Ingress
Di seguito è riportato un manifest Ingress denominato my-ingress.yaml.
. In questo esempio, le richieste in arrivo vengono instradate alla porta 80 del servizio denominato my-service
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: my-service
port:
number: 80
Per creare l'elemento Ingress, esegui il seguente comando:
kubectl apply -f my-ingress.yaml
Attendi alcuni minuti affinché il controller Ingress configuri un bilanciatore del carico delle applicazioni esterno e un servizio di backend associato. Al termine, hai configurato Ingress in modo da utilizzare un timeout di 40 secondi e un timeout per lo svuotamento della connessione di 60 secondi.
Convalida delle proprietà servizio di backend
Puoi verificare che le impostazioni del bilanciatore del carico corrette siano state applicate tramite BackendConfig. A questo scopo, identifica il servizio di backend di cui è stato eseguito il deployment da parte di Ingress e controllane le impostazioni per verificare che corrispondano ai manifest di deployment.
Per prima cosa, descrivi la risorsa my-ingress
e filtra per l'annotazione che elenca i servizi di backend associati all'Ingress. Ad esempio:
kubectl describe ingress my-ingress | grep ingress.kubernetes.io/backends
Dovresti vedere un output simile al seguente:
ingress.kubernetes.io/backends: '{"k8s1-27fde173-default-my-service-80-8d4ca500":"HEALTHY","k8s1-27fde173-kube-system-default-http-backend-80-18dfe76c":"HEALTHY"}
L'output fornisce informazioni sui servizi di backend. Ad esempio, questa annotazione contiene due servizi di backend:
"k8s1-27fde173-default-my-service-80-8d4ca500":"HEALTHY"
fornisce informazioni sul servizio di backend associato al servizio Kubernetesmy-service
.k8s1-27fde173
è un hash utilizzato per descrivere il cluster.default
è lo spazio dei nomi Kubernetes.HEALTHY
indica che il backend è integro.
"k8s1-27fde173-kube-system-default-http-backend-80-18dfe76c":"HEALTHY"
fornisce informazioni sul servizio di backend associato al backend predefinito (server 404).k8s1-27fde173
è un hash utilizzato per descrivere il cluster.kube-system
è lo spazio dei nomi.default-http-backend
è il nome del servizio Kubernetes.80
è la porta dell'host.HEALTHY
indica che il backend è integro.
A questo punto, controlla il servizio di backend associato a my-service
utilizzando gcloud
.
Filtra per "drainingTimeoutSec"
e "timeoutSec"
per verificare che siano stati impostati nel control plane del bilanciatore del carico Google Cloud. Ad esempio:
# Optionally, set a variable
export BES=k8s1-27fde173-default-my-service-80-8d4ca500
# Filter for drainingTimeoutSec and timeoutSec
gcloud compute backend-services describe ${BES} --global | grep -e "drainingTimeoutSec" -e "timeoutSec"
Output:
drainingTimeoutSec: 60
timeoutSec: 40
Se vedi drainingTimeoutSec
e timeoutSec
nell'output, significa che i relativi valori sono stati impostati correttamente tramite BackendConfig.
Pulizia
Per evitare addebiti indesiderati sul tuo account, elimina gli oggetti Kubernetes che hai creato per questo esercizio:
kubectl delete ingress my-ingress
kubectl delete service my-service
kubectl delete backendconfig my-backendconfig
kubectl delete deployment my-deployment
Limitazioni di BackendConfig
BackendConfigs presenta le seguenti limitazioni:
- Una sola coppia (servizio, porta) può utilizzare un solo BackendConfig, anche se più oggetti Ingress fanno riferimento a (servizio, porta). Ciò significa che tutti gli oggetti Ingress che fanno riferimento allo stesso (servizio, porta) devono utilizzare la stessa configurazione per Google Cloud Armor, IAP e Cloud CDN.
- IAP e Cloud CDN non possono essere attivati per lo stesso servizio di backend del bilanciamento del carico HTTP(S). Ciò significa che non puoi configurare sia IAP che Cloud CDN nella stessa BackendConfig.
- Per interagire con BackendConfig, devi utilizzare
kubectl
1.7 o versioni successive.
Rimozione della configurazione specificata in FrontendConfig o BackendConfig
Per revocare una funzionalità di Ingress, devi disattivare esplicitamente la configurazione della funzionalità nel CRD FrontendConfig o BackendConfig. Il controller Ingress riconcilia solo le configurazioni specificate in questi CRD.
Per cancellare o disattivare una configurazione precedentemente attivata, imposta il valore del campo su una stringa vuota (""
) o su un valore booleano false
, a seconda del tipo di campo.
Il seguente manifest BackendConfig disattiva un criterio di sicurezza di Google Cloud Armor e Cloud CDN:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backendconfig
spec:
cdn:
enabled: false
securityPolicy:
name: ""
Eliminazione di FrontendConfig o BackendConfig
FrontendConfig
Per eliminare un FrontendConfig:
Rimuovi il nome di FrontendConfig dall'annotazione
networking.gke.io/v1beta1.FrontendConfig
nel manifest di Ingress.Applica il manifest Ingress modificato al cluster. Ad esempio, usa
kubectl apply
.Elimina FrontendConfig. Ad esempio, usa
kubectl delete frontendconfig config my-frontendconfig
.
BackendConfig
Per eliminare un BackedConfig:
Rimuovi il nome di BackendConfig dall'annotazione
cloud.google.com/backend-config
nel manifest del servizio.Applica il manifest del servizio modificato al cluster. Ad esempio, usa
kubectl apply
.Elimina BackendConfig. Ad esempio, usa
kubectl delete backendconfig my-backendconfig
.
Risoluzione dei problemi
Puoi rilevare le configurazioni errate comuni utilizzando lo strumento di diagnostica Ingress. Devi anche assicurarti che tutti i controlli di integrità siano configurati correttamente.
BackendConfig non trovato
Questo errore si verifica quando nell'annotazione di servizio è specificato un BackendConfig per una porta di servizio, ma non è stato possibile trovare la risorsa BackendConfig effettiva.
Per valutare un evento Kubernetes, esegui il seguente comando:
kubectl get event
L'esempio di output seguente indica che BackendConfig non è stato trovato:
KIND ... SOURCE
Ingress ... loadbalancer-controller
MESSAGE
Error during sync: error getting BackendConfig for port 80 on service "default/my-service":
no BackendConfig for service port exists
Per risolvere il problema, assicurati di non aver creato la risorsa BackendConfig nello spazio dei nomi errato o di non aver scritto male il relativo riferimento nell'annotazione di servizio.
Criterio di sicurezza in entrata non trovato
Dopo aver creato l'oggetto Ingress, se il criterio di sicurezza non è associato correttamente al servizio LoadBalancer, valuta l'evento Kubernetes per verificare se è presente un errore di configurazione. Se BackendConfig specifica un criterio di sicurezza inesistente, viene emesso periodicamente un evento di avviso.
Per valutare un evento Kubernetes, esegui il seguente comando:
kubectl get event
L'esempio di output seguente indica che il criterio di sicurezza non è stato trovato:
KIND ... SOURCE
Ingress ... loadbalancer-controller
MESSAGE
Error during sync: The given security policy "my-policy" does not exist.
Per risolvere il problema, specifica il nome corretto del criterio di sicurezza in BackendConfig.
Risolvere gli errori della serie 500 con i NEG durante la scalabilità del carico di lavoro in GKE
Sintomo:
Quando utilizzi NEG di GKE di cui è stato eseguito il provisioning per il bilanciamento del carico, potresti riscontrare errori 502 o 503 per i servizi durante il fare lo scale down del carico di lavoro. Gli errori 502 si verificano quando i pod vengono terminati prima della chiusura delle connessioni esistenti, mentre gli errori 503 si verificano quando il traffico viene indirizzato ai pod eliminati.
Questo problema può interessare i cluster se utilizzi i prodotti di bilanciamento del carico gestiti da GKE che utilizzano gli NEG, inclusi Gateway, Ingress e NEG autonomi. Se esegui spesso il ridimensionamento dei carichi di lavoro, il tuo cluster è più a rischio di essere interessato.
Diagnosi:
La rimozione di un pod in Kubernetes senza svuotare il relativo endpoint e rimuoverlo prima dal NEG genera errori della serie 500. Per evitare problemi durante l'interruzione del pod, devi considerare l'ordine delle operazioni. Le seguenti immagini rappresentano scenari in cui BackendService Drain Timeout
non è impostato e BackendService Drain Timeout
è impostato con BackendConfig
.
Scenario 1: BackendService Drain Timeout
non è impostato.
L'immagine seguente mostra uno scenario in cui BackendService Drain Timeout
è impostato su OFF.
Scenario 2: è impostato BackendService Drain Timeout
.
L'immagine seguente mostra uno scenario in cui è impostato BackendService Drain Timeout
.
Il momento esatto in cui si verificano gli errori della serie 500 dipende dai seguenti fattori:
Latenza di scollegamento dell'API NEG: la latenza di scollegamento dell'API NEG rappresenta il tempo corrente necessario per completare l'operazione di scollegamento in Google Cloud. Questo valore è influenzato da una serie di fattori esterni a Kubernetes, tra cui il tipo di bilanciatore del carico e la zona specifica.
Latenza di scarico: la latenza di scarico è il tempo necessario al bilanciatore del carico per iniziare a indirizzare il traffico lontano da una parte specifica del sistema. Dopo che è stato avviato il ritiro, il bilanciatore del carico smette di inviare nuove richieste all'endpoint, ma esiste ancora una latenza nell'attivazione del ritiro (latenza del ritiro) che può causare errori 503 temporanei se il pod non esiste più.
Configurazione dei controlli di integrità: soglie di controllo di integrità più sensibili mitigano la durata degli errori 503, in quanto possono indicare al bilanciatore del carico di interrompere l'invio di richieste agli endpoint anche se l'operazione di scollegamento non è stata completata.
Periodo di tolleranza per l'interruzione: il periodo di tolleranza per l'interruzione determina il tempo massimo concesso a un pod per uscire. Tuttavia, un pod può uscire prima del completamento del periodo di tolleranza prima della chiusura. Se un pod impiega più tempo di questo periodo, viene costretto a uscire alla fine di questo periodo. Si tratta di un'impostazione del pod e deve essere configurata nella definizione del carico di lavoro.
Possibile risoluzione:
Per evitare questi errori 5XX, applica le seguenti impostazioni. I valori di timeout sono indicativi e potrebbe essere necessario modificarli per la tua applicazione specifica. La sezione seguente illustra la procedura di personalizzazione.
La seguente immagine mostra come mantenere attivo il pod con preStopHook
:
Per evitare errori della serie 500, svolgi i seguenti passaggi:
Imposta
BackendService Drain Timeout
per il tuo servizio su 1 minuto.Per gli utenti Ingress, vedi Impostare il timeout su BackendConfig.
Per gli utenti di Gateway, vedi configurare il timeout su GCPBackendPolicy.
Per chi gestisce direttamente i propri servizi di backend quando utilizza i NEG autonomi, consulta Impostare il timeout direttamente sul servizio di backend.
Espandi
terminationGracePeriod
nel pod.Imposta
terminationGracePeriodSeconds
sul pod su 3,5 minuti. Se abbinato alle impostazioni consigliate, questo consente ai pod di avere un intervallo di 30-45 secondi per un arresto graduale dopo la rimozione dell'endpoint del pod dal NEG. Se hai bisogno di più tempo per l'arresto graduale, puoi estendere il periodo di tolleranza o seguire le istruzioni riportate nella sezione Personalizzare i timeout.Il seguente manifest del pod specifica un timeout per lo svuotamento della connessione di 210 secondi (3,5 minuti):
spec: terminationGracePeriodSeconds: 210 containers: - name: my-app ... ...
Applica un
preStopHook
a tutti i contenitori.Applica un
preStopHook
che garantisca che il pod rimanga attivo per altri 120 secondi mentre l'endpoint del pod viene svuotato nel bilanciatore del carico e l'endpoint viene rimosso dal NEG.spec: containers: - name: my-app ... lifecycle: preStopHook: exec: command: ["/bin/sh", "-c", "sleep 120s"] ...
Personalizzare i timeout
Per garantire la continuità del pod ed evitare errori della serie 500, il pod deve essere attivo
fino a quando l'endpoint non viene rimosso dal NEG. In particolare, per evitare errori 502 e 503,
prendi in considerazione l'implementazione di una combinazione di timeout e un preStopHook
.
Per mantenere attivo il pod più a lungo durante il processo di arresto, aggiungi un preStopHook
al pod. Esegui preStopHook
prima che a un pod venga inviato il segnale di uscita, in modo che preStopHook
possa essere utilizzato per mantenere il pod finché il relativo endpoint non viene rimosso dal NEG.
Per estendere la durata del tempo in cui un pod rimane attivo durante il processo di arresto,
inserisci un preStopHook
nella configurazione del pod come segue:
spec:
containers:
- name: my-app
...
lifecycle:
preStopHook:
exec:
command: ["/bin/sh", "-c", "sleep <latency time>"]
Puoi configurare i timeout e le impostazioni correlate per gestire l'arresto graduale dei pod durante i cali di scalabilità del carico di lavoro. Puoi modificare i timeout in base a casi d'uso specifici. Ti consigliamo di iniziare con timeout più lunghi e di ridurre la durata se necessario. Puoi personalizzare i timeout configurando
i parametri relativi ai timeout e preStopHook
nei seguenti modi:
Timeout di scarico del servizio di backend
Il parametro Backend Service Drain Timeout
non è impostato per impostazione predefinita e non ha alcun effetto. Se imposti e attivi il parametro Backend Service Drain Timeout
, il bilanciatore del carico smette di inoltrare le nuove richieste all'endpoint e attende il timeout prima di terminare le connessioni esistenti.
Puoi impostare il parametro Backend Service Drain Timeout
utilizzando BackendConfig
con Ingress, GCPBackendPolicy
con Gateway o manualmente su BackendService
con NEG autonomi. Il timeout deve essere 1,5-2 volte più lungo del tempo necessario per elaborare una richiesta. In questo modo, se una richiesta viene inviata poco prima dell'avvio dello scarico, verrà completata prima del timeout. L'impostazione del parametro Backend Service Drain Timeout
su un valore superiore a 0 contribuisce ad attenuare gli errori 503 perché non vengono inviate nuove richieste agli endpoint pianificati per la rimozione. Affinché questo timeout sia efficace, devi usarlo in combinazione con preStopHook
per assicurarti che il pod rimanga attivo durante lo svuotamento. Senza questa combinazione, le richieste esistenti che non sono state completate riceveranno un errore 502.
preStopHook
volta
preStopHook
deve ritardare l'arresto del pod in modo sufficiente per completare sia la latenza di scarico sia il timeout dello scarico del servizio di backend, garantendo un corretto svuotamento delle connessioni e la rimozione degli endpoint dal NEG prima dell'arresto del pod.
Per risultati ottimali, assicurati che il tempo di esecuzione di preStopHook
sia maggiore o uguale alla somma della latenza di Backend Service Drain Timeout
e del drenaggio.
Calcola il momento ideale per l'esecuzione di preStopHook
con la seguente formula:
preStopHook execution time >= BACKEND_SERVICE_DRAIN_TIMEOUT + DRAIN_LATENCY
Sostituisci quanto segue:
BACKEND_SERVICE_DRAIN_TIMEOUT
: l'ora configurata per ilBackend Service Drain Timeout
.DRAIN_LATENCY
: un tempo stimato per la latenza di scarico. Ti consigliamo di utilizzare un minuto come stima.
Se gli errori 500 persistono, stima la durata totale delle occorrenze e aggiungi il doppio di questo tempo alla latenza di scarico stimata. In questo modo, il pod avrà tempo sufficiente per eseguire lo svuotamento in modo corretto prima di essere rimosso dal servizio. Puoi modificare questo valore se è troppo lungo per il tuo caso d'uso specifico.
In alternativa, puoi stimare la tempistica esaminando il timestamp dell'eliminazione dal pod e il timestamp in cui l'endpoint è stato rimosso dal NEG in Cloud Audit Logs.
Parametro Periodo di tolleranza per il recesso
Devi configurare il parametro terminationGracePeriod
in modo da concedere tempo sufficiente per il completamento di preStopHook
e per l'arresto graduale del pod.
Per impostazione predefinita, se non impostato esplicitamente, terminationGracePeriod
è pari a 30 secondi.
Puoi calcolare il valore ottimale di terminationGracePeriod
utilizzando la formula:
terminationGracePeriod >= preStopHook Time + Pod shutdown time
Per definire terminationGracePeriod
all'interno della configurazione del pod come segue:
spec:
terminationGracePeriodSeconds: <terminationGracePeriod>
containers:
- name: my-app
...
...
NEG non trovato durante la creazione di una risorsa Ingress interna
Quando crei un Ingress interno in GKE, potrebbe verificarsi il seguente errore:
Error syncing: error running backend syncing routine: googleapi: Error 404: The resource 'projects/PROJECT_ID/zones/ZONE/networkEndpointGroups/NEG' was not found, notFound
Questo errore si verifica perché Ingress per i bilanciatori del carico delle applicazioni interni richiede Gruppi di endpoint di rete (NEG) come backend.
Negli ambienti VPC condivisi o nei cluster con i criteri di rete abilitati,
aggiungi l'annotazione cloud.google.com/neg: '{"ingress": true}'
al manifest del servizio.
504 Gateway Timeout: upstream request timeout
Quando accedi a un servizio da un Ingress interno in GKE, potrebbe verificarsi il seguente errore:
HTTP/1.1 504 Gateway Timeout
content-length: 24
content-type: text/plain
upsteam request timeout
Questo errore si verifica perché il traffico inviato agli Application Load Balancer interni viene eseguito tramite proxy da proxy Envoy nell'intervallo di subnet solo proxy.
Per consentire il traffico dall'intervallo della subnet solo proxy,
crea una regola del firewall
sul targetPort
del servizio.
Errore 400: valore non valido per il campo "resource.target"
Quando accedi a un servizio da un Ingress interno in GKE, potrebbe verificarsi il seguente errore:
Error syncing:LB_NAME does not exist: googleapi: Error 400: Invalid value for field 'resource.target': 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/regions/REGION_NAME/targetHttpProxies/LB_NAME. A reserved and active subnetwork is required in the same region and VPC as the forwarding rule.
Per risolvere il problema, crea una subnet solo proxy.
Errore durante la sincronizzazione: errore durante l'esecuzione della routine di sincronizzazione del bilanciatore del carico: il bilanciatore del carico non esiste
Quando esegui l'upgrade del piano di controllo GKE o modifichi un oggetto Ingress, potrebbe verificarsi uno dei seguenti errori:
"Error during sync: error running load balancer syncing routine: loadbalancer
INGRESS_NAME does not exist: invalid ingress frontend configuration, please
check your usage of the 'kubernetes.io/ingress.allow-http' annotation."
In alternativa:
Error during sync: error running load balancer syncing routine: loadbalancer LOAD_BALANCER_NAME does not exist:
googleapi: Error 400: Invalid value for field 'resource.IPAddress':'INGRESS_VIP'. Specified IP address is in-use and would result in a conflict., invalid
Per risolvere questi problemi, prova i seguenti passaggi:
- Aggiungi il campo
hosts
nella sezionetls
del manifest di Ingress, quindi elimina Ingress. Attendi cinque minuti per consentire a GKE di eliminare le risorse Ingress non utilizzate. Quindi, ricrea l'Ingress. Per ulteriori informazioni, consulta il campo hosts di un oggetto Ingress. - Ripristina le modifiche apportate all'Ingress. Aggiungi un certificato utilizzando un'annotazione o un secret Kubernetes.
Problemi noti
Impossibile attivare i reindirizzamenti HTTPS con lo schema di denominazione di Ingress V1
Non puoi abilitare i reindirizzamenti HTTPS sulle risorse Ingress di GKE create nelle versioni GKE 1.16.8-gke.12 e precedenti. Devi rielaborare Ingress prima di poter attivare i reindirizzamenti HTTPS, altrimenti viene creato un evento di errore e Ingress non si sincronizza.
Il messaggio dell'evento di errore è simile al seguente:
Error syncing: error running load balancer syncing routine: loadbalancer lb-name does not exist: ensureRedirectUrlMap() = error: cannot enable HTTPS Redirects with the V1 Ingress naming scheme. Please recreate your ingress to use the newest naming scheme.
I campi dei criteri di sicurezza di Google Cloud Armor sono stati rimossi da BackendConfig
Esiste un problema noto per cui l'aggiornamento di una risorsa BackendConfig utilizzando l'v1beta1
API rimuove un criterio di sicurezza Google Cloud Armor attivo dal servizio.
Questo problema riguarda le seguenti versioni di GKE:
- Da 1.18.19-gke.1400 a 1.18.20-gke.5099
- Da 1.19.10-gke.700 a 1.19.14-gke.299
- Da 1.20.6-gke.700 a 1.20.9-gke.899
Se non configuri Google Cloud Armor nelle risorse Ingress tramite la configurazione di BackendConfig, questo problema non influisce sui tuoi cluster.
Per i cluster GKE che configurano Google Cloud Armor tramite
la risorsa BackendConfig, è fortemente consigliato aggiornare solo le risorse BackendConfig utilizzando
l'API v1
. L'applicazione di un BackendConfig al cluster utilizzando le risorse v1beta1
BackendConfig rimuoverà il criterio di sicurezza Google Cloud Armor
dal servizio a cui fa riferimento.
Per attenuare il problema, apporta aggiornamenti a BackendConfig solo utilizzando l'v1
API BackendConfig. v1
BackendConfig supporta tutti gli stessi campi di v1beta1
e non apporta modifiche che comportano interruzioni, pertanto il campo dell'API può essere aggiornato in modo trasparente.
Sostituisci il campo apiVersion
di tutti i manifest di BackendConfig attivi con cloud.google.com/v1
e non utilizzare cloud.google.com/v1beta1
.
Il seguente manifest di esempio descrive una risorsa BackendConfig che utilizza l'API v1
:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: my-backend-config
spec:
securityPolicy:
name: "ca-how-to-security-policy"
Se disponi di sistemi o strumenti CI/CD che aggiornano regolarmente le risorse di BackendConfig, assicurati di utilizzare il gruppo di API cloud.google.com/v1
in questi sistemi.
Se BackendConfig è già stato aggiornato con l'API v1beta1
, il criterio di sicurezza di Google Cloud Armor potrebbe essere stato rimosso.
Per determinare se ciò è avvenuto, esegui il seguente comando:
kubectl get backendconfigs -A -o json | jq -r '.items[] | select(.spec.securityPolicy == {}) | .metadata | "\(.namespace)/\(.name)"'
Se la risposta restituisce un output, il problema riguarda il tuo cluster.
L'output di questo comando restituisce un elenco di risorse BackendConfig
(<namespace>/<name>
) interessate dal problema. Se l'output è vuoto,
significa che BackendConfig non è stato aggiornato utilizzando l'API v1beta1
da quando è stato introdotto il problema. Eventuali aggiornamenti futuri a BackendConfig devono utilizzare solo v1
.
Se il criterio di sicurezza di Google Cloud Armor è stato rimosso, puoi determinare quando è stato rimosso utilizzando la seguente query di logging:
resource.type="gce_backend_service"
protoPayload.methodName="v1.compute.backendServices.setSecurityPolicy"
protoPayload.authenticationInfo.principalEmail:"container-engine-robot.iam.gserviceaccount.com"
protoPayload.response.status = "RUNNING"
NOT protoPayload.authorizationInfo.permission:"compute.securityPolicies.use"
Se uno dei tuoi cluster è stato interessato, puoi correggere il problema inviando un aggiornamento alla risorsa BackendConfig che utilizza l'API v1
.
Esegui l'upgrade del tuo piano di controllo GKE
a una delle seguenti versioni aggiornate che correggono il problema e consentono di utilizzare in sicurezza le risorse v1beta1
BackendConfig:
- 1.18.20-gke.5100 e versioni successive
- 1.19.14-gke.300 e versioni successive
- 1.20.9-gke.900 e versioni successive