全栈工程师开发手册 (作者:栾鹏)
架构系列文章


我们知道在代码里面创建数据库链接需要先有database, 但是我们刚刚部署的数据库可能还没有database或者没有指定权限的用户,这就要求我们在部署完数据库以后手动链接,创建数据库和用户. 有两种方式来实现自动化, 这里以mysql为例

通过环境变量实现

在k8s中部署mysql时,可以传环境变量指定,例如下面的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: my-mysqllabels:app: my-mysqlversion: v1.0.0
spec:selector:matchLabels:app: my-mysqlversion: v1.0.0strategy:type: RollingUpdatetemplate:metadata:labels:app: my-mysqlversion: v1.0.0spec:containers:- image: mysql:5.6name: my-mysqlargs:- "--ignore-db-dir=lost+found"- "--character-set-server=utf8"     #  指定字符编码- "--collation-server=utf8_general_ci"    #  指定字符编码env:- name: MYSQL_ROOT_PASSWORD    #  指定root用户的用户名value: introcks- name: MYSQL_PASSWORD     #  新建用户的用户名value: introcks- name: MYSQL_USER        # 新建的用户value: root- name: MYSQL_DATABASE    # 新建的数据库value: cloudaiports:- containerPort: 3306name: mysqlvolumeMounts:- name: datamountPath: /var/lib/mysql- name: configmountPath: /etc/mysql/mysql.conf.d/mysqld.cnfsubPath: mysqld.cnfreadOnly: Falsevolumes:- name: datapersistentVolumeClaim:claimName: mysql-pvc- name: configconfigMap:name: mysql-configmap

这样就能在创建的时候创建用户,密码,数据库和指定字符编码, 但是这种通过环境变量超过的有一个问题是操作内容有限. 下面我们来实现第二种方法.

init容器直接执行自定义的sql语句

我们可以添加一个init容器, 并将sql语句挂载进去, init容器中实现执行sql语句的功能. 这里我实现了一个, 镜像源码在github上: https://github.com/626626cdllp/k8s/tree/master/database-tools

不想重新制作的可以直接拉取luanpeng/lp:database-tools-1.0

镜像启动就会执行容器中/root/db_tools/script/文件夹下的所有sql文件. 所以我们只需要将sql语句,以configmap的形式挂载到这个目录下就行.

我们先来创建一个sql语句的configmap

apiVersion: v1
kind: ConfigMap
metadata:name: hive-metastore-databaselabels:app: yourapp_name
data:execute.sql: |--- create databaseCREATE DATABASE IF NOT EXISTS mytable DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;-- create user and grant authorizationGRANT ALL ON mytable.* TO 'luanpeng'@'%' IDENTIFIED BY '${IDENTIFIED}';

上面创建数据库,并将权限授予luanpeng用户.

下面就可以将这个sql语句挂载到init容器中

apiVersion: apps/v1
kind: Deployment
metadata:name: xxxlabels:app: xxxversion: v1.0.0
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: xxxversion: v1.0.0template:metadata:labels:app: xxxversion: v1.0.0spec:initContainers:- name: init-dababaseimage:  luanpeng/lp:database-tools-1.0env:- name: DRIVER_NAME      # 链接不同的数据库,使用的驱动名value: "com.mysql.jdbc.Driver"- name: URL                    # 链接地址value: "jdbc:mysql://hive-metadata-mysql-service:3306/mysql?useUnicode=true&characterEncoding=utf8&useSSL=false"- name: USERNAME       # 用户名value: "root"- name: PASSWORD      # 密码value: "admin"- name: IDENTIFIEDvalue: "admin"volumeMounts:- name: init-dababase-volumemountPath: /root/db_tools/script   # 必须挂载到该目录containers:......volumes:- name: init-dababase-volumeconfigMap:name: hive-metastore-database

这样要实现更加复杂的初始化工作就可以直接在sql里面写了.

注意: 如果init容器运行失败,则会不运行后续的容器,我们可以通过设置sql语句,争取不报错

init容器

在 Pod 启动过程中,Init 容器会按顺序在网络和数据卷初始化之后启动。 每个容器必须在下一个容器启动之前成功退出。 如果由于运行时或失败退出,导致容器启动失败,它会根据 Pod 的 restartPolicy 指定的策略进行重试。 然而,如果 Pod 的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy 策略。

在所有的 Init 容器没有成功之前,Pod 将不会变成 Ready 状态。 Init 容器的端口将不会在 Service 中进行聚集。 正在初始化中的 Pod 处于 Pending 状态,但应该会将条件 Initializing 设置为 true。

如果 Pod 重启,所有 Init 容器必须重新执行。

对 Init 容器 spec 的修改,被限制在容器 image 字段中。 更改 Init 容器的 image 字段,等价于重启该 Pod。

