首页 > 解决方案 > 是否可以在没有 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

我很困惑:

标签: kubernetes

解决方案


将 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


推荐阅读