mysql - 如何使用本地持久卷创建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 服务?
我搜索了很多,但没有运气
解决方案
我终于解决了问题...
的问题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
在那之后,一切都按预期工作!
推荐阅读
- r - 在同一个表中嵌套 Ifelse 语句
- kubernetes - kubernetes gke 上的 ejabberd 未通过健康检查
- xamarin.ios - 如何在 Xamarin 中获取 iOS 设备 CPU 架构?
- c# - 此方法是否违反 c# 语法规则?会被认为是语法错误吗?
- mysql - XAMPP 中默认的 MySQL 数据库名称是什么?
- node.js - npm cron v1.4.0 不工作
- json - express 应用程序 - 从 JSON 数据创建表。更改失败数据的背景
- ms-access - 如何从在线服务器检索 URL 到 MS Access
- unreal-engine4 - UE4 在 FoV 中获取所有玩家
- windows - 使用 VS2017 (vstest.console.exe) 运行单元测试失败,因为 Windows 操作系统不同