我正在学习这里的持久磁盘教程,同时还将其创建为statefulset而不是部署。
当我将yaml文件运行到gke中时,数据库无法启动,查看日志,它有以下错误。
[错误]--指定了初始化,但数据目录中有文件。正在中止。
是否可以检查创建的卷以查看目录中的内容?否则,我做错了什么导致磁盘非空?
谢谢
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: datalayer-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
---
apiVersion: v1
kind: Service
metadata:
name: datalayer-svc
labels:
app: myapplication
spec:
ports:
- port: 80
name: dbadmin
clusterIP: None
selector:
app: database
---
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
name: datalayer
spec:
selector:
matchLabels:
app: myapplication
serviceName: "datalayer-svc"
replicas: 1
template:
metadata:
labels:
app: myapplication
spec:
terminationGracePeriodSeconds: 10
containers:
- name: database
image: mysql:5.7.22
env:
- name: "MYSQL_ROOT_PASSWORD"
valueFrom:
secretKeyRef:
name: mysql-root-password
key: password
- name: "MYSQL_DATABASE"
value: "appdatabase"
- name: "MYSQL_USER"
value: "app_user"
- name: "MYSQL_PASSWORD"
value: "app_password"
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: datalayer-pv
mountPath: /var/lib/mysql
volumes:
- name: datalayer-pv
persistentVolumeClaim:
claimName: datalayer-pvc
4条答案
按热度按时间egmofgnx1#
您可以添加ignore dir lost+found
i1icjdpr2#
我使用init容器删除该文件(我使用的是postgres):
r8xiu3jd3#
这个问题可能是由于
lost+found
persistentvolume文件系统上的目录。我可以通过添加一个
k8s.gcr.io/busybox
容器(pvc套装)accessModes: [ReadWriteMany]
,或注解掉database
容器):有一些潜在的解决办法。。。
最好是使用
subPath
上volumeMounts
对象。这将使用persistentvolume的子目录,该子目录在创建时应为空,而不是卷根目录:不太可取的解决方法包括:
使用一次性容器
rm -rf /var/lib/mysql/lost+found
(不是一个很好的解决方案,因为目录是由文件系统管理的,很可能会重新出现)使用
mysql:5
图像,并添加args: ["--ignore-db-dir=lost+found"]
到容器(mysql 8中删除了此选项)使用
mariadb
图像而不是mysql
更多细节可以在docker library/mysql上找到:#69和#186z31licg04#
您通常会看到您的卷是否装载了:
然后你可以使用这些命令来检查你的pv和pvc
然后您可以在磁盘上访问gcp控制台,查看是否创建了磁盘: