使用挂载目录创建 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 可以在主机路径“模式”中定义。我的最终解决方案是:
- 解决方案最重要的部分:在主机路径“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
- 定义绑定到上述 PV 的 PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: all-harddrives-pvc
spec:
storageClassName: all-harddrives-storage
- 在 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。
在我的 /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 可以在主机路径“模式”中定义。我的最终解决方案是:
- 解决方案最重要的部分:在主机路径“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
- 定义绑定到上述 PV 的 PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: all-harddrives-pvc
spec:
storageClassName: all-harddrives-storage
- 在 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。