ETCD還原實戰指南:Cluster問題輕鬆解決

更新於 發佈於 閱讀時間約 15 分鐘

最近碰到K8S Cluster出現問題,在不使用其他快照功能的前提之下,透過平常ETCD的備份來還原Cluster,本篇就將這個還原的做法記錄下來,下次若再次發生(希望不要!),就可以作為參考文件。

raw-image

同樣地,以下是本篇將會提到的幾個重點:

  1. ETCD的資料類型
  2. ETCD 備份
  3. ETCD 還原
  4. 結論

1. ETCD的資料類型

ETCD的資料預設會分成二種資料類型:

  • snap(Snapshot):儲存快照資料,預防WAL檔案過多而設計的快照,存放ETCD資料狀態。檔案附檔名為.snap。如果打開一個.snap檔案,可以發現除了開頭的幾個字是看不到的字元外,之後都是可見字元,因為實際上就是直接將儲存的JSON格式化後的字串。
  • wal(Write Ahead Log):儲存預寫式日誌,最大的功能是記錄整個資料變化的全部過程,在ETCD中,所有資料的修改在提交之前,都先寫到WAL中。每個wal都是由一條條的記錄所構成。

2. ETCD 備份

#------------------------------------------------------
# S2-1. 前置作業
#------------------------------------------------------
[master]# mkdir -p /root/backup_$(date +%Y%m%d)
[master]# cp -r /etc/kubernetes /root/backup_$(date +%Y%m%d)/
[master]# cp -r /var/lib/etcd/ /root/backup_$(date +%Y%m%d)/
[master]# cp -r /var/lib/kubelet/ /root/backup_$(date +%Y%m%d)/
[master]# ls -al /root/backup_$(date +%Y%m%d)/
raw-image
#------------------------------------------------------
# S2-2. 備份ETCD
#------------------------------------------------------
[master]# ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379" \
--cert="/etc/kubernetes/pki/etcd/server.crt" \
--key="/etc/kubernetes/pki/etcd/server.key" \
--cacert="/etc/kubernetes/pki/etcd/ca.crt" \
snapshot save /root/backup_$(date +%Y%m%d)/snap-$(date +%Y%m%d).db

[master]# ls -alh
drwx------ 3 root root 20 Feb 5 15:52 etcd
drwx------ 8 root root 4.0K Feb 5 15:52 kubelet
drwxr-xr-x 4 root root 125 Feb 5 15:52 kubernetes
-rw------- 1 root root 169M Feb 5 15:53 snap-20240205.db
raw-image

3. ETCD 還原

#------------------------------------------------------
# S3-1. 確認member名稱
#------------------------------------------------------
[master]# ETCDCTL_API=3 etcdctl --endpoints 10.107.88.12:2379,10.107.88.13:2379,10.107.88.14:2379 \
--cert="/etc/kubernetes/pki/etcd/server.crt" \
--key="/etc/kubernetes/pki/etcd/server.key" \
--cacert="/etc/kubernetes/pki/etcd/ca.crt" \
member list --write-out=table
raw-image
#------------------------------------------------------
# S3-1. 還原前準備 (master01,master02, master03)
# 停掉所有master節點上的kube-apiserver, etcd
#------------------------------------------------------
[master]# cd /etc/kubernetes
[master]# mv manifests manifests.bak
[master01]# scp -rp /etc/kubernetes/manifests.bak.master01 root@lb01:/root/backup_20240205/
[master02]# scp -rp /etc/kubernetes/manifests.bak.master02 root@lb01:/root/backup_20240205/
[master03]# scp -rp /etc/kubernetes/manifests.bak.master03 root@lb01:/root/backup_20240205/
[master]# crictl ps
(確認相對應的Pod都已經完全停止)

[master]# mv /var/lib/etcd /var/lib/etcd.bak
[master01]# scp -rp /var/lib/etcd.bak.master01 root@lb01:/root/backup_20240205/
[master02]# scp -rp /var/lib/etcd.bak.master02 root@lb01:/root/backup_20240205/
[master03]# scp -rp /var/lib/etcd.bak.master03 root@lb01:/root/backup_20240205/
=> 執行`etcdctl member list`會出現錯誤訊息

