Questa pagina fornisce la strategia di deployment consigliata per creare un'applicazione container Kubernetes solida e ad alta disponibilità (HA) in Google Distributed Cloud (GDC) air-gapped. Devi eseguire il deployment dell'applicazione container in più zone GDC e configurare la replica asincrona dello spazio di archiviazione in modo che l'applicazione e i relativi dati siano recuperabili in caso di tempi di inattività imprevisti o disastri locali.
Questa pagina è rivolta agli sviluppatori del gruppo di operatori di applicazioni, che sono responsabili della creazione dei carichi di lavoro delle applicazioni per la propria organizzazione. Per saperne di più, consulta la documentazione sulle audience per GDC air-gapped.
Obiettivi
- Crea un cluster Kubernetes in due o più zone del tuo universo GDC.
- Configura il bilanciamento del carico globale.
- Esegui il deployment dei carichi di lavoro dei container in ogni cluster Kubernetes zonale.
- Esegui il provisioning dello spazio di archiviazione e collegalo ai tuoi pod.
- Configura la replica asincrona dello spazio di archiviazione utilizzando lo spazio di archiviazione a blocchi o lo spazio di archiviazione di oggetti.
Prima di iniziare
Verifica di lavorare in un universo GDC con più zone disponibili. Esegui
gdcloud zones list
per elencare le zone disponibili nel tuo universo. Per maggiori informazioni, vedi Elenca le zone in un universo.Chiedi all'amministratore IAM dell'organizzazione di concederti i seguenti ruoli:
Il ruolo Amministratore spazio dei nomi (
namespace-admin
) per creare e gestire i carichi di lavoro dei container.I ruoli Amministratore cluster utente (
user-cluster-admin
) e Sviluppatore cluster utente (user-cluster-developer
) per creare e gestire cluster Kubernetes e i relativi node pool.I ruoli Amministratore bilanciatore del carico (
load-balancer-admin
) e Amministratore bilanciatore del carico globale (global-load-balancer-admin
). Per creare e gestire i bilanciatori del carico, devi disporre di questo ruolo.Il ruolo Amministratore globale della replica dei volumi (
app-volume-replication-admin-global
). Devi disporre di questo ruolo per amministrare la replica dei volumi.Il ruolo Amministratore PNP globale (
global-project-networkpolicy-admin
) per creare e gestire le norme di rete del progetto tra le zone.I ruoli Amministratore istanza Harbor (
harbor-instance-admin
), Visualizzatore istanza Harbor(harbor-instance-viewer
) e Creatore progetto Harbor (harbor-project-creator
). Questi ruoli sono necessari per creare e gestire le immagini container nel registro degli artefatti.Il ruolo Amministratore globale della replica del volume (
app-volume-replication-admin-global
) per amministrare la relazione di replica del volume per le risorse di archiviazione a blocchi.I ruoli Amministratore oggetti bucket progetto (
project-bucket-object-admin
) e Amministratore bucket progetto (project-bucket-admin
) per creare e gestire i bucket di archiviazione.
Per ulteriori informazioni, consulta le descrizioni dei ruoli.
Installa e configura gcloud CLI e configura i contesti globali e di zona. Per saperne di più, vedi Gestire le risorse tra le zone.
Installa e configura la CLI kubectl con i file kubeconfig appropriati impostati per il server API globale, il server API di gestione e il cluster Kubernetes. Per saperne di più, consulta Generare manualmente il file kubeconfig.
Crea un cluster Kubernetes in più zone
Un cluster Kubernetes è una risorsa di zona, quindi devi creare un cluster separatamente in ogni zona.
Console
Nel menu di navigazione, seleziona Kubernetes Engine > Cluster.
Fai clic su Crea cluster.
Nel campo Nome, specifica un nome per il cluster.
Seleziona la versione di Kubernetes per il cluster.
Seleziona la zona in cui creare il cluster.
Fai clic su Collega progetto e seleziona un progetto esistente da collegare al cluster. Quindi, fai clic su Salva. Puoi collegare o scollegare i progetti dopo aver creato il cluster dalla pagina Dettagli progetto. Prima di eseguire il deployment dei carichi di lavoro dei container, devi collegare un progetto al cluster.
Fai clic su Avanti.
Configura le impostazioni di rete per il cluster. Non puoi modificare queste impostazioni di rete dopo aver creato il cluster. Il protocollo Internet predefinito e unico supportato per i cluster Kubernetes è Internet Protocol versione 4 (IPv4).
Specifica le dimensioni del pool di indirizzi IP del bilanciatore del carico, ad esempio
20
.Seleziona il CIDR (Classless Inter-Domain Routing) del servizio da utilizzare. Ai tuoi servizi di cui è stato eseguito il deployment, come i bilanciatori del carico, vengono allocati indirizzi IP da questo intervallo.
Seleziona il CIDR del pod da utilizzare. Il cluster alloca indirizzi IP da questo intervallo ai tuoi pod e alle tue VM.
Fai clic su Avanti.
Rivedi i dettagli del pool di nodi predefinito generato automaticamente per il cluster. Fai clic su edit Modifica per modificare il pool di nodi predefinito.
Per creare altri node pool, seleziona Aggiungi node pool. Quando modifichi il pool di nodil predefinito o aggiungi un nuovopool di nodil, lo personalizzi con le seguenti opzioni:
- Assegna un nome al pool di nodi. Non puoi modificare il nome dopo aver creato il pool di nodi.
- Specifica il numero di nodi worker da creare nel pool di nodi.
Seleziona la classe di macchine più adatta ai requisiti del tuo workload. Visualizza l'elenco delle seguenti impostazioni:
- Tipo di macchina
- CPU
- Memoria
Fai clic su Salva.
Fai clic su Crea per creare il cluster.
Ripeti questi passaggi per ogni zona del tuo universo GDC. Assicurati che in ogni zona che vuoi utilizzare per la tua strategia HA sia presente un cluster Kubernetes.
API
Per creare un nuovo cluster Kubernetes utilizzando direttamente l'API, applica una risorsa personalizzata a ogni zona GDC.
Crea una risorsa personalizzata
Cluster
e implementala sul server dell'API Management per la tua zona:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF \ apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform spec: clusterNetwork: podCIDRSize: POD_CIDR serviceCIDRSize: SERVICE_CIDR initialVersion: kubernetesVersion: KUBERNETES_VERSION loadBalancer: ingressServiceIPSize: LOAD_BALANCER_POOL_SIZE nodePools: - machineTypeName: MACHINE_TYPE name: NODE_POOL_NAME nodeCount: NUMBER_OF_WORKER_NODES taints: TAINTS labels: LABELS acceleratorOptions: gpuPartitionScheme: GPU_PARTITION_SCHEME releaseChannel: channel: UNSPECIFIED EOF
Sostituisci quanto segue:
MANAGEMENT_API_SERVER
: il percorso kubeconfig del server API Management zonale. Per ulteriori informazioni, vedi Passare al contesto zonale.CLUSTER_NAME
: il nome del cluster. Il nome del cluster non deve terminare con-system
. Il suffisso-system
è riservato ai cluster creati da GDC.POD_CIDR
: la dimensione degli intervalli di rete da cui vengono allocati gli indirizzi IP virtuali (VIP) dei pod. Se non viene configurato, viene utilizzato <x0A>il valore predefinito21
.SERVICE_CIDR
: la dimensione degli intervalli di rete da cui vengono allocati i VIP del servizio. Se non viene configurato, viene utilizzato il valore predefinito23
.KUBERNETES_VERSION
: la versione di Kubernetes del cluster, ad esempio1.26.5-gke.2100
. Per elencare le versioni di Kubernetes disponibili da configurare, consulta Elenca le versioni di Kubernetes disponibili per un cluster.LOAD_BALANCER_POOL_SIZE
: la dimensione dei pool di indirizzi IP non sovrapposti utilizzati dai servizi di bilanciamento del carico. Se non impostato, viene utilizzato il valore predefinito20
.MACHINE_TYPE
: il tipo di macchina per i nodi worker delpool di nodil. Visualizza i tipi di macchina disponibili per ciò che è disponibile per la configurazione.NODE_POOL_NAME
: il nome del pool di nodi.NUMBER_OF_WORKER_NODES
: il numero di nodi di lavoro di cui eseguire il provisioning nelpool di nodil.TAINTS
: le incompatibilità da applicare ai nodi di questo pool di nodi. Questo è un campo facoltativo.LABELS
: le etichette da applicare ai nodi di questopool di nodil. Contiene un elenco di coppie chiave-valore. Questo è un campo facoltativo.GPU_PARTITION_SCHEME
: lo schema di partizionamento della GPU, se esegui carichi di lavoro GPU, ad esempiomixed-2
. La GPU non è partizionata se questo campo non è impostato. Per i profili GPU multi-istanza (MIG) disponibili, vedi Profili MIG supportati.
Ripeti il passaggio precedente per ogni zona in cui vuoi ospitare l'applicazione container per la tua strategia HA.
Configura i bilanciatori del carico
Per distribuire il traffico tra i pod in zone diverse, crea bilanciatori del carico. Hai la possibilità di creare bilanciatori del carico esterni (ELB) e bilanciatori del carico interni (ILB), entrambi configurabili a livello di zona o globale. Per questo esempio, configura un bilanciamento del carico interno globale e un bilanciamento del carico esterno globale per l'applicazione container.
Crea un bilanciatore del carico interno globale
I bilanciatori del carico interni (ILB) espongono i servizi all'interno dell'organizzazione da un pool di indirizzi IP interni assegnato all'organizzazione. Un servizio ILB non è mai accessibile da qualsiasi endpoint al di fuori dell'organizzazione.
Completa i seguenti passaggi per creare un bilanciamento del carico interno globale per i tuoi carichi di lavoro dei container.
gdcloud
Crea un bilanciatore del carico interno che ha come target i carichi di lavoro dei pod utilizzando gcloud CLI.
Questo bilanciatore del carico interno ha come target tutti i carichi di lavoro nel progetto che corrispondono all'etichetta
definita nell'oggetto Backend
. La risorsa personalizzata Backend
deve essere
limitata a una zona.
Per creare un bilanciamento del carico interno utilizzando gcloud CLI:
Crea una risorsa
Backend
zonale in ogni zona in cui vengono eseguiti i pod per definire l'endpoint per il bilanciamento del carico interno:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
Sostituisci quanto segue:
BACKEND_NAME
: il nome scelto per la risorsa di backend, ad esempiomy-backend
.LABELS
: il selettore che definisce quali endpoint tra i pod utilizzare per questa risorsa di backend, ad esempioapp=web
.PROJECT
: il nome del progetto.CLUSTER_NAME
: il cluster Kubernetes a cui è limitato l'ambito dei selettori definiti. Se questo campo non viene specificato, vengono selezionati tutti gli endpoint con l'etichetta indicata. Questo campo è facoltativo.ZONE
: la zona da utilizzare per questa chiamata. Per preimpostare il flag di zona per tutti i comandi che lo richiedono, eseguigdcloud config set core/zone ZONE
. Il flag di zona è disponibile solo negli ambienti multizona. Questo campo è facoltativo.
Ripeti questo passaggio per ogni zona del tuo universo GDC.
Crea una risorsa
BackendService
globale:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --global
Sostituisci quanto segue:
BACKEND_SERVICE_NAME
: il nome del servizio di backend.PROJECT
: il nome del progetto.TARGET_PORTS
: un elenco separato da virgole di porte di destinazione che questo servizio di backend traduce, in cui ogni porta di destinazione specifica il protocollo, la porta nella regola di forwarding e la porta nell'istanza di backend. Puoi specificare più porte di destinazione. Questo campo deve essere nel formatoprotocol:port:targetport
, ad esempioTCP:80:8080
. Questo campo è facoltativo.
Aggiungi la risorsa
BackendService
alla risorsaBackend
creata in precedenza in ogni zona:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend-zone=ZONE \ --backend=BACKEND_NAME \ --project=PROJECT \ --global
Sostituisci quanto segue:
BACKEND_SERVICE_NAME
: il nome del servizio di backend globale.ZONE
: la zona del backend.BACKEND_NAME
: il nome del backend zonale.PROJECT
: il nome del progetto.
Completa questo passaggio per ogni backend di zona che hai creato in precedenza.
Crea una risorsa
ForwardingRule
interna che definisca l'indirizzo IP virtuale (VIP) in cui è disponibile il servizio:gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --project=PROJECT \ --global
Sostituisci quanto segue:
FORWARDING_RULE_INTERNAL_NAME
: il nome della regola di forwarding.CIDR
: il CIDR da utilizzare per la regola di forwarding. Questo campo è facoltativo. Se non specificato, un CIDRIPv4/32
viene riservato automaticamente dal pool di indirizzi IP globali. Specifica il nome di una risorsaSubnet
nello stesso spazio dei nomi di questa regola di forwarding. Una risorsaSubnet
rappresenta le informazioni su richiesta e allocazione di una subnet globale. Per ulteriori informazioni sulle risorseSubnet
, vedi Gestire le subnet.PROTOCOL_PORT
: il protocollo e la porta da esporre nella regola di forwarding. Questo campo deve essere nel formatoip-protocol=TCP:80
. La porta esposta deve essere la stessa di quella esposta dall'applicazione effettiva all'interno del container.
Per convalidare il bilanciamento del carico interno configurato, conferma la condizione
Ready
su ciascuno degli oggetti creati. Verifica il traffico con una richiestacurl
al VIP:Per ottenere il VIP assegnato, descrivi la regola di forwarding:
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME --global
Verifica il traffico con una richiesta
curl
al VIP sulla porta specificata nel campo della regola di forwarding:curl http://FORWARDING_RULE_VIP:PORT
Sostituisci quanto segue:
FORWARDING_RULE_VIP
: il VIP della regola di forwarding.PORT
: il numero di porta della regola di inoltro.
API
Crea un bilanciatore del carico interno che ha come target i carichi di lavoro dei container utilizzando l'API KRM. Questo bilanciamento del carico interno ha come target tutti i workload nel progetto che corrispondono all'etichetta definita nell'oggetto Backend
. Per creare un bilanciamento del carico interno globale utilizzando l'API KRM:
Crea una risorsa
Backend
per definire gli endpoint per il bilanciamento del carico interno. Crea risorseBackend
per ogni zona in cui vengono inseriti i carichi di lavoro dei container:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
Sostituisci quanto segue:
MANAGEMENT_API_SERVER
: il percorso kubeconfig del server API Management zonale. Per maggiori informazioni, vedi Passare a un contesto zonale.PROJECT
: il nome del progetto.BACKEND_NAME
: il nome della risorsaBackend
.CLUSTER_NAME
: il cluster Kubernetes a cui è limitato l'ambito dei selettori definiti. Se questo campo non viene specificato, vengono selezionati tutti gli endpoint con l'etichetta indicata. Questo campo è facoltativo.APP_NAME
: il nome dell'applicazione container.
Puoi utilizzare la stessa risorsa
Backend
per ogni zona o creare risorseBackend
con set di etichette diversi per ogni zona.Crea un oggetto
BackendService
utilizzando la risorsaBackend
creata in precedenza. Assicurati di includere la risorsaHealthCheck
:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF
Sostituisci quanto segue:
GLOBAL_API_SERVER
: il percorso kubeconfig del percorso kubeconfig del server API globale.PROJECT
: il nome del progetto.BACKEND_SERVICE_NAME
: il nome scelto per la risorsaBackendService
.HEALTH_CHECK_NAME
: il nome della risorsaHealthCheck
creata in precedenza.BACKEND_NAME
: il nome della risorsaBackend
zonale.ZONE
: la zona in cui risiede la risorsaBackend
. Puoi specificare più backend nel campobackendRefs
. Ad esempio:- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
Il campo
targetPorts
è facoltativo. Questa risorsa elenca le porte che questa risorsaBackendService
traduce. Se utilizzi questo oggetto, fornisci i valori per quanto segue:PORT
: la porta esposta dal servizio.PROTOCOL
: il protocollo di livello 4 a cui deve corrispondere il traffico. Sono supportati solo TCP e UDP.TARGET_PORT
: la porta a cui viene tradotto il valore, ad esempio8080
. Il valore non può essere ripetuto in un determinato oggetto.Un esempio per
targetPorts
potrebbe avere il seguente aspetto:targetPorts: - port: 80 protocol: TCP targetPort: 8080
Crea una risorsa
ForwardingRule
interna che definisca l'indirizzo IP virtuale (VIP) in cui è disponibile il servizio.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Sostituisci quanto segue:
GLOBAL_API_SERVER
: il percorso kubeconfig del percorso kubeconfig del server API globale.PROJECT
: il nome del progetto.FORWARDING_RULE_INTERNAL_NAME
: il nome scelto per la risorsaForwardingRuleInternal
.CIDR
: il CIDR da utilizzare per la regola di forwarding. Questo campo è facoltativo. Se non specificato, un CIDRIPv4/32
viene riservato automaticamente dal pool di indirizzi IP globali. Specifica il nome di una risorsaSubnet
nello stesso spazio dei nomi di questa regola di forwarding. Una risorsaSubnet
rappresenta le informazioni su richiesta e allocazione di una subnet globale. Per ulteriori informazioni sulle risorseSubnet
, vedi Gestire le subnet.PORT
: la porta da esporre nella regola di inoltro. Utilizza il campoports
per specificare un array di porte L4 per le quali i pacchetti vengono inoltrati ai backend configurati con questa regola di inoltro. È necessario specificare almeno una porta. Utilizza il campoport
per specificare un numero di porta. La porta esposta deve essere la stessa che l'applicazione effettiva espone all'interno del container.PROTOCOL
: il protocollo da utilizzare per la regola di forwarding, ad esempioTCP
. Una voce nell'arrayports
deve avere il seguente aspetto:ports: - port: 80 protocol: TCP
Per convalidare il bilanciamento del carico interno configurato, conferma la condizione
Ready
su ciascuno degli oggetti creati. Verifica il traffico con una richiestacurl
al VIP:Recupera il VIP:
kubectl get forwardingruleinternal -n PROJECT
L'output è simile al seguente:
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Testa il traffico con una richiesta
curl
al VIP sulla porta specificata nel campo della regola di forwarding:curl http://FORWARDING_RULE_VIP:PORT
Sostituisci quanto segue:
FORWARDING_RULE_VIP
: il VIP della regola di forwarding.PORT
: il numero di porta del campo nella regola di forwarding.
Crea un bilanciatore del carico esterno globale
I bilanciatori del carico esterni (ELB) espongono i servizi per l'accesso dall'esterno dell'organizzazione da un pool di indirizzi IP assegnati all'organizzazione dal pool di indirizzi IP esterni delle istanze più grande.
Completa i seguenti passaggi per creare un ELB globale per i tuoi carichi di lavoro dei container.
gdcloud
Utilizza gcloud CLI per creare un ELB globale che abbia come target tutti i
carichi di lavoro nel progetto corrispondenti all'etichetta definita nell'oggetto Backend
.
La risorsa personalizzata Backend
deve essere limitata a una zona.
Affinché i servizi ELB funzionino, devi configurare e applicare il tuo trasferimento di dati
ProjectNetworkPolicy
personalizzato nelle norme per consentire il traffico ai carichi di lavoro di questo servizio ELB. I criteri di rete controllano l'accesso ai tuoi workload, non al bilanciatore del carico stesso. Gli ELB espongono i workload alla rete dei clienti, richiedendo policy di rete esplicite per consentire il traffico esterno alla porta del workload, ad esempio8080
.Specifica l'indirizzo CIDR esterno per consentire il traffico ai carichi di lavoro di questo ELB:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Sostituisci quanto segue:
GLOBAL_API_SERVER
: il percorso kubeconfig del percorso kubeconfig del server API globale. Se non hai ancora generato un file kubeconfig per il server API globale, consulta Generare manualmente il file kubeconfig per maggiori dettagli.PROJECT
: il nome del progetto.CIDR
: il CIDR esterno da cui deve essere accessibile l'ELB. Questo criterio è necessario perché il bilanciatore del carico esterno utilizza il ritorno diretto del server (DSR), che conserva l'indirizzo IP esterno di origine e bypassa il bilanciatore del carico sul percorso di ritorno. Per ulteriori informazioni, vedi Creare una regola firewall in entrata globale per il traffico tra organizzazioni.PORT
: la porta di backend sui pod dietro il bilanciatore del carico. Questo valore si trova nel campo.spec.ports[].targetPortfield
del manifest della risorsaService
. Questo campo è facoltativo.
Questa configurazione fornisce a tutte le risorse all'interno dei progetti l'accesso all'intervallo CIDR specificato.
Crea una risorsa
Backend
in ogni zona per definire l'endpoint per ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
Sostituisci quanto segue:
BACKEND_NAME
: il nome della risorsa di backend, ad esempiomy-backend
.LABELS
: un selettore che definisce quali endpoint tra i pod utilizzare per questa risorsa di backend, ad esempioapp=web
.PROJECT
: il nome del progetto.CLUSTER_NAME
: il cluster Kubernetes a cui è limitato l'ambito dei selettori definiti. Se questo campo non viene specificato, vengono selezionati tutti gli endpoint con l'etichetta indicata. Questo campo è facoltativo.ZONE
: la zona da utilizzare per questa chiamata. Per preimpostare il flag di zona per tutti i comandi che lo richiedono, eseguigdcloud config set core/zone ZONE
. Il flag di zona è disponibile solo negli ambienti multizona. Questo campo è facoltativo.
Puoi utilizzare la stessa risorsa
Backend
per ogni zona o creare risorseBackend
con set di etichette diversi per ogni zona.Crea una risorsa
BackendService
globale:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global
Sostituisci quanto segue:
BACKEND_SERVICE_NAME
: il nome scelto per questo servizio di backend.PROJECT
: il nome del progetto.TARGET_PORTS
: un elenco separato da virgole di porte di destinazione che questo servizio di backend traduce, dove ogni porta di destinazione specifica il protocollo, la porta nella regola di forwarding e la porta nell'istanza di backend. Puoi specificare più porte di destinazione. Questo campo deve essere nel formatoprotocol:port:targetport
, ad esempioTCP:80:8080
. Questo campo è facoltativo.HEALTH_CHECK_NAME
: il nome della risorsa di controllo di integrità. Questo campo è facoltativo.
Aggiungi la risorsa globale
BackendService
alla risorsa di zonaBackend
creata in precedenza:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone=ZONE \ --project=PROJECT \ --global
Completa questo passaggio per ogni backend di zona che hai creato in precedenza.
Crea una risorsa
ForwardingRule
esterna che definisce il VIP in cui è disponibile il servizio:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT \ --global
Sostituisci quanto segue:
FORWARDING_RULE_EXTERNAL_NAME
: il nome della regola di forwardingo.CIDR
: il CIDR da utilizzare per la regola di forwarding. Questo campo è facoltativo. Se non specificato, un CIDRIPv4/32
viene riservato automaticamente dal pool di indirizzi IP globali. Specifica il nome di una risorsaSubnet
nello stesso spazio dei nomi di questa regola di forwarding. Una risorsaSubnet
rappresenta le informazioni su richiesta e allocazione di una subnet globale. Per ulteriori informazioni sulle risorseSubnet
, consulta Gestire le subnet.PROTOCOL_PORT
: il protocollo e la porta da esporre nella regola di forwarding. Questo campo deve essere nel formatoip-protocol=TCP:80
. La porta esposta deve essere la stessa che l'applicazione effettiva espone all'interno del container.PROJECT
: il nome del progetto.
Per convalidare l'ELB configurato, conferma la condizione
Ready
su ciascuno degli oggetti creati. Verifica il traffico con una richiestacurl
al VIP:Per ottenere il VIP assegnato, descrivi la regola di forwarding:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
Verifica il traffico con una richiesta
curl
al VIP sulla porta specificata nel campoPROTOCOL_PORT
della regola di forwarding:curl http://FORWARDING_RULE_VIP:PORT
Sostituisci quanto segue:
FORWARDING_RULE_VIP
: il VIP della regola di inoltro.PORT
: il numero di porta del campoPROTOCOL_PORT
nella regola di forwarding.
API
Crea un ELB che abbia come target i carichi di lavoro dei pod utilizzando l'API KRM. Questo ELB
ha come target tutti i workload nel progetto che corrispondono all'etichetta definita nell'oggetto
Backend
. Per creare un ELB a livello di zona utilizzando l'API KRM:
Affinché i servizi ELB funzionino, devi configurare e applicare il tuo trasferimento di dati
ProjectNetworkPolicy
personalizzato nelle norme per consentire il traffico ai carichi di lavoro di questo servizio ELB. I criteri di rete controllano l'accesso ai tuoi workload, non al bilanciatore del carico stesso. Gli ELB espongono i workload alla rete dei clienti, richiedendo policy di rete esplicite per consentire il traffico esterno alla porta del workload, ad esempio8080
.Specifica l'indirizzo CIDR esterno per consentire il traffico ai carichi di lavoro di questo ELB:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Sostituisci quanto segue:
GLOBAL_API_SERVER
: il percorso kubeconfig del percorso kubeconfig del server API globale. Se non hai ancora generato un file kubeconfig per il server API globale, consulta Generare manualmente il file kubeconfig per maggiori dettagli.PROJECT
: il nome del progetto.CIDR
: il CIDR esterno da cui deve essere accessibile l'ELB. Questo criterio è necessario perché il bilanciatore del carico esterno utilizza il ritorno diretto del server (DSR), che conserva l'indirizzo IP esterno di origine e bypassa il bilanciatore del carico sul percorso di ritorno. Per ulteriori informazioni, vedi Creare una regola firewall in entrata globale per il traffico tra organizzazioni.PORT
: la porta di backend sui pod dietro il bilanciatore del carico. Questo valore si trova nel campo.spec.ports[].targetPortfield
del manifest della risorsaService
. Questo campo è facoltativo.
Crea una risorsa
Backend
per definire gli endpoint per ELB. Crea risorseBackend
per ogni zona in cui vengono inseriti i carichi di lavoro:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
Sostituisci quanto segue:
MANAGEMENT_API_SERVER
: il percorso kubeconfig del server API Management zonale. Se non hai ancora generato un file kubeconfig per il server API nella zona di destinazione, consulta Generare manualmente il file kubeconfig per maggiori dettagli.PROJECT
: il nome del progetto.BACKEND_NAME
: il nome della risorsaBackend
.CLUSTER_NAME
: il cluster Kubernetes a cui è limitato l'ambito dei selettori definiti. Se questo campo non viene specificato, vengono selezionati tutti gli endpoint con l'etichetta indicata. Questo campo è facoltativo.APP_NAME
: il nome dell'applicazione container.
Puoi utilizzare la stessa risorsa
Backend
per ogni zona o creare risorseBackend
con set di etichette diversi per ogni zona.Crea un oggetto
BackendService
utilizzando la risorsaBackend
creata in precedenza:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME EOF
Sostituisci quanto segue:
BACKEND_SERVICE_NAME
: il nome scelto per la risorsaBackendService
.HEALTH_CHECK_NAME
: il nome della risorsaHealthCheck
creata in precedenza. Non includere questo campo se stai configurando un ELB per i workload dei pod.ZONE
: la zona in cui risiede la risorsaBackend
. Puoi specificare più backend nel campobackendRefs
. Ad esempio:
- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
Crea una risorsa
ForwardingRule
esterna che definisca l'IP virtuale a cui è disponibile il servizio.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Sostituisci quanto segue:
FORWARDING_RULE_EXTERNAL_NAME
: il nome scelto per la risorsaForwardingRuleExternal
.CIDR
: il CIDR da utilizzare per la regola di forwarding. Questo campo è facoltativo. Se non specificato, un CIDRIPv4/32
viene riservato automaticamente dal pool di indirizzi IP globali. Specifica il nome di una risorsaSubnet
nello stesso spazio dei nomi di questa regola di forwarding. Una risorsaSubnet
rappresenta le informazioni su richiesta e allocazione di una subnet globale. Per ulteriori informazioni sulle risorseSubnet
, consulta Gestire le subnet.PORT
: la porta da esporre nella regola di forwarding. Utilizza il campoports
per specificare un array di porte L4 per le quali i pacchetti vengono inoltrati ai backend configurati con questa regola di forwarding. È necessario specificare almeno una porta. Utilizza il campoport
per specificare un numero di porta. La porta esposta deve essere la stessa che l'applicazione effettiva espone all'interno del container.PROTOCOL
: il protocollo da utilizzare per la regola di forwarding, ad esempioTCP
. Una voce nell'arrayports
deve avere il seguente aspetto:
ports: - port: 80 protocol: TCP
Per convalidare l'ELB configurato, conferma la condizione
Ready
su ciascuno degli oggetti creati. Prova e testa il traffico con una richiestacurl
al VIP.Recupera il VIP per il progetto:
kubectl get forwardingruleexternal -n PROJECT
L'output è simile al seguente:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Verifica il traffico con una richiesta curl al VIP sulla porta specificata nel campo
PORT
della regola di forwarding:curl http://FORWARDING_RULE_VIP:PORT
Sostituisci
FORWARDING_RULE_VIP:PORT
con l'indirizzo VIP e la porta della regola di forwarding, ad esempio192.0.2.0:80
.
Esegui il deployment dei carichi di lavoro dei container in ogni cluster di zona
I carichi di lavoro dei container non sono una risorsa globale, il che significa che devi eseguire il deployment di ciascuna delle tue applicazioni container separatamente nei cluster Kubernetes zonali.
Accedi alla zona che ospita il cluster Kubernetes:
gdcloud config set core/zone ZONE
Verifica che l'immagine container sia disponibile nel registro Harbor gestito. Per saperne di più, consulta il tutorial Eseguire il deployment di un'app container.
Crea un file manifest per il tuo workload container ed eseguine il deployment nel tuo cluster Kubernetes zonale:
kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS selector: matchLabels: run: APP_NAME template: metadata: labels: run: APP_NAME spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG EOF
Sostituisci quanto segue:
KUBERNETES_CLUSTER
: il file kubeconfig per il cluster Kubernetes zonale in cui stai eseguendo il deployment dei carichi di lavoro dei container. Se non hai ancora generato un file kubeconfig per il tuo cluster Kubernetes zonale, consulta Generare manualmente il file kubeconfig per maggiori dettagli.PROJECT
: lo spazio dei nomi del progetto in cui eseguire il deployment dei carichi di lavoro dei container.DEPLOYMENT_NAME
: il nome del deployment del container.NUMBER_OF_REPLICAS
: il numero di oggettiPod
replicati gestiti dal deployment.APP_NAME
: il nome dell'applicazione da eseguire all'interno del deployment.CONTAINER_NAME
: il nome del container.HARBOR_INSTANCE_URL
: l'URL dell'istanza Harbor, ad esempioharbor-1.org-1.zone1.google.gdc.test.
. Per recuperare l'URL dell'istanza Harbor, consulta Visualizzare le istanze del registro Harbor.HARBOR_PROJECT_NAME
: il nome del progetto Harbor, ad esempiomy-project
.IMAGE
: il nome dell'immagine, ad esempionginx
.TAG
: il tag per la versione dell'immagine che vuoi estrarre, ad esempio1.0
.
Ripeti i passaggi precedenti per ogni zona del tuo universo GDC. Assicurati che l'applicazione contenitore si trovi in ogni zona che vuoi per la tua strategia di alta disponibilità.
Esporre l'applicazione containerizzata utilizzando Kubernetes
Devi esporre l'applicazione contenitore per consentire l'accesso da altre risorse nel tuo universo GDC.
Crea una risorsa
Service
ditype: LoadBalancer
. Questa risorsa espone i pod della tua applicazione su una rete.kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: v1 kind: Service metadata: name: SERVICE_NAME spec: selector: app: APP_NAME ports: - port: 80 protocol: TCP type: LoadBalancer EOF
Sostituisci quanto segue:
KUBERNETES_CLUSTER
: il file kubeconfig per il cluster Kubernetes zonale in cui stai eseguendo il deployment dei carichi di lavoro dei container.PROJECT
: lo spazio dei nomi del progetto in cui risiedono i carichi di lavoro dei container.SERVICE_NAME
: il nome del servizio di bilanciamento del carico.APP_NAME
: l'etichetta che hai applicato alla tua applicazione container.
Crea una risorsa personalizzata
NetworkPolicy
per consentire tutto il traffico di rete allo spazio dei nomi predefinito:kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOF
Provisioning dell'archiviazione permanente per i pod
Devi creare una risorsa PersistentVolumeClaim
(PVC) per fornire ai pod dell'applicazione uno spazio di archiviazione permanente.
Le seguenti istruzioni mostrano come creare un volume utilizzando
standard-rwo
StorageClass
di GDC.
Crea una risorsa
PersistentVolumeClaim
. Ad esempio, configuralo con una modalità di accessoReadWriteOnce
e una classe di archiviazionestandard-rwo
:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: PVC_NAME spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard-rwo EOF
Sostituisci quanto segue:
KUBERNETES_CLUSTER
: il file kubeconfig per il cluster Kubernetes.PROJECT
: lo spazio dei nomi del progetto in cui creare il PVC.PVC_NAME
: il nome dell'oggettoPersistentVolumeClaim
.
Gli oggetti
PersistentVolume
(PV) vengono sottoposti a provisioning dinamico. Controlla lo stato dei nuovi PV nel cluster Kubernetes:kubectl get pv --kubeconfig KUBERNETES_CLUSTER
L'output è simile al seguente:
NAME CAPACITY ACCESS MODES STATUS CLAIM STORAGECLASS AGE pvc-uuidd 10Gi RWO Bound pvc-name standard-rwo 60s
Configura i tuoi workload containerizzati per utilizzare il PVC. Di seguito è riportato un esempio di manifest del pod che utilizza un PVC
standard-rwo
:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: apps/v1 kind: Pod metadata: name: web-server-deployment labels: app: APP_LABEL spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG volumeMounts: - mountPath: MOUNT_PATH name: data volumes: - name: data persistentVolumeClaim: claimName: PVC_NAME EOF
Sostituisci quanto segue:
KUBERNETES_CLUSTER
: il file kubeconfig per il cluster Kubernetes in cui stai eseguendo il deployment dei carichi di lavoro dei container.PROJECT
: lo spazio dei nomi del progetto in cui si trova il PVC.APP_LABEL
: l'etichetta che hai applicato alla tua applicazione container.CONTAINER_NAME
: il nome del container.HARBOR_INSTANCE_URL
: l'URL dell'istanza Harbor, ad esempioharbor-1.org-1.zone1.google.gdc.test.
. Per recuperare l'URL dell'istanza Harbor, consulta Visualizzare le istanze del registro Harbor.HARBOR_PROJECT_NAME
: il nome del progetto Harbor, ad esempiomy-project
.IMAGE
: il nome dell'immagine, ad esempionginx
.TAG
: il tag per la versione dell'immagine che vuoi estrarre, ad esempio1.0
.MOUNT_PATH
: il percorso all'interno del pod per montare il volume.PVC_NAME
: il PVC che hai creato.
Configura la replica asincrona dell'archiviazione
Gli universi multizona GDC offrono l'utilizzo di risorse di archiviazione replicate come volumi e bucket in modalità asincrona per scenari di ripristino di emergenza. Queste opzioni di risorse di archiviazione forniscono la replica asincrona dei dati tra due zone qualsiasi nella stessa regione. La replica asincrona viene eseguita in background, fornendo un RPO (Recovery Point Objective) basso, ma diverso da zero, in caso di emergenza. Tutti i dati replicati sono online e immediatamente accessibili, ma potrebbe essere necessaria una procedura di failover manuale per abilitare la scrittura nella zona secondaria.
Puoi scegliere uno dei seguenti tipi di replica asincrona dell'archiviazione per l'applicazione contenitore:
Crea un bucket dual-zone per l'archiviazione degli oggetti
I dati di archiviazione di oggetti vengono scritti in un singolo bucket i cui dati vengono archiviati in entrambe le zone. Poiché i dati vengono copiati in modo asincrono tra le zone, queste potrebbero non contenere le stesse versioni degli oggetti in un determinato momento, ma alla fine diventeranno equivalenti se non vengono apportate ulteriori modifiche. A differenza della replica dei volumi, i bucket replicati sono scrivibili durante le partizioni di zona. Ogni scrittura in un oggetto produce una versione diversa e l'ultima versione in una zona sarà lo stato finale dopo il ripristino della connettività.
Verifica che l'operatore dell'infrastruttura (IO) abbia creato la risorsa personalizzata
BucketLocationConfig
, necessaria per la replica asincrona tra zone per l'archiviazione di oggetti. Questa risorsa deve essere implementata nel server API globale principale.Crea la risorsa personalizzata
Bucket
a doppia zona:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: object.global.gdc.goog/v1 kind: Bucket metadata: name: BUCKET_NAME namespace: PROJECT spec: location: LOCATION_NAME description: Sample DZ Bucket storageClass: Standard EOF
Sostituisci quanto segue:
GLOBAL_API_SERVER
: il file kubeconfig per il server API globale.BUCKET_NAME
: il nome del bucket di archiviazione.PROJECT
: il nome del progetto in cui si trova il bucket.LOCATION_NAME
: il luogo fisico in cui risiedono i dati degli oggetti nel bucket. Deve corrispondere al nome di una risorsaBucketLocation
esistente. Per eseguire query sul server API globale della tua organizzazione per un elenco di risorseBucketLocation
disponibili, eseguikubectl --kubeconfig GLOBAL_API_SERVER bucketlocations
. Se non sono presenti risorseBucketLocation
, contatta il tuo IO per verificare che abbia attivato la replica asincrona.
Configura la replica asincrona dell'archiviazione a blocchi tra zone
L'archiviazione a blocchi replicata fornisce volumi (PV) replicati in modo asincrono, che mantengono l'equivalenza dei blocchi tra i volumi primario e secondario. A causa della natura asincrona, il volume secondario riflette lo stato della zona primaria in un momento del passato (RPO diverso da zero). Il volume secondario non è montabile finché rimane la destinazione della replica, il che richiede un intervento manuale per terminare la relazione e consentire le scritture.
Devi configurare una relazione di replica dell'archiviazione tra zone per creare dati replicati disponibili per il failover se i dati della zona di origine non sono più disponibili. Questo è pertinente se utilizzi l'archiviazione a blocchi per l'applicazione container.
Prima di iniziare, verifica che l'operatore dell'infrastruttura (IO) abbia creato e configurato le risorse personalizzate StorageClusterPeering
e StorageVirtualMachinePeering
per consentire la replica dell'archiviazione a blocchi tra le zone. Questa risorsa
deve essere implementata nel server API globale principale.
Crea un file YAML della risorsa personalizzata
VolumeReplicationRelationship
e deployalo sul server API globale:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: storage.global.gdc.goog/v1 kind: VolumeReplicationRelationship metadata: name: PVC_REPL_NAME namespace: PROJECT spec: source: pvc: clusterRef: SOURCE_PVC_CLUSTER pvcRef: SOURCE_PVC zoneRef: SOURCE_ZONE destination: pvc: clusterRef: DEST_PVC_CLUSTER zoneRef: DEST_ZONE EOF
Sostituisci quanto segue:
GLOBAL_API_SERVER
: il file kubeconfig per il server API globale.PVC_REPL_NAME
: il nome della relazione di replica del volume.PROJECT
: il progetto in cui si trova l'infrastruttura di archiviazione.SOURCE_PVC_CLUSTER
: il cluster Kubernetes in cui è ospitato il PVC.SOURCE_PVC
: il PVC nella zona di origine da replicare.SOURCE_ZONE
: la zona di origine in cui è ospitato il PVC.DEST_PVC_CLUSTER
: il cluster Kubernetes di destinazione in cui replicare il PVC.DEST_ZONE
: la zona di destinazione in cui replicare il PVC.
Crea una risorsa personalizzata
VolumeFailover
nella zona di destinazione, che interrompe la replica nella zona di destinazione se la zona di origine non è disponibile per qualsiasi motivo:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: PVC_FAILOVER_NAME namespace: PROJECT spec: volumeReplicationRelationshipRef: PVC_REPL_NAME EOF
Sostituisci quanto segue:
MANAGEMENT_API_SERVER
: il file kubeconfig del server API di gestione zonale.PVC_FAILOVER_NAME
: il nome del failover del PVC.PROJECT
: il progetto in cui si trova l'infrastruttura di archiviazione.PVC_REPL_NAME
: il nome della relazione di replica del volume.
Passaggi successivi
- Workload Kubernetes per l'alta disponibilità
- Carichi di lavoro con container in GDC
- Panoramica di più zone