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

更新於 2024/03/07閱讀時間約 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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
孩子,我們今天來談談生命之花吧   生命之花,來自於你們的母親,蓋亞。那是他的生命藍圖縮限在你們2D圖像的一種示現。生命之花是你們所在的天體與他的所有片段,環繞著他的靈魂本源移動的路線圖。沒有終點,也沒有起點,那是你們自源頭出生後,成長的一個經歷及過程。透過這個示現圖,你們可以與你們的母親獲得連
Thumbnail
之前寫完《如何把工作快狠準地搞定 (上)》、《如何把工作快狠準地搞定 (下)》兩篇文章後,除了得到一些私訊迴響外,我覺得它們也讓我去檢視我在工作以外的日常生活如何運作,特別是做家事這點 除了自己的提升,別忘了「工欲善其事,必先利其器」 你去問大部分的人,不論性別年齡,如果他/她說自己很喜歡做家事,通
Thumbnail
《大俠胡金銓》以客觀角度看待的話,優點是明顯的,反面來說,缺點亦是。以單純二分法來假設,對於喜歡、熟悉胡金銓電影的觀眾來看此部紀錄片,絕對看得熱血沸騰,身歷其境,甚至會再次愛上胡金銓所悉心建構的武俠世
Thumbnail
大家在極簡生活的過程當中,一定會愈來愈清楚自己「購買物品的原則」,例如衣服必須要舒服、適合場合夠多(要能上班、爬山等等)、有彈性、純棉質、快乾吸汗等,同樣的,觀察自己的飲食生活,也會逐漸讓我們發現自己的飲食原則! 在練習少食生活之後,我們也愈來愈清楚適合自己的飲食生活,於是整理了以下我們設計自己菜
Thumbnail
本文為1922年的美國紀錄片《北方的南奴克》觀後感,請不介意劇透者再閱讀。
Thumbnail
如果借用人沒有按照約定的方式來使用借用物品,貸與人(出借物品的人)可以隨時要求對方將出借的東西還給自己。因為A沒照當時約定的方式來使用土地,所以B可以馬上要求A交還土地,不用等到契約約定的五年到期才拿回土地。
Thumbnail
大家或許可以理解,在民智未開的部落時代,為了保障統治權威不墜,賦予統治者神祕力量象徵是相當有效的方式,世界各地部落首領神格化也就應運而生,日本當然也不例外。 一般人比較熟悉日本神話大概是九州天照大神系統,不過提及葦原中國地方就比較少為外國人所知,甚至現代日本年輕一代或許也不太清楚。 話說天
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
孩子,我們今天來談談生命之花吧   生命之花,來自於你們的母親,蓋亞。那是他的生命藍圖縮限在你們2D圖像的一種示現。生命之花是你們所在的天體與他的所有片段,環繞著他的靈魂本源移動的路線圖。沒有終點,也沒有起點,那是你們自源頭出生後,成長的一個經歷及過程。透過這個示現圖,你們可以與你們的母親獲得連
Thumbnail
之前寫完《如何把工作快狠準地搞定 (上)》、《如何把工作快狠準地搞定 (下)》兩篇文章後,除了得到一些私訊迴響外,我覺得它們也讓我去檢視我在工作以外的日常生活如何運作,特別是做家事這點 除了自己的提升,別忘了「工欲善其事,必先利其器」 你去問大部分的人,不論性別年齡,如果他/她說自己很喜歡做家事,通
Thumbnail
《大俠胡金銓》以客觀角度看待的話,優點是明顯的,反面來說,缺點亦是。以單純二分法來假設,對於喜歡、熟悉胡金銓電影的觀眾來看此部紀錄片,絕對看得熱血沸騰,身歷其境,甚至會再次愛上胡金銓所悉心建構的武俠世
Thumbnail
大家在極簡生活的過程當中,一定會愈來愈清楚自己「購買物品的原則」,例如衣服必須要舒服、適合場合夠多(要能上班、爬山等等)、有彈性、純棉質、快乾吸汗等,同樣的,觀察自己的飲食生活,也會逐漸讓我們發現自己的飲食原則! 在練習少食生活之後,我們也愈來愈清楚適合自己的飲食生活,於是整理了以下我們設計自己菜
Thumbnail
本文為1922年的美國紀錄片《北方的南奴克》觀後感,請不介意劇透者再閱讀。
Thumbnail
如果借用人沒有按照約定的方式來使用借用物品,貸與人(出借物品的人)可以隨時要求對方將出借的東西還給自己。因為A沒照當時約定的方式來使用土地,所以B可以馬上要求A交還土地,不用等到契約約定的五年到期才拿回土地。
Thumbnail
大家或許可以理解,在民智未開的部落時代,為了保障統治權威不墜,賦予統治者神祕力量象徵是相當有效的方式,世界各地部落首領神格化也就應運而生,日本當然也不例外。 一般人比較熟悉日本神話大概是九州天照大神系統,不過提及葦原中國地方就比較少為外國人所知,甚至現代日本年輕一代或許也不太清楚。 話說天