使用挂载目录创建 Kubernetes 持久卷

Create Kubernetes Persistent Volume with mounted directory

在我的 /mnt/ 中,我安装了一些硬盘驱动器(例如 /mnt/hdd1//mnt/hdd2/)。有什么方法可以在 /mnt 上制作一个 K8s 持久卷,可以看到 /mnt 下安装的硬盘的内容?当我在 /mnt 上创建本地持久卷时,K8s pods 看到目录 hdd1 和 hdd2,但它们显示为空。

以下是我测试过的:

不需要的解决方案 1:

我可以在 /mnt/hdd1 上创建一个本地持久卷,然后我的 K8s pod 将能够看到 hdd1 硬盘驱动器的内容。但是正如我之前提到的,我希望我的 pod 能够看到 all 硬盘驱动器,我不想为每个硬盘驱动器创建一个持久卷,尤其是当我在下面安装新硬盘驱动器时/mnt.

不需要的解决方案 2:

我可以在部署的 yaml 文件中使用 mountPropagation: HostToContainer 的 K8s 选项在 /mnt/ 上安装本地持久卷。在这种情况下,如果我 重新安装 硬盘驱动器,我的 pod 将看到硬盘驱动器的内容。但这是不希望的,因为如果 pod 重新启动,我需要再次重新安装硬盘驱动器才能让 pod 看到它的内容! (仅在 pod 处于活动状态时重新安装硬盘驱动器时有效)

我能够允许 pod 使用主机路径查看安装在目录中的所有硬盘驱动器。 PersistentVolume 可以在主机路径“模式”中定义。我的最终解决方案是:

  1. 解决方案最重要的部分:在主机路径“mode”中定义一个 PersistentVolume, 具有 nodeAffinity 以确保它只会安装在具有硬盘驱动器的节点上:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: all-harddrives-pv
spec:
  volumeMode: Filesystem
  storageClassName: all-harddrives-storage
  hostPath:
    path: /mnt      # Where all the hard drives are mounted
    type: Directory
  nodeAffinity:     # Use nodeAffinity to ensure it will only be mounted on the node with harddrives.
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - MyNodeName
  1. 定义绑定到上述 PV 的 PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: all-harddrives-pvc
spec:
  storageClassName: all-harddrives-storage
  1. 在 Deployment 上安装它:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-deployment
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: my-deployment
    spec:
      containers:
        - name: mycontainername
          image: myimage
          volumeMounts:
            - mountPath: /mnt
              name: all-harddrives-pvc
      nodeSelector:
        kubernetes.io/hostname: MyNodeName

这种方法 Local Persistence Volume Static Provisioner 更适合 Kubernetes 的工作方式。

它支持指标、存储生命周期(例如清理)、node/pv 亲和力、可扩展(例如动态临时存储)。例如,使用 eks-nvme-ssd-provisioner,可以有一个守护程序集 运行 提供快速存储作为本地。这非常适合需要临时本地存储用于数据缓存、快速计算,同时不需要在 pods 开始之前在 ec2 节点上手动执行挂载的工作负载。

使用 yaml 示例在这里,sig-storage-local-static-provisioner/examples