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 “混合云/多云存储架构的实践和展望”,欢迎点此报名

如何使用 etcd 实现分布式 /etc 目录的更多相关文章

  1. 一次基于etcd的分布式锁自动延时失败问题的排查

    今天在测试基于etcd的分布式锁过程中,在测试获取锁后,释放之前超出TTL时长的情况下自动延长TTL这部分功能,在延长指定key的TTL时总是返回404错误信息,在对目标KEY更新TTL时目标KEY已 ...

  2. golang基于etcd实现分布式锁(转)

    下面描述使用 Etcd 实现分布式锁的业务流程,假设对某个共享资源设置的锁名为:/lock/mylock 步骤 1: 准备 客户端连接 Etcd,以 /lock/mylock 为前缀创建全局唯一的 k ...

  3. etcd实现分布式锁

    转载自:etcd实现分布式锁 当并发的访问共享资源的时候,如果没有加锁的话,无法保证共享资源安全性和正确性.这个时候就需要用到锁 1.需要具备的特性 需要保证互斥访问(分布式环境需要保证不同节点.不同 ...

  4. golang使用etcd实现分布式锁

    package main import ( "context" "fmt" "time" "go.etcd.io/etcd/cli ...

  5. 基于go+etcd实现分布式锁

    原文链接:https://www.yii-china.com/topic/detail/113 package main import ( "context" "fmt& ...

  6. 分布式键值存储系统ETCD调研

    分布式键值存储系统ETCD调研 简介 etcd是一个开源的分布式键值存储工具--为CoreOS集群提供配置服务.发现服务和协同调度.Etcd运行在集群的每个coreos节点上,可以保证coreos集群 ...

  7. ETCD分布式锁实现选主机制(Golang实现)

    ETCD分布式锁实现选主机制(Golang) 为什么要写这篇文章 做架构的时候,涉及到系统的一个功能,有一个服务必须在指定的节点执行,并且需要有个节点来做任务分发,想了半天,那就搞个主节点做这事呗,所 ...

  8. etcd分布式锁及事务

    前言 分布式锁是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互 ...

  9. 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务

    基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...

  10. 服务发现之 Etcd VS Consul

    抄自这里 *********************************************************************************************** ...

随机推荐

  1. 一些 Codeforce Content 补题记录

    Codeforces Round #651 (Div. 2) 1370A. Maximum GCD 给定一个 n,求(1~n)中任意组合对的最大的公约数. 思路:如果 \(n\) 是偶数,那么最大公约 ...

  2. 云原生 Serverless Database 使用体验

    作者 | 李欣 近十年来互联网技术得到了飞速的发展,越来越多的行业加入到了互联网的矩阵,由此带来了更为丰富且复杂的业务场景需求,这对于数据应用系统的性能无疑是巨大的挑战.​ 关系型数据库 MySQL ...

  3. proxy代理

  4. CoinBase是什么?

    什么是CoinBase交易? 比特币区块链上的每个区块中都会包含一个或者多个交易(transaction),其中第一个交易就叫做CoinBase交易. 什么是CoinBase交易? CoinBase交 ...

  5. wireshark 报文颜色

    在使用wireshark抓包分析的过程中,默认会对不同的包进行着色,截图如下: 对不同的颜色有了解,可快速的过滤包或分析请求. 菜单栏选择视图-->着色规则,即可看到不同颜色代表的含义: 大致可 ...

  6. ClickHouse中“大列”造成的JOIN的内存超限问题

    ClickHouse中"大列"造成的JOIN的内存超限问题 "大列"是指单行数据量非常大的列,通常是100KiB以上.这样的列会导致JOIN(通常LEFT JO ...

  7. Laravel - 模板中的url

    <!-- 1, url --> <a href="{{url('/')}}">跳转到主页</a>   <!-- 2,action  方法  ...

  8. [转帖]TiFlash 简介

    overview TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展,在提供了良好的隔离性的同时,也兼顾了强一致性.列存副本通过 Raft Learner 协议异步复制 ...

  9. [转帖]在麒麟Linux安装Postgis

    https://jimolonely.github.io/tech/linux/install-postgis-kylin/ 接着上一篇在麒麟linux上安装Postgresql12.5 ,我们来安装 ...

  10. [转帖]Linux性能优化(十五)——CPU绑定

    一.孤立CPU 1.孤立CPU简介 针对CPU密集型的任务,CPU负载较高,推荐设置CPU Affinity,以提高任务执行效率,避免CPU进行上下文切换,提高CPU Cache命中率. 默认情况下, ...