Questa pagina mostra come eseguire il deployment di una risorsa Ingress che fornisce un'applicazione su più cluster GKE. Per saperne di più su Ingress multi-cluster, consulta Ingress multi-cluster.
Per un confronto dettagliato tra Ingress multi-cluster (MCI), Multi-cluster Gateway (MCG) e bilanciatore del carico con gruppi di endpoint di rete autonomi (bilanciatore del carico e gruppi di endpoint di rete autonomi), consulta Scegliere l'API di bilanciamento del carico multi-cluster per GKE.
Tutorial sul deployment
Nelle attività seguenti, eseguirai il deployment di un'app fittizia denominata whereami e di un
MultiClusterIngress in due cluster. L'ingresso fornisce un indirizzo IP virtuale (VIP)
condiviso per i deployment delle app.
Questa pagina si basa sul lavoro svolto in Configurazione di Ingress multi-cluster, in cui hai creato e registrato due cluster. Verifica di avere due cluster registrati anche in un parco risorse:
gcloud container clusters list
L'output è simile al seguente:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
gke-eu europe-west1-b 1.16.8-gke.9 *** e2-medium 1.16.8-gke.9 2 RUNNING
gke-us us-central1-b 1.16.8-gke.9 *** e2-medium 1.16.6-gke.13 * 2 RUNNING
Creazione dello spazio dei nomi
Poiché i parchi risorse hanno la proprietà di
uguaglianza dello spazio dei nomi,
ti consigliamo di coordinare la creazione e la gestione degli spazi dei nomi nei cluster
in modo che spazi dei nomi identici siano di proprietà e gestiti dallo stesso gruppo. Puoi creare
spazi dei nomi per team, per ambiente, per applicazione o per componente
dell'applicazione. Gli spazi dei nomi possono essere granulari quanto necessario, a condizione che uno spazio dei nomi ns1 in un cluster abbia lo stesso significato e utilizzo di ns1 in un altro cluster.
In questo esempio, crei uno spazio dei nomi whereami per ogni applicazione in
ogni cluster.
Crea un file denominato
namespace.yamlcon i seguenti contenuti:apiVersion: v1 kind: Namespace metadata: name: whereamiPassa al contesto gke-us:
kubectl config use-context gke-usCrea lo spazio dei nomi:
kubectl apply -f namespace.yamlPassa al contesto gke-eu:
kubectl config use-context gke-euCrea lo spazio dei nomi:
kubectl apply -f namespace.yamlL'output è simile al seguente:
namespace/whereami created
Deployment dell'app in corso
Crea un file denominato
deploy.yamlcon i seguenti contenuti:apiVersion: apps/v1 kind: Deployment metadata: name: whereami-deployment namespace: whereami labels: app: whereami spec: selector: matchLabels: app: whereami template: metadata: labels: app: whereami spec: containers: - name: frontend image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1 ports: - containerPort: 8080Passa al contesto gke-us:
kubectl config use-context gke-usEsegui il deployment dell'app
whereami:kubectl apply -f deploy.yamlPassa al contesto gke-eu:
kubectl config use-context gke-euEsegui il deployment dell'app
whereami:kubectl apply -f deploy.yamlVerifica che il deployment dell'app
whereamisia stato eseguito correttamente in ogni cluster:kubectl get deployment --namespace whereamiL'output dovrebbe essere simile al seguente in entrambi i cluster:
NAME READY UP-TO-DATE AVAILABLE AGE whereami-deployment 1/1 1 1 12m
Deployment tramite il cluster di configurazione
Ora che l'applicazione è distribuita in gke-us e gke-eu, eseguirai il deployment di un bilanciatore del carico eseguendo il deployment delle risorse MultiClusterIngress e MultiClusterService nel cluster di configurazione. Queste sono le risorse
equivalenti multicluster di Ingress e Service.
Nella guida alla configurazione,
hai configurato il cluster gke-us come cluster di configurazione. Il cluster di configurazione viene utilizzato per eseguire il deployment e configurare Ingress in tutti i cluster.
Imposta il contesto sul cluster di configurazione.
kubectl config use-context gke-us
MultiClusterService
Crea un file denominato
mcs.yamlcon i seguenti contenuti:apiVersion: networking.gke.io/v1 kind: MultiClusterService metadata: name: whereami-mcs namespace: whereami spec: template: spec: selector: app: whereami ports: - name: web protocol: TCP port: 8080 targetPort: 8080Esegui il deployment della risorsa
MultiClusterServiceche corrisponde all'appwhereami:kubectl apply -f mcs.yamlVerifica che la risorsa
whereami-mcssia stata implementata correttamente nel cluster di configurazione:kubectl get mcs -n whereamiL'output è simile al seguente:
NAME AGE whereami-mcs 9m26sQuesto
MultiClusterServicecrea un servizio headless derivato in ogni cluster che corrisponde ai pod conapp: whereami. Puoi vedere che ne esiste uno nel clustergke-uskubectl get service -n whereami.L'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mci-whereami-mcs-svc-lgq966x5mxwwvvum ClusterIP None <none> 8080/TCP 4m59s
Un servizio headless simile esisterà anche in gke-eu. Questi servizi locali vengono
utilizzati per selezionare dinamicamente gli endpoint dei pod per programmare il bilanciatore del carico Ingress globale con i backend.
MultiClusterIngress
Crea un file denominato
mci.yamlcon i seguenti contenuti:apiVersion: networking.gke.io/v1 kind: MultiClusterIngress metadata: name: whereami-ingress namespace: whereami spec: template: spec: backend: serviceName: whereami-mcs servicePort: 8080Tieni presente che questa configurazione indirizza tutto il traffico a
MultiClusterServicedenominatowhereami-mcsesistente nello spazio dei nomiwhereami.Esegui il deployment della risorsa
MultiClusterIngressche fa riferimento awhereami-mcscome backend:kubectl apply -f mci.yamlL'output è simile al seguente:
multiclusteringress.networking.gke.io/whereami-ingress createdTieni presente che
MultiClusterIngressha lo stesso schema dell'ingresso Kubernetes. La semantica della risorsa Ingress è la stessa, ad eccezione del campobackend.serviceName.
Il campo backend.serviceName in un MultiClusterIngress fa riferimento a un
MultiClusterService nell'API Fleet anziché a un servizio in un cluster
Kubernetes. Ciò significa che qualsiasi impostazione per Ingress, ad esempio la terminazione TLS, può essere configurata nello stesso modo.
Convalida dello stato di deployment riuscito
Google Cloud Il deployment del bilanciatore del carico potrebbe richiedere diversi minuti per i nuovi
bilanciatori del carico. L'aggiornamento dei bilanciatori del carico esistenti viene completato più rapidamente perché non è necessario eseguire il deployment di nuove risorse. La risorsa MultiClusterIngress descrive in dettaglio le risorse Compute Engine sottostanti che sono state create per conto di MultiClusterIngress.
Verifica che il deployment sia riuscito:
kubectl describe mci whereami-ingress -n whereamiL'output è simile al seguente:
Name: whereami-ingress Namespace: whereami Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"networking.gke.io/v1","kind":"MultiClusterIngress","metadata":{"annotations":{},"name":"whereami-ingress","namespace":"whe... API Version: networking.gke.io/v1 Kind: MultiClusterIngress Metadata: Creation Timestamp: 2020-04-10T23:35:10Z Finalizers: mci.finalizer.networking.gke.io Generation: 2 Resource Version: 26458887 Self Link: /apis/networking.gke.io/v1/namespaces/whereami/multiclusteringresses/whereami-ingress UID: 62bec0a4-8a08-4cd8-86b2-d60bc2bda63d Spec: Template: Spec: Backend: Service Name: whereami-mcs Service Port: 8080 Status: Cloud Resources: Backend Services: mci-8se3df-8080-whereami-whereami-mcs Firewalls: mci-8se3df-default-l7 Forwarding Rules: mci-8se3df-fw-whereami-whereami-ingress Health Checks: mci-8se3df-8080-whereami-whereami-mcs Network Endpoint Groups: zones/europe-west1-b/networkEndpointGroups/k8s1-e4adffe6-whereami-mci-whereami-mcs-svc-lgq966x5m-808-88670678 zones/us-central1-b/networkEndpointGroups/k8s1-a6b112b6-whereami-mci-whereami-mcs-svc-lgq966x5m-808-609ab6c6 Target Proxies: mci-8se3df-whereami-whereami-ingress URL Map: mci-8se3df-whereami-whereami-ingress VIP: 34.98.102.37 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 3m35s multi-cluster-ingress-controller whereami/whereami-ingress Normal UPDATE 3m10s (x2 over 3m34s) multi-cluster-ingress-controller whereami/whereami-ingressEsistono diversi campi che indicano lo stato di questo deployment Ingress:
Eventsè la prima sezione da controllare. Se si è verificato un errore, verrà elencato qui.Cloud Resourceelenca le risorse Compute Engine come regole di forwarding, servizi di backend e regole firewall create dal controller Ingress multi-cluster. Se non sono elencati, significa che non sono ancora stati creati. Puoi esaminare le singole risorse Compute Engine con la console o il comandogcloudper ottenere il relativo stato.VIPelenca un indirizzo IP quando ne è stato allocato uno. Tieni presente che il bilanciamento del carico potrebbe non elaborare ancora il traffico anche se l'indirizzo IP virtuale esiste. Se non vedi un VIP dopo un paio di minuti o se il bilanciatore del carico non fornisce una risposta 200 entro 10 minuti, consulta Risoluzione dei problemi e operazioni.
Se gli eventi di output sono
Normal, il deployment diMultiClusterIngressè probabilmente andato a buon fine, ma l'unico modo per determinare che l'intero percorso del traffico è funzionale è testarlo.Verifica che l'applicazione venga pubblicata sul VIP con l'endpoint
/ping:curl INGRESS_VIP/pingSostituisci
INGRESS_VIPcon l'indirizzo IP virtuale (VIP).L'output è simile al seguente:
{ "cluster_name": "gke-us", "host_header": "34.120.175.141", "pod_name": "whereami-deployment-954cbf78-mtlpf", "pod_name_emoji": "😎", "project_id": "my-project", "timestamp": "2021-11-29T17:01:59", "zone": "us-central1-b" }L'output deve indicare la regione e il backend dell'applicazione.
Puoi anche andare all'
http://INGRESS_VIPURL nel browser per visualizzare una versione grafica dell'applicazione che mostra la regione da cui viene pubblicata.Il cluster a cui viene inoltrato il traffico dipende dalla tua posizione. Il bilanciatore del carico globale è progettato per inoltrare il traffico client al backend disponibile più vicino con capacità.
Specifiche delle risorse
Specifica di MultiClusterService
La definizione di MultiClusterService è composta da due parti:
Una sezione
templateche definisce il servizio da creare nei cluster Kubernetes. Tieni presente che, mentre la sezionetemplatecontiene campi supportati in un servizio tipico, in unMultiClusterServicesono supportati solo due campi:selectoreports. Gli altri campi vengono ignorati.Una sezione
clustersfacoltativa che definisce quali cluster ricevono il traffico e le proprietà di bilanciamento del carico per ciascun cluster. Se non viene specificata alcuna sezioneclusterso se non sono elencati cluster, per impostazione predefinita vengono utilizzati tutti i cluster.
Il seguente manifest descrive un MultiClusterService standard:
apiVersion: networking.gke.io/v1
kind: MultiClusterService
metadata:
name: NAME
namespace: NAMESPACE
spec:
template:
spec:
selector:
app: POD_LABEL
ports:
- name: web
protocol: TCP
port: PORT
targetPort: TARGET_PORT
Sostituisci quanto segue:
NAME: il nome diMultiClusterService. Questo nome viene fatto riferimento dal camposerviceNamenelle risorseMultiClusterIngress.NAMESPACE: lo spazio dei nomi Kubernetes in cui viene eseguito il deployment diMultiClusterService. Deve corrispondere allo stesso spazio dei nomi diMultiClusterIngresse dei pod in tutti i cluster del parco risorse.POD_LABEL: l'etichetta che determina quali pod vengono selezionati come backend per questoMultiClusterServicein tutti i cluster del parco risorse.PORT: deve corrispondere alla porta a cui fa riferimentoMultiClusterIngressche fa riferimento a questoMultiClusterService.TARGET_PORT: la porta utilizzata per inviare traffico al pod dal bilanciamento del carico Google Cloud. In ogni cluster viene creato un NEG con questa porta come porta di servizio.
Specifica MultiClusterIngress
Il seguente mci.yaml descrive il frontend del bilanciatore del carico:
apiVersion: networking.gke.io/v1
kind: MultiClusterIngress
metadata:
name: NAME
namespace: NAMESPACE
spec:
template:
spec:
backend:
serviceName: DEFAULT_SERVICE
servicePort: PORT
rules:
- host: HOST_HEADER
http:
paths:
- path: PATH
backend:
serviceName: SERVICE
servicePort: PORT
Sostituisci quanto segue:
NAME: il nome della risorsaMultiClusterIngress.NAMESPACE: lo spazio dei nomi Kubernetes in cui viene eseguito il deployment diMultiClusterIngress. Deve trovarsi nello stesso spazio dei nomi diMultiClusterServicee dei pod in tutti i cluster del parco risorse.DEFAULT_SERVICE: funge da backend predefinito per tutto il traffico che non corrisponde a nessuna regola host o percorso. Questo è un campo obbligatorio e un backend predefinito deve essere specificato inMultiClusterIngressanche se sono configurate altre corrispondenze di host o percorso.PORT: qualsiasi numero di porta valido. Deve corrispondere al campoportdelle risorseMultiClusterService.HOST_HEADER: corrisponde al traffico in base al campo dell'intestazione host HTTP. Il campohostè facoltativo.PATH: corrisponde al traffico in base al percorso dell'URL HTTP. Il campopathè facoltativo.SERVICE: il nome di unMultiClusterServicedistribuito nello stesso spazio dei nomi e cluster di configurazione di questoMultiClusterIngress.
Funzionalità di Ingress multi-cluster
Questa sezione mostra come configurare funzionalità aggiuntive di Ingress multi-cluster.
Selezione del cluster
Per impostazione predefinita, i servizi derivati da Ingress multi-cluster vengono pianificati su ogni cluster membro. Tuttavia, potresti voler applicare regole di ingresso a cluster specifici. Alcuni casi d'uso includono:
- Applicazione di Ingress multi-cluster a tutti i cluster, tranne il cluster di configurazione, per l'isolamento del cluster di configurazione.
- Migrazione dei carichi di lavoro tra cluster in modalità blu/verde.
- Routing ai backend delle applicazioni che esistono solo in un sottoinsieme di cluster.
- Utilizzo di un singolo VIP L7 per il routing di host o percorsi ai backend che si trovano su cluster diversi.
La selezione dei cluster consente di selezionare i cluster per regione o nome nell'oggetto
MultiClusterService. Questo parametro controlla a quali cluster punta il tuo
MultiClusterIngress e dove vengono pianificati i servizi derivati.
I cluster all'interno dello stesso parco risorse e della stessa regione non devono avere lo stesso nome, in modo che
possono essere referenziati in modo univoco.
Apri
mcs.yamlapiVersion: networking.gke.io/v1 kind: MultiClusterService metadata: name: whereami-mcs namespace: whereami spec: template: spec: selector: app: whereami ports: - name: web protocol: TCP port: 8080 targetPort: 8080Questa specifica crea servizi derivati in tutti i cluster, il comportamento predefinito.
Aggiungi le seguenti righe nella sezione dei cluster:
apiVersion: networking.gke.io/v1 kind: MultiClusterService metadata: name: whereami-mcs namespace: whereami spec: template: spec: selector: app: whereami ports: - name: web protocol: TCP port: 8080 targetPort: 8080 clusters: - link: "us-central1-b/gke-us" - link: "europe-west1-b/gke-eu"Questo esempio crea risorse del servizio derivato solo nei cluster gke-us e gke-eu. Devi selezionare i cluster per applicare in modo selettivo le regole di ingresso. Se la sezione "cluster" di
MultiClusterServicenon è specificata o se non sono elencati cluster, viene interpretata come i cluster "tutti" predefiniti.
Supporto HTTPS
Il secret di Kubernetes supporta HTTPS. Prima di attivare il supporto HTTPS, devi creare un indirizzo IP statico. Questo IP statico consente a HTTP e HTTPS di condividere lo stesso indirizzo IP. Per maggiori informazioni, consulta Creazione di un IP statico.
Dopo aver creato un indirizzo IP statico, puoi creare un secret.
Crea un secret:
kubectl -n whereami create secret tls SECRET_NAME --key PATH_TO_KEYFILE --cert PATH_TO_CERTFILESostituisci quanto segue:
SECRET_NAMEcon il nome del secret.PATH_TO_KEYFILEcon il percorso del file della chiave TLS.PATH_TO_CERTFILEcon il percorso del file del certificato TLS.
Aggiorna il file
mci.yamlcon il nome del secret:apiVersion: networking.gke.io/v1 kind: MultiClusterIngress metadata: name: whereami-ingress namespace: whereami annotations: networking.gke.io/static-ip: STATIC_IP_ADDRESS spec: template: spec: backend: serviceName: whereami-mcs servicePort: 8080 tls: - secretName: SECRET_NAMESostituisci
SECRET_NAMEcon il nome del tuo secret.STATIC_IP_ADDRESSè l'indirizzo IP o l'URL completo dell'indirizzo che hai allocato nella sezione Creazione di un IP statico.Esegui di nuovo il deployment della risorsa
MultiClusterIngress:kubectl apply -f mci.yamlL'output è simile al seguente:
multiclusteringress.networking.gke.io/whereami-ingress configured
Supporto di BackendConfig
Il seguente CRD BackendConfig ti consente di personalizzare le impostazioni della risorsa BackendService di Compute Engine:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
name: whereami-health-check-cfg
namespace: whereami
spec:
healthCheck:
checkIntervalSec: [int]
timeoutSec: [int]
healthyThreshold: [int]
unhealthyThreshold: [int]
type: [HTTP | HTTPS | HTTP2 | TCP]
port: [int]
requestPath: [string]
timeoutSec: [int]
connectionDraining:
drainingTimeoutSec: [int]
sessionAffinity:
affinityType: [CLIENT_IP | CLIENT_IP_PORT_PROTO | CLIENT_IP_PROTO | GENERATED_COOKIE | HEADER_FIELD | HTTP_COOKIE | NONE]
affinityCookieTtlSec: [int]
cdn:
enabled: [bool]
cachePolicy:
includeHost: [bool]
includeQueryString: [bool]
includeProtocol: [bool]
queryStringBlacklist: [string list]
queryStringWhitelist: [string list]
securityPolicy:
name: ca-how-to-security-policy
logging:
enable: [bool]
sampleRate: [float]
iap:
enabled: [bool]
oauthclientCredentials:
secretName: [string]
Per utilizzare BackendConfig, collegalo alla risorsa MultiClusterService utilizzando un'annotazione:
apiVersion: networking.gke.io/v1
kind: MultiClusterService
metadata:
name: whereami-mcs
namespace: whereami
annotations:
cloud.google.com/backend-config: '{"ports": {"8080":"whereami-health-check-cfg"}}'
spec:
template:
spec:
selector:
app: whereami
ports:
- name: web
protocol: TCP
port: 8080
targetPort: 8080
Per ulteriori informazioni sulla semantica di BackendConfig, consulta Associazione di una porta di servizio a un BackendConfig.
Supporto gRPC
La configurazione delle applicazioni gRPC su Ingress multi-cluster richiede una configurazione molto specifica. Ecco alcuni suggerimenti per assicurarti che il bilanciatore del carico sia configurato correttamente:
- Assicurati che il traffico dal bilanciatore del carico alla tua applicazione sia HTTP/2. Utilizza i protocolli applicativi per configurare questa impostazione.
- Assicurati che la tua applicazione sia configurata correttamente per SSL, in quanto si tratta di un requisito di HTTP/2. Tieni presente che l'utilizzo di certificati autofirmati è accettabile.
- Devi disattivare mTLS nella tua applicazione perché mTLS non è supportato per i bilanciatori del carico esterni di livello 7.
Ciclo di vita delle risorse
Modifiche alla configurazione
Le risorse MultiClusterIngress e MultiClusterService si comportano come oggetti Kubernetes standard, quindi le modifiche agli oggetti vengono riflesse in modo asincrono nel sistema. Qualsiasi modifica che comporta una configurazione non valida fa sì che gli oggettiGoogle Cloud associati rimangano invariati e genera un errore nel flusso di eventi degli oggetti. Gli errori associati alla configurazione verranno segnalati come eventi.
Gestione delle risorse Kubernetes
L'eliminazione dell'oggetto Ingress smantella il bilanciatore del carico HTTP(S), quindi
il traffico non viene più inoltrato a nessun MultiClusterService definito.
L'eliminazione di MultiClusterService comporta la rimozione dei servizi derivati associati in
ciascuno dei cluster.
Gestione dei cluster
Il set di cluster di destinazione del bilanciatore del carico può essere modificato aggiungendo o rimuovendo cluster dal parco risorse.
Ad esempio, per rimuovere il cluster gke-eu come backend per un ingresso,
esegui:
gcloud container fleet memberships unregister CLUSTER_NAME \
--gke-uri=URI
Sostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.URI: l'URI del cluster GKE.
Per aggiungere un cluster in Europa, esegui:
gcloud container fleet memberships register europe-cluster \
--context=europe-cluster --enable-workload-identity
Per scoprire di più sulle opzioni di registrazione dei cluster, consulta Registrare un cluster GKE.
Tieni presente che la registrazione o l'annullamento della registrazione di un cluster ne modifica lo stato di backend
per tutti gli ingressi. L'annullamento della registrazione del cluster gke-eu
lo rimuove come backend disponibile per tutti gli Ingress che crei. Il
contrario vale per la registrazione di un nuovo cluster.
Disabilitazione di Ingress multi-cluster
Prima di disattivare Ingress multi-cluster, devi assicurarti di eliminare prima le risorse
MultiClusterIngress e MultiClusterService e verificare che tutte le risorse di networking
associate siano eliminate.
Quindi, per disattivare Ingress multi-cluster, utilizza il seguente comando:
gcloud container fleet ingress disable
Se non elimini le risorse MultiClusterIngress e MultiClusterService
prima di disabilitare Ingress multi-cluster, potresti riscontrare un errore simile al
seguente:
Feature has associated resources that should be cleaned up before deletion.
Se vuoi forzare la disattivazione di Ingress multi-cluster, utilizza il seguente comando:
gcloud container fleet ingress disable --force
Annotazioni
Sono supportate le seguenti annotazioni sulle risorse MultiClusterIngress e
MultiClusterService.
Annotazioni MultiClusterIngress
| Annotazione | Descrizione |
|---|---|
| networking.gke.io/frontend-config | Fa riferimento a una risorsa FrontendConfig nello stesso spazio dei nomi della risorsa MultiClusterIngress. |
| networking.gke.io/static-ip | Si riferisce all'indirizzo IP letterale di un IP statico globale. |
| networking.gke.io/pre-shared-certs | Fa riferimento a una risorsa SSLCertificate globale. |
Annotazioni MultiClusterService
| Annotazione | Descrizione |
|---|---|
| networking.gke.io/app-protocols | Utilizza questa annotazione per impostare il protocollo per la comunicazione tra il bilanciatore del carico e l'applicazione. I protocolli possibili sono HTTP, HTTPS e HTTP/2. Consulta HTTPS tra il bilanciatore del carico e l'applicazione e HTTP/2 per il bilanciamento del carico con Ingress. |
| cloud.google.com/backend-config | Utilizza questa annotazione per configurare il servizio di backend associato a un servicePort. Per ulteriori informazioni, consulta la sezione Configurazione Ingress. |
Policy SSL e reindirizzamenti HTTPS
Puoi utilizzare la risorsa FrontendConfig per configurare le policy SSL e i reindirizzamenti HTTPS. I criteri SSL consentono di specificare le suite di crittografia e le versioni TLS accettate dal bilanciatore del carico. I reindirizzamenti HTTPS ti consentono di forzare il reindirizzamento da HTTP o dalla porta 80 a HTTPS o alla porta 443. I seguenti passaggi configurano insieme un criterio SSL e il reindirizzamento HTTPS. Tieni presente che possono anche essere configurati in modo indipendente.
Crea una policy SSL che rifiuti le richieste che utilizzano una versione precedente a TLS v1.2.
gcloud compute ssl-policies create tls-12-policy \ --profile MODERN \ --min-tls-version 1.2 \ --project=PROJECT_IDSostituisci
PROJECT_IDcon l'ID progetto in cui sono in esecuzione i tuoi cluster GKE.Visualizza il criterio per assicurarti che sia stato creato.
gcloud compute ssl-policies list --project=PROJECT_IDL'output è simile al seguente:
NAME PROFILE MIN_TLS_VERSION tls-12-policy MODERN TLS_1_2Crea un certificato per
foo.example.comcome nell'esempio. Una volta ottenutikey.pemecert.pem, memorizza queste credenziali come secret a cui farà riferimento la risorsa MultiClusterIngress.kubectl -n whereami create secret tls SECRET_NAME --key key.pem --cert cert.pemSalva la seguente risorsa FrontendConfig come
frontendconfig.yaml. Per ulteriori informazioni sui campi supportati in un FrontendConfig, consulta la sezione Configurazione delle risorse FrontendConfig.apiVersion: networking.gke.io/v1beta1 kind: FrontendConfig metadata: name: frontend-redirect-tls-policy namespace: whereami spec: sslPolicy: tls-12-policy redirectToHttps: enabled: trueQuesto FrontendConfig attiverà i reindirizzamenti HTTPS e un criterio SSL che impone una versione TLS minima di 1.2.
Esegui il deployment di
frontendconfig.yamlnel cluster di configurazione.kubectl apply -f frontendconfig.yaml --context MCI_CONFIG_CLUSTERSostituisci
MCI_CONFIG_CLUSTERcon il nome del tuo cluster di configurazione.Salva il seguente MultiClusterIngress come
mci-frontendconfig.yaml.apiVersion: networking.gke.io/v1 kind: MultiClusterIngress metadata: name: foo-ingress namespace: whereami annotations: networking.gke.io/frontend-config: frontend-redirect-tls-policy networking.gke.io/static-ip: STATIC_IP_ADDRESS spec: template: spec: backend: serviceName: default-backend servicePort: 8080 rules: - host: foo.example.com http: paths: - backend: serviceName: whereami-mcs servicePort: 8080 tls: - secretName: SECRET_NAME- Sostituisci
STATIC_IP_ADDRESScon un indirizzo IP statico globale di cui hai già eseguito il provisioning. - Sostituisci
SECRET_NAMEcon il secret in cui è memorizzato il certificatofoo.example.com.
Esistono due requisiti per l'attivazione dei reindirizzamenti HTTPS:
- TLS deve essere abilitato tramite il campo
spec.tlso tramite l'annotazione del certificato pre-condivisonetworking.gke.io/pre-shared-certs. MultiClusterIngress non verrà eseguito il deployment se i reindirizzamenti HTTPS sono attivati, ma HTTPS no. - Un IP statico deve essere referenziato tramite l'annotazione
networking.gke.io/static-ip. Gli IP statici sono necessari quando si abilita HTTPS su un MultiClusterIngress.
- Sostituisci
Esegui il deployment di MultiClusterIngress nel cluster di configurazione.
kubectl apply -f mci-frontendconfig.yaml --context MCI_CONFIG_CLUSTERAttendi un minuto o due e controlla
foo-ingress.kubectl describe mci foo-ingress --context MCI_CONFIG_CLUSTERUn output riuscito è simile al seguente:
- Lo stato
Cloud Resourcesviene compilato con i nomi delle risorse - Il campo
VIPviene compilato con l'indirizzo IP del bilanciatore del carico
Name: foobar-ingress Namespace: whereami ... Status: Cloud Resources: Backend Services: mci-otn9zt-8080-whereami-bar mci-otn9zt-8080-whereami-default-backend mci-otn9zt-8080-whereami-foo Firewalls: mci-otn9zt-default-l7 Forwarding Rules: mci-otn9zt-fw-whereami-foobar-ingress mci-otn9zt-fws-whereami-foobar-ingress Health Checks: mci-otn9zt-8080-whereami-bar mci-otn9zt-8080-whereami-default-backend mci-otn9zt-8080-whereami-foo Network Endpoint Groups: zones/europe-west1-b/networkEndpointGroups/k8s1-1869d397-multi-cluste-mci-default-backend-svc--80-9e362e3d zones/europe-west1-b/networkEndpointGroups/k8s1-1869d397-multi-cluster--mci-bar-svc-067a3lzs8-808-89846515 zones/europe-west1-b/networkEndpointGroups/k8s1-1869d397-multi-cluster--mci-foo-svc-820zw3izx-808-8bbcb1de zones/us-central1-b/networkEndpointGroups/k8s1-a63e24a6-multi-cluste-mci-default-backend-svc--80-a528cc75 zones/us-central1-b/networkEndpointGroups/k8s1-a63e24a6-multi-cluster--mci-bar-svc-067a3lzs8-808-36281739 zones/us-central1-b/networkEndpointGroups/k8s1-a63e24a6-multi-cluster--mci-foo-svc-820zw3izx-808-ac733579 Target Proxies: mci-otn9zt-whereami-foobar-ingress mci-otn9zt-whereami-foobar-ingress URL Map: mci-otn9zt-rm-whereami-foobar-ingress VIP: 34.149.29.76 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal UPDATE 38m (x5 over 62m) multi-cluster-ingress-controller whereami/foobar-ingress- Lo stato
Verifica che i reindirizzamenti HTTPS funzionino correttamente inviando una richiesta HTTP tramite
curl.curl VIPSostituisci
VIPcon l'indirizzo IP di MultiClusterIngress.L'output deve mostrare che la richiesta è stata reindirizzata alla porta HTTPS, il che indica che i reindirizzamenti funzionano correttamente.
Verifica che la policy TLS funzioni correttamente inviando una richiesta HTTPS utilizzando la versione 1.1 di TLS. Poiché il DNS non è configurato per questo dominio, utilizza l'opzione
--resolveper indicare acurldi risolvere direttamente l'indirizzo IP.curl https://foo.example.com --resolve foo.example.com:443:VIP --cacert CERT_FILE -vQuesto passaggio richiede il file PEM del certificato utilizzato per proteggere MultiClusterIngress. Un output riuscito sarà simile al seguente:
... * SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305 * ALPN, server accepted to use h2 * Server certificate: * subject: O=example; CN=foo.example.com * start date: Sep 1 10:32:03 2021 GMT * expire date: Aug 27 10:32:03 2022 GMT * common name: foo.example.com (matched) * issuer: O=example; CN=foo.example.com * SSL certificate verify ok. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x7fa10f00e400) > GET / HTTP/2 > Host: foo.example.com > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 100)! < HTTP/2 200 < content-type: application/json < content-length: 308 < access-control-allow-origin: * < server: Werkzeug/1.0.1 Python/3.8.6 < date: Wed, 01 Sep 2021 11:39:06 GMT < via: 1.1 google < alt-svc: clear < {"cluster_name":"gke-us","host_header":"foo.example.com","metadata":"foo","node_name":"gke-gke-us-default-pool-22cb07b1-r5r0.c.mark-church-project.internal","pod_name":"foo-75ccd9c96d-dkg8t","pod_name_emoji":"👞","project_id":"mark-church-project","timestamp":"2021-09-01T11:39:06","zone":"us-central1-b"} * Connection #0 to host foo.example.com left intact * Closing connection 0Il codice di risposta è 200 e viene utilizzato TLSv1.2, il che indica che tutto funziona correttamente.
Successivamente, puoi verificare che la policy SSL applichi la versione TLS corretta tentando di connetterti con TLS 1.1. Per il funzionamento di questo passaggio, i criteri SSL devono essere configurati per una versione minima di 1.2.
Invia la stessa richiesta del passaggio precedente, ma applica una versione TLS 1.1.
curl https://foo.example.com --resolve foo.example.com:443:VIP -v \ --cacert CERT_FILE \ --tls-max 1.1Un output riuscito sarà simile al seguente:
* Added foo.example.com:443:34.149.29.76 to DNS cache * Hostname foo.example.com was found in DNS cache * Trying 34.149.29.76... * TCP_NODELAY set * Connected to foo.example.com (34.149.29.76) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: cert.pem CApath: none * TLSv1.1 (OUT), TLS handshake, Client hello (1): * TLSv1.1 (IN), TLS alert, protocol version (582): * error:1400442E:SSL routines:CONNECT_CR_SRVR_HELLO:tlsv1 alert protocol version * Closing connection 0 curl: (35) error:1400442E:SSL routines:CONNECT_CR_SRVR_HELLO:tlsv1 alert protocol versionIl mancato completamento dell'handshake TLS indica che la policy SSL ha bloccato TLS 1.1.
Creazione di un IP statico
Alloca un IP statico:
gcloud compute addresses create ADDRESS_NAME --globalSostituisci
ADDRESS_NAMEcon il nome dell'IP statico da allocare.L'output contiene l'URL completo dell'indirizzo che hai creato, simile al seguente:
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/ADDRESS_NAME].Visualizza l'indirizzo IP appena creato:
gcloud compute addresses listL'output è simile al seguente:
NAME ADDRESS/RANGE TYPE STATUS ADDRESS_NAME STATIC_IP_ADDRESS EXTERNAL RESERVEDQuesto output include:
- Il
ADDRESS_NAMEche hai definito. STATIC_IP_ADDRESSallocati.
- Il
Aggiorna il file
mci.yamlcon l'IP statico:apiVersion: networking.gke.io/v1 kind: MultiClusterIngress metadata: name: whereami-ingress namespace: whereami annotations: networking.gke.io/static-ip: STATIC_IP_ADDRESS spec: template: spec: backend: serviceName: whereami-mcs servicePort: 8080Sostituisci
STATIC_IP_ADDRESScon:- L'indirizzo IP allocato, simile a:
34.102.201.47 - L'URL completo dell'indirizzo che hai creato, simile a:
"https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/ADDRESS_NAME"
STATIC_IP_ADDRESSnon è il nome della risorsa (ADDRESS_NAME).- L'indirizzo IP allocato, simile a:
Esegui di nuovo il deployment della risorsa
MultiClusterIngress:kubectl apply -f mci.yamlL'output è simile al seguente:
multiclusteringress.networking.gke.io/whereami-ingress configuredSegui i passaggi descritti in Verificare lo stato di deployment riuscito per verificare che il deployment sia attivo su
STATIC_IP_ADDRESS.
Certificati precondivisi
I certificati precondivisi
sono certificati caricati su Google Cloud che possono essere utilizzati dal bilanciamento del carico per la terminazione TLS anziché i certificati archiviati in Kubernetes Secrets. Questi certificati vengono caricati fuori banda da GKE
a Google Cloud e a cui fa riferimento una risorsa MultiClusterIngress.
Sono supportati anche più certificati, tramite certificati precondivisi o secret di Kubernetes.
L'utilizzo dei certificati in Ingress multi-cluster richiede l'annotazione
networking.gke.io/pre-shared-certs e i nomi dei certificati. Quando
vengono specificati più certificati per un determinato MultiClusterIngress, un
ordine predeterminato stabilisce quale certificato viene presentato al client.
Puoi elencare i certificati SSL disponibili eseguendo:
gcloud compute ssl-certificates list
L'esempio seguente descrive il traffico client verso uno degli host specificati che corrisponde al nome comune dei certificati precondivisi, in modo che venga presentato il certificato corrispondente al nome di dominio.
kind: MultiClusterIngress
metadata:
name: shopping-service
namespace: whereami
annotations:
networking.gke.io/pre-shared-certs: "domain1-cert, domain2-cert"
spec:
template:
spec:
rules:
- host: my-domain1.gcp.com
http:
paths:
- backend:
serviceName: domain1-svc
servicePort: 443
- host: my-domain2.gcp.com
http:
paths:
- backend:
serviceName: domain2-svc
servicePort: 443
Certificati gestiti da Google
I certificati gestiti da Google
sono supportati sulle risorse MultiClusterIngress tramite l'annotazione networking.gke.io/pre-shared-certs. Ingress multi-cluster supporta l'allegato di certificati gestiti da Google a una risorsa MultiClusterIngress, ma a differenza di Ingress single-cluster, la generazione dichiarativa di una risorsa Kubernetes ManagedCertificate non è supportata sulle risorse MultiClusterIngress. La creazione originale del certificato gestito da Google deve essere eseguita direttamente tramite l'API compute ssl-certificates create prima di poterlo collegare a un MultiClusterIngress. Per farlo, segui questi passaggi:
Crea un certificato gestito da Google come descritto nel passaggio 1 qui. Non passare al passaggio 2, perché Ingress multi-cluster allegherà questo certificato per te.
gcloud compute ssl-certificates create my-google-managed-cert \ --domains=my-domain.gcp.com \ --globalFai riferimento al nome del certificato nel tuo
MultiClusterIngressutilizzando l'annotazionenetworking.gke.io/pre-shared-certs.kind: MultiClusterIngress metadata: name: shopping-service namespace: whereami annotations: networking.gke.io/pre-shared-certs: "my-google-managed-cert" spec: template: spec: rules: - host: my-domain.gcp.com http: paths: - backend: serviceName: my-domain-svc servicePort: 8080
Il manifest precedente associa il certificato a MultiClusterIngress
in modo che possa terminare il traffico per i cluster GKE di backend.
Google Cloud rinnova automaticamente il certificato
prima della scadenza. I rinnovi avvengono in modo trasparente e non richiedono aggiornamenti a Ingress multi-cluster.
Protocolli applicativi
La connessione dal proxy del bilanciatore del carico alla tua applicazione utilizza HTTP per impostazione predefinita. Utilizzando l'annotazione networking.gke.io/app-protocols, puoi configurare il bilanciatore del carico in modo che utilizzi HTTPS o HTTP/2 quando inoltra le richieste alla tua applicazione. Nel campo annotation dell'esempio seguente, http2
si riferisce al nome della porta MultiClusterService e HTTP2 si riferisce al
protocollo utilizzato dal bilanciatore del carico.
kind: MultiClusterService
metadata:
name: shopping-service
namespace: whereami
annotations:
networking.gke.io/app-protocols: '{"http2":"HTTP2"}'
spec:
template:
spec:
ports:
- port: 443
name: http2
BackendConfig
Consulta la sezione precedente su come configurare l'annotazione.
Passaggi successivi
- Leggi la panoramica della rete GKE.
- Scopri di più sulla configurazione del bilanciamento del carico HTTP con Ingress.
- Implementa Ingress multi-cluster con HTTPS end-to-end.