#mysql #docker #kubernetes #mariadb #minikube
#mysql #докер #kubernetes #мариадб #мини — куб
Вопрос:
Sup. Я создал свою службу, развертывание и постоянное требование объема, чтобы мой mysql sholud работал внутри minikube, но это не так. Я не могу понять, почему контейнер docker вне minikube работает нормально, но когда я пытаюсь использовать его внутри кластера minikube, моя база данных каким-то образом очищается. Вот мой файл Dockerfile
FROM alpine:latest
RUN apk update amp;amp; apk upgrade -a -U
RUN apk add mysql mysql-client openrc supervisor
RUN chown -R mysql:mysql /var/lib/mysql/
COPY ./my.cnf /etc/
COPY ./secure_config.sh /root
RUN rc default
RUN /etc/init.d/mariadb setup
RUN /etc/init.d/mariadb start
RUN chmod 755 /root/secure_config.sh
RUN /root/secure_config.sh
RUN sed -i "s|.*bind-addresss*=.*|bind-address=0.0.0.0|g" /etc/my.cnf
RUN sed -i "s|.*bind-addresss*=.*|bind-address=0.0.0.0|g" /etc/my.cnf.d/mariadb-server.cnf
RUN sed -i "s|.*skip-networking.*|skip-networking|g" /etc/my.cnf
RUN sed -i "s|.*skip-networking.*|skip-networking|g" /etc/my.cnf.d/mariadb-server.cnf
COPY ./wpdb.sh .
COPY ./sql_launch.sh .
RUN chmod 755 /wpdb.sh
RUN chmod 755 /sql_launch.sh
COPY ./supervisord.conf /etc/
EXPOSE 3306
CMD /sql_launch.sh
wpdb.sh
mysql -e "CREATE DATABASE wordpress;"
mysql -e "CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin';"
mysql -e "CREATE USER 'lchantel'@'localhost' IDENTIFIED BY 'lchantel';"
mysql -e "CREATE USER 'pstein'@'localhost' IDENTIFIED BY 'pstein'"
mysql -e "CREATE USER 'admins_mom'@'localhost' IDENTIFIED BY 'admins_mom'"
mysql -e "DELETE FROM mysql.user WHERE user = '';"
mysql -e "SET PASSWORD FOR 'admins_mom'@'localhost' = PASSWORD('123456');"
mysql -e "SET PASSWORD FOR 'admin'@'localhost' = PASSWORD('123456');"
mysql -e "SET PASSWORD FOR 'pstein'@'localhost' = PASSWORD('123456');"
mysql -e "SET PASSWORD FOR 'lchantel'@'localhost' = PASSWORD('123456');"
mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'admin'@'localhost' IDENTIFIED BY 'admin';"
mysql -e "FLUSH PRIVILEGES;"
sql_launch.sh
#!bin/sh
rc default
chmod 777 /wpdb.sh amp;amp; /wpdb.sh
rc-service mariadb stop
/usr/bin/supervisord -c /etc/supervisord.conf
Это мой вывод mysql внутри контейнера
MariaDB [(none)]> SELECT user FROM mysql.user
-> ;
-------------
| User |
-------------
| admin |
| admins_mom |
| lchantel |
| mariadb.sys |
| mysql |
| pstein |
| root |
-------------
7 rows in set (0.006 sec)
MariaDB [(none)]>
и это мои выходные данные внутри модуля minikube
# rc-status
Runlevel: default
mariadb [ stopped ]
Dynamic Runlevel: hotplugged
Dynamic Runlevel: needed/wanted
Dynamic Runlevel: manual
/ # rc-service mariadb start
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/blkio/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpu/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpu,cpuacct/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuacct/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/cpuset/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/devices/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/freezer/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/hugetlb/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/memory/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_cls/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_cls,net_prio/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/net_prio/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/perf_event/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/pids/tasks: Read-only file system
/lib/rc/sh/openrc-run.sh: line 100: can't create /sys/fs/cgroup/systemd/tasks: Read-only file system
* Datadir '/var/lib/mysql/' is empty or invalid.
* Run '/etc/init.d/mariadb setup' to create new database.
* ERROR: mariadb failed to start
И поэтому я предполагаю, что проблема заключается в файле yaml в разделе mountPath развертывания. Есть файлы yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-mysql
spec:
capacity:
storage: 500Mi
accessModes:
- ReadWriteOnce
hostPath:
path: "/home/lchantel/pv_proj/"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim-mysql
labels:
app: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
apiVersion: v1
kind: Service
metadata:
name: wildboar-mysql-service
labels:
app: mysql
spec:
type: ClusterIP
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
protocol: TCP
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wildboar-mysql-deploy
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: wildboar-mysql-pod
image: wildboar.mysql:latest
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysqldb-storage
mountPath: /var/lib/mysql/
env:
- name: MYSQL_ROOT_PASSWORD
value: root
imagePullPolicy: Never
volumes:
- name: mysqldb-storage
persistentVolumeClaim:
claimName: pv-claim-mysql
Google не помогает и просто не знает, что мне делать и с чего начать.
Комментарии:
1. Есть ли инициализированные данные на
/home/lchantel/pv_proj/
каждом отдельном узле в кластере? Как это туда попадает? Все, что находится в этом каталоге хоста, на каком бы узле ни запускался модуль, скроет все/var/lib/mysql
, что находится в изображении. (Стандартные образы базы данных Docker Hub инициализируют новую базу данных, если каталог данных окажется пустым.)2. @David Maze спасибо за ответ. В /home/lchantel/pv_proj данных вообще нет. На самом деле я думал, что ссылка pv-pvc-deploy содержит каталог /var/lib/mysql на мой хост-каталог /home/lchantel/pv-proj. Значит, фактическое поведение полностью противоположно тому, которое я описал выше?
3. «я предполагаю, что проблема в файле yaml в разделе mountPath» — Работает ли это, когда вы не монтируете PV? есть ли какие-либо файлы в
/var/lib/mysql
запеченном контейнере?4. @Matt На самом деле, да, это работает. Я только что это проверил…
5. Что ж, я думаю, я могу попробовать следующее решение: не использовать /var/lib/mysql/ directory , а новый — /mnt/mysql-data/ в качестве mountVolume , после этого я просто копирую свои данные в этот каталог и меняю каталог и сокет mysql по умолчанию для дальнейшей работы. Но я попробую это сделать завтра.
Ответ №1:
Что ж, я решил свою проблему следующим образом
- Я полностью переделал свой докер-файл mysql. Способ, которым alpine wiki предлагает настроить mariadb, сложен и не работает.
VOLUME /var/lib/mysql/
команда была довольно полезной для сохранения данных в этом каталоге. - Я решил превратить файл .sh в скрипт mysql. И, насколько мне удается использовать мою базу данных для WordPress, нет причин создавать несколько пользователей в базе данных mysql. Достаточно создать одного администратора. Вот мой Dockerfile
FROM alpine:latest
RUN apk update amp;amp; apk upgrade -a -U
RUN apk add mysql mysql-client openrc supervisor
COPY ./mariadb-server.cnf /etc/my.cnf
RUN chmod 755 /etc/my.cnf
RUN mkdir /sql_data
COPY ./wpdb.sql /sql_data
COPY ./launch.sh /
RUN chmod 755 ./launch.sh
RUN chown -R mysql:mysql /sql_data
VOLUME /var/lib/mysql/
RUN mkdir -p /run/mysqld/
EXPOSE 3306
CMD /launch.sh
и sql-скрипт
CREATE DATABASE wordpress;
DELETE FROM mysql.user WHERE user = '';
GRANT ALL PRIVILEGES ON wordpress.* TO 'admin'@'%' IDENTIFIED BY 'admin';
SET PASSWORD FOR 'admin'@'%' = PASSWORD('admin');
FLUSH PRIVILEGES;
- Служба Superviror полезна, когда вы запускаете 2 и более служб (исключая супервизор) одновременно. Итак, достаточно использовать скрипт с настройкой myslq и запустить его как демон:
#!/bin/sh
mysql_install_db --skip-test-db --user=mysql --datadir=/var/lib/mysql
mysqld --user=mysql --datadir=/var/lib/mysql --init-file=/sql_data/wpdb.sql
- В файле yaml есть небольшие изменения. Мы создали admin — скрипт mysql, поэтому нет необходимости создавать его в файле yaml.
apiVersion: v1
kind: Service
metadata:
name: mysql-service
labels:
app: mysql
spec:
type: ClusterIP
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
protocol: TCP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim-mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
restartPolicy: Always
containers:
- name: mysql
image: mysql:latest
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysqldb-storage
mountPath: "/var/lib/mysql/"
imagePullPolicy: Never
volumes:
- name: mysqldb-storage
persistentVolumeClaim:
claimName: pv-claim-mysql
- В моем конфигурационном файле.cnf произошли некоторые изменения.
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
# this is read by the standalone daemon and embedded servers
[server]
# this is only for the mysqld standalone daemon
[mysqld]
user=root
port=3306
datadir=/var/lib/mysql
tmpdir=/tmp
skip-networking=false
socket=/run/mysqld/mysqld.sock
wait_timeout = 600
max_allowed_packet = 64M
# Galera-related settings
#[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0
# Disabling symbolic links is recommended to prevent assorted security risks
symbolic-links=0
# this is only for embedded server
[embedded]