kubernetes mysql映像持久卷在初始化期间为非空

yk9xbfzb  于 2021-06-19  发布在  Mysql
关注(0)|答案(4)|浏览(436)

我正在学习这里的持久磁盘教程,同时还将其创建为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
egmofgnx

egmofgnx1#

您可以添加ignore dir lost+found

containers:
  - image: mysql:5.7
    name: mysql
    args:
    - "--ignore-db-dir=lost+found"
i1icjdpr

i1icjdpr2#

我使用init容器删除该文件(我使用的是postgres):

initContainers:
        - name: busybox
          image: busybox:latest
          args: ["rm", "-rf", "/var/lib/postgresql/data/lost+found"]
          volumeMounts:
            - name: nfsv-db
              mountPath: /var/lib/postgresql/data
r8xiu3jd

r8xiu3jd3#

这个问题可能是由于 lost+found persistentvolume文件系统上的目录。
我可以通过添加一个 k8s.gcr.io/busybox 容器(pvc套装) accessModes: [ReadWriteMany] ,或注解掉 database 容器):

- name: init
  image: "k8s.gcr.io/busybox"
  command: ["/bin/sh","-c","ls -l /var/lib/mysql"]
  volumeMounts:
  - name: database
    mountPath: "/var/lib/mysql"

有一些潜在的解决办法。。。
最好是使用 subPathvolumeMounts 对象。这将使用persistentvolume的子目录,该子目录在创建时应为空,而不是卷根目录:

volumeMounts:
- name: database
  mountPath: "/var/lib/mysql"
  subPath: mysql

不太可取的解决方法包括:
使用一次性容器 rm -rf /var/lib/mysql/lost+found (不是一个很好的解决方案,因为目录是由文件系统管理的,很可能会重新出现)
使用 mysql:5 图像,并添加 args: ["--ignore-db-dir=lost+found"] 到容器(mysql 8中删除了此选项)
使用 mariadb 图像而不是 mysql 更多细节可以在docker library/mysql上找到:#69和#186

z31licg0

z31licg04#

您通常会看到您的卷是否装载了:

kubectl get pods # gets you all the pods on the default namespace

# and

kubectl describe pod <pod-created-by-your-statefulset>

然后你可以使用这些命令来检查你的pv和pvc

kubectl get pv  # gets all the PVs on the default namespace
kubectl get pvc # same for PVCs
kubectl describe pv <pv-name>
kubectl describe pvc <pvc-name>

然后您可以在磁盘上访问gcp控制台,查看是否创建了磁盘:

相关问题