Skip to content

Operator-Learning-Playground/dbconfig-operator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dbconfig-operator 简易型数据库配置控制器

项目思路与设计

设计背景:集群部署服务时,会有使用与配置数据库的需求。本项目在此需求上,基于 k8s 的扩展功能,实现 DbConfig 的自定义资源,做出一个自动创建库、表与 user 的 operator 应用。 其中:controller 应用与 mysql 服务使用 sidecar 的模式部署在一起。

思路:当应用启动后,会启动一个 controllermysql 服务,controller 会监听 crd 资源,并执行相应的业务逻辑(创建库、表与用户)。

项目功能

  1. 支持多个 service 服务接入,实现自动配置数据库
  2. 建库、建表
  3. 创建 user

项目部署与使用

  1. 打成镜像或是使用编译二进制。
# 项目根目录执行
[root@VM-0-16-centos dbconfigoperator]# pwd
/root/dbconfigoperator
# 下列命令会得到一个二进制文件,服务启动时需要使用。
# 可以直接使用 docker 镜像部署
# docker build -t dbconfigoperator:v1 .
[root@VM-0-16-centos dbconfigoperator]# docker run --rm -it -v /root/dbconfigoperator:/app -w /app -e GOPROXY=https://goproxy.cn -e CGO_ENABLED=0  golang:1.18.7-alpine3.15 go build -o ./mydbconfigoperator .
[root@VM-0-16-centos dbconfigoperator]# ls | grep mydbconfigoperator
 mydbconfigoperator # 可以看到这就是需要用的二进制文件
  1. apply crd 资源
[root@VM-0-16-centos yaml]# pwd
/root/dbconfigoperator/yaml
[root@VM-0-16-centos yaml]# kubectl apply -f dbconfig.yaml
customresourcedefinition.apiextensions.k8s.io/dbconfigs.api.practice.com unchanged
  1. 启动 controller 服务(需要先执行 rbac.yaml,否则服务会报错)
[root@VM-0-16-centos yaml]# kubectl apply -f rbac.yaml deploy.yaml
deployment.apps/mydbconfig-controller unchanged
service/mydbconfig-svc unchanged
serviceaccount/mydbconfig-sa unchanged
clusterrole.rbac.authorization.k8s.io/mydbconfig-clusterrole unchanged
clusterrolebinding.rbac.authorization.k8s.io/mydbconfig-ClusterRoleBinding unchanged
  1. 查看 operator 服务

附注:这里可能启动时 pod 会有 Error 的情况,原因是 pod 的创建在 Kubelet 是有随机概率的,但两个 container 又有相互依赖,规划在之后版本会修改这个 bugfix

临时解决方案:等服务自己重启即可。

[root@VM-0-16-centos yaml]# kubectl get pods | grep mydbconfig-controller
mydbconfig-controller-5c85668748-gv624   2/2     Running     0                 9m23s
  1. 配置用户的表与密码

使用 k8s 内部 configmap 与 secret 资源,分别创建用户表与密码( namespace 需要与 controller 相同) 参考

  • configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: dbconfig-service2-configmap
  namespace: default  # 需要与 cr 资源的 namespace 相同
data:
  # 下面填写创建 mysql 表的 sql 语句
  products.table: |
    CREATE TABLE IF NOT EXISTS products (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(100) NOT NULL,
      price DECIMAL(10, 2) NOT NULL,
      description TEXT,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );
  shipments.table: |
    CREATE TABLE IF NOT EXISTS shipments (
      id INT PRIMARY KEY AUTO_INCREMENT,
      product_id INT,
      quantity INT,
      shipment_date DATE,
      destination VARCHAR(100)
    );
  • secret
apiVersion: v1
kind: Secret
metadata:
  name: dbconfig-service2-secret
  namespace: default  # 需要与 cr 资源的 namespace 相同
data:
  # 在创建 secret 对象时,data 字段需要用 "base64" 编码
  # 这是 base64 后的结果,k8s 会自动从 base64 转回来
  # 所以连接数据库时,只需要填写原密码就行。
  PASSWORD: "ZGJjb25maWctc2VydmljZTItc2VjcmV0" # 原密码: dbconfig-service2-secret
# 创建后如下
[root@VM-0-16-centos ~]# kubectl get cm | grep test-db-table
dbconfig-service1-configmap     2      20m
dbconfig-service2-configmap     2      20m
dbconfig-service3-configmap     1      20m
[root@VM-0-16-centos ~]# kubectl get secret | grep test-db-
dbconfig-service1-secret   Opaque   1      20m
dbconfig-service2-secret   Opaque   1      20m
dbconfig-service3-secret   Opaque   1      20m
  1. 配置 cr (当中的 password、tables 需要自己创建 configmap secret 资源,如上5所示) 参考
apiVersion: api.practice.com/v1alpha1
kind: DbConfig
metadata:
  name: mydbconfig-2
spec:
  dsn: root:123456@tcp(127.0.0.1:3306)/                # db 连接的 <user>:<password>@tcp(<ip:port>)/
  maxIdleConn: 15                                      # 最大空闲连接数,可不填,默认为 10
  maxOpenConn: 100                                     # 最大连接数,可不填,默认为 100
  services:
    - user: dbconfig_servicetest1                      # 用户名
      password:
        secretRef: dbconfig-service1-secret            # secret 名,设置 db 用户的密码,用户需要先创建 secret 资源,并在此指定
      dbname: dbconfig_servicetest1                    # db 名
      tables:
        configMapRef: dbconfig-service1-configmap      # configmap 名,设置创建表,用户需要先创建 configmap 资源,并在此指定
    - user: dbconfig_service22test
      password:
        secretRef: dbconfig-service2-secret
      dbname: dbconfig_service22test
      tables:
        configMapRef: dbconfig-service2-configmap
    - user: dbconfig_service33tttt
      password:
        secretRef: dbconfig-service3-secret
      dbname: dbconfig_service33tttt
      tables:
        configMapRef: dbconfig-service3-configmap
  1. 可以 execlogs 查看结果

RoadMap

About

Custom mysql and configuration service based on k8s operator

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published