kubernetes - 是否可以在没有 PVC 的情况下直接安装 PV?
问题描述
到目前为止,我确信需要一个 PVC 才能从 k8s doc访问这个示例中的 PV :
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
但后来我在Docker 文档中看到可以使用以下语法(使用 nfs 的示例):
kind: Pod
apiVersion: v1
metadata:
name: nfs-in-a-pod
spec:
containers:
- name: app
image: alpine
volumeMounts:
- name: nfs-volume
mountPath: /var/nfs # Please change the destination you like the share to be mounted too
command: ["/bin/sh"]
args: ["-c", "sleep 500000"]
volumes:
- name: nfs-volume
nfs:
server: nfs.example.com # Please change this to your NFS server
path: /share1 # Please change this to the relevant share
我很困惑:
- 这种语法是否在幕后创建了 PVC?
- 或者是否有任何符合规格的 PV 没有安装 PVC?
- 或者规范选择了现有的 PVC?
解决方案
将 Pod 分配给 Node 时首先创建一个 emptyDir 卷,并且只要该 Pod 在该节点上运行就存在。emptyDIr 卷不需要 pv 和 pvc。
请注意,当 Pod 由于任何原因从节点中删除时,emptyDir 中的数据将被永久删除。
如果要在 pod 崩溃或重新启动或 pod 被删除或取消部署的情况下保留数据,则需要使用 pv 和 pvc
看看下面的另一个例子,你不需要 pv 和 pvc 使用 hostPath
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
如果您需要将数据存储在 nfs、azure 文件存储、aws EBS、google persistentDisk 等外部存储解决方案上,那么您需要创建 pv 和 pvc。
不允许将 pv 直接安装到 pod 上,这违反了 kubernetes 的设计原则。这将导致 pod vloume 和底层存储之间的紧密耦合。
pvc 启用 pod 和持久卷之间的光耦合。Pod 不知道使用什么底层存储来存储容器数据,并且 Pod 不需要知道该信息。
为 kubernetes 集群中的工作负载静态和动态配置存储卷需要 pv 和 pvc
推荐阅读
- macos - 如何在 VS Code 的终端中重新绑定键盘快捷键?
- node.js - 是否可以在 Express ReactJS 应用程序中同时使用 res.sendFile() 和 res.redirect() ?
- feature-extraction - 在 PCL 中查找法线的 NormalEstimation 问题
- python - 如何从 App Engine 将图像上传到 Google Cloud Storage
- rust - Rust SDL:如何将表面“附加”到窗口?
- c++ - C++ 程序在重新执行时加速
- python - 已解决——SQL 用序列号更新字段
- r - 将一系列条件函数应用于 data.table
- firebase - 如果您让任何人读取数据但不写入,Firestore 的安全性如何
- python - “字节”对象没有属性“格式”