Informazioni sul ripristino dei cluster Kubernetes in base agli snapshot etcd
Nonostante l'enorme cambiamento che implica l'adozione di Kubernetes per l'architettura del sistema IT, un sistema Kubernetes presenta paradigmi di disaster recovery (DR) simili a un'applicazione tradizionale (ad esempio Oracle Java SE, Oracle Java EE o JavaScript). Deve mantenere una copia coerente e "il più aggiornata possibile" del sistema primario in una posizione secondaria in grado di riprendere i carichi di lavoro in caso di calamità che causino tempi di inattività nell'area primaria.
Questa guida alle soluzioni fornisce consigli e utility Oracle MAA che creeranno un sistema Kubernetes secondario e ti consentiranno di eseguire il ripristino in scenari di emergenza che influiscono su una posizione e costringono il reindirizzamento dei carichi di lavoro a un sito di replica.
Sebbene questa guida sulla soluzione si concentri sul ripristino di un cluster Kubernetes in un'area diversa, è possibile utilizzare gli stessi script e le stesse procedure per ripristinare un cluster in loco in un point-in-time precedente. Questa operazione può essere utile in scenari diversi dal disaster recovery, ad esempio:
- Quando il piano di controllo non è configurato correttamente.
- Quando il database
etcd
viene perso, danneggiato o quandoetcd
non viene visualizzato correttamente. - Quando una distribuzione errata o un errore dell'utente influisce su più applicazioni o microservizi, è necessario ripristinare una versione o una copia precedente del cluster. Un ripristino dello snapshot ETCD ripristinerà tutti gli artifact al momento in cui è stato eseguito lo snapshot (backup).
Questo documento si concentra sulla replica dei dati etcd
di Kubernetes in una posizione secondaria. Tutte le informazioni di un cluster Kubernetes vengono memorizzate in etcd
, un archivio di valori chiave utilizzato come area di memorizzazione di backup di Kubernetes per i dati del cluster. Questa guida alle soluzioni fornisce suggerimenti per replicare un cluster Kubernetes creato con lo strumento kubeadm
di Kubernetes (vedere https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) basato su etcd restore
. Le procedure di impostazione e gli script forniti potrebbero richiedere personalizzazioni per altri tipi di cluster (quelli non creati con kubeadm
), ma in generale sono validi purché sia disponibile l'accesso agli endpoint etcd
utilizzati dal piano di controllo di Kubernetes. Questa soluzione di replica richiede un'impostazione specifica per il cluster secondario e utilizzerà una copia di etcd
(chiamata anche etcd snapshots
) per visualizzare gli stessi artifact esistenti nel database primario.
Puoi utilizzare snapshot di artifact o strumenti di backup Kubernetes di terze parti per replicare spazi di nomi e applicazioni specifici nei sistemi Kubernetes. Tuttavia, non proteggono i cluster da danneggiamenti dei file e configurazioni errate nei metadati del piano di controllo. Oltre a utilizzarli per la protezione da errori irreversibili, è possibile utilizzare etcd snapshots
per i ripristini locali e per ripristinare i cluster Kubernetes in un point-in-time precedente. Se i sistemi etcd store
e etcd cluster
non sono in buono stato, l'esecuzione delle applicazioni potrebbe continuare, ma i riposizionamenti dei pod, le modifiche alla configurazione, l'accesso segreto e qualsiasi altra operazione che richieda la disponibilità del piano di controllo non funzioneranno correttamente. È per questo motivo che la conservazione etcd
deve essere una parte fondamentale di qualsiasi procedura del ciclo di vita del cluster Kubernetes.
Oltre ai dati di configurazione Kubernetes, le applicazioni e i microservizi in esecuzione su Kubernetes possono generare dati in runtime. La protezione da errori irreversibili dei dati di runtime non rientra nell'ambito di questo documento e deve essere trattata esattamente come nelle applicazioni tradizionali in esecuzione sugli Application Server:
- Evitare la persistenza poliglotta (l'uso di diversi tipi di aree di memorizzazione persistenti per i dati di runtime è un "quasi" impossibile da risolvere il problema in base al teorema BAC)
- Utilizza un'unica area di memorizzazione per tutti i diversi tipi di dati, microservizi e applicazioni con dipendenze il più possibile
- Consulta Oracle MAA Best Practices for Oracle Database per la protezione da errori irreversibili per il tuo runtime
Operazioni preliminari
Per ulteriori dettagli, vedere:
- Oracle WebLogic Server for Oracle Cloud Infrastructure Disaster Recovery
- SOA Suite su Oracle Cloud Infrastructure Marketplace Disaster Recovery
Per i dettagli sull'uso degli snapshot artifact per la protezione della configurazione specifica dell'applicazione, vedere Usa gli snapshot del motore Kubernetes OCI da errori irreversibili.
Architettura
Questa architettura mostra la topologia del sistema di disaster recovery (DR) per il cluster Kubernetes.
Tutte le informazioni su runtime, configurazione e metadati che risiedono nel database primario vengono replicate dall'area 1 all'area 2 con Oracle Autonomous Data Guard. La configurazione cluster Kubernetes richiesta viene replicata tramite snapshot etcd per la protezione del piano di controllo. È possibile utilizzare copie etcd
o snapshot di artifact per la protezione della configurazione specifica dell'applicazione. Le immagini utilizzate dai container sono ospitate in registri locali per ogni cluster o in repository esterni (le immagini non sono considerate una configurazione cluster Kubernetes).
Nota
L'impostazione di Oracle Autonomous Data Guard per il database runtime non rientra nell'ambito di questo documento.
Descrizione dell'immagine kubernetes-etcd-multiregion-dr.png
kubernetes-etcd-multiregion-dr-oracle.zip
Questa architettura supporta i componenti elencati di seguito.
- Area
Un'area geografica Oracle Cloud Infrastructure è un'area geografica localizzata che contiene uno o più data center, denominati domini di disponibilità. Le regioni sono indipendenti da altre regioni e grandi distanze possono separarle (tra paesi o addirittura continenti).
- Load balancer
Il servizio Oracle Cloud Infrastructure Load Balancing fornisce la distribuzione automatica del traffico da un unico punto di accesso a più server nel back-end.
- Gateway di instradamento dinamico (DRG)
Il gateway DRG è un router virtuale che fornisce un percorso per il traffico di rete privato tra le reti VCN nella stessa area, tra una rete VCN e una rete esterna all'area, ad esempio una rete VCN in un'altra area Oracle Cloud Infrastructure, una rete on premise o una rete in un altro provider cloud.
- Data Guard
Oracle Data Guard e Oracle Active Data Guard offrono un set completo di servizi che creano, mantengono, gestiscono e monitorano uno o più database di standby e che consentono ai database Oracle di produzione di rimanere disponibili senza interruzioni. Oracle Data Guard gestisce questi database di standby come copie del database di produzione utilizzando la replica in-memory. Se il database di produzione non è più disponibile a causa di un'indisponibilità pianificata o non pianificata, Oracle Data Guard può passare qualsiasi database di standby al ruolo di produzione, riducendo al minimo i tempi di inattività associati all'indisponibilità. Oracle Active Data Guard offre la possibilità aggiuntiva di scaricare i carichi di lavoro in lettura, principalmente sui database in standby e offre inoltre funzioni avanzate di protezione dei dati.
- Oracle Real Application Clusters (Oracle RAC)
Oracle RAC ti consente di eseguire un singolo Oracle Database su più server per massimizzare la disponibilità e abilitare la scalabilità orizzontale, accedendo allo storage condiviso. Le sessioni utente che si connettono alle istanze Oracle RAC possono eseguire il failover e ripetere le modifiche in modo sicuro durante le interruzioni, senza apportare modifiche alle applicazioni dell'utente finale.
- Registro
Oracle Cloud Infrastructure Registry è un registro gestito da Oracle e che ti consente di semplificare il flusso di lavoro da sviluppo a produzione. Registry semplifica la memorizzazione, la condivisione e la gestione degli artifact di sviluppo, ad esempio le immagini Docker. L'architettura altamente disponibile e scalabile di Oracle Cloud Infrastructure ti assicura di poter distribuire e gestire le tue applicazioni in modo affidabile.
- Motore Kubernetes
Oracle Cloud Infrastructure Kubernetes Engine (OCI Kubernetes Engine o OKE) è un servizio completamente gestito, scalabile e ad alta disponibilità che puoi utilizzare per distribuire le tue applicazioni containerizzate nel cloud. Puoi specificare le risorse di computazione richieste dalle tue applicazioni e Kubernetes Engine le esegue sul Oracle Cloud Infrastructure in una tenancy esistente. OKE utilizza Kubernetes per automatizzare l'implementazione, la scalabilità e la gestione di applicazioni containerizzate tra cluster di host.
- Cluster Kubernetes
Un cluster Kubernetes è un set di computer che eseguono applicazioni containerizzate. Kubernetes offre una piattaforma portatile, estendibile e open source per la gestione di carichi di lavoro e servizi containerizzati in quei nodi. Un cluster Kubernetes è formato da nodi di lavoro e nodi del piano di controllo.
- Piano di controllo KubernetesUn piano di controllo Kubernetes gestisce le risorse per i nodi di lavoro e i pod all'interno di un cluster Kubernetes. I componenti del piano di controllo rilevano e rispondono agli eventi, eseguono la pianificazione e spostano le risorse del cluster. Di seguito sono riportati i componenti del piano di controllo.
- kube-apiserver: esegue il server API Kubernetes.
- etcd: area di memorizzazione chiave-valore distribuita per tutti i dati del cluster.
- kube-scheduler: determina su quale nodo verranno eseguiti i nuovi pod non assegnati.
- kube-controller-manager: esegue i processi del controller.
- cloud-controller-manager: collega il cluster con un'API specifica per il cloud.
- Nodo di lavoro Kubernetes
Un nodo di lavoro Kubernetes è una macchina operativa che esegue applicazioni containerizzate all'interno di un cluster Kubernetes. Ogni cluster dispone di almeno un nodo di lavoro.
- Controller di ingresso
Un controller in entrata è un componente che viene eseguito in un cluster Kubernetes e gestisce le risorse in entrata. Riceve traffico dalla rete esterna, lo instrada al servizio corretto ed esegue il bilanciamento del carico e l'interruzione SSL. Il controller Ingress viene in genere eseguito come pod separato nel cluster e può essere ridimensionato indipendentemente dai servizi gestiti.
- API endpoint KUBE
L'API KUBE-Endpoint è il componente
kube-apiserver
del piano di controllo Kubernetes. Esegue il server API Kubernetes. - Backup ETCD
ETCD Backup è un backup del componente
etcd
del piano di controllo Kubernetes.etcd
contiene l'area di memorizzazione chiave-valore distribuita per tutti i dati del cluster. È importante creare un backup ETCD per recuperare i cluster Kubernetes per il recupero da errori irreversibili. - Snapshot YAML
Uno snapshot YAML è una copia point-in-time dei file (YAML) che contengono la definizione degli artifact in un cluster Kubernetes. Lo snapshot è un file tar che è possibile utilizzare per ripristinare tali artifact nello stesso cluster Kubernetes o in un altro cluster.
Considerazioni per la protezione da calamità Kubernetes
Quando si implementa la protezione da errori irreversibili per Kubernetes, tenere presente quanto riportato di seguito.
- DR (Symmetric Disaster Recovery): Oracle consiglia di utilizzare la stessa capacità e configurazione delle risorse in database primario e secondario. I cluster Kubernetes nelle due aree devono disporre di risorse simili, ad esempio il numero di nodi di lavoro (e la relativa capacità hardware) e altre infrastrutture (storage condiviso, load balancer, database e così via). Le risorse da cui dipende il cluster Kubernetes nell'area secondaria devono essere in grado di tenere il passo con gli stessi carichi di lavoro del database primario. Inoltre, i due sistemi devono essere coerenti funzionalmente con gli stessi servizi da cui dipende il sistema ripristinato, le auto laterali, le mappe di configurazione (CM) devono essere utilizzate in entrambe le posizioni.
- Alias nome host e virtualizzazione: è importante pianificare i nomi host utilizzati dai nodi nel sito secondario. I nomi host o i nomi host alias per il piano di controllo e i nodi di lavoro devono essere "attivi" nella posizione secondaria prima di ripristinare uno snapshot
etcd
da un cluster Kubernetes primario. I nomi dei nodi vengono memorizzati in artifact diversi di un cluster Kubernetes per identificare i nodi di lavoro, contrassegnare le allocazioni dei pod, nelle mappe di configurazione (config) che descrivono il cluster stesso e in più file e voci di configurazione. La posizione secondaria deve identificare gli indirizzikube-api
del lavoratore, del piano di controllo e del front-end con gli stessi nomi host utilizzati nel cluster Kubernetes primario (un nome completamente qualificato può differire nel nome di dominio, ma il nome host deve essere lo stesso). Senza l'aliasing dei nomi host, un ripristino dello snapshotetcd
non funzionerà correttamente poiché kubelet, scheduler, controller e, in generale, i servizi del piano di controllo non saranno in grado di raggiungere gli endpoint e gli host appropriati utilizzati dalla configurazione replicata. Non utilizzare gli indirizzi IP per identificare i nodi in Kubernetes, ma utilizzare sempre i nomi host. - Le immagini presentano un paradigma simile ai file binari: le immagini potrebbero non cambiare con la stessa frequenza della configurazione Kubernetes e potrebbe non essere necessario aggiornare le immagini con ogni replica del cluster Kubernetes. Le immagini utilizzate dal sistema primario devono essere identiche a quelle utilizzate nel sistema secondario oppure possono verificarsi incongruenze e guasti. Tuttavia, la replica delle immagini non rientra nell'ambito di questo playbook. Esistono più strategie che è possibile utilizzare per mantenere un uso coerente delle immagini tra due posizioni, tra cui:
- Salvare le immagini nel database primario e caricarle nei nodi di lavoro secondari. Questo approccio è molto facile da implementare, ma comporta un sovraccarico di gestione. L'utilizzo dei registri dei container offre notevoli vantaggi e il salvataggio delle immagini a livello locale rende più difficile la gestione di versioni e aggiornamenti.
- Le immagini possono risiedere in registri dei container totalmente esterni in aree o data center diversi da quelli utilizzati dal database primario e dal database di standby. I prodotti e le librerie esterni sono gestiti da terze parti e la loro disponibilità è in genere implicita nelle loro release.
- Le immagini possono risiedere nei registri dei container presenti nel database primario e in standby. Ogni area viene aggiornata in parallelo quando viene rilasciata una nuova versione di un'immagine. Ciò fornisce un migliore controllo sul software utilizzato, ma comporta un maggiore sovraccarico di gestione. Richiede la duplicazione delle immagini e la gestione delle credenziali per accedere a due registri diversi. Gli strumenti CI/CD sono in genere utilizzati per questo approccio.
- Differenze tra cluster primario e secondario: si prevede (come avviene in generale per i sistemi DR) che primari e secondari siano una replica l'uno dell'altro in termini di versioni e configurazione utilizzate. Sono particolarmente rilevanti i seguenti aspetti:
- Versioni Kubernetes
- Runtime e versione runtime del contenitore
- Versioni plugin di rete e plugin di rete
podSubnet
eservicesubnet
- Directory del percorso host
etcd
e versione dell'immagineetcd
- Plugin di rete e versione dell'immagine dns
- Repository di immagini per i pod del piano di controllo
Le configurazioni di protezione da calamità con differenze minori tra i siti nella versione Kubernetes potrebbero funzionare, ma potrebbero lasciare il cluster in uno stato incoerente dopo un ripristino dallo snapshot
etcd
di un primario. Le informazioni sui socket di runtime dei container, sulla versione Kubernetes e così via vengono memorizzate nello stesso Kubernetes. Ad esempio, le informazionicri-socket
sono specifiche di ogni nodo in base al runtime del contenitore utilizzato e vengono memorizzate nelle mappe di configurazione interne. Molte informazioni utilizzate per gli aggiornamenti dakubeadm
si basano sulle mappe di configurazione nello spazio di nomikube-system
. Pertanto, è importante che sia primaria che secondaria utilizzino le stesse informazioni in queste configurazioni. È possibile utilizzare questo comando per memorizzare tutte le informazioni pertinenti dalle importanti configmap sia in database primario che in standby nei fileyaml
.[prompt]$ kubectl get cm -n kube-system | grep -v NAME | awk '{print $1}'| xargs -I{} sh -c 'kubectl get cm "$1" -o yaml -n kube-system > "$1-`date +%y-%m-%d-%H-%M-%S`.yaml"' -- {}
Analogamente, è possibile creare una copia della configurazione del nodo in ogni sito con il comando seguente:
[prompt]$ kubectl get node |grep -v NAME | awk '{print $1}'| xargs -I{} sh -c 'kubectl get node "$1" -o yaml > "$1-`date +%y-%m-%d-%H-%M-%S`.yaml"' -- {}
Questo playbook di soluzioni presenta un esempio utilizzando i cluster Kubernetes creati utilizzando lo strumento kubeadm
. I suggerimenti sono generici per i cluster Kubernetes personalizzati installati nei sistemi in locale, ma la maggior parte degli script potrebbe richiedere modifiche per i cluster non creati con lo strumento kubeadm
. È necessario utilizzare i passi e gli script forniti tra i cluster Kubernetes che eseguono la stessa versione etcd
e Kubernetes. Il ripristino degli snapshot etcd
in diverse versioni di Kubernetes può causare incongruenze e cluster etcd
instabili.
Informazioni sui prodotti e sui ruoli richiesti
Questa soluzione richiede i seguenti prodotti e ruoli:
- Cluster Kubernetes
- Bastion in grado di gestire il sistema Kubernetes per accedere agli endpoint etcd del cluster e accedere ai diversi nodi del piano di controllo con ssh
- (Facoltativo) Oracle Cloud Infrastructure (OCI)
Questa guida si basa sull'utilizzo delle region e delle risorse OCI per le region primarie e secondarie. Tuttavia, questa soluzione è applicabile anche ai cluster Kubernetes che si trovano on-premise.
Questi sono i ruoli necessari per ogni servizio.
Nome servizio: ruolo | Richiesto per... |
---|---|
Cluster Kubernetes (primario): administrator |
eseguire tutti gli script. |
Nodi Kubernetes (primari): utente con diritti sudo su root |
eseguire i seguenti script:
|
Cluster Kubernetes (secondario): administrator |
eseguire tutti gli script. |
Nodi Kubernetes (secondari): utente con diritti sudo su root | eseguire i seguenti script:
|
Consulta i prodotti, le soluzioni e i servizi Oracle per ottenere ciò di cui hai bisogno.