※ 停止前

raw-image
raw-image
raw-image

※ 停止後

raw-image
raw-image
#------------------------------------------------------
# S3-3. 還原ETCD (master01,master02, master03)
# 要用同一份snapshot還原
#------------------------------------------------------
[master]# scp -rp /root/backup_20240205 root@master02.test.example.poc:/root/
[master]# scp -rp /root/backup_20240205 root@master03.test.example.poc:/root/
#------------------------------------------------------
# S3-4. 執行還原 (master01)
#------------------------------------------------------
[master01]# ETCDCTL_API=3 etcdctl snapshot restore /root/backup_20240205/snap-20240205.db \
--endpoints=10.107.88.12:2379 \
--name=master01.test.example.poc \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--initial-advertise-peer-urls=https://10.107.88.12:2380 \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=master01.test.example.poc=https://10.107.88.12:2380,master02.test.example.poc=https://10.107.88.13:2380,master03.test.example.poc=https://10.107.88.14:2380 \
--data-dir=/var/lib/etcd

[master01]# mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
raw-image
#------------------------------------------------------
# S3-5. 執行還原 (master02)
#------------------------------------------------------
[master]# ETCDCTL_API=3 etcdctl snapshot restore /root/backup_20240205/snap-20240205.db \
--endpoints=10.107.88.13:2379 \
--name=master02.test.example.poc \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--initial-advertise-peer-urls=https://10.107.88.13:2380 \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=master01.test.example.poc=https://10.107.88.12:2380,master02.test.example.poc=https://10.107.88.13:2380,master03.test.example.poc=https://10.107.88.14:2380 \
--data-dir=/var/lib/etcd

[master02]# mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
raw-image
#------------------------------------------------------
# S3-6. 執行還原 (master03)
#------------------------------------------------------
[master]# ETCDCTL_API=3 etcdctl snapshot restore /root/backup_20240205/snap-20240205.db \
--endpoints=10.107.88.14:2379 \
--name=master03.test.example.poc \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--initial-advertise-peer-urls=https://10.107.88.14:2380 \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=master01.test.example.poc=https://10.107.88.12:2380,master02.test.example.poc=https://10.107.88.13:2380,master03.test.example.poc=https://10.107.88.14:2380 \
--data-dir=/var/lib/etcd

[master03]# mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
raw-image
#------------------------------------------------------
# S3-6. 確認
#------------------------------------------------------
[master]# crictl ps
[master]# kubectl get podn -n kube-system
[master]# ETCDCTL_API=3 etcdctl --endpoints 10.107.88.12:2379,10.107.88.13:2379,10.107.88.14:2379 \
--cert="/etc/kubernetes/pki/etcd/server.crt" \
--key="/etc/kubernetes/pki/etcd/server.key" \
--cacert="/etc/kubernetes/pki/etcd/ca.crt" \
member list --write-out=table
raw-image
raw-image
raw-image
raw-image
raw-image

4. 結論

本篇很快速的複習備份ETCD的做法,各位也可以參考先前的ETCD文章一併使用。實務上建議用Cronjob的方式自動進行ETCD的備份作業,並且加上第三方針對應用服務的備份,這樣就能更加確保系統的穩定性與可回復性。

此外備份的儲存位置也很重要,一定要存放在K8S的外部位置,最好是還可以定期將儲存的備份檔案再另外存放一份到異地更為安全。

本篇就先說到這邊,謝謝收看~~


Reference:




