如何理解k8s里面 pv pvc 和 storageClass 之间的关系?

我目前按照某数据服务的说明在 minikube 上搭建 logstash 服务,但一直提示 unbound immediate PersistentVolumeClaims 。我在按照文档理解的意思是绑定 pvc 失败了,于是发现对方让默认用 nfs 做存储,我理解的单节点上搭建应该不存在 nfs 服务,所以换用了 local 。但换用 local 之后,发现就 pv 就没有创建,pvc 也是空的,storageClass 是创建成功的。

我目前的配置如下:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: logstash-local-storage
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
---
apiVersion: v1
kind: Service
metadata:
  name: logstash
  labels:
    app: logstash
spec:
  ports:
    - port: 5044
      name: beat-in
  clusterIP: None
  selector:
    app: logstash
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: logstash
spec:
  # 使用上面的 Headless Service
  serviceName: "logstash"
  selector:
    matchLabels:
      app: logstash
  replicas: 3
  template:
    metadata:
      labels:
        app: logstash
    spec:
      containers:
        - name: logstash
          image: sensorsdata/logstash:7.2.0
          resources:
            limits:
              cpu: "0.5"
              memory: "500Mi"
            requests:
              cpu: 100m
              memory: "100Mi"
          ports:
            - containerPort: 5044
              name: beat-in
          volumeMounts:
            - name: logstash-pipe-conf
              mountPath: /usr/share/logstash/pipeline/logstash.conf
              subPath: logstash.conf
            - name: logstash-set
              mountPath: /usr/share/logstash/config/logstash.yml
              subPath: logstash.yml
            # 容器中 /usr/share/logstash/data 目录下保存着缓冲队列 ,与进度信息。
            - name: ldata
              mountPath: /usr/share/logstash/data
      volumes:
        - name: logstash-pipe-conf
          configMap:
            name: logstash-pipe-conf
        - name: logstash-set
          configMap:
            name: logstash-set
  volumeClaimTemplates: # Logstash 进度数据使用的 PVC 模板
    - metadata:
        name: ldata
      spec:
        accessModes: [ "ReadWriteOnce" ]
        # 使用的存储类名称,需要提前创建。
        storageClassName: "logstash-local-storage"
        resources:
          requests:
            # 大小要高于缓冲队列的最大长度限制
            storage: 100Mi

我理解的是 pv 是要永久存储的卷,pvc 是对这个卷的声明,而 sc 则是对存储系统参数的抽象化,官方文档读起来太拗口,我不知道理解的对不对。请大家帮我看看。

k8s
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

看了下你的sc的信息,里面有个

provisioner: kubernetes.io/no-provisioner

应该是要手动创建一个pv对象吧,不然pvc无法找到相对应的pv对象进行绑定。

Local Persistent Volume 不支持 Dynamic Provisioning,所以它没办法在用户创建 PVC 的时候,就自动创建出对应的 PV。

这块我也不是特别熟。仅供参考。

3年前 评论
jxlwqq (作者) 3年前
sanders (楼主) 3年前
jxlwqq (作者) 3年前
讨论数量: 2

看了下你的sc的信息,里面有个

provisioner: kubernetes.io/no-provisioner

应该是要手动创建一个pv对象吧,不然pvc无法找到相对应的pv对象进行绑定。

Local Persistent Volume 不支持 Dynamic Provisioning,所以它没办法在用户创建 PVC 的时候,就自动创建出对应的 PV。

这块我也不是特别熟。仅供参考。

3年前 评论
jxlwqq (作者) 3年前
sanders (楼主) 3年前
jxlwqq (作者) 3年前
sanders

网上大部分例子貌似都是先用 nfs 来应用一个 pv 然后再让 pod 通过 pvc 去尝试使用这个 pv ,本楼的问题貌似可以通过这种方法走过去了。只不过我根据网上的方法在本地部署了一个 nfsd 一直被提示 'mount.nfs: access denied by server while mounting' 貌似是服务权限哪里没有配置好。如果还不行我就按照官方范例里面再启用一个 pod 当 nfs 服务试试。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!