#mysql #docker #kubernetes
#mysql #docker #kubernetes
Вопрос:
Я пытаюсь создать постоянный том kubernetes, чтобы подключить его к приложению spring boot, но я обнаружил эту ошибку в модуле тома persistence : mysqld: Table 'mysql.plugin' doesn't exist
. Создается секретный файл как для пользователя, так и для администратора, а также файл ConfigMap для сопоставления загрузочного образа spring со службой mysql. Вот мой файл развертывания:
# Define a 'Service' To Expose mysql to Other Services
apiVersion: v1
kind: Service
metadata:
name: mysql # DNS name
labels:
app: mysql
tier: database
spec:
ports:
- port: 3306
targetPort: 3306
selector: # mysql Pod Should contain same labels
app: mysql
tier: database
clusterIP: None # We Use DNS, Thus ClusterIP is not relevant
---
# Define a 'Persistent Volume Claim'(PVC) for Mysql Storage, dynamically provisioned by cluster
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim # name of PVC essential for identifying the storage data
labels:
app: mysql
tier: database
spec:
accessModes:
- ReadWriteOnce #This specifies the mode of the claim that we are trying to create.
resources:
requests:
storage: 1Gi #This will tell kubernetes about the amount of space we are trying to claim.
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
# Configure 'Deployment' of mysql server
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
tier: database
spec:
selector: # mysql Pod Should contain same labels
matchLabels:
app: mysql
tier: database
strategy:
type: Recreate
template:
metadata:
labels: # Must match 'Service' and 'Deployment' selectors
app: mysql
tier: database
spec:
containers:
- image: mysql:latest # image from docker-hub
args:
- "--ignore-db-dir"
- "lost found" # Workaround for https://github.com/docker-library/mysql/issues/186
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD # Setting Root Password of mysql From a 'Secret'
valueFrom:
secretKeyRef:
name: db-admin # Name of the 'Secret'
key: password # 'key' inside the Secret which contains required 'value'
- name: MYSQL_USER # Setting USER username on mysql From a 'Secret'
valueFrom:
secretKeyRef:
name: db-user
key: username
- name: MYSQL_PASSWORD # Setting USER Password on mysql From a 'Secret'
valueFrom:
secretKeyRef:
name: db-user
key: password
- name: MYSQL_DATABASE # Setting Database Name from a 'ConfigMap'
valueFrom:
configMapKeyRef:
name: db-config
key: name
ports:
- containerPort: 3306
name: mysql
volumeMounts: # Mounting volume obtained from Persistent Volume Claim
- name: mysql-persistent-storage
mountPath: /var/lib/mysql #This is the path in the container on which the mounting will take place.
volumes:
- name: mysql-persistent-storage # Obtaining 'volume' from PVC
persistentVolumeClaim:
claimName: mysql-pv-claim
Я использую последний образ mysql с помощью docker. Есть ли в моем файле какая-либо конфигурация, которую я должен изменить?
Ответ №1:
Прежде всего, используя последний контейнер mysql, вы используете mysql: 8.
--ignore-db-dir
флаг не существует в версии 8, поэтому вы должны увидеть в журналах эту ошибку:
2020-09-21 0 [ERROR] [MY-000068] [Server] unknown option '--ignore-db-dir'.
2020-09-21 0 [ERROR] [MY-010119] [Server] Aborting
После удаления этого флага mysql перестает сбоить, но, похоже, есть другая проблема.
Том hostPath работает не так, как ожидалось. Когда я запустил:
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-xxxx 1Gi RWO standard 4m16s
вы можете видеть, что для STORAGECLASS установлено значение standard, и это приводит к тому, что k8s предоставляет pv вместо использования уже созданного.
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-xxxx 1Gi RWO Delete Bound default/mysql-pv-claim standard 6m31s
task-pv-volume 1Gi RWO Retain Available 6m31s
Как вы, вероятно, видите task-pv-volume
, статус доступен, и это означает, что его никто не использует.
Чтобы использовать его, вам нужно установить storageClassName
для утверждения о постоянном объеме пустую строку: ""
и, возможно, добавить volumeName
следующее:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: mysql
tier: database
spec:
storageClassName: ""
volumeName: task-pv-volume
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
После выполнения этого hostPath volume будет работать, как ожидалось, но по-прежнему существует проблема с потерянным найденным каталогом.
Моим решением было бы создать другой каталог в /mnt/data/
каталоге, например /mnt/data/mysqldata/
, и использовать /mnt/data/mysqldata/
в качестве пути к хосту в объекте PersistentVolume.
Другим решением было бы использовать более старую версию mysql, которая поддерживает --ignore-db-dir
флаг.