Как инициализировать данные MySQL в реплицированном состоянии с сохранением

#kubernetes

Вопрос:

Я создал постоянную базу данных MySQL в кластере Kubernetes, следуя этому руководству. Я пытаюсь создать таблицы при инициализации, но не могу заставить их работать.

Я попробовал два разных подхода.

Сначала создайте новую карту конфигурации:

 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;
 

Я использую совершенно неправильный подход или это просто небольшая ошибка?

Ответ №1:

Когда контейнер mysql запускается в первый раз, он будет выполнять файлы с расширениями .sh, .sql и sql.sz которые находятся в /docker-entrypoint-initdb.d после создания новой базы данных. Поэтому мы должны смонтировать сценарий инициализации в этом конкретном каталоге.

Сначала создайте новую карту конфигурации/секрет, которая будет использоваться в качестве источника тома.

 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

Комментарии:

1. Таким образом, это дает мне следующую ошибку: «Предупреждение не удалось создать 2m21s (x16 за 5m5s) набор состояний-контроллер создает модуль mysql-0 в наборе состояний ошибка mysql: Модуль «mysql-0» недопустим: спецификации.контейнеры[1].Объемные установки[2].имя: Не найдено: «init-скрипт»‘

2. Но это определенно полезный шаг в правильном направлении, я надеюсь, что смогу заставить его работать отсюда.

3. можете ли вы проверить, создан ли том сценария инициализации или нет? Я думаю, это потому, что volumeMount не смог найти ни одного тома с именем init-script.

4. Правильно: «Предупреждение не удалось установить 51s (x9 более 2m59s) кубелет MountVolume. Ошибка установки для тома «init-скрипт» : карта конфигурации «mysql-initdb-конфигурация» не найдена»

5. На самом деле ваше оригинальное решение сработало, я просто задержался из-за ошибки пространства имен