因为 Init 容器可能会被重启、重试或者重新执行,所以 Init 容器的代码应该是幂等的。 特别地,被写到 EmptyDirs 中文件的代码,应该对输出文件可能已经存在做好准备。

Init 容器具有应用容器的所有字段。 然而 Kubernetes 禁止使用 readinessProbe,因为 Init 容器不能够定义不同于完成(completion)的就绪(readiness)。 这会在验证过程中强制执行。

在 Pod 上使用 activeDeadlineSeconds,在容器上使用 livenessProbe,这样能够避免 Init 容器一直失败。 这就为 Init 容器活跃设置了一个期限。

在 Pod 中的每个 app 和 Init 容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。

k8s中实现自动数据库初始化(mysql,postgresql)相关推荐

  1. php 中insert into,数据库insert_PHP MySQL Insert Into用法

    摘要 腾兴网为您分享:PHP MySQL Insert Into用法,智影,招联金融,优路教育,一点英语等软件知识,以及cad2013注册机,业主名录采集软件,我查查,自选股软件,贝贝app,手机百度 ...

  2. mysql安装后第一次操作_MySQL数据库之mysql 安装成功以及第一次安装成功初始化密码操作...

    本文主要向大家介绍了MySQL数据库之mysql 安装成功以及第一次安装成功初始化密码操作 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一 把文件解压到一个目录下 技术分享图 ...

  3. sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段

    在Oracle.MySQL.MS SQL Server中创建自动增长字段 好吧,今天面试有道题,要各个数据库怎么建立自增长字段,顺便复习一下吧,最近面试很多数据库问题... 一:Oracle Orac ...

  4. mysql系统数据库服务器,mysql中的系统数据库服务器

    mysql中的系统数据库服务器 内容精选 换一换 用户正常的数据(不包括备份数据),以及云数据库RDS实例正常运行所需的数据(比如系统数据库.数据库回滚日志.重做日志.索引等).同时,包含如下云数据库 ...

  5. 初始化mysql的数据库失败_初始化mysql的数据库失败怎么办

    初始化mysql数据库失败的解决办法:首先找到并打开my.ini文件:然后注释掉my.ini文件中的datadir:最后根据提示把UTF8换成UTF8MB4即可. 安装MySQL8,安装时初始化数据库 ...

  6. docker 容器启动顺序_Docker容器启动时初始化Mysql数据库

    1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案 ...

  7. docker mysql数据库初始化_如何在Mysql的Docker容器启动时初始化数据库

    1.前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. ...

  8. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...

    阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程) (仅此纪念人生第一篇学习博客) 前阵子接了一个小小的JavaWe ...

  9. 2019最受欢迎数据库:MySQL居首PostgreSQL第二Oracle位列第八

    近日,倍受关注的 2019 Stack Overflow 年度开发者调查结果已经出炉,本次年度调查共约 90,000人参与了需要耗时 20分钟的调查问卷填写. 我们重点关注一下关于数据库的信息,但是在 ...

最新文章

  1. iOS ASIHTTPRequest用https协议加密请求
  2. HTTP VS RPC
  3. VTK:直线网格之RGrid
  4. 网站开发中JS中的常用语句
  5. 数据库 索引、存储、引擎这几个的优缺点
  6. CSS隐藏内容的三种方法比较
  7. delphi StatusBar在状态栏中显示checkBox
  8. RaspberryPI 3b 技术总结(包括Linux)
  9. 万能五笔输入法弹窗_万能五笔输入法广告屏蔽的方法
  10. amr 转mp3 android,安卓批量amr转mp3 微信amr批量转换
  11. Regester 正则表达式测试工具
  12. Shell中的while用法
  13. 零基础语法入门三十一讲[被动语态 (1)]被动语态的构成和含义
  14. linux修改mac地址_如何(以及为什么)在Windows,Linux和Mac上更改您的MAC地址
  15. 使用vue-awesome-swiper制作H5动画页面
  16. 开通VPN后,网络访问比未开VPN还要慢
  17. FineReport——登录不到决策系统
  18. TI Sitara AM57x DSP+ARM + Xilinx Artix-7 FPGA核心板 规格书资料
  19. Smells and Heuristics
  20. 华为交换机根据MAC地址禁止设备上网

热门文章

  1. python是什么 自学-自学python用什么系统好
  2. 易语言识别语音的方法
  3. 腾讯云:一句话语音识别API接入步骤和说明
  4. element级联选择框的使用~干货分享
  5. 调用接口时form-data形式如何传递数据
  6. 最简单的视频编码器:编译(libx264,libx265,libvpx)
  7. SDL2源代码分析4:纹理(SDL_Texture)
  8. react 动态添加组件属性_React的组件动态参数使用Underscore和Context来传递
  9. zookeeper集群节点热扩容和迁移详解
  10. Linux下MySQL起动报错The server quit without updating PID file