iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

etcd 是一種分散式鍵值儲存系統,通常用於保存分散式系統中的配置數據和元數據。

它是一個高可用、高一致性且易於使用的儲存解決方案,由 CoreOS 開發並以 Go 語言編寫。

etcd 作為 Kubernetes 的後端資料存儲,保存所有的集群狀態資訊,如節點、Pod、配置、Secret 等。


etcd 可以作為 pod 部署在主節點中,以便在 Kubernetes 中實現高可用性。

a

Figure Source

外部部署,以實現復原能力和安全性

b

Figure Source


分散式配置儲存

etcd 可以作為一個中心化的配置管理系統,為分散式系統提供一個一致的配置數據儲存資訊。

這使得系統的各個節點可以存取、共享和同步同一組配置數據。

透過使用 etcd,開發者和運維人員可以:

  • 集中管理配置:不再需要手動同步配置文件,配置變更可以自動分發到所有節點。
  • 提高可用性:當某個節點失效時,其它節點仍然可以從 etcd 中獲取最新的配置數據,確保系統的高可用性。
  • 版本控制:etcd 支持歷史版本控制,允許我們追溯配置變更,並在必要時恢復到先前的版本。

示例

假設我們有一個分散式 Web 服務,每個服務節點都需要訪問一組 API 設定,比如 API 金鑰和 API 路徑。

我們可以將這些設定存儲在 etcd 中,當設定變更時,所有服務節點都可以自動更新其設定。

/api-config:
    key: "API_KEY_12345"
    path: "/api/v1/"

服務註冊與發現

etcd 允許服務在啟動時將自己註冊到 etcd 中,這樣其它服務就可以發現並連接到它們。

這對於動態和彈性伸縮的系統非常重要,因為服務的實例數量和位置可能經常變化。

  • 服務健康檢查:服務可以定期更新自己的狀態,其他服務可以根據這些狀態資訊來選擇連接健康的服務實例。
  • 自動伸縮:當服務的負載增加時,可以自動部署新的服務實例並將其註冊到 etcd 中。

示例

一個服務可以將自己的資訊寫入 etcd,其他服務則可以監聽 etcd 中的服務列表變化,並動態調整連接。

/service-registry:
    service-1:
        address: "192.168.1.10:8080"
        status: "healthy"
    service-2:
        address: "192.168.1.11:8080"
        status: "unhealthy"

分散式鎖定

etcd 提供了一種分散式鎖定機制,允許多個客戶端在共享資源時協調和同步操作。

這對於需要確保某些操作的唯一性或順序性的情況非常有用。

  • 防止競爭條件:在分散式系統中,競爭條件(race conditions)可能會導致數據不一致或資源衝突。透過分散式鎖定,etcd 確保只有一個客戶端可以同時訪問共享資源。
  • 簡化協調:開發者不需要自行實現複雜的鎖定和協調邏輯,etcd 已經提供了這些功能。

示例

假設我們有一個需要確保只有一個實例在執行特定任務的應用程序。

我們可以使用 etcd 的分散式鎖來實現這個功能。

# 使用 etcd 進行分散式鎖定
from etcd3 import Client

etcd = Client()
lock = etcd.lock("my-distributed-lock")
with lock:
    # 執行需要鎖定的操作
    pass

觀察者模式

etcd 提供了監聽(watch)功能,允許客戶端監視特定鍵或目錄下的數據變化。

當數據發生變化時,etcd 會自動通知監聽者。

  • 即時反應:客戶端可以即時獲取變化通知,從而快速響應系統中的變化。
  • 動態配置更新:服務可以監聽配置變更,並在配置變更時自動更新自身的設定。

示例

假設我們有一個服務需要監聽 API 配置的變化,當配置更新時,服務可以即時調整其設定。

import etcd3

def callback(event):
    print("Configuration changed:", event.key, event.value)

etcd = etcd3.client()
etcd.watch("/api-config", callback)

Reference


上一篇
[Day 13] Kube Controller Manager
下一篇
[Day 15] K8S Lab - 部署一個簡單的 Web 應用
系列文
關於新手會想知道Kubernetes的幾件事情30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言