0

在我/mnt/的身上,我安装了许多硬盘驱动器(例如 at /mnt/hdd1//mnt/hdd2/)。有什么办法可以在上面创建一个 K8s Persistent Volume/mnt可以看到安装在下面的硬盘驱动器的内容/mnt吗?当我在 上创建本地持久卷时/mnt,K8s pod 会看到目录 hdd1 和 hdd2,但它们显示为空。

以下是我测试过的:

不受欢迎的解决方案 1:

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

不受欢迎的解决方案 2:

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

4

2 回答 2

2

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

  1. 解决方案中最重要的部分:在主机路径“模式”中定义一个 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. 将其安装在部署上:
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
于 2021-01-23T01:06:59.713 回答
2

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

它支持指标、存储生命周期(例如清理)、节点/pv 亲和性、可扩展性(例如动态临时存储)。例如,使用eks-nvme-ssd-provisioner,可以运行守护程序集以将快速存储配置为本地。这非常适合需要临时本地存储以进行数据缓存、快速计算的工作负载,同时无需在 pod 启动之前手动在 ec2 节点上执行挂载。

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

于 2021-01-23T02:38:14.343 回答