首页 > 解决方案 > 如何指定持久卷文件的存储位置

问题描述

我开始通过创建 LAMP 堆栈来学习 Kubernetes。对于我的 MySQL 数据库,我创建了一个持久卷和持久卷声明,但现在我遇到了一个问题,我找不到存储 PV 文件的位置。

这是我现在的配置:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    app: mysql
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  hostPath:
    path: "/lamp/pvstorage"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    app: mysql
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

然后在我的 MySQL 部署文件的末尾,我有这些行:

          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pvc

我希望 Pod 中的所有内容都/var/lib/mysql将备份在主机/lamp/pvstorage目录中,但这似乎没有发生(但文件备份在我能看到的其他地方。删除 mysql Pod 后总是重新创建数据库)。

所以我的问题是我现在做错了什么以及如何指定该位置?

标签: mysqlkuberneteslamppersistent-volumespersistent-volume-claims

解决方案


TL;博士

PVC要在具有 ahostPathminikube实例中访问存储在 a 上的文件,--driver=docker您需要直接登录到主机 ( minikube),例如:$ minikube ssh并直接访问文件:ls /SOME_PATH


解释

处理整个过程的主题Persistent VolumesStorage Classes资源相当广泛,需要逐案调查。

可以从官方文档和所使用的 Kubernetes 解决方案的文档中获得良好的基线知识来源:

大多数情况下,在使用某种容器化/虚拟化(层环绕)时minikube(见例外) ,用于隔离环境并允许更轻松地创建和销毁实例。这使得所有资源都存储在某个“盒子”(等)内。--driver=noneminikubeVirtualbox VMDocker container

在本例中,由 所创建的文件mysql存储在正在运行的主机上,minikube但存储在minikube实例本身中。当您创建minikube时,--driver=docker您会创建一个Docker包含所有组件的容器。此外,通过将 aPVC与 的以下部分一起使用.spec

  hostPath:
    path: "/lamp/pvstorage"

hostPath

hostPath将文件或目录从主机节点的文件系统安装到您的 Pod 中。

-- Kubernetes.io:文档:概念:存储:卷:hostPath


例子

作为如何访问文件的示例:

docker@minikube:~$ ls /mnt/data/
auto.cnf  ib_logfile0  ib_logfile1  ibdata1  mysql  performance_schema

其他资源:

如果存在将主机目录安装到minikube实例的特定目录的用例,您可以选择:

  • $ minikube mount SOURCE:DESTINATION

推荐阅读