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 官网,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 集群;也能够应用 Bitnami 提供的 etcd 的 chart 安装包。
在数据敏感的状况下,能够开启 etcd 的加密通信性能,进行数据的加密传输。参考 etcd 我的项目提供的示例脚本。
在 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/jfs
将 JuiceFS volume 挂载到 /mnt/jfs
目录后,就能够间接在该目录搁置 nginx.conf
文件。
在 Kubernetes 中应用 JuiceFS
首先创立一个 Secret,在其中配置 etcd 的连贯信息:
apiVersion: 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/data
元数据引擎和对象存储都应用 etcd,其中 $IP1、$IP2、$IP3 为 etcd 的客户端 IP。接着创立 PV 和 PVC(能够参考文档)。而后就能够在 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 实现了最后的幻想 ✌🏻。
流动预报
本周六将举办 Meetup“ 混合云 / 多云存储架构的实际和瞻望 ”,欢送点此报名。