PostgreSQL è una piattaforma open source un database relazionale a oggetti noto per l'affidabilità e l'integrità dei dati. È È conforme agli ACID e supporta chiavi esterne, join, viste, trigger e stored procedure.
Questo documento è rivolto agli amministratori di database, cloud architect e professionisti delle operazioni interessati al deployment di un database PostgreSQL ad alta disponibilità su Google Kubernetes Engine (GKE).
Obiettivi
In questo tutorial imparerai a:- Utilizza Terraform per creare un cluster GKE a livello di regione.
- Esegui il deployment di un database PostgreSQL ad alta disponibilità.
- Configura il monitoraggio per l'applicazione PostgreSQL.
- Eseguire gli upgrade del database PostgreSQL e del cluster GKE.
- Simula l'interruzione del cluster e il failover della replica PostgreSQL.
- Esegui il backup e il ripristino del database PostgreSQL.
Architettura
Questa sezione descrive l'architettura della soluzione che creerai in questo durante il tutorial.
Eseguirai il provisioning di due cluster GKE in regioni diverse: uno principale
cluster e un cluster di backup. Per questo tutorial, il cluster principale si trova
la regione us-central1
e il cluster di backup si trova nella regione us-west1
. Questo
consente di eseguire il provisioning di un database PostgreSQL ad alta disponibilità
per il ripristino di emergenza, come descritto più avanti in questo tutorial.
Per il cluster di origine, utilizzerai un grafico Helm (bitnami/postgresql-ha
) per configurare un cluster PostgreSQL ad alta disponibilità.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prima di iniziare
Configura il progetto
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Google Kubernetes Engine, Backup for GKE, Artifact Registry, Compute Engine, and IAM APIs.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Google Kubernetes Engine, Backup for GKE, Artifact Registry, Compute Engine, and IAM APIs.
Configurare i ruoli
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
role/storage.objectViewer, role/logging.logWriter, role/artifactregistry.Admin, roles/container.clusterAdmin, role/container.serviceAgent, roles/serviceusage.serviceUsageAdmin, roles/iam.serviceAccountAdmin
$ gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Configura l'ambiente
In questo tutorial utilizzerai Cloud Shell per gestire le risorse ospitate su Google Cloud. Cloud Shell è preinstallato con il software necessario
per questo tutorial, inclusi Docker, kubectl
, gcloud CLI, Helm,
e Terraform.
Per utilizzare Cloud Shell per configurare il tuo ambiente:
Avvia una sessione di Cloud Shell dalla console Google Cloud facendo clic su . Attiva Cloud Shell nella console Google Cloud. Viene avviata una sessione nel riquadro inferiore della console Google Cloud.
Imposta le variabili di ambiente.
export PROJECT_ID=PROJECT_ID export SOURCE_CLUSTER=cluster-db1 export REGION=us-central1
Sostituisci i seguenti valori:
- PROJECT_ID: il tuo ID progetto Google Cloud.
Imposta le variabili di ambiente predefinite.
gcloud config set project PROJECT_ID
Clona il repository di codice.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Passa alla directory di lavoro.
cd kubernetes-engine-samples/databases/gke-stateful-postgres
Crea l'infrastruttura del tuo cluster
In questa sezione eseguirai uno script Terraform per creare un Virtual Private Cloud (VPC) personalizzato, un repository Artifact Registry per archiviare le immagini PostgreSQL e due cluster GKE regionali.
Verrà eseguito il deployment di un cluster in us-central1
e del secondo cluster per il backup
verrà eseguito il deployment in us-west1
.
Per creare il cluster, segui questi passaggi:
Autopilot
In Cloud Shell, esegui questi comandi:
terraform -chdir=terraform/gke-autopilot init
terraform -chdir=terraform/gke-autopilot apply -var project_id=$PROJECT_ID
Quando richiesto, digita yes
.
Informazioni sulla configurazione di Terraform
I file di configurazione Terraform creano le seguenti risorse per eseguire il deployment dell'infrastruttura:
- Crea un repository Artifact Registry per archiviare le immagini Docker.
- Crea la rete VPC e la subnet per all'interfaccia di rete della VM.
Creare un cluster GKE principale.
Terraform crea un cluster privato nella regione
us-central1
e attiva Backup per GKE per il disaster recovery e Managed Service per Prometheus per il monitoraggio del cluster.Managed Service per Prometheus è supportato solo nei cluster Autopilot che eseguono GKE versione 1.25 o successive.
Crea un cluster di backup nella regione
us-west1
per il ripristino di emergenza.
Standard
In Cloud Shell, esegui i seguenti comandi:
terraform -chdir=terraform/gke-standard init
terraform -chdir=terraform/gke-standard apply -var project_id=$PROJECT_ID
Quando richiesto, digita yes
.
Informazioni sulla configurazione di Terraform
I file di configurazione Terraform creano le seguenti risorse per eseguire il deployment dell'infrastruttura:
- Creare un repository Artifact Registry per archiviare le immagini Docker.
- Crea la rete VPC e la subnet per all'interfaccia di rete della VM.
Creare un cluster GKE principale.
Terraform crea un cluster privato nella regione
us-central1
e attiva Backup per GKE per il disaster recovery e Managed Service per Prometheus per il monitoraggio del cluster.Crea un cluster di backup nella regione
us-west1
per il ripristino di emergenza.
Esegui il deployment di PostgreSQL sul tuo cluster
In questa sezione eseguirai il deployment di un'istanza di database PostgreSQL da eseguire GKE usando un grafico Helm.
Installa PostgreSQL
Per installare PostgreSQL nel cluster:
Configurare l'accesso a Docker.
gcloud auth configure-docker us-docker.pkg.dev
Compila Artifact Registry con le immagini Docker PostgreSQL richieste.
./scripts/gcr.sh bitnami/postgresql-repmgr 15.1.0-debian-11-r0 ./scripts/gcr.sh bitnami/postgres-exporter 0.11.1-debian-11-r27 ./scripts/gcr.sh bitnami/pgpool 4.3.3-debian-11-r28
Lo script esegue il push delle seguenti immagini Bitnami in Artifact Registry per Helm da installare:
postgresql-repmgr
: Questa soluzione di cluster PostgreSQL include PostgreSQL replication manager (repmgr), uno strumento open source per la gestione della replica e del failover sui cluster PostgreSQL.postgres-exporter
: PostgreSQL Exporter raccoglie le metriche PostgreSQL per Consumo di Prometheus.pgpool
: Pgpool-II è il proxy PostgreSQL. Fornisce il pooling delle connessioni e il bilanciamento del carico.
Verifica che le immagini corrette siano archiviate nel repository.
gcloud artifacts docker images list us-docker.pkg.dev/$PROJECT_ID/main \ --format="flattened(package)"
L'output è simile al seguente:
--- image: us-docker.pkg.dev/[PROJECT_ID]/main/bitnami/pgpool --- image: us-docker.pkg.dev/[PROJECT_ID]/main/bitnami/postgres-exporter --- image: us-docker.pkg.dev/h[PROJECT_ID]/main/bitnami/postgresql-repmgr
Configura l'accesso alla riga di comando
kubectl
al cluster principale.gcloud container clusters get-credentials $SOURCE_CLUSTER \ --region=$REGION --project=$PROJECT_ID
Crea uno spazio dei nomi.
export NAMESPACE=postgresql kubectl create namespace $NAMESPACE
Se esegui il deployment in un cluster Autopilot, configura il provisioning dei nodi su tre zone. Puoi saltare questo passaggio se stai eseguendo il deployment in un cluster Standard.
Per impostazione predefinita, Autopilot esegue il provisioning delle risorse in sole due zone. Il deployment definito in
prepareforha.yaml
garantisce che Autopilot esegui il provisioning dei nodi in tre zone del tuo cluster impostando i seguenti valori:replicas:3
podAntiAffinity
conrequiredDuringSchedulingIgnoredDuringExecution
etopologyKey: "topology.kubernetes.io/zone"
kubectl -n $NAMESPACE apply -f scripts/prepareforha.yaml
Aggiorna la dipendenza Helm.
cd helm/postgresql-bootstrap helm dependency update
Ispeziona e verifica i grafici che verranno installati da Helm.
helm -n postgresql template postgresql . \ --set global.imageRegistry="us-docker.pkg.dev/$PROJECT_ID/main"
Installa il grafico Helm.
helm -n postgresql upgrade --install postgresql . \ --set global.imageRegistry="us-docker.pkg.dev/$PROJECT_ID/main"
L'output è simile al seguente:
NAMESPACE: postgresql STATUS: deployed REVISION: 1 TEST SUITE: None
Verifica che le repliche PostgreSQL siano in esecuzione.
kubectl get all -n $NAMESPACE
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE pod/postgresql-postgresql-bootstrap-pgpool-75664444cb-dkl24 1/1 Running 0 8m39s pod/postgresql-postgresql-ha-pgpool-6d86bf9b58-ff2bg 1/1 Running 0 8m39s pod/postgresql-postgresql-ha-postgresql-0 2/2 Running 0 8m39s pod/postgresql-postgresql-ha-postgresql-1 2/2 Running 0 8m39s pod/postgresql-postgresql-ha-postgresql-2 2/2 Running 0 8m38s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/postgresql-postgresql-ha-pgpool ClusterIP 192.168.99.236 <none> 5432/TCP 8m39s service/postgresql-postgresql-ha-postgresql ClusterIP 192.168.90.20 <none> 5432/TCP 8m39s service/postgresql-postgresql-ha-postgresql-headless ClusterIP None <none> 5432/TCP 8m39s service/postgresql-postgresql-ha-postgresql-metrics ClusterIP 192.168.127.198 <none> 9187/TCP 8m39s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/postgresql-postgresql-bootstrap-pgpool 1/1 1 1 8m39s deployment.apps/postgresql-postgresql-ha-pgpool 1/1 1 1 8m39s NAME DESIRED CURRENT READY AGE replicaset.apps/postgresql-postgresql-bootstrap-pgpool-75664444cb 1 1 1 8m39s replicaset.apps/postgresql-postgresql-ha-pgpool-6d86bf9b58 1 1 1 8m39s NAME READY AGE statefulset.apps/postgresql-postgresql-ha-postgresql 3/3 8m39s
Crea un set di dati di test
In questa sezione creerai un database e una tabella con valori di esempio. La funge da set di dati di test per il processo di failover che testerai in seguito questo tutorial.
Connetterti all'istanza PostgreSQL.
cd ../../ ./scripts/launch-client.sh
L'output è simile al seguente:
Launching Pod pg-client in the namespace postgresql ... pod/pg-client created waiting for the Pod to be ready Copying script files to the target Pod pg-client ... Pod: pg-client is healthy
Avvia una sessione di shell.
kubectl exec -it pg-client -n postgresql -- /bin/bash
Crea un database e una tabella, quindi inserisci alcune righe di test.
psql -h $HOST_PGPOOL -U postgres -a -q -f /tmp/scripts/generate-db.sql
Verifica il numero di righe per ogni tabella.
psql -h $HOST_PGPOOL -U postgres -a -q -f /tmp/scripts/count-rows.sql
L'output è simile al seguente:
select COUNT(*) from tb01; count -------- 300000 (1 row) select COUNT(*) from tb02; count -------- 300000 (1 row)
Generare dati di test.
export DB=postgres pgbench -i -h $HOST_PGPOOL -U postgres $DB -s 50
L'output è simile al seguente:
dropping old tables... creating tables... generating data (client-side)... 5000000 of 5000000 tuples (100%) done (elapsed 29.85 s, remaining 0.00 s) vacuuming... creating primary keys... done in 36.86 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 31.10 s, vacuum 1.88 s, primary keys 3.86 s).
Esci dal pod del client postgres.
exit
Monitora PostgreSQL
In questa sezione, visualizzerai le metriche e configurerai gli avvisi per la tua istanza PostgreSQL. Utilizzerai Google Cloud Managed Service per Prometheus per eseguire il monitoraggio e creare avvisi.
Visualizza metriche
Il tuo deployment PostgreSQL include un file collaterale postgresql-exporter
containerizzato. Questo contenitore espone un endpoint /metrics
.
Google Cloud Managed Service per Prometheus è configurato per monitorare i pod PostgreSQL su questo endpoint. Puoi visualizzare queste metriche tramite le dashboard della console Google Cloud.
La console Google Cloud offre alcuni modi per creare e salvare la configurazione della dashboard:
- Creazione ed esportazione: puoi creare dashboard direttamente nella console Google Cloud, poi esportarle e memorizzarle in un repository di codice. Per farlo, nella dashboard nella barra degli strumenti, apri l'editor JSON e scarica il file JSON della dashboard.
- Archiviazione e importazione: puoi importare una dashboard da un file JSON facendo clic su +Crea dashboard e caricando i contenuti JSON della dashboard utilizzando il menu Editor JSON.
Per visualizzare i dati dell'applicazione PostgreSQL e del cluster GKE, segui questi passaggi:
Crea le seguenti dashboard.
cd monitoring gcloud monitoring dashboards create \ --config-from-file=dashboard/postgresql-overview.json \ --project=$PROJECT_ID gcloud monitoring dashboards create \ --config-from-file dashboard/gke-postgresql.json \ --project $PROJECT_ID
Nella console Google Cloud, vai alla dashboard di Cloud Monitoring. Vai alla dashboard di Cloud Monitoring
Seleziona Personalizzata dall'elenco delle dashboard. Vengono visualizzate le seguenti dashboard:
- Panoramica di PostgreSQL: visualizza le metriche di PostgreSQL tra cui l'uptime del database, le dimensioni del database e la latenza delle transazioni.
- Cluster PostgreSQL GKE: mostra le metriche del cluster GKE su cui è in esecuzione PostgreSQL, tra cui utilizzo della CPU, utilizzo della memoria e utilizzo del volume.
Fai clic su ciascun link per esaminare le dashboard generate.
Configurazione degli avvisi
Gli avvisi ti forniscono una consapevolezza tempestiva dei problemi nelle tue applicazioni, risolvere rapidamente i problemi. Puoi creare un criterio di avviso di specificare le circostanze in cui desideri ricevere gli avvisi e come per ricevere una notifica. Puoi anche creare canali di notifica che ti consentono di selezionare dove inviare gli avvisi.
In questa sezione utilizzerai Terraform per configurare i seguenti avvisi di esempio:
db_max_transaction
: monitora il ritardo massimo delle transazioni in secondi. Verrà attivato un avviso se il valore è superiore a 10.db_node_up
: monitora lo stato dei pod di database. 0 indica che un pod non è attivo e attiva un avviso.
Per configurare gli avvisi:
Configurare gli avvisi con Terraform.
EMAIL=YOUR_EMAIL cd alerting/terraform terraform init terraform plan -var project_id=$PROJECT_ID -var email_address=$EMAIL terraform apply -var project_id=$PROJECT_ID -var email_address=$EMAIL
Sostituisci i seguenti valori:
- YOUR_EMAIL: il tuo indirizzo email.
L'output è simile al seguente :
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Connettiti al pod del client.
cd ../../../ kubectl exec -it --namespace postgresql pg-client -- /bin/bash
Genera un test di carico per testare l'avviso
db_max_transaction
.pgbench -i -h $HOST_PGPOOL -U postgres -s 200 postgres
L'output è simile al seguente:
dropping old tables... creating tables... generating data (client-side)... 20000000 of 20000000 tuples (100%) done (elapsed 163.22 s, remaining 0.00 s) vacuuming... creating primary keys... done in 191.30 s (drop tables 0.14 s, create tables 0.01 s, client-side generate 165.62 s, vacuum 4.52 s, primary keys 21.00 s).
L'avviso viene attivato e invia un'email all'indirizzo YOUR_EMAIL con una riga dell'oggetto che inizia con "[ALERT] Ritardo massimo della transazione".
Nella console Google Cloud, vai alla pagina Criterio di avviso.
Seleziona
db_max_transaction
dai criteri elencati. Dal grafico, puoi dovrebbe essere registrato un picco nel test di carico che supera la soglia di blocco pari a 10 per la metrica Prometheuspg_stat_activity_max_tx_duration/gauge
.Esci dal pod del client postgres.
exit
Gestire gli upgrade di PostgreSQL e GKE
Gli aggiornamenti delle versioni di PostgreSQL e Kubernetes vengono rilasciati con una frequenza regolare. Segui le best practice operative per aggiornare regolarmente il tuo ambiente software. Per impostazione predefinita, GKE gestisce il cluster e il pool di nodi upgrade per te.
Upgrade di PostgreSQL
Questa sezione mostra come eseguire un upgrade della versione per PostgreSQL. Per questo tutorial, utilizzerai una strategia di aggiornamento in sequenza per eseguire l'upgrade dei pod, in modo che in nessun momento tutti i pod siano inattivi.
Per eseguire l'upgrade di una versione:
Esegui il push di una versione aggiornata dell'immagine
postgresql-repmgr
in Artifact Registry. Definisci la nuova versione (ad esempiopostgresql-repmgr 15.1.0-debian-11-r1
).NEW_IMAGE=us-docker.pkg.dev/$PROJECT_ID/main/bitnami/postgresql-repmgr:15.1.0-debian-11-r1 ./scripts/gcr.sh bitnami/postgresql-repmgr 15.1.0-debian-11-r1
Attiva un aggiornamento in sequenza utilizzando
kubectl
.kubectl set image statefulset -n postgresql postgresql-postgresql-ha-postgresql postgresql=$NEW_IMAGE kubectl rollout restart statefulsets -n postgresql postgresql-postgresql-ha-postgresql kubectl rollout status statefulset -n postgresql postgresql-postgresql-ha-postgresql
Vedrai che lo StatefulSet completa un aggiornamento in sequenza, a partire dal replica ordinale più alto a quello più basso.
L'output è simile al seguente:
Waiting for 1 pods to be ready... waiting for statefulset rolling update to complete 1 pods at revision postgresql-postgresql-ha-postgresql-5c566ccf49... Waiting for 1 pods to be ready... Waiting for 1 pods to be ready... waiting for statefulset rolling update to complete 2 pods at revision postgresql-postgresql-ha-postgresql-5c566ccf49... Waiting for 1 pods to be ready... Waiting for 1 pods to be ready... statefulset rolling update complete 3 pods at revision postgresql-postgresql-ha-postgresql-5c566ccf49...
Pianifica gli upgrade di GKE su cluster Standard
Questa sezione è applicabile se esegui cluster standard. Puoi adottare misure proattive e impostare configurazioni per ridurre i rischi e semplificare l'upgrade del cluster quando esegui servizi con stato, tra cui:
Segui le best practice di GKE per l'upgrade dei cluster. Scegli una strategia di upgrade appropriata per garantire che gli upgrade vengano eseguiti durante il periodo di manutenzione:
- Scegli gli upgrade di sovraccarico se l'ottimizzazione dei costi è importante e se i tuoi carichi di lavoro possono tollerare un arresto controllato in meno di 60 minuti.
- Scegli gli upgrade blu/verdi se i tuoi carichi di lavoro sono meno tolleranti alle interruzioni e un aumento temporaneo dei costi dovuto a un utilizzo più elevato delle risorse è accettabile.
Per saperne di più, consulta Eseguire l'upgrade di un cluster che esegue un carico di lavoro stateful.
Utilizzare il servizio Motore per suggerimenti per verificare per approfondimenti e consigli sul ritiro al fine di evitare interruzioni del servizio.
Utilizzare periodi di manutenzione per assicurarti che gli upgrade vengano eseguiti quando vuoi. Prima della periodo di manutenzione, per assicurarti che i backup del database siano andati a buon fine.
Prima di consentire il traffico ai nodi di cui è stato eseguito l'upgrade, utilizza i probe di idoneità e di attività per assicurarti che siano pronti per il traffico.
Crea probe che valutano se la replica è sincronizzata prima di accettare per via del traffico. Questa operazione può essere eseguita tramite script personalizzati, a seconda della complessità e delle dimensioni del database.
Verifica la disponibilità del database durante gli upgrade dei cluster Standard
Questa sezione è applicabile se utilizzi cluster standard. Per verificare la disponibilità di PostgreSQL durante gli upgrade, la procedura generale consiste nel generare traffico verso il database PostgreSQL durante la procedura di upgrade. Quindi, utilizza pgbench
.
per verificare che il database sia in grado di gestire un livello di base di traffico
rispetto a quando il database è completamente disponibile.
Connetterti all'istanza PostgreSQL.
./scripts/launch-client.sh
L'output è simile al seguente:
Launching Pod pg-client in the namespace postgresql ... pod/pg-client created waiting for the Pod to be ready Copying script files to the target Pod pg-client ... Pod: pg-client is healthy
In Cloud Shell, esegui la shell nel pod del client.
kubectl exec -it -n postgresql pg-client -- /bin/bash
Inizializza pgbench.
pgbench -i -h $HOST_PGPOOL -U postgres postgres
Utilizza il seguente comando per ottenere i risultati di riferimento per verificare che la tua applicazione PostgreSQL rimanga altamente disponibile durante la finestra di tempo per un upgrade. Per ottenere un risultato di riferimento, esegui il test con più connessioni tramite più job (thread) per 30 secondi.
pgbench -h $HOST_PGPOOL -U postgres postgres -c10 -j4 -T 30 -R 200
L'output è simile al seguente:
pgbench (14.5) starting vacuum...end. transaction type: <builtin: TPC-B (sort of)> scaling factor: 1 query mode: simple number of clients: 10 number of threads: 4 duration: 30 s number of transactions actually processed: 5980 latency average = 7.613 ms latency stddev = 2.898 ms rate limit schedule lag: avg 0.256 (max 36.613) ms initial connection time = 397.804 ms tps = 201.955497 (without initial connection time)
Per garantire la disponibilità durante gli upgrade, puoi generare un po' di carico sul tuo database e assicurarti che l'applicazione PostgreSQL fornisca un tasso di risposta coerente durante l'upgrade. Per eseguire questo test, genera del traffico rispetto al database, utilizzando il comando
pgbench
. Il seguente comando verrà eseguitopgbench
per un'ora, con un target di 200 TPS (transazioni al secondo) e elencando la frequenza di richiesta ogni 2 secondi.pgbench -h $HOST_PGPOOL -U postgres postgres --client=10 --jobs=4 --rate=200 --time=3600 --progress=2 --select-only
Dove:
--client
: numero di client simulati, ovvero numero di sessioni di database simultanee.--jobs
: numero di thread worker in pgbench. L'utilizzo di più thread può essere utile su macchine con più CPU. I client vengono distribuiti il più uniformemente possibile tra i thread disponibili. Il valore predefinito è 1.--rate
: la frequenza è indicata in transazioni al secondo--progress
: mostra il report di avanzamento ogni sec secondi.
L'output è simile al seguente:
pgbench (14.5) starting vacuum...end. progress: 5.0 s, 354.8 tps, lat 25.222 ms stddev 15.038 progress: 10.0 s, 393.8 tps, lat 25.396 ms stddev 16.459 progress: 15.0 s, 412.8 tps, lat 24.216 ms stddev 14.548 progress: 20.0 s, 405.0 tps, lat 24.656 ms stddev 14.066
Nella console Google Cloud, torna alla dashboard Panoramica di PostgreSQL in Cloud Monitoring. Nota il picco nei grafici Connessioni per DB e Connessioni per pod.
Esci dal pod del client.
exit
Elimina il pod client.
kubectl delete pod -n postgresql pg-client
Simula un'interruzione del servizio PostgreSQL
In questa sezione simulerai un'interruzione del servizio in una delle repliche PostgreSQL interrompendo il servizio di gestione della replica. In questo modo eviterai Il pod non gestisca il traffico verso le sue repliche di peer e i relativi probe di attività.
Apri una nuova sessione di Cloud Shell e configura la riga di comando
kubectl
per accedere al cluster principale.gcloud container clusters get-credentials $SOURCE_CLUSTER \ --region=$REGION --project=$PROJECT_ID
Visualizza gli eventi PostgreSQL emessi in Kubernetes.
kubectl get events -n postgresql --field-selector=involvedObject.name=postgresql-postgresql-ha-postgresql-0 --watch
Nella sessione di Cloud Shell precedente, simula un errore del servizio arrestando PostgreSQL
repmgr
.Collega la sessione al contenitore del database.
kubectl exec -it -n $NAMESPACE postgresql-postgresql-ha-postgresql-0 -c postgresql -- /bin/bash
Interrompi il servizio utilizzando
repmgr
e rimuovi il checkpoint e l'argomentodry-run
.export ENTRY='/opt/bitnami/scripts/postgresql-repmgr/entrypoint.sh' export RCONF='/opt/bitnami/repmgr/conf/repmgr.conf' $ENTRY repmgr -f $RCONF node service --action=stop --checkpoint
Il probe di attività configurato per il contenitore PostgreSQL inizierà a non riuscire
in cinque secondi. L'operazione viene ripetuta ogni dieci secondi fino al raggiungimento della soglia di errori di sei errori. Una volta raggiunto il valore failureThreshold
,
il container viene riavviato. Puoi configurare questi parametri per ridurre
tolleranza del probe di attività per ottimizzare i requisiti SLO del deployment.
Dal flusso di eventi, vedrai che i probe di attività e di idoneità del pod hanno esito negativo. e un messaggio che informa che il container deve essere riavviato. L'output è simile al seguente:
0s Normal Killing pod/postgresql-postgresql-ha-postgresql-0 Container postgresql failed liveness probe, will be restarted
0s Warning Unhealthy pod/postgresql-postgresql-ha-postgresql-0 Readiness probe failed: psql: error: connection to server at "127.0.0.1", port 5432 failed: Connection refused...
0s Normal Pulled pod/postgresql-postgresql-ha-postgresql-0 Container image "us-docker.pkg.dev/psch-gke-dev/main/bitnami/postgresql-repmgr:14.5.0-debian-11-r10" already present on machine
0s Normal Created pod/postgresql-postgresql-ha-postgresql-0 Created container postgresql
0s Normal Started pod/postgresql-postgresql-ha-postgresql-0 Started container postgresql
Preparati per il ripristino di emergenza
Per assicurarti che i carichi di lavoro di produzione rimangano disponibili in caso di un evento che interrompa il servizio, devi preparare un piano di ripristino di emergenza (RE). Per scoprire di più sulla pianificazione del RE, consulta la Guida alla pianificazione del ripristino di emergenza.
Il disaster recovery per Kubernetes può essere implementato in due fasi:
- Il backup prevede la creazione di uno snapshot point-in-time dello stato o dei dati. prima che si verifichi un evento che interrompe il servizio.
- Il recupero prevede il ripristino dello stato o dei dati da una copia di backup dopo il di una calamità.
Per eseguire il backup e il ripristino dei carichi di lavoro sui cluster GKE, puoi utilizzare Backup per GKE. Puoi attivare questo servizio su cluster nuovi ed esistenti. Questa operazione esegue il deployment di un agente Backup per GKE in esecuzione nei tuoi cluster. l'agente è responsabile dell'acquisizione della configurazione e l'orchestrazione del ripristino.
I backup e i ripristini possono limitare l'ambito a un intero cluster, a uno spazio dei nomi o
dell'applicazione (definita da selettori come matchLabels
).
Esempio di scenario di backup e ripristino di PostgreSQL
L'esempio in questa sezione mostra come eseguire un'operazione di backup e ripristino
nell'ambito dell'applicazione, utilizzando la risorsa personalizzata ProtectedApplication
.
Il seguente diagramma mostra le risorse dei componenti in Protected Application,
ovvero uno StatefulSet che rappresenta l'applicazione postgresql-ha
e un deployment
di pgpool
, che utilizzano la stessa etichetta (app.kubernetes.io/name: postgresql-ha
).
Per prepararti al backup e al ripristino del carico di lavoro PostgreSQL, segui questi passaggi:
Configura le variabili di ambiente. In questo esempio utilizzerai un'applicazione per ripristinare il carico di lavoro PostgreSQL e i suoi volumi dall'origine cluster GKE (
us-central1
), quindi ripristina in un altro Cluster GKE in un'altra regione (us-west1
).export SOURCE_CLUSTER=cluster-db1 export TARGET_CLUSTER=cluster-db2 export REGION=us-central1 export DR_REGION=us-west1 export NAME_PREFIX=g-db-protected-app export BACKUP_PLAN_NAME=$NAME_PREFIX-bkp-plan-01 export BACKUP_NAME=bkp-$BACKUP_PLAN_NAME export RESTORE_PLAN_NAME=$NAME_PREFIX-rest-plan-01 export RESTORE_NAME=rest-$RESTORE_PLAN_NAME
Verifica che Backup per GKE sia abilitato sui tuoi cluster. Dovrebbe sia già abilitata come parte della configurazione Terraform che hai eseguito in precedenza.
gcloud container clusters describe $SOURCE_CLUSTER \ --project=$PROJECT_ID \ --region=$REGION \ --format='value(addonsConfig.gkeBackupAgentConfig)'
Se Backup per GKE è abilitato, l'output del comando mostra
enabled=True
.
Configurare un piano di backup ed eseguire un ripristino
Backup per GKE ti consente di creare piano di backup come cron job. Un piano di backup contiene una configurazione di backup che include il cluster di origine, la selezione dei carichi di lavoro di cui eseguire il backup e la regione in cui vengono archiviati gli elementi di backup prodotti in base a questo piano.
Per eseguire il backup e il ripristino, segui questi passaggi:
Verifica lo stato dell'applicazione protetta su
cluster-db1
.kubectl get ProtectedApplication -A
L'output è simile al seguente:
NAMESPACE NAME READY TO BACKUP postgresql postgresql-ha true
Crea un piano di backup per ProtectedApplication.
export NAMESPACE=postgresql export PROTECTED_APP=$(kubectl get ProtectedApplication -n $NAMESPACE | grep -v 'NAME' | awk '{ print $1 }')
gcloud beta container backup-restore backup-plans create $BACKUP_PLAN_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --cluster=projects/$PROJECT_ID/locations/$REGION/clusters/$SOURCE_CLUSTER \ --selected-applications=$NAMESPACE/$PROTECTED_APP \ --include-secrets \ --include-volume-data \ --cron-schedule="0 3 * * *" \ --backup-retain-days=7 \ --backup-delete-lock-days=0
Crea manualmente un backup.
gcloud beta container backup-restore backups create $BACKUP_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --backup-plan=$BACKUP_PLAN_NAME \ --wait-for-completion
Configura un piano di ripristino.
gcloud beta container backup-restore restore-plans create $RESTORE_PLAN_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --backup-plan=projects/$PROJECT_ID/locations/$DR_REGION/backupPlans/$BACKUP_PLAN_NAME \ --cluster=projects/$PROJECT_ID/locations/$DR_REGION/clusters/$TARGET_CLUSTER \ --cluster-resource-conflict-policy=use-existing-version \ --namespaced-resource-restore-mode=delete-and-restore \ --volume-data-restore-policy=restore-volume-data-from-backup \ --selected-applications=$NAMESPACE/$PROTECTED_APP \ --cluster-resource-scope-selected-group-kinds="storage.k8s.io/StorageClass","scheduling.k8s.io/PriorityClass"
Esegui il ripristino dal backup.
gcloud beta container backup-restore restores create $RESTORE_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --restore-plan=$RESTORE_PLAN_NAME \ --backup=projects/$PROJECT_ID/locations/$DR_REGION/backupPlans/$BACKUP_PLAN_NAME/backups/$BACKUP_NAME \ --wait-for-completion
Verifica che il cluster venga ripristinato
Per verificare che il cluster ripristinato abbia tutti i pod previsti, PersistentVolume, e StorageClass, segui questi passaggi:
Configura l'accesso da riga di comando
kubectl
al cluster di backupcluster-db2
.gcloud container clusters get-credentials $TARGET_CLUSTER --region $DR_REGION --project $PROJECT_ID
Verifica che lo StatefulSet sia pronto con 3/3 pod.
kubectl get all -n $NAMESPACE
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE pod/postgresql-postgresql-ha-pgpool-778798b5bd-k2q4b 1/1 Running 0 4m49s pod/postgresql-postgresql-ha-postgresql-0 2/2 Running 2 (4m13s ago) 4m49s pod/postgresql-postgresql-ha-postgresql-1 2/2 Running 0 4m49s pod/postgresql-postgresql-ha-postgresql-2 2/2 Running 0 4m49s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/postgresql-postgresql-ha-pgpool ClusterIP 192.168.241.46 <none> 5432/TCP 4m49s service/postgresql-postgresql-ha-postgresql ClusterIP 192.168.220.20 <none> 5432/TCP 4m49s service/postgresql-postgresql-ha-postgresql-headless ClusterIP None <none> 5432/TCP 4m49s service/postgresql-postgresql-ha-postgresql-metrics ClusterIP 192.168.226.235 <none> 9187/TCP 4m49s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/postgresql-postgresql-ha-pgpool 1/1 1 1 4m49s NAME DESIRED CURRENT READY AGE replicaset.apps/postgresql-postgresql-ha-pgpool-778798b5bd 1 1 1 4m49s NAME READY AGE statefulset.apps/postgresql-postgresql-ha-postgresql 3/3 4m49s
Verifica che tutti i pod nello spazio dei nomi
postgres
siano in esecuzione.kubectl get pods -n $NAMESPACE
L'output è simile al seguente:
postgresql-postgresql-ha-pgpool-569d7b8dfc-2f9zx 1/1 Running 0 7m56s postgresql-postgresql-ha-postgresql-0 2/2 Running 0 7m56s postgresql-postgresql-ha-postgresql-1 2/2 Running 0 7m56s postgresql-postgresql-ha-postgresql-2 2/2 Running 0 7m56s
Verifica i volumi permanenti e la classe di archiviazione. Durante il processo di ripristino, Backup per GKE crea una classe proxy nel carico di lavoro di destinazione per sostituire Provisioning di StorageClass eseguito nel carico di lavoro di origine (
gce-pd-gkebackup-dn
nell'output di esempio).kubectl get pvc -n $NAMESPACE
L'output è simile al seguente:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-postgresql-postgresql-ha-postgresql-0 Bound pvc-be91c361e9303f96 8Gi RWO gce-pd-gkebackup-dn 10m data-postgresql-postgresql-ha-postgresql-1 Bound pvc-6523044f8ce927d3 8Gi RWO gce-pd-gkebackup-dn 10m data-postgresql-postgresql-ha-postgresql-2 Bound pvc-c9e71a99ccb99a4c 8Gi RWO gce-pd-gkebackup-dn 10m
Verifica che i dati previsti vengano ripristinati
Per verificare il ripristino dei dati previsti:
Connetterti all'istanza PostgreSQL.
./scripts/launch-client.sh kubectl exec -it pg-client -n postgresql -- /bin/bash
Verifica il numero di righe per ogni tabella.
psql -h $HOST_PGPOOL -U postgres -a -q -f /tmp/scripts/count-rows.sql select COUNT(*) from tb01;
Dovresti visualizzare un risultato simile ai dati che hai scritto in precedenza in Creare un set di dati di test. L'output è simile al seguente:
300000 (1 row)
Esci dal pod del client.
exit
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
Il modo più semplice per evitare la fatturazione è eliminare il progetto che hai creato per il tutorial.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Passaggi successivi
- Scopri le best practice per il deployment dei database su GKE.
- Esplora i volumi permanenti in modo più dettagliato.
- Guarda un esempio di come utilizzare Pgpool-II per la replica in streaming con cluster PostgreSQL ad alta disponibilità.