返回文章列表

Kubernetes叢集備份與還原實戰

本文探討 Kubernetes 叢集的備份與還原策略,涵蓋 etcd 資料函式庫備份、Velero 的使用,以及整合 EFK 堆積疊和 Falco 進行安全稽核與日誌管理。文章提供詳細的操作步驟和程式碼範例,並結合圖表說明,幫助讀者快速掌握 Kubernetes 叢集的備份、還原和安全防護技巧。

Kubernetes DevOps

Kubernetes 叢集的備份與還原對於維護系統穩定性和資料安全至關重要。etcd 資料函式庫作為 Kubernetes 叢集的狀態儲存中心,其備份是整個流程的關鍵環節。本文將介紹如何使用 etcdctl 工具備份 etcd 資料函式庫,並探討 Velero 作為更自動化、更全面的備份與還原解決方案的優勢。此外,文章還涵蓋了使用 EFK 堆積疊和 Falco 監控 Kubernetes 叢集安全性和日誌管理的實務操作,包含 Kibana 視覺化和儀錶板的建立,以及 Falco 規則的客製化。透過整合這些工具,可以建立更穩固、更安全的 Kubernetes 叢集管理體系。

使用 Falco 和 EFK 進行稽核

設定 Kibana 索引

要檢視日誌或建立視覺化和儀錶板,您需要建立索引。您可以在單個 Kibana 伺服器上擁有多個索引,從而允許您從單個位置檢視不同的日誌。在我們的範例伺服器上,我們將擁有兩組不同的傳入日誌,一組以名稱 logstash 開頭,另一組以名稱 falco 開頭。

logstash 檔案容器中的資料由 Kubernetes 日誌檔案組成,其中包括由 Fluentd 轉發器轉發的所有日誌。Falco 檔案則由 Falcosidekick 轉發,並且僅包含來自 Falco Pod 的警示。為了本章的目的,我們將重點關注 Falco 檔案,因為它們只包含 Falco 資料。

  1. 在 Kibana 中,按一下左側的設定工具,開啟 Kibana 管理頁面。
  2. 若要建立索引並將其設定為預設值,請按一下瀏覽器左上角的 index patterns 連結。
  3. 接下來,按一下右上角的按鈕以建立新的索引模式。

建立 Falco 索引模式

由於我們只想建立一個包含 Falco 資料的索引,因此在方塊中輸入 falco*。這將建立一個包含所有當前和未來 Falco 日誌的索引:

  1. 按一下 Next step 按鈕繼續。

  2. 在組態設定中,按一下下拉式選單並選擇 time,然後按一下 Create index pattern 以建立模式:

  3. 最後,按一下最後一個畫面右上角的星號,將索引設定為預設索引:

現在您已經有了一個完整的 Falco 日誌記錄系統在叢集上執行。

檢視資料

要開始檢視資料,請按一下 Kibana 畫面左上角的 discover 按鈕,這將帶您到主要的 Kibana 頁面,您將在其中看到叢集中的事件:

您可以在搜尋欄位中輸入關鍵字來搜尋事件。如果您正在尋找單一型別的事件,並且知道要搜尋的值,這將非常有用。

建立儀錶板

Kibana 等日誌記錄系統的真正好處在於能夠建立自訂的儀錶板,提供對多個事件的檢視,可以按計數、平均值等進行分組。在下一節中,我們將解釋如何建立一個提供 Falco 事件集合的儀錶板。

視覺化

視覺化是資料集合的圖形表示,在我們的上下文中,來自 Kibana 索引。Kibana 包含一組視覺化工具,允許您將資料分組到表格、儀表、水平條形圖、餅圖、垂直條形圖等中。

建立新的視覺化

  1. 若要建立新的視覺化,請按一下左側欄中的 visualize 圖示,看起來像一個小圖表。這將開啟新的視覺化選擇畫面。
  2. 若要選擇要建立的視覺化,請從清單中選擇它。讓我們使用一個常見的視覺化——餅圖:

設定視覺化

  1. 每個視覺化都需要一個來源。對於我們的範例,我們只有一個名為 falco* 的索引,因此請選擇它作為來源:
  2. 下一步是選擇指標和儲存桶。指標定義了您希望如何彙總儲存桶中的結果。儲存桶是您要視覺化的值。

