raz*_*azr 5 nfs kubernetes persistent-volumes
我有一个 Kubernetes 集群设置(本地),它在/exports/backup每个节点上安装了一个 NFS 共享 (my-nfs.internal.tld) 以在此处创建备份。
现在我正在设置我的日志记录堆栈,我想让数据持久化。所以我想我可以先将索引存储在 NFS 上。
现在我发现了三种不同的方法来实现这一目标:
apiVersion: v1
kind: PersistentVolume
metadata:
name: logging-data
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
server: my-nfs.internal.tld
path: /path/to/exports/backup/logging-data/
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: logging-data-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: logging-data
resources:
requests:
storage: 10Gi
Run Code Online (Sandbox Code Playgroud)
apiVersion: apps/v1
kind: Deployment
...
spec:
...
template:
...
spec:
...
volumes:
- name: logging-data-volume
persistentVolumeClaim:
claimName: logging-data-pvc
Run Code Online (Sandbox Code Playgroud)
当然,这需要我的集群能够访问 NFS(而不是仅访问当前设置的节点)。
apiVersion: v1
kind: PersistentVolume
metadata:
name: logging-data
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /exports/backup/logging-data/
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: logging-data-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: logging-data
resources:
requests:
storage: 10Gi
Run Code Online (Sandbox Code Playgroud)
apiVersion: apps/v1
kind: Deployment
...
spec:
...
template:
...
spec:
...
volumes:
- name: logging-data-volume
persistentVolumeClaim:
claimName: logging-data-pvc
Run Code Online (Sandbox Code Playgroud)
由于 nfs 已安装到我的所有节点,因此我也可以直接在部署中使用主机路径,而无需固定任何内容。
apiVersion: apps/v1
kind: Deployment
...
spec:
...
template:
...
spec:
...
volumes:
- name: logging-data-volume
hostPath:
path: /exports/backup/logging-data
type: DirectoryOrCreate
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:这三者之间真的有什么区别吗?我很确定这三个都有效。我已经测试了第二个和第三个。不过,我还无法测试第一个(至少在这个特定设置中)。特别是第二个和第三个解决方案对我来说非常相似。我认为,第二个可以更轻松地在多个集群上重用部署文件,因为您可以使用不同类型的持久卷,而无需更改volumes部署的部分。但除此之外还有什么区别吗?也许是性能?或者其中之一已被弃用并将很快被删除?
我发现一个教程提到,hostPath-PV 仅适用于单节点集群。但我确信它也适用于我的情况。也许评论是关于:“在多节点集群上,当部署到不同节点时,数据会发生变化。”
通过阅读大量文档和操作方法,我了解到第一个是首选解决方案。我可能也会选择它,因为它是最容易复制到云设置的一种。但我真的不明白为什么这个比其他两个更受欢迎。
预先感谢您对此事的意见!
NFS确实是首选解决方案:
卷
nfs允许将现有的 NFS(网络文件系统)共享挂载到 Pod 中。emptyDir与删除 Pod 时会被擦除的不同,nfs卷的内容会被保留,而卷只是被卸载。这意味着 NFS 卷可以预先填充数据,并且数据可以在 Pod 之间共享。NFS 可以由多个写入器同时挂载。
因此,NFS 很有用,原因有两个:
数据是持久的。
可以同时从多个Pod访问,并且可以在Pod之间共享数据。
请参阅 NFS示例有关更多详细信息,
而主机路径:
A
hostPath将主机节点文件系统中的文件或目录挂载到 Pod 中。由于节点上的文件不同,具有相同配置的 Pod(例如从 PodTemplate 创建的 Pod)在不同节点上的行为可能会有所不同
在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或者修改主机上的文件权限以便能够写入
hostPath卷
hostPath不推荐,有以下几个原因:
您无法直接控制 pod 将在哪个节点上运行,因此无法保证 pod 实际上会调度到具有数据量的节点上。
您使集群面临安全威胁。
如果某个节点出现故障,您需要将 pod 调度到本地配置的卷不可用的其他节点上。
例如hostPath,如果您想将它用于在DaemonSet. 除此之外,最好使用 NFS。
| 归档时间: |
|
| 查看次数: |
2862 次 |
| 最近记录: |