avatar-img
15會員
40內容數
記錄IT社畜的自我學習筆記,如同專題名稱,主要是怕自已忘記自已做過什麼、學到什麼。索性就分享我自已在學習Kubernetes這條路上的各種測試、學習心得。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
超健忘閒人的沙龍 的其他內容
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
本篇將介紹Minio的功能和如何與Harbor進行整合,並說明這樣做的好處。包括Minio的優勢及Harbor x Minio的部署和測試。
本文闡述了Kubernetes內部網路通訊的基本概念,從容器到服務的溝通流程,並討論了Kubernetes使用的各種技術。重要的是,管理Kubernetes叢集時理解這些基本概念是極其重要的。
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
當您在K8S Cluster中使用Harbor作為容器鏡像的儲存庫時,隨著應用服務鏡像的增加,如何透過內建機制將一臺Harbor的內容同步到另一個Harbor就變得愈來愈重要。本文將介紹如何透過內建機制同步Harbor的內容以及支援Harbor同步到其他相容的Image Registry的方式。
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
本篇將介紹Minio的功能和如何與Harbor進行整合,並說明這樣做的好處。包括Minio的優勢及Harbor x Minio的部署和測試。
本文闡述了Kubernetes內部網路通訊的基本概念,從容器到服務的溝通流程,並討論了Kubernetes使用的各種技術。重要的是,管理Kubernetes叢集時理解這些基本概念是極其重要的。
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
當您在K8S Cluster中使用Harbor作為容器鏡像的儲存庫時,隨著應用服務鏡像的增加,如何透過內建機制將一臺Harbor的內容同步到另一個Harbor就變得愈來愈重要。本文將介紹如何透過內建機制同步Harbor的內容以及支援Harbor同步到其他相容的Image Registry的方式。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
自己今天庫存,錯了停損就好!
Thumbnail
由於電腦突然出現故障,導致檔案丟失以及電腦無法正常使用,故今日臨時停更一次,沿至下禮拜五更新
Thumbnail
資料庫之備份工作大都是自動執行,但是執行結果是否成功,需要安排人員去檢查,有時疏忽忘記確認作業,致備份工作失敗仍不知道,等到有一天需要回復舊有資料的場合時,才發現找不到過去某段期間的備份資料,造成無法彌補之後果。   2.    改善: 2.1 設計一執行檔,功能為打開備
不論企業使用的伺服器和客戶端是使用何種作業系統,定期更新補丁是必不可少的。 這道理仿如真理,因為世界上還沒有一個作業系統是完全沒有漏洞的,只要有漏洞被發現,就要推出補丁,作為使用者的角色就得決定是否安裝。 筆者曾經和一些決策層交談,他們未必是IT業者,但也懂得補丁要越快更新越好。但其實這觀點並不
Thumbnail
引言 在現今迅速發展的科技環境下,資料克隆技術已成為數據管理中不可或缺的一環。在日常生活和商業運營中,我們經常需要處理大量數據的複製、備份和遷移,而SSD克隆技術應運而生,提供了高效、快速和方便的解決方案。 目錄 SSD克隆的原理 SSD克隆的方法 SSD克隆機器的運作 軟體 vs. 專
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
自己今天庫存,錯了停損就好!
Thumbnail
由於電腦突然出現故障,導致檔案丟失以及電腦無法正常使用,故今日臨時停更一次,沿至下禮拜五更新
Thumbnail
資料庫之備份工作大都是自動執行,但是執行結果是否成功,需要安排人員去檢查,有時疏忽忘記確認作業,致備份工作失敗仍不知道,等到有一天需要回復舊有資料的場合時,才發現找不到過去某段期間的備份資料,造成無法彌補之後果。   2.    改善: 2.1 設計一執行檔,功能為打開備
不論企業使用的伺服器和客戶端是使用何種作業系統,定期更新補丁是必不可少的。 這道理仿如真理,因為世界上還沒有一個作業系統是完全沒有漏洞的,只要有漏洞被發現,就要推出補丁,作為使用者的角色就得決定是否安裝。 筆者曾經和一些決策層交談,他們未必是IT業者,但也懂得補丁要越快更新越好。但其實這觀點並不
Thumbnail
引言 在現今迅速發展的科技環境下,資料克隆技術已成為數據管理中不可或缺的一環。在日常生活和商業運營中,我們經常需要處理大量數據的複製、備份和遷移,而SSD克隆技術應運而生,提供了高效、快速和方便的解決方案。 目錄 SSD克隆的原理 SSD克隆的方法 SSD克隆機器的運作 軟體 vs. 專