對於我們的範例,我們希望我們的餅圖顯示事件優先順序的總計數,範圍從錯誤、通知和警告到偵錯。

  1. 首先,將指標彙總值設定為 Count

  2. 接下來,我們需要選擇要彙總的欄位。對於 Aggregation,選擇 Terms,對於 Field,選擇 priority.keyword

  3. 在儲存視覺化之前,您可以按一下指標方塊頂部的箭頭按鈕來預覽結果。結果的預覽將顯示在右側窗格中:

  4. 如果結果符合您的預期,您可以按一下主檢視頂部的 Save 連結來儲存視覺化。輸入視覺化的名稱,以便稍後在建立儀錶板時找到它:

當您儲存視覺化時,它將保留在畫面上,但您應該在右下角看到儲存成功的確認訊息。

建立額外的視覺化

使用我們剛才介紹的第一個視覺化的步驟,建立兩個額外的視覺化,它們使用以下引數:

  • 視覺化型別:水平條形圖
    • 來源:falco*
    • 指標:彙總:計數
    • 儲存桶:X 軸,彙總:術語,欄位:rule.keyword
    • 指標:計數,大小:5,自訂標籤:前 5 個 Falco 規則
    • 視覺化名稱:前 5 個 Falco 規則
  • 視覺化型別:資料表
    • 來源:falco*
    • 指標:彙總:計數

程式碼範例與說明

Falco 和 EFK 的架構:

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 程式碼範例與說明

rectangle "logs" as node1
rectangle "forward" as node2
rectangle "index" as node3
rectangle "visualize" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

圖表翻譯: 此圖展示了 Falco 和 EFK Stack 之間的互動關係。Falco 產生日誌並將其傳送給 Falcosidekick,後者將日誌轉發給 EFK Stack。EFK Stack 對日誌進行索引,並將結果儲存在 Kibana 中。最後,Kibana 將資料視覺化並呈現在儀錶板上。

使用 Falco 和 EFK 進行稽核

在前面的章節中,我們探討瞭如何使用 Falco 來增強 Kubernetes 叢集的稽核功能。現在,我們將介紹如何使用 EFK(Elasticsearch、Fluentd、Kibana)堆積疊來儲存和視覺化 Falco 事件。

建立視覺化

視覺化允許您以圖形化的方式呈現資料。在 Kibana 中,您可以建立多種不同型別的視覺化,例如柱狀圖、圓餅圖等。

  1. 建立視覺化:點選左側邊欄中的「Visualize」按鈕。
  2. 選擇視覺化型別:選擇您想要建立的視覺化型別,例如「Vertical bar chart」。
  3. 設定資料來源:選擇您要使用的資料來源,例如「falco-*」索引模式。
  4. 設定欄位:設定您要使用的欄位,例如「output_fields.fd.name.keyword」。

Top 5 Falco Modified Files 視覺化

  • Buckets:Split rows, Aggregation: Terms, Field: output_fields.fd.name.keyword
  • Metric:Count, Size: 5, Custom label: Top 5 Modified Files
  • 視覺化名稱:Top 5 Falco Modified Files

建立儀錶板

儀錶板允許您將多個視覺化集合在一起,以便於閱讀和理解資料。

  1. 建立儀錶板:點選左側邊欄中的「Dashboard」按鈕。
  2. 建立新儀錶板:點選「Create new dashboard」按鈕。
  3. 新增視覺化:點選「Add an existing」連結,然後選擇您之前建立的視覺化。

新增 Falco 視覺化到儀錶板

  • 新增「Falco - Priority Count」、「Top 5 Falco Modified Files」和「Top 5 Falco Rules」視覺化到儀錶板。
  • 如果您不小心新增了重複的視覺化,可以點選視覺化右上角的齒輪圖示,然後選擇「Delete from dashboard」來刪除它。
重點回顧
  • Falco 提供了 Kubernetes 所沒有的稽核功能,可以與 Kubernetes 的稽核功能結合使用,提供完整的稽核軌跡。
  • EFK 堆積疊提供了一個日誌管理系統,可以儲存日誌並提供搜尋和管理介面。
  • Kibana 提供了視覺化和儀錶板功能,可以用來呈現 Falco 事件和其他日誌資料。

