Ошибка при создании persistanceVolume с mysql в kubernetes

#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 флаг.