首页 > 解决方案 > 如何使用本地持久卷创建mysql服务以将数据存储在Windows本地机器上

问题描述

我希望 mysql pod 在我重新启动计算机时不会删除所有 mysql 数据。

我应该能够将数据存储在我的机器中,所以当我重新启动计算机并且 mysql pod 再次启动时,数据库仍然存在。

这是我的yaml:

存储类.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

mysql-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem
  storageClassName: local-storage
  local:
    path: "C:\\mysql-volume" #2 \ for escape characters right?
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - docker-desktop
  #hostPath:
   # path: /mysql-volume
    #type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    type: local
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi

mysql-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  ports:
  - protocol: TCP
    port: 3306
    nodePort: 30001
  selector:        
    app: mysql
  type: NodePort
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql-custom-img-here
        imagePullPolicy: IfNotPresent
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: mysql-root-password
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: mysql-user
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: mysql-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

尝试之后,我得到的第一个错误是:

MountVolume.NewMounter initialization failed for volume "mysql-pv-volume" : path "C:\\mysql-volume" does not exist

由于我使用的是 Windows,我猜这是正确的路径,对吧?我使用 2 "" 作为转义字符,也许问题出在路径上,但不确定。如果是,我怎样才能在我的 Windows 机器上提供我的本地路径?

然后我将其更改local: path:/opt并出现以下错误:

initialize specified but the data directory has files in it.

日志:

2020-09-24 12:53:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-09-24 12:53:00+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-09-24 12:53:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-09-24 12:53:00+00:00 [Note] [Entrypoint]: Initializing database files
2020-09-24T12:53:00.271130Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-09-24T12:53:00.271954Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2020-09-24T12:53:00.271981Z 0 [ERROR] Aborting

但是如果我将其更改mountPath: /var/lib/mysql为例如mountPath: /var/lib/mysql-test

它可以工作,但不如预期(重新启动计算机后保存数据)。

即使在删除 PV、PVC 和 MYSQL 部署/服务后,同样的错误仍然出现。我什至使用 docker 命令删除了卷,并将我的 mysql 自定义映像更改为 'mysql:5.7' 以防万一,但同样会initialize specified but the data directory has files in it.出现。

这是怎么发生的,即使我移除了吊舱?mountPath 是容器路径,所以数据应该会消失。

以及如何在persistentVolume 中提供我的本地路径?

谢谢你的时间!

编辑:忘了告诉我已经看到了:如何使用本地安装的数据卷创建 mysql kubernetes 服务?

我搜索了很多,但没有运气

标签: mysqldockerkubernetespersistent-volumespersistent-volume-claims

解决方案


我终于解决了问题...

的问题initialize specified but the data directory has files in it.由@Jakub 回答

MountVolume.NewMounter initialization failed for volume "mysql-pv-volume" : path "C:\\mysql-volume" does not exist......我什至无法相信因为这个愚蠢的问题而花费的时间......

正确的路径是:path: /c/mysql-volume在那之后,一切都按预期工作!


推荐阅读