常見問題

  1. 如果您需要編輯內建的 Falco 規則,您應該編輯哪個檔案?

    • 答案:D. falco_rules.local.yaml

    內容解密:

    • Falco 的內建規則儲存在 falco_rules.yaml 中,但您不應該直接編輯這個檔案。
    • 要自定義或覆寫內建規則,您應該編輯 falco_rules.local.yaml 檔案。
  2. 以下哪個是 Kubernetes 常用的日誌轉送器?

    • 答案:B. Fluentd

    內容解密:

    • Fluentd 是一個開源的日誌轉送器,常用於 Kubernetes 環境中收集和轉送日誌。
  3. 當您佈署 EFK 堆積疊時,哪個產品提供了使用視覺化和儀錶板呈現日誌的方式?

    • 答案:C. Kibana

    內容解密:

    • Kibana 是 EFK 堆積疊中的一部分,提供了一個網頁介面來搜尋、分析和視覺化日誌資料。
  4. 以下哪個工具只將 Falco 日誌轉送到中央日誌系統?

    • 答案:B. Falcosidekick

    內容解密:

    • Falcosidekick 是一個用於轉送 Falco 事件到多種目標的工具,包括日誌管理系統。
  5. Falco 中的哪個物件允許您建立一個專案集合?

    • 答案:A. Lists

    內容解密:

    • 在 Falco 中,Lists 用於定義一個專案集合,可以在規則中使用。

第 13 章:備份工作負載

本章將介紹如何使用 Velero 來備份和還原 Kubernetes 工作負載。

本章重點

  • 瞭解 Kubernetes 備份
  • 執行 etcd 備份
  • 使用 Velero 備份工作負載
  • 使用 CLI 管理 Velero
  • 從備份還原工作負載

在下一章中,我們將探討 Velero 的使用方法和最佳實踐。

Kubernetes備份與還原:etcd資料函式庫備份實戰

在Kubernetes叢集管理中,備份是一項至關重要的任務。本章將探討如何備份Kubernetes叢集及其工作負載,重點關注etcd資料函式庫的備份。

瞭解Kubernetes備份

備份Kubernetes叢集不僅需要備份正在執行的工作負載,還需要備份叢集本身。由於叢集狀態儲存在etcd資料函式庫中,因此etcd是備份過程中的關鍵元件。備份叢集和工作負載使我們能夠:

  • 遷移叢集
  • 從生產叢集建立開發叢集
  • 從災難中還原叢集
  • 從持久性儲存區中還原資料
  • 名稱空間和佈署還原

執行etcd備份

由於我們使用KinD(Kubernetes-in-Docker)作為Kubernetes叢集,因此可以建立etcd資料函式庫的備份,但無法直接還原它。

備份必要的憑證

大多數Kubernetes安裝將憑證儲存在/etc/kubernetes/pki。對於KinD叢集,我們可以使用docker cp命令備份這些憑證。

  1. 首先,在chapter13資料夾下建立一個名為backup的目錄,並進入該目錄:
mkdir backup
cd ./backup
  1. 使用docker cp命令備份API伺服器上的憑證:
docker cp cluster01-control-plane:/etc/kubernetes/pki ./

這將把控制平面節點上的pki資料夾內容複製到本地的chapter13/backup/pki資料夾中。

備份etcd資料函式庫

要在KinD叢集中備份etcd資料函式庫,請遵循以下步驟:

  1. 使用kubectl exec在etcd Pod中執行一個shell:
kubectl exec -it etcd-cluster01-control-plane /bin/sh -n kube-system
  1. 在etcd Pod中,使用etcdctl備份etcd資料函式庫:
etcdctl snapshot save etcd-snapshot.db --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key

內容解密:

此命令使用etcdctl工具對etcd資料函式庫進行快照備份。具體引數說明如下:

  • snapshot save etcd-snapshot.db:將etcd資料函式庫快照儲存到名為etcd-snapshot.db的檔案中。
  • --endpoints=https://127.0.0.1:2379:指定etcd服務的端點地址和埠。
  • --cacert, --cert, --key:分別指定用於與etcd服務進行安全通訊的CA憑證、客戶端憑證和客戶端私鑰。

執行此命令後,您將看到類別似以下的輸出,表示備份成功:

