【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 main
 
import (
	"time"
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
    count := 0

	for{
		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 string
		var case_id string
		var case_name string
		var project_id string
		var description string
		err = 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】

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/64836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年华数杯数学建模B题思路代码分析 - 不透明制品最优配色方案设计

# 1 赛题 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而&#xff0c;传统的人工配色 存在一定的局限性&#xff0c;如主观性强、效率低下等。因此…

华三H3C S5120V3交换机的配置之组建IRF

IRF&#xff08;Intelligent Resilient Framework&#xff0c;智能弹性架构&#xff09;&#xff0c;是华三交换机实现虚拟堆叠的一种技术&#xff0c;其核心思想是将多台交换机连接在一起&#xff0c;虚拟成一台交换机&#xff0c;进而实现统一管理。和传统的堆叠概念不同&…

Python如何解决Amazon亚马逊“图文验证码”识别(6)

前言 本文是该专栏的第55篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏前面,笔者有详细介绍多种登录验证码识别方法,感兴趣的同学可往前翻阅。而本文,笔者将单独详细介绍亚马逊Amazon的图文识别验证码的解决方法。 如上图所示,访问或请求频次达到一定程度之…

笔记本WIFI连接无网络【实测有效,不用重启电脑】

笔记本Wifi连接无网络实测有效解决方案 问题描述&#xff1a; 笔记本买来一段时间后&#xff0c;WIFI网络连接开机一段时间还正常连接&#xff0c;但是过一段时间显示网络连接不上&#xff0c;重启电脑太麻烦&#xff0c;选择编写重启网络脚本解决。三步解决问题。 解决方案&a…

FastAPI(七)应用配置

目录 一、在apps下新建文件夹config 二、新建配置文件app_conf.py 一、在apps下新建文件夹config 二、新建配置文件app_conf.py from functools import lru_cachefrom pydantic.v1 import BaseSettingsclass AppConfig(BaseSettings):app_name: str "Windows10 插件&qu…

JMeter启动时常见的错误

很多小伙伴在学工具这一块时&#xff0c;安装也是很吃力的一个问题&#xff0c;之前记得有说过怎么安装jmeter这个工具。那么你要启动jmeter的时候&#xff0c;一些粉丝就会碰到如下几个问题。 1.解压下载好的jmeter安装&#xff0c;Windows 平台&#xff0c;双击 jmeter/bin …

谷粒商城第十天-分组新增级联显示商品分类分组修改级联回显商品分类

目录 一、总述 二、前端实现 三、后端实现 四、总结 一、总述 本次就是一个小的优化。 就是分组新增或者是修改的时候&#xff0c;直接显示商品分类的id可读性不高&#xff0c;新增的时候需要填写对商品分类的id&#xff0c;修改的时候&#xff0c;就只是给你一个商品分类…

HarmonyOS/OpenHarmony-ArkTS基于API9元服务开发快速入门

一、创建项目 二、创建卡片 三、添加资源 四、具体代码 Entry Component struct WidgetNewCard {/** The title.*/readonly TITLE: string harmonyOs;readonly CONTEXT: string 技术构建万物智联;/** The action type.*/readonly ACTION_TYPE: string router;/** The…

【快应用】list组件如何区分滑动的方向?

【关键词】 list组件、滑动方向、scroll 【问题背景】 有cp反馈list这个组件在使用的时候&#xff0c;不知道如何区分它是上滑还是下滑。 【问题分析】 list组件除了通用事件之外&#xff0c;还提供了scroll、scrollbottom、scrolltop、scrollend、scrolltouchup事件&#x…

ArduPilot开源飞控之MAVProxy简介

ArduPilot开源飞控之MAVProxy简介 1. 源由2. 特点3. 安装 & 更新3.1 安装Step 1: 烧录raspberryPi镜像Step 2&#xff1a;apt软件包更新Step 3&#xff1a;Raspian系统更新Step 4&#xff1a;安装依赖环境Step 5&#xff1a;安装mavproxyStep 6&#xff1a;配置bash环境 3.…

后台管理系统

1.1 项目概述 简易后台管理系统是一个基于Vue3ElemrntPlus的后台管理系统&#xff0c;提供了用户登录、记住密码、数据的增删改查、分页、错误信息提示等功能&#xff0c;旨在协助管理员对特定数据进行管理和操作。 没有后台对接&#xff0c;数据源为假数据。 全部代码已上传G…

关于HIVE的分区与分桶

1.分区 1.概念 Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录&#xff0c;每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区&#xff0c;这样的查询效率会提高很多 个人理解白话:按表中或者自定义的一个列,对数据进…

整理mongodb文档:集合名字有类似-等特殊字符串如何处理?

个人博客 整理mongodb文档:集合名字有类似-等特殊字符串如何处理&#xff1f; 首先&#xff0c;先创建一个collection的名字为’collection-test’&#xff0c;这个表名中&#xff0c;colletion的名字有一个特殊字符串“-”&#xff0c;但是后面插入数据的时候会有这么一个错…

rk3399移植linux kernel

rk3399移植linux kernel 0.前言一、移植ubuntu根文件系统二、移植linux1.支持NFS(可选)2.配置uevent helper3.支持etx4文件系统(默认已支持)4.配置DRM驱动5.有线网卡驱动6.无线网卡驱动 三、设备树四、内核镜像文件制作五、烧录六、总结 参考文章&#xff1a; 1.RK3399移植u-bo…

无涯教程-Perl - defined函数

描述 如果 EXPR 的值不是undef值,则此函数返回true&#xff1b;如果未指定 EXPR ,则检查$_的值。它可以与许多功能一起使用以检测操作失败,因为如果出现问题,它们将返回undef。简单的布尔测试不会区分false,零,空字符串或字符串.0。 如果 EXPR 是函数或函数引用,则在定义函数…

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上&#xff0c;因此实现方案如下&#xff1a; (1) ceph集群开启mgr内置的exporter服务&#xff0c;用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…

推荐5本软件测试人员必读经典书籍

学会选择对的学习方法 俗话说&#xff1a;“选择大于努力”。 初学软件测试也如此。很多刚入行测试的同学最容易陷入一个误区&#xff0c;那就是优先买一堆视频来学习。结果时间过去了&#xff0c;视频仅以形式主义存在电脑的硬盘里&#xff0c;从此走上了入门到放弃之路。 …

TCP/IP四层模型对比OSI七层网络模型的区别是啥?数据传输过程原来是这样的

一、TCP/IP四层模型对比OSI七层模型 它们两个定义的一些功能和协议都是差不多的。TCP/IP四层协议模型比我们的七层少了三层&#xff0c;把我们的数据链路层和物理层放在一层里面了&#xff0c;叫做数据链路层&#xff08;网络接口层&#xff09;&#xff0c;对应网络协议也没有…

CNN成长路:从AlexNet到EfficientNet(02)

一、说明 在~10年的深度学习中&#xff0c;进步是多么迅速&#xff01;早在 2012 年&#xff0c;Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在&#xff0c;我们超过90%的EfficientNet架构和师生训练&#xff08;teacher-student&#xff09;。 二、第一阶段 …

c++:day4

1.思维导图 2.shell函数获取uid和gid&#xff0c;并用变量接 #!/bin/bashfunction fun() {read -p "输入用户名" necho uid:id -u $necho gid:id -g $n } afun echo $a3.冒泡、选择和快排代码整理 /**************************************************************…