将mysql镜像运行在k8s集群内,记录下踩坑过程。
mysql镜像
mysql镜像地址
这里我使用的是mysql5.7.30
版本,通过上面的镜像文档,我们可以初步了解一些镜像的关键信息。
考虑到官方仓库太慢,这里我上传到了阿里云镜像库:
registry.cn-hangzhou.aliyuncs.com/speed_containers/mysql:5.7.30
使用自定义的my.cnf
文件
默认的配置文件路径为/etc/mysql/my.cnf
,内部会以!includedir
的形式包含/etc/mysql/conf.d
和/etc/mysql/mysql.conf.d
,可以将配置文件挂载到对应的目录。
假如你的配置文件是在 /my/custom/config-file.cnf
,可以启动容器进行测试验证
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
不用my.conf
文件更改配置
将配置选项作为命令标志传递给mysqld,也可以灵活的配置,例如比较通用发修改字符集编码
默认的编码是latin
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
如果想看一个完成的命令列表
docker run -it --rm mysql:tag --verbose --help
镜像支持的环境变量
-
MYSQL_ROOT_PASSWORD
该变量是必需变量,它指定将为MySQL根超级用户帐户设置的密码。 -
MYSQL_DATABASE
此变量是可选的,允许您指定在映像启动时要创建的数据库的名称。
如果提供了用户/密码(MYSQL_USER/MYSQL_PASSWORD),则将授予该用户对该数据库的超级用户访问权限(对应于GRANT ALL)。 -
MYSQL_USER
可选的,与创建新用户和设置该用户的密码一起使用。
将为该用户授予MYSQL_DATABASE变量指定的数据库的超级用户权限(请参见上文)。
这两个变量都是创建用户所必需的。
请注意,无需使用此机制来创建根超级用户,该用户默认情况下是使用MYSQL_ROOT_PASSWORD变量指定的密码创建的。 -
MYSQL_PASSWORD
同上,这两个选项将会在mysql初始化的时候自动创建指定的用户名和密码,同时将MYSQL_DATABASE这个数据库的权限操作赋予指定的用户和密码 -
MYSQL_RANDOM_ROOT_PASSWORD
可选变量。
设置为yes可以为root用户生成一个随机的初始密码(使用pwgen)。
生成的root密码将被打印到stdout -
MYSQL_ONETIME_PASSWORD
初始化完成后,将root用户(不是MYSQL_USER中指定的用户!)设置为过期用户,从而在首次登录时强制更改密码。
注意:仅MySQL 5.6+支持此功能。
在MySQL 5.5上使用此选项将在初始化期间引发适当的错误。
如何运行在k8s内
直接上yaml文件,这为了方便测试,我使用的是nfs直接挂载,根据情况自由选择,没有nfs的可以选择hostPath挂载到宿主机(pod需要绑定固定的nodes节点),或者创建pvc存储,挂载到pvc下。
官方pvc挂载参考:运行一个单实例有状态应用
通过将配置参数传递给mysqld,我们更改了mysql的编码:
args: ["--character-set-server", "utf8mb4", "--collation-server", "utf8mb4_unicode_ci"]
完整yaml文件
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/speed_containers/mysql:5.7.30
name: mysql
args: ["--character-set-server", "utf8mb4", "--collation-server", "utf8mb4_unicode_ci"]
env:
- name: MYSQL_ROOT_PASSWORD
value: "111111"
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "false"
- name: MYSQL_USER
value: "tony"
- name: MYSQL_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "db_test"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-nfs
mountPath: /var/lib/mysql
volumes:
- name: mysql-nfs
nfs:
server: xxx.xxx.xxx.xxx # nfs地址
path: /data/mysql # nfs挂载路径,假如nfs挂载在/data目录,需要手动创建mysql,修改文件权限为777
这里我们直接使用了service的clusterIP,不对外暴露mysql的访问入口,同一namesapce下的应用如果需要访问mysql,mysql_host直接使用 service 的名称mysql
即可实现内部通信.
网友评论