{"level":"info","ts":1591637958.297016,"caller":"snapshot/v3_snapshot.go:110","msg":"created temporary db file","path":"etcd-snapshot.db.part"}
{"level":"info","ts":1591637958.732125,"caller":"snapshot/v3_snapshot.go:143","msg":"saved","path":"etcd-snapshot.db"}

此輸出表明etcd資料函式庫已成功備份到etcd-snapshot.db檔案中。

使用 Velero 進行 Kubernetes 叢集備份與還原

在上一章節中,我們探討瞭如何手動備份 etcd 資料函式庫。雖然這種方法在某些情況下很有用,但在實際生產環境中,我們通常需要更自動化、更全面的備份解決方案。Heptio 的 Velero 就是為此而生的工具。

Velero 簡介

Velero 是一款開源的 Kubernetes 備份與還原工具,提供豐富的功能,包括排程備份、備份勾子(backup hooks)以及細粒度的備份控制等。與許多商業產品不同,Velero 完全免費。

雖然 Velero 功能強大,但它沒有圖形化介面(GUI),所有的操作都需要透過命令列工具 velero 來完成。這款單一的可執行檔允許使用者安裝 Velero 伺服器、建立備份、檢查備份狀態、還原備份等。

Velero 元件與需求

Velero 由幾個關鍵元件構成:

  1. Velero CLI:用於安裝 Velero 元件,執行備份與還原操作。
  2. Velero 伺服器:負責執行備份與還原程式。
  3. 儲存提供者外掛:用於支援特定儲存系統的備份與還原。

除了 Velero 的核心元件外,使用者還需要提供一個物件儲存位置來存放備份資料。如果沒有現成的物件儲存解決方案,可以佈署 MinIO——一個開源的 S3 相容物件儲存專案。

安裝 Velero CLI

要開始使用 Velero,首先需要下載並安裝 Velero CLI。步驟如下:

  1. 從 Velero 的 GitHub 倉函式庫下載最新版本:
    wget https://github.com/vmware-tanzu/velero/releases/download/v1.4.0/velero-v1.4.0-linux-amd64.tar.gz
    
  2. 解壓縮下載的檔案:
    tar xvf velero-v1.4.0-linux-amd64.tar.gz
    
  3. 將 Velero 二進位制檔案移動到 /usr/bin 目錄下:
    sudo mv velero-v1.4.0-linux-amd64/velero /usr/bin
    
  4. 驗證 Velero CLI 是否安裝成功:
    velero version
    

程式碼解密:

上述指令用於下載、解壓縮並安裝 Velero CLI。

  • wget 用於從指定 URL 下載檔案。
  • tar xvf 用於解壓縮 .tar.gz 檔案。
  • sudo mv 用於將 Velero 可執行檔移動到系統目錄,以便全域使用。
  • velero version 用於檢查已安裝的 Velero 版本。

安裝 Velero 伺服器

在安裝 Velero 伺服器之前,需要滿足以下需求:

  • Kubernetes 叢集版本 1.10 或更高
  • Velero 可執行檔
  • 系統元件的映像檔
  • 相容的儲存位置
  • Volume Snapshot 外掛(可選)

相容的儲存解決方案

Velero 需要一個 S3 相容的儲存桶來存放備份資料。官方支援多種儲存解決方案,包括 AWS、Azure 和 Google 的物件儲存服務。此外,還有多家廠商和社群提供的相容儲存方案。

如果沒有現成的物件儲存解決方案,可以佈署 MinIO 作為 S3 相容的儲存服務。

MinIO 佈署與使用

在我們的範例中,由於使用的是 KinD 叢集,我們將佈署 MinIO 來提供 S3 相容的儲存服務。

圖表翻譯:

此圖示展示了 MinIO 在 Kubernetes 中的佈署架構:

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表翻譯:

rectangle "包含" as node1
rectangle "提供" as node2
rectangle "被" as node3

node1 --> node2
node2 --> node3

@enduml

圖表翻譯: 上圖展示了在 Kubernetes 叢集中佈署 MinIO,並利用其提供的 S3 相容儲存服務給 Velero 使用。

綜上所述,Velero 提供了一個強大且靈活的 Kubernetes 叢集備份與還原解決方案。透過結合 MinIO 等開源工具,即使在沒有商業儲存解決方案的情況下,也能實作可靠的備份與還原功能。