kubernetes的數據存儲組件——etcd

最近在研究k8s的時候,對k8s的數據存儲組件etcd頗感興趣,寫篇博客記錄一下。

一.etcd簡介

etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。etcd是由CoreOS開發並維護的,靈感來自於 ZooKeeper 和 Doozer,使用Go語言編寫,並通過Raft一致性算法處理日誌複製以保證強一致性。Raft是一個新的一致性算法( https://blog.csdn.net/jiang_shikui/article/details/85255248
適用於分佈式系統的日誌複製,Raft通過選舉的方式來實現一致性。Google的容器集羣管理系統Kubernetes、開源PaaS平臺Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd。在分佈式系統中,如何管理節點間的狀態一直是一個難題,etcd像是專門爲集羣環境的服務發現和註冊而設計,它提供了數據TTL失效、數據改變監視、多值、目錄監聽、分佈式鎖原子操作等功能,可以方便的跟蹤並管理集羣節點的狀態。

  • 簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
  • 安全:支持SSL證書驗證
  • 快速:根據官方提供的benchmark數據,單實例支持每秒2k+讀操作
  • 可靠:採用raft算法,實現分佈式系統數據的可用性和一致性

二.安裝和使用

etcd的安裝非常簡單,可以直接下載編譯後的可執行文件,下載地址:https://github.com/coreos/etcd/releases

curl -L https://github.com/coreos/etcd/releases/download/v3.0.6/etcd-v3.0.6-linux-amd64.tar.gz -o etcd-v3.0.6-linux-amd64.tar.gz
tar xzvf etcd-v3.0.6-linux-amd64.tar.gz && cd etcd-v3.0.6-linux-amd64
./etcd --version

etcd命令行接口使用
etcd支持http RESTful API,支持get查詢,post,delete,put等操作。爲了便於理解,可將它存儲數據的框架看做一個文件系統,可以創建目錄和“文件”,每個“文件”名就是一個key,每個“文件”的內容就是它的value,目錄沒有value只能包含子目錄或者“文件”,可以通過RESTful API來獲取這些key的值或者設置這些key的值。

設置一個key的value

curl -s http://127.0.0.1:2379/v2/keys/message -X PUT -d value="Hello world" |test

獲取一個key的value

curl -s http://127.0.0.1:2379/v2/keys/message |test

改變一個key的value

curl -s http://127.0.0.1:2379/v2/keys/message -X PUT -d value="Hello etcd" |test

刪除一個key節點

curl -s http://127.0.0.1:2379/v2/keys/message -X DELETE |test

使用ttl(即設置一個key的值並給這個key加一個生命週期,當超過這個時間該值沒有被訪問則自動被刪除

curl -s http://127.0.0.1:2379/v2/keys/foo -X PUT -d value=bar -d ttl=5 |test

watch一個值的變化

curl -s http://127.0.0.1:2379/v2/keys/foo?wait=true

該命令調用之後會阻塞進程,直到這個值發生變化才能返回,當改變一個key的值,或者刪除等操作發生時,該等待就會返回結果。

創建一個目錄

curl -s http://127.0.0.1:2379/v2/keys/dir -XPUT -d dir=true |test

列舉一個目錄

curl -s http://127.0.0.1:2379/v2/keys/dir

遞歸列舉一個目錄

curl -s http://127.0.0.1:2379/v2/keys/dir?recursive=true

刪除一個目錄

curl -s http://127.0.0.1:2379/v2/keys/dir?dir=true -XDELETE

監控一個目錄下的所有key的變化,包括子目錄的。可以使用命令:

curl -s http://127.0.0.1:2379/v2/keys/dir?recursive=true&wait=true

三.應用場景

1.服務發現

服務發現要解決的也是分佈式系統中最常見的問題之一,即在同一個分佈式集羣中的進程或服務,要如何才能找到對方並建立連接。本質上來說,服務發現就是想要了解集羣中是否有進程在監聽udp或tcp端口,並且通過名字就可以查找和連接。
在這裏插入圖片描述

微服務協同工作架構中,服務動態添加。隨着Docker容器的流行,多種微服務共同協作,構成一個相對功能強大的架構的案例越來越多。透明化的動態添加這些服務的需求也日益強烈。通過服務發現機制,在etcd中註冊某個服務名字的目錄,在該目錄下存儲可用的服務節點的IP。在使用服務的過程中,只要從服務目錄下查找可用的服務節點去使用即可。

在這裏插入圖片描述

2.消息發佈與訂閱

在分佈式系統中,最適用的一種組件間通信方式就是消息發佈與訂閱。即構建一個配置共享中心,數據提供者在這個配置中心發佈消息,而消息使用者則訂閱他們關心的主題,一旦主題有消息發佈,就會實時通知訂閱者。通過這種方式可以做到分佈式系統配置的集中式管理與動態更新。
在這裏插入圖片描述

3.分佈式通知與協調

這裏說到的分佈式通知與協調,與消息發佈和訂閱有些相似。都用到了etcd中的Watcher機制,通過註冊與異步通知機制,實現分佈式環境下不同系統之間的通知與協調,從而對數據變更做到實時處理。實現方式通常是這樣:不同系統都在etcd上對同一個目錄進行註冊,同時設置Watcher觀測該目錄的變化(如果對子目錄的變化也有需要,可以設置遞歸模式),當某個系統更新了etcd的目錄,那麼設置了Watcher的系統就會收到通知,並作出相應處理。

4.分佈式鎖

因爲etcd使用Raft算法保持了數據的強一致性,某次操作存儲到集羣中的值必然是全局一致的,所以很容易實現分佈式鎖。鎖服務有兩種使用方式,一是保持獨佔,二是控制時序。

  • 保持獨佔即所有獲取鎖的用戶最終只有一個可以得到。etcd爲此提供了一套實現分佈式鎖原子操作CAS(CompareAndSwap)的API。通過設置prevExist值,可以保證在多個節點同時去創建某個目錄時,只有一個成功。而創建成功的用戶就可以認爲是獲得了鎖。

  • 控制時序,即所有想要獲得鎖的用戶都會被安排執行,但是獲得鎖的順序也是全局唯一的,同時決定了執行順序。etcd爲此也提供了一套API(自動創建有序鍵),對一個目錄建值時指定爲POST動作,這樣etcd會自動在目錄下生成一個當前最大的值爲鍵,存儲這個新的值(客戶端編號)。同時還可以使用API按順序列出所有當前目錄下的鍵值。此時這些鍵的值就是客戶端的時序,而這些鍵中存儲的值可以是代表客戶端的編號。
    在這裏插入圖片描述

四.etcd在kubernetes中的應用

etcd是Kubernetes集羣中的一個十分重要的組件,用於保存集羣所有的網絡配置和對象的狀態信息。
整個kubernetes系統中一共有兩個服務需要用到etcd用來協同和存儲配置,分別是:

  • 網絡插件flannel、對於其它網絡插件也需要用到etcd存儲網絡的配置信息
  • kubernetes本身,包括各種對象的狀態和元信息配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章