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 等開源工具,即使在沒有商業儲存解決方案的情況下,也能實作可靠的備份與還原功能。