美文网首页
k8s中将mysql运行在容器内

k8s中将mysql运行在容器内

作者: wowshiwoniu | 来源:发表于2020-05-29 11:00 被阅读0次

    将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即可实现内部通信.

    相关文章

      网友评论

          本文标题:k8s中将mysql运行在容器内

          本文链接:https://www.haomeiwen.com/subject/rpfxzhtx.html