【Docker】数据库动态授权组件在Kubernetes集群下的测试过程记录
目录
背景
组件原理
测试设计
环境
测试脚本
脚本build为linux可执行文件
镜像构建
Dockerfile
Docker build
镜像有效性验证
总结
资料获取方法
背景
我们都知道出于安全性考虑,生产环境的权限一般都是要做最小化控制,尤其是数据库的操作授权,更是重中之重。
博主所在公司使用的是Kubernetes(k8s)进行的集群容器管理,因为容器发布时的IP都是动态分配的,而出于安全性考虑,数据库的授权又不能全部放开或者针对整个集群的IP,所以有了动态为节点进行数据库授权的需求,所以也就诞生我们今天的主角--数据库授权组件,Mysql-grant。
当然,我们今天介绍的不是这个组件的开发,而是相关的测试过程记录。

组件原理
这个数据库动态授权组件的原理不复杂,每次Kubernetes有节点变化(上线或者下线服务)时,调取Kubernetes相关的API接口获取已配置的服务改变的对应节点的IP,然后对其进行授权或者权限回收操作(IP+user)。相当于在获取到信息之后执行下面的命令:
grant select,insert,update on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option;
测试设计
在了解了具体的需求之后,我很快的确定了测试思路。具体如下:
- 拉起两个mysql数据库,每个库中新建两个DB,每个DB个新建一张表。
- 写一个无限循环的脚本,每隔两秒访问一次数据库,插入一条数据,查询一次数据。
- 把脚本打包到多个不同的镜像服务中,push到公司的镜像库中。
- 然后根据设计的场景使用k8s(Kubernetes)发布、下线服务、做Mysql-grant相关的配置信息改变来完成相关验证;
环境
这次主要用的环境如下:
- golang开发环境
- docker环境
- 镜像运行环境(centos)
测试脚本
考虑到镜像的大小及Dockerfile的复杂性,本次使用了golang来写这个脚本,直接编辑成二进制文件,可以不依赖环境执行,具体的脚本如下,把他保存为mysqlgrant-test.go即可:
package mainimport ("time""database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)func main() {count := 0for{fmt.Println("====================")// fmt.Println(count)fmt.Println(time.Now().Format("2006-01-02 15:04:05"))time.Sleep(time.Second * 2)count++db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/easytest?charset=utf8")checkErr(err)//插入数据stmt, err := db.Prepare("INSERT base_case SET case_name=?,project_id=?,content=?,description=?")checkErr(err)res, err := stmt.Exec(count, "Golang", time.Now(),time.Now())checkErr(err)id, err := res.LastInsertId()checkErr(err)fmt.Println(id)//查询数据rows, err := db.Query("select * from base_case order by case_id desc limit 1")checkErr(err)for rows.Next() {var content stringvar case_id stringvar case_name stringvar project_id stringvar description stringerr = rows.Scan(&description, &case_id, &case_name, &project_id, &content)checkErr(err)fmt.Println(case_id +":"+ case_name +" "+ project_id +" "+ description +" "+ content)// fmt.Println(case_id)// fmt.Println(case_name)// fmt.Println(project_id)// fmt.Println(content)// fmt.Println(description)}db.Close()}
}func checkErr(err error) {if err != nil {panic(err)}
}
脚本build为linux可执行文件
golang脚本的编译命令如下:
go build 脚本名称
但是因为楼主使用的是windows,默认的会直接build成 .exe文件
所以我们要手动设置环境变量,具体命令如下:
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build mysqlgrant-test.go
GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
GOARCH:目标平台的体系架构(386、amd64、arm)
交叉编译不支持 CGO 所以要禁用它
上面的命令编译 64 位可执行程序,你当然应该也会使用 386 编译 32 位可执行程序
镜像构建
Dockerfile
上面的脚本准备好了之后,接下来要制作镜像,我们这次试用的是dockerfile,dockerfile内容如下:
FROM centos:6.7
MAINTAINER <"bingo@xxxx.com">
RUN mkdir -p /usr/local/user-web/mysqlgrant-test
ADD ./mysqlgrant-test /usr/local/user-web/mysqlgrant-test
#ADD ./conf /usr/local/usr-web/mysqlgrant-test/conf
WORKDIR /usr/local/user-web/mysqlgrant-test
CMD ./mysqlgrant-test
Docker build
将上面的信息保存到dockerfile文件之后,切换到文件所在目录,执行下面命令来进行镜像的构建:
docker build -t mysqlgrant-test/centos:v1.0 .
参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
注意后面的.不能遗漏,它表示在当前目录构建的意思
镜像构建成功之后我们可以通过下面的命令来查看:
root@msxxx:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysqlgrant-test/centos v1.0 70bf1840fd7c 15 seconds ago 158.5 MB
镜像有效性验证
我们可以使用新的镜像来创建容器:
root@msxxx:~$ docker run -it mysqlgrant-test/centos:v1.0 /bin/bash --name mysqlgrant
参数说明:--name mysqlgrant表示为这个容器设置了一个叫mysqlgrant的别名-t:在新容器内指定一个伪终端或终端。-i:允许你对容器内的标准输入 (STDIN) 进行交互。
执行上面的命令后会默认进入mysqlgrant-test目录,即我们上面在dockerfile中设置的WORKDIR。
当然我们也可以直接执行下面的命令来获取容器的标准输出:
docker logs mysqlgrant
这就是脚本输出的内容:

至此,所有的东西准备完毕,只需要根据准备好的测试用例,做相关业务场景的验证就可以了。
总结
在新技术应用的过程中难免会遇到一些问题,比如我们今天的介绍的容器化过程中解决数据库鉴权问题开发的组件。我的感触是,接触新的事物我们能学习到更多的东西。此前学习的docker、golang等等,都没有实战的基础,这一次虽然也只是简单的实践,但是还是有一种豁然开朗的感觉。
资料获取方法
【留言777】


各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!
三连之后我会在评论区挨个私信发给你们~
相关文章:
【Docker】数据库动态授权组件在Kubernetes集群下的测试过程记录
目录 背景 组件原理 测试设计 环境 测试脚本 脚本build为linux可执行文件 镜像构建 Dockerfile Docker build 镜像有效性验证 总结 资料获取方法 背景 我们都知道出于安全性考虑,生产环境的权限一般都是要做最小化控制,尤其是数据库的操作授…...
数据结构【第3章】——线性表
线性表的定义 线性表:零个或多个数据元素的有限序列。 1)线性表是一个序列。即元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。 2&a…...
MySql之分库分表
数据库瓶颈 不管是IO瓶颈还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载的活跃连接数的阈值。在业务service来看, 就是可用数据库连接少甚至无连接可用,接下来就可以想象了(并发量、吞…...
数据结构—图的遍历
6.3图的遍历 遍历定义: 从已给的连通图中某一顶点出发,沿着一些边访问遍历图中所有的顶点,且使每个顶点仅被访问一次,就叫作图的遍历,它是图的基本运算。 遍历实质:找每个顶点的邻接点的过程。 图的…...
MySQL主从复制基于二进制日志的高可用架构指南
前言 在现代数据库架构中,MySQL主从复制技术扮演着重要角色。它不仅可以提升数据库性能和可扩展性,还赋予系统卓越的高可用性和灾难恢复能力。本文将深入剖析MySQL主从复制的内部机制,同时通过一个实际案例,展示其在实际场景中的…...
RestTemplate HTTPS请求忽略SSL证书
问题描述 使用RestTemplate发送HTTPS请求的时候,出现了这样的一个问题: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification …...
Jenkins触发器时间、次数设定
触发器触发条件介绍 触发器触发条件公式:由5颗星组成 * * * * * 分别代表:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6) 企业项目中常用场景介绍 场景1:接口脚本部分测试通过,部分还在进行,回归测试脚本执行…...
kafka partition的数据文件(offffset,MessageSize,data)
partition中的每条Message包含了以下三个属性: offset,MessageSize,data,其中offset表示Message在这个partition中的偏移量,offset不是该Message在partition数据文件中的实际存储位置,而是逻辑上一个值&…...
htnl根据轮播图图片切换背景色
htnl根据轮播图图片切换背景色 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>轮播图示例</title><link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/swiper10/swiper-bundle.min.css&q…...
gpu-manager安装及测试
提示:GPU-manager安装为主部分内容做了升级开箱即用,有用请点收藏❤抱拳 文章目录 前言一、约束条件二、使用步骤1.下载镜像1.1 查看当前虚拟机的驱动类型: 2.部署gpu-manager3.部署gpu-admission4.修改kube-scheduler.yaml附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
