如何使用 etcd 實現分佈式 -etc 目錄 -JuiceFS 花式玩法-

📖 關於 JuiceFS 的花式用法,今天請到 Juicedata 的全棧工程師朱唯唯打開腦洞,請大家往下閱讀,一探究竟。

背景

etcd 是一款兼具一致性和高可用性的鍵值數據庫,簡單、安全、快速、可信,目前是 Kubernetes 的首要數據存儲。我們先來看一段 etcd 官方對於名字的解釋。

The name “etcd” originated from two ideas, the unix “/etc” folder and “d”istributed systems. The “/etc” folder is a place to store configuration data for a single system whereas etcd stores configuration information for large scale distributed systems. Hence, a “d”istributed “/etc” is “etcd”.

上面一段話來源於 etcd 官網 [1],etcd 富有想象力地把 etc (Linux 系統通常用來存儲配置文件的地方) 與 distributed (分佈式) 兩個概念結合在了一起,然而**,由於 etcd 通過 HTTP API 提供服務,因此 “遺憾” 地沒能實現一個真正的分佈式 /etc 目錄。下面我們將介紹,如何通過 JuiceFS,幫助 etcd 實現一個真正的分佈式 /etc 目錄**。

那麼可以用 etcd 實現真正的分佈式 /etc 麼?下面的方法親測可以。

我們使用開源的分佈式文件系統 JuiceFS 來爲 /etc 提供 POSIX 文件接口的訪問能力,而 JuiceFS 可以使用 etcd 作爲 Metadata 引擎,存儲文件系統中目錄樹、文件名等元數據,配合 JuiceFS CSI Driver,可以作爲 Persistent Volume,在 Kubernetes 平臺中實現多個應用實例共享配置文件,這就是不折不扣的分佈式 /etc 了。

下文將從什麼是 JuiceFS、爲什麼 JuiceFS 可以實現分佈式 /etc 以及如何實現分佈式 /etc 等方面展開介紹,講述 etcd 如何藉助 JuiceFS 實現在多個應用實例中共享配置文件。

什麼是 JuiceFS

JuiceFS 是一個開源的雲原生分佈式文件系統,爲雲環境設計,提供完備的 POSIX、HDFS 和 S3 API 兼容性。JuiceFS 的架構採用了分層插件式的設計,元數據引擎陸續開放了對 Redis、MySQL、PostgreSQL、TiKV 等數據庫的支持,並且在 v1.0-beta3 版本中正式支持 etcd 作爲元數據引擎。數據存儲引擎對接任意對象存儲存儲系統,在 v1.0-rc1 中也支持了 etcd 作爲數據存儲引擎,正適合存儲容量不大的配置文件

爲什麼 JuiceFS 可以實現分佈式 /etc 目錄

根據上面所述的分層架構設計可以看到,JuiceFS 將文件的元數據存儲在數據庫中,而文件數據存儲在對象存儲中,從而使得用戶可以在不同節點上都可以訪問到相同的樹形文件系統結構,並達到共享文件的目的。有了 JuiceFS 分佈式文件系統的加持,我們就可以將配置文件放在文件系統中,然後在每個應用中將 JuiceFS 掛載進其 /etc 目錄,進而實現真正的分佈式 "/etc"。整個過程如下圖所示。

如何實現分佈式 /etc 目錄

接下來以 nginx 應用爲例,講述 etcd 如何藉助 JuiceFS,使得多個 nginx 實例間共享同一份配置,實現分佈式 /etc

部署 etcd

在 Kubernetes 環境中,建議搭建獨立的 etcd 服務供 JuiceFS 使用,而不是使用集羣中默認的 etcd 服務,避免當文件系統訪問壓力高時影響 Kubernetes 集羣的穩定性。

安裝 etcd 的方式可以參考官方文檔,搭建多節點的 etcd 集羣 [2];也可以使用 Bitnami 提供的 etcd 的 chart 安裝包 [3]。

在數據敏感的情況下,可以開啓 etcd 的加密通信功能,進行數據的加密傳輸。參考 etcd 項目提供的示例腳本 [4]。

在 JuiceFS 中準備配置文件

安裝好 etcd 集羣后,兩行命令初始化一個 JuiceFS 文件系統。

$ juicefs format etcd://$IP1:2379,$IP2:2379,$IP3:2379/jfs --storage etcd --bucket etcd://$IP1:2379,$IP2:2379,$IP3:2379/data pics
$ juicefs mount etcd://$IP1:2379,$IP2:2379,$IP3:2379/jfs /mnt/jf

將 JuiceFS volume 掛載到 /mnt/jfs 目錄後,就可以直接在該目錄放置 nginx.conf 文件。

在 Kubernetes 中使用 JuiceFS

首先創建一個 Secret,在其中配置 etcd 的連接信息:

piVersion: v1
kind: Secret
metadata:
  name: juicefs-secret
  namespace: kube-system
type: Opaque
stringData:
  name: test
  metaurl: etcd://$IP1:2379,$IP2:2379,$IP3:2379/jfs
  storage: etcd
  bucket: etcd://$IP1:2379,$IP2:2379,$IP3:2379/da

元數據引擎和對象存儲都使用 etcd,其中 $IP1、$IP2、$IP3 爲 etcd 的客戶端 IP。接着創建 PV 和 PVC(可以參考文檔 [5])。然後就可以在 Nginx 應用中,將 PVC 掛載到 /etc,如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
    …
    volumes:
      - name: config
        persistentVolumeClaim:
          claimName: etcd
    containers:
      - image: nginx
        volumeMounts:
        - mountPath: /etc/nginx
          name: config

Nginx 應用在啓動時會讀取 /etc/nginx 下的 nginx.conf 配置文件,即讀取我們放置在 JuiceFS 中的 nginx.conf 配置文件即可,而 nginx.conf 文件就是通過 JuiceFS volume 共享的。

總結

etcd 作爲一款雲原生鍵值數據庫,用於存儲 Kubernetes 平臺中的服務配置信息,已經成爲事實標準。但是很多上層應用的配置文件管理仍然不方便,本文分享 JuiceFS 如何把 etcd 變成分佈式 "/etc" 的方法,幫助 etcd 完成了最初的夢想 ✌🏻。

引用鏈接

[1] etcd 官網: https://etcd.io/docs/v3.1/learning/why/
[2] etcd 集羣: https://etcd.io/docs/v3.5/op-guide/clustering/
[3] chart 安裝包: https://github.com/bitnami/charts/blob/master/bitnami/etcd/README.md
[4] 示例腳本: https://github.com/etcd-io/etcd/tree/main/hack/tls-setup
[5] 文檔: https://juicefs.com/docs/zh/csi/examples/static-provisioning/

本文作者

朱唯唯,Juicedata 全棧工程師,負責 JuiceFS CSI Driver 的開發和維護,負責 JuiceFS 在雲原生領域的發展。

關於 Juicedata

Juicedata,杭州果汁數據科技有限公司是一家企業級存儲服務供應商,開發了雲原生分佈式文件系統 JuiceFS,致力於在大數據時代下,爲客戶打造安全、高性能、自主可控的存儲基礎設施及服務。

2021 年,JuiceFS 正式在 GitHub 上開源,已經獲得 5.5K star,歡迎開發者加入我們。 (github.com/juicedata/juicefs)

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/4vE0wvqcO_eoAI4Bp7cbpQ