首页 > 解决方案 > 如何在复制的有状态中初始化 MySQL 数据

问题描述

按照本教程,我在 Kubernetes 集群上创建了一个持久性 MySQL 数据库。我正在尝试在初始化时创建表,但无法使其正常工作。

我尝试了两种不同的方法。

首先创建一个新的配置图:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-initdb-config
data:
  initdb.sql: |
    #SQL GOES HERE

我使用有状态服务将它添加到这里的卷中(注释掉的行是我添加的):

      volumes:
        - name: conf
          emptyDir: {}
        - name: config-map
          configMap:
            name: mysql
#        - name: mysql-initdb
#          configMap:
#            name: mysql-initdb-config

我还尝试将 SQL 数据添加到当前使用的配置映射中:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  namespace: thesis
  labels:
    app: mysql
data:
  primary.cnf: |
    [mysqld]
    log-bin
  replica.cnf: |
    [mysqld]
    super-read-only
  initdb.sql: |
#   SQL goes here

再次在有状态集中引用它:

      volumes:
        - name: conf
          emptyDir: {}
        - name: config-map
          configMap:
            name: mysql
#        - name: mysql-initdb
#          configMap:
#            name: mysql;

我采取了完全错误的方法还是只是一个小错误?

标签: kubernetes

解决方案


首次启动 mysql 容器时,它将在创建新数据库后执行/docker-entrypoint-initdb.d中的扩展名为 .sh、.sql 和 sql.sz 的文件。所以我们必须在那个特定的目录上挂载初始化脚本。

首先创建一个将用作卷源的新 configmap/secret。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-initdb-config
data:
  initdb.sql: |
    #SQL GOES HERE

然后创建一个将挂载在 /docker-entrypoint-initdb.d目录中的卷。

  volumes:
    - name: init-script
      configMap:
        name: mysql-initdb-config

现在将此卷安装在特定目录上。

  volumeMounts:
    - name: init-script
      mountPath: /docker-entrypoint-initdb.d

进一步阅读:如何使用 MySQL 镜像


推荐阅读