Kerrigan:配置中心管理UI的实现思路和技术细节

2023-12-25 17:48

本文主要是介绍Kerrigan:配置中心管理UI的实现思路和技术细节,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

去年写过一篇文章『中小团队落地配置中心详解』,介绍了我们借助etcd+confd实现的配置中心方案,这是一个对运维友好,与开发解耦的极佳方案,经过了一年多的实践也确实帮我们解决了配置文件无版本、难回滚、更新复杂等问题

这套配置中心解决方案的特点是,对整个配置文件进行管理,而非配置项,且在配置中心修改的配置,客户端可以实时自动更新。同时借助于我们自研的配置中心管理UI(kerrigan)还能够实现记录修改历史,快速回滚配置,与线上配置做对比等实用功能

陆续有小伙伴问我能否写篇文章介绍一下配置中心的管理UI(Kerrigan)的实现,咖啡君就通过本篇文章来介绍Kerrigan的设计思路,以及用到的技术和部分核心代码,由于kerrigan有过一次改版,所以界面会与上面文章中的截图有出入

界面与功能

时光小说网 www.youxs.org

用户登陆进入会看到一个简单的统计页面,展示配置文件相关数据

20191220.01.png

这个实现非常简单就是对数据库数据进行查询统计,都是类似于下边这样的语句输出的结果

Config.objects.all().count()

当点击“我的项目”标签时,会出现所有的项目,在这里可以搜索你要操作的项目,或是新建/导入项目

20191220.02.png

当点击“新建/导入项目”时,可以选择从CMDB同步项目,或者自己填写项目名称新建配置中心中的项目,但由于我们配置中心和CMDB是打通的,配置中心里的所有项目都来源于CMDB,保证项目信息一致性,所以新建项目功能并没有被用到

20191220.03.png

与CMDB系统的同步是通过http协议进行了,当点击“与CMDB同步”按钮时,会发送个get请求到cmdb服务器获取项目信息,cmdb采用JWT认证,主要代码如下:

headers = {"WWW-Authenticate": "Token","Content-Type": "application/json","Authorization": "Token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDgyMjg4MzgsImlhdCI6MTU0ODE0MjQzOCwiZGF0YSI6eyJ1c2VybmFtZSI6ImFkbWluQDE2My5jb20ifX0.oKc0SafgksMT9ZIhTACupUlz49Q5kI4oJA-B8-GHqLA"
}requests.get('https://ops-coffee.cn/api/cmdb/project', headers=headers)

在我的项目页面点击项目时,会进入项目的配置管理页面,这个页面列出了项目下的所有配置文件,也可以通过右上角的“添加配置”按钮添加配置文件

20191220.04.png

当添加配置文件时,会做三件事情:

  1. 配置文件表(Config)添加一条新数据
  2. 历史记录表(History)添加一条新数据,作为历史版本
  3. 往etcd里写入一条新的KV数据,其中key为:项目+环境+服务+文件名称的组合,保证在etcd内唯一

操作etcd的代码如下:

class EtcdApi:def __init__(self):self.client = etcd.Client(host=str(self.ETCD_HOST),port=int(self.ETCD_PORT),username=str(self.ETCD_USER),password=str(self.ETCD_PASS))def read(self, key):try:kx = self.client.read(key)return {"state": 1, "message": "", "action": kx.action, "key": kx.key, "value": kx.value,"newKey": kx.newKey, "dir": kx.dir, "_children": kx._children}except Exception as e:return {"state": 0, "message": str(e)}def write(self, key, value):try:kx = self.client.write(key, value)return {"state": 1, "message": "", "action": kx.action, "key": kx.key, "newKey": kx.newKey,"dir": kx.dir, "_children": kx._children}except Exception as e:return {"state": 0, "message": str(e)}def delete(self, key, recursive=False, dir=False):try:if dir:kx = self.client.delete(key, recursive, True)return {"state": 1, "message": "", "action": kx.action, "key": kx.key, "newKey": kx.newKey,"dir": kx.dir, "_children": kx._children}else:kx = self.client.delete(key)return {"state": 1, "message": kx}except Exception as e:return {"state": 0, "message": str(e)}

当编辑和删除配置文件时,操作与新建类似,修改Config表数据-->Histror表添加新数据-->修改或删除etcd数据,History表在每次新建或修改配置时都需要添加一条新数据,这里使用到了Django的信号Signales来实现,主要代码如下:

@receiver(signals.post_init, sender=Config)
def migrate_notify_init(instance, **kwargs):instance.old_content = instance.content@receiver(signals.post_save, sender=Config)
def migrate_notify_post(instance, created, **kwargs):_t = Setting.objects.get(key='enable_etcd')# 每次新建或者content变更都往历史表里插入一条历史数据if created or instance.old_content != instance.content:History.objects.create(config=instance,user=instance.user,content=instance.content)

除了History表操作之外,对于etcd的操作以及下边要说到的发布功能也是在signales里完成的,signals可以简化代码强化逻辑

当点击“编辑”按钮后,会进入配置文件编辑页面,在这里可以修改、保存或发布配置文件,也可以拿当前配置文件与已发布配置文件做对比

20191220.05.png

这里“保存”和“发布”的区别在于,保存只会将配置文件保存在Kerrigan内,不会修改etcd里的数据,从而实现客户端不更新,而发布会直接修改etcd里的数据,客户端能够直接更新,对于未发布的配置文件,当你点击配置文件时会有如下的提示,你可以对比或者发布

20191220.06.png

判断是否发布主要是在Config表里加入了is_published字段,同样通过signals的post_save信号在每次保存时检查这个字段,如果为True,则修改对应etcd的值,否则不处理

@receiver(signals.post_save, sender=Config)
def migrate_notify_post(instance, created, **kwargs):...# 判断状态为发布且开启了etcd,则更新数据到etcdif instance.is_published:_r = EtcdApi().write(key, instance.content)if _r.get('state') == 0:raise '写入key:%s失败' % (key)

系统中多次出现“对比”功能,都指的是当前配置文件和已发布配置文件的对比,通过对比可以清晰的看出修改的内容,对比结果展示如下

20191220.07.png

对比功能主要用到了difflib模块,主要代码如下:

difflib.HtmlDiff().make_file(src_value, diff_value, context=True, numlines=3)

每一次的添加或者修改都会往History表里写入一条新数据,“历史版本”便是直接读的History表,展示出谁在什么时间修改了什么内容

20191220.08.png

当点击历史版本时可以查看此版本的配置文件内容,同时在必要的时候回滚,有了历史版本的内容,回滚也只是将历史内容覆盖到etcd

20191220.09.png

至此,Kerrigan介绍完成,其最主要的功能是通过web浏览器来操作etcd里的KV数据,在此基础上做了扩展,对每一次的修改都做了记录,以实现实用的保存、发布、历史、回滚等功能

最后再回顾一下整个配置中心的工作流程,配置管理员通过Kerrigan来添加或修改配置文件,Kerrigan记录修改,同时将修改同步至etcd,客户端上的confd服务在检测到etcd对应key的数据发生变化时,会自动拉取数据覆盖至本地配置文件,然后配合check_cmdreload_cmd指令对配置文件进行检查和重载,更多细节原理回顾文章『中小团队落地配置中心详解』


扫码关注公众号查看更多实用文章

相关文章推荐阅读:

  • 我们自研的那些Devops工具
  • 中小团队基于Docker的devops实践

这篇关于Kerrigan:配置中心管理UI的实现思路和技术细节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536388

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象