Quando attivi l'agente Backup per GKE nel tuo cluster Google Kubernetes Engine, Backup per GKE fornisce un CustomResourceDefinition
che introduce un nuovo tipo di risorsa Kubernetes: il ProtectedApplication
.
La composizione di un ProtectedApplication
prevede tre attività:
Seleziona l'insieme di risorse di cui vuoi eseguire il backup e il ripristino nell'ambito dell'applicazione.
Definizione di regole di orchestrazione dettagliate per un sottoinsieme di queste risorse.
Convalida del
ProtectedApplication
per verificare se è pronto per il backup.
Le risorse ProtectedApplication
ti offrono queste funzionalità per personalizzare la logica di backup e ripristino a livello di applicazione:
Operazioni di backup e ripristino più granulari. Senza
ProtectedApplications
, l'ambito dei backup deve essere definito a livello diNamespace
(selezionando allNamespaces o selectedNamespaces). Una logica simile si applica al ripristino delle risorse con spazio dei nomi. La creazione di risorseProtectedApplication
ti consente di assegnare un nome a un sottoinsieme di risorse in unNamespace
. Puoi quindi eseguire il backup e il ripristino di questo sottoinsieme elencando selectedApplications nell'ambito del backup (e in modo simile per il restore).Orchestrazione dei dettagli granulari della procedura di backup o ripristino, tra cui:
Sono stati ignorati i volumi selezionati durante il backup.
Incorporazione della topologia dell'applicazione in backup e ripristino (ad esempio, eseguire il backup di una sola istanza di un database replicato e utilizzarla per ripristinare più istanze).
Eseguire hook definiti dall'utente prima e dopo gli snapshot dei volumi. Questi possono essere utilizzati, ad esempio, per svuotare e mettere in stato di riposo un carico di lavoro prima di eseguire lo snapshot e riattivarlo in un secondo momento.
Puoi creare ProtectedApplication
tramite kubectl
come le altre risorse Kubernetes.
Sono completamente facoltativi. Se le risorse ProtectedApplication
non sono presenti, Backup per GKE crea backup dei volumi per tutti i volumi nell'ambito di un backup e i backup dei volumi risultanti saranno coerenti in caso di arresto anomalo: tutte le scritture svuotate sul disco in un determinato momento verranno acquisite (ovvero, nessuna scrittura parziale). Tuttavia, alcune applicazioni potrebbero conservare in memoria dati che non vengono svuotati sul disco, pertanto la possibilità o meno per un'applicazione di recuperare correttamente da un backup coerente con gli arresti anomali dipende dalla logica dell'applicazione.
Selezione delle risorse
Il primo passaggio per creare la risorsa ProtectedApplication
è identificare le altre risorse nello stesso Namespace
che vuoi includere nell'applicazione. Si tratta dell'insieme di risorse di cui verrà eseguito il backup o il ripristino se fornisci l'opzione di ambito
selectedApplications
nella configurazione BackupPlan
.
Le risorse vengono identificate utilizzando un selettore di etichette. Per farlo, devi etichettare tutte le risorse (utilizzando il campo metadata.label in ogni risorsa) con la stessa etichetta. Tieni presente che questo
si applica anche alle risorse create automaticamente dai controller. Queste risorse create automaticamente vengono etichettate utilizzando il modello corrispondente.
Tieni presente che è comune riutilizzare la stessa etichetta che utilizzi già per associare Pods
e PersistentVolumeClaims
generati alla relativa risorsa principale. L'esempio seguente mostra come applicare l'etichetta app: nginx
alle altre risorse oltre a Deployment
.
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-vars
namespace: webserver
labels:
app: nginx
data:
...
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-logs
namespace: webserver
labels:
app: nginx
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Mi
storageClassName: standard-rwo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: webserver
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: nginx-logs
persistentVolumeClaim:
claimName: nginx-logs
containers:
...
Dopo aver applicato l'etichetta selezionata a tutte le risorse di destinazione (e ai modelli da cui vengono generate risorse aggiuntive), puoi fare riferimento a queste risorse da un ProtectedApplication
. Ad esempio:
kind: ProtectedApplication
apiVersion: gkebackup.gke.io/v1
metadata:
name: nginx
namespace: webserver
spec:
resourceSelection:
type: Selector
selector:
matchLabels:
app: nginx
...
Definisci le regole di orchestrazione
Una volta identificate tutte le risorse nel tuo ProtectedApplication
, puoi scegliere di definire regole di orchestrazione dettagliate per un sottoinsieme di queste risorse. Queste regole possono essere applicate solo a due tipi di risorse:
deployment
e StatefulSets e sono
riferite nella sezione components
del ProtectedApplication
.
Panoramica dei componenti
La configurazione di un componente prevede quanto segue:
Selezionare una strategia di base per il funzionamento del backup e del ripristino per questo componente. Sono disponibili tre strategie:
BackupAllRestoreAll
: esegui il backup dei volumi associati a tutte le istanze del componente e ripristinali tutti dai backup.BackupOneRestoreAll
: esegui il backup dei volumi da una sola istanza del componente e utilizza questi backup per ripristinare tutte le istanze.DumpAndLoad
: esporta i dati dall'applicazione in un singolo volume al momento del backup e importali nell'applicazione al momento del ripristino.
Definizione di hook di esecuzione da eseguire durante il backup (e possibilmente il ripristino, a seconda della strategia). Un hook è un comando che viene eseguito in contenuti specifici.
Selezionare un sottoinsieme di volumi di cui eseguire il backup.
Hook di esecuzione
Un hook è un comando shell che Backup per GKE esegue in un contenitore in una determinata fase del processo di backup o ripristino.
Esistono quattro tipi diversi di hook:
pre hooks
: questi comandi vengono eseguiti subito prima del backup dei volumi e in genere dovrebbero svuotare tutti i dati in memoria sul disco e quindi mettere in stato di attesa l'applicazione in modo che non vengano eseguite nuove scritture su disco. Questi hook vengono utilizzati nelle strategieBackupAllRestoreAll
eBackupOneRestoreAll
.post hooks
: questi comandi vengono eseguiti durante il processo di backup del volume subito dopo il passaggio SNAPSHOTTING (prima del passaggio UPLOADING). In genere, il passaggio SNAPSHOTTING richiede solo pochi secondi. In genere, è previsto che risveglino l'applicazione (ovvero consentano di procedere con l'elaborazione normale e le scritture su disco). Questi hook vengono utilizzati nelle strategieBackupAllRestoreAll
,BackupOneRestoreAll
eDumpAndLoad
.dump hooks
: questi comandi vengono eseguiti prima del backup del volume nella strategiaDumpAndLoad
e in genere dovrebbero esportare i dati dall'applicazione nel volume di backup designato.load hooks
: questi comandi vengono eseguiti al momento del ripristino dopo il ripristino del volume di backup nei casi di strategiaDumpAndLoad
. In genere, devono importare i dati dal volume di backup nell'applicazione.
Puoi fornire più di un hook per ogni tipo e Backup per GKE li executerà nell'ordine in cui li definisci.
Definisci gli hook nella sezione dei componenti della specificaProtectedApplication
. Tutte le definizioni di hook hanno gli stessi
campi disponibili:
name
: un nome assegnato all'hook.container
- (facoltativo) nome del contenitore in cui eseguire il comando. Se non fornisci il contenitore, Backup per GKE eseguirà l'hook nel primo contenitore definito per iPod
di destinazione.command
: si tratta del comando effettivo inviato al contenitore, costituito come un array di parole. La prima parola nell'array è il percorso del comando e le parole successive sono gli argomenti da passare al comando.timeoutSeconds
- (facoltativo) tempo prima dell'interruzione dell'esecuzione dell'hook. Se non lo specifichi, il valore predefinito è 30 secondi.onError
- (facoltativo) comportamento adottato in caso di errore dell'hook. Può essere impostato suIgnore
oFail
(valore predefinito). Se imposti questo valore suFail
, quando un hook non va a buon fine, il backup del volume non andrà a buon fine. Se lo imposti suIgnore
, gli errori di questo hook vengono ignorati.
Prima di applicare gli hook ProtectedApplication
alla tua applicazione, devi testare il comando utilizzando kubectl exec
per assicurarti che si comportino come previsto:
kubectl exec POD_NAME -- COMMAND
Sostituisci quanto segue:
POD_NAME
: il nome del pod che contiene la risorsaProtectedApplication
.COMMAND
: l'array contenente il comando da eseguire nel contenitore, ad esempio/sbin/fsfreeze, -f, /var/log/nginx
.
Selezionare un sottoinsieme di volumi di cui eseguire il backup
A volte le applicazioni scrivono in volumi che non sono interessanti da ripristinare (ad esempio determinati volumi di log o scratch). Puoi eliminare il backup di questi volumi utilizzando un selettore di volumi.
Per utilizzare questa funzionalità, devi prima applicare un'etichetta comune ai volumi di cui vuoi eseguire il backup e poi lasciare questa etichetta disattivata per i volumi di cui non vuoi eseguire il backup. Poi includi una clausola volumeSelector
nella definizione del componente come segue:
spec:
...
components:
...
strategy:
...
volumeSelector:
matchLabels:
label_name: label_value
Se fornisci un volumeSelector
per un componente, verrà eseguito il backup e il ripristino solo dei volumi che hanno l'etichetta specificata. Al momento del ripristino, per tutti gli altri volumi verrà eseguito il provisioning come vuoti anziché ripristinarli da un backup del volume.
Strategia: BackupAllRestoreAll
Questa è la strategia più semplice e esegue il backup di tutti i volumi del componente al momento del backup e li ripristina tutti dai backup dei volumi al momento del ripristino.
È la scelta migliore quando l'applicazione non ha alcuna replica tra Pods
.
Questa strategia supporta i seguenti parametri:
backupPreHooks
- (facoltativo) un elenco ordinato di hook che vengono eseguiti subito prima del backup dei volumi. Questi comandi vengono eseguiti su tutti iPods
del componente.backupPostHooks
- (facoltativo) un elenco ordinato di hook che vengono eseguiti dopo che i backup dei volumi hanno raggiunto la fase di caricamento. Questi comandi vengono eseguiti su tutti iPods
del componente.volumeSelector
- (Facoltativo) logica per l'associazione di un sottoinsieme di volumi da eseguire il backup.
Questo esempio crea una risorsa ProtectedApplication
che mette in stato di riposo il sistema di file prima di eseguire il backup del volume dei log e lo riattiva dopo il backup:
kind: ProtectedApplication
apiVersion: gkebackup.gke.io/v1
metadata:
name: nginx
namespace: sales
spec:
resourceSelection:
type: Selector
selector:
matchLabels:
app: nginx
components:
- name: nginx-app
resourceKind: Deployment
resourceNames: ["nginx"]
strategy:
type: BackupAllRestoreAll
backupAllRestoreAll:
backupPreHooks:
- name: fsfreeze
container: nginx
command: [ /sbin/fsfreeze, -f, /var/log/nginx ]
backupPostHooks:
- name: fsunfreeze
container: nginx
command: [ /sbin/fsfreeze, -u, /var/log/nginx ]
Strategia: BackupOneAndRestoreAll
Questa strategia esegue il backup di una copia di un pod selezionato. Questa singola copia è la fonte per il ripristino di tutti i pod durante un ripristino. Questo metodo può contribuire a ridurre i costi di archiviazione e il tempo di backup. Questa strategia funziona in una configurazione ad alta disponibilità
quando un componente viene disegnato con un PersistentVolumeClaim
principale e più PersistentVolumeClaims
secondari.
Questa strategia supporta i seguenti parametri:
backupTargetName
- (obbligatorio) specifica il Deployment o il StatefulSet da utilizzare per eseguire il backup dei dati. Il pod migliore di cui eseguire il backup viene selezionato automaticamente. In una configurazione ad alta disponibilità, consigliamo di impostare questo valore su una delle repliche dell'applicazione.backupPreHooks
- (facoltativo) un elenco ordinato di hook che vengono eseguiti subito prima del backup dei volumi. Questi comandi vengono eseguiti solo sul backup selezionatoPod
.backupPostHooks
- (facoltativo) un elenco ordinato di hook che vengono eseguiti dopo che i backup dei volumi hanno raggiunto la fase di caricamento. Questi comandi vengono eseguiti solo sul backup selezionatoPod
.volumeSelector
- (Facoltativo) logica per l'associazione di un sottoinsieme di volumi da eseguire il backup.
Se un componente è configurato con più deployment o StatefulSet, tutte le risorse devono avere la stessa struttura PersistentVolume, il che significa che devono rispettare queste regole:
- Il numero di
PersistentVolumeClaims
utilizzato da tutti i deployment o gli StatefulSet deve essere lo stesso. - Lo scopo di
PersistentVolumeClaims
nello stesso indice deve essere lo stesso. Per gli StatefulSet, l'indice è definito involumeClaimTemplate
. Per i deployment, l'indice è definito inVolumes
e tutti i volumi non permanenti vengono ignorati. - Se il componente dell'applicazione è costituito da deployment, ogni deployment deve avere esattamente una replica.
Tenendo conto di queste considerazioni, è possibile selezionare più set di volumi per il backup, ma verrà selezionato un solo volume per ogni set di volumi.
Questo esempio, che presuppone un'architettura di un StatefulSet principale e un StatefulSet secondario, mostra un backup dei volumi di un pod nel StatefulSet secondario e un successivo ripristino in tutti gli altri volumi:
kind: ProtectedApplication
apiVersion: gkebackup.gke.io/v1
metadata:
name: mariadb
namespace: mariadb
spec:
resourceSelection:
type: Selector
selector:
matchLabels:
app: mariadb
components:
- name: mariadb
resourceKind: StatefulSet
resourceNames: ["mariadb-primary", "mariadb-secondary"]
strategy:
type: BackupOneRestoreAll
backupOneRestoreAll:
backupTargetName: mariadb-secondary
backupPreHooks:
- name: quiesce
container: mariadb
command: [...]
backupPostHooks:
- name: unquiesce
container: mariadb
command: [...]
Strategia: DumpAndLoad
Questa strategia utilizza un volume dedicato per i processi di backup e ripristino
e richiede un PersistentVolumeClaim
dedicato collegato a un componente che memorizza
i dati del dump.
Questa strategia supporta i seguenti parametri:
dumpTarget
- (obbligatorio) specifica il Deployment o il StatefulSet da utilizzare per eseguire il backup dei dati. Il pod migliore di cui eseguire il backup viene selezionato automaticamente. In una configurazione ad alta disponibilità, ti consigliamo di impostare questo valore su una delle repliche dell'applicazione.loadTarget
- (obbligatorio) specifica quale Deployment o StatefulSet deve essere utilizzato per caricare i dati. Il pod migliore di cui eseguire il backup viene selezionato automaticamente. La destinazione di caricamento non deve essere uguale alla destinazione del dump.dumpHooks
- (obbligatorio) un elenco ordinato di hook che vengono eseguiti per compilare il volume di backup dedicato. Questi comandi vengono eseguiti solo sul dump selezionatoPod
.backupPostHooks
- (facoltativo) un elenco ordinato di hook che vengono eseguiti dopo che i backup dei volumi hanno raggiunto la fase di caricamento. Questi comandi vengono eseguiti solo sul dump selezionatoPod
.loadHooks
- (obbligatorio) un elenco ordinato di hook che vengono eseguiti per caricare i dati dal volume ripristinato dopo l'avvio dell'applicazione. Questi comandi vengono eseguiti solo sul carico selezionatoPod
.volumeSelector
- (obbligatorio) logica per l'associazione di un singolo volume da eseguire il backup e il ripristino (il volume "dump"). Anche se deve corrispondere a un solo volume, lo configuri nello stesso modo in cui configuri il sottoinsieme di volumi di cui eseguire il backup utilizzato da altre strategie.
Se l'applicazione è composta da deployment, ogni deployment deve avere esattamente una replica.
Questo esempio, che presuppone un'architettura di un StatefulSet principale e un StatefulSet secondario con PersistentVolumeClaims
dedicato sia per i StatefulSet principali che per quelli secondari, mostra una strategia DumpAndLoad
:
kind: ProtectedApplication
apiVersion: gkebackup.gke.io/v1
metadata:
name: mariadb
namespace: mariadb
spec:
resourceSelection:
type: Selector
selector:
matchLabels:
app: mariadb
components:
- name: mariadb-dump
resourceKind: StatefulSet
resourceNames: ["mariadb-primary", "mariadb-secondary"]
strategy:
type: DumpAndLoad
dumpAndLoad:
loadTarget: mariadb-primary
dumpTarget: mariadb-secondary
dumpHooks:
- name: db_dump
container: mariadb
command:
- bash
- "-c"
- |
mysqldump -u root --all-databases > /backup/mysql_backup.dump
loadHooks:
- name: db_load
container: mariadb
command:
- bash
- "-c"
- |
mysql -u root < /backup/mysql_backup.sql
volumeSelector:
matchLabels:
gkebackup.gke.io/backup: dedicated-volume
Controllare se un ProtectedApplication
è pronto per il backup
Puoi verificare se un ProtectedApplication
è pronto per un backup eseguendo il seguente comando:
kubectl describe protectedapplication APPLICATION_NAME
Sostituisci APPLICATION_NAME
con il nome della tua applicazione.
Se è tutto pronto, nella descrizione dell'applicazione lo stato Ready to backup
sarà true
, come in questo esempio:
% kubectl describe protectedapplication nginx
Name: nginx
Namespace: default
API Version: gkebackup.gke.io/v1
Kind: ProtectedApplication
Metadata:
UID: 90c04a86-9dcd-48f2-abbf-5d84f979b2c2
Spec:
Components:
Name: nginx
Resource Kind: Deployment
Resource Names:
nginx
Strategy:
Backup All Restore All:
Backup Pre Hooks:
Command:
/sbin/fsfreeze
-f
/var/log/nginx
Container: nginx
Name: freeze
Backup Post Hooks:
Command:
/sbin/fsfreeze
-u
/var/log/nginx
Container: nginx
Name: unfreeze
Type: BackupAllRestoreAll
Resource Selection:
Selector:
Match Labels:
app: nginx
Type: Selector
Status:
Ready To Backup: true
Events: <none>
Passaggi successivi
- Scopri di più sulla pianificazione di un insieme di backup.