美文网首页
k8s的持久卷和持久卷声明

k8s的持久卷和持久卷声明

作者: wowshiwoniu | 来源:发表于2020-05-31 22:56 被阅读0次

在 Kubemetes 集群中为 了使应用能够正常请求存储资源, 同时避免处理基础设 施细节, 引入了两个新的资源, 分别是持久卷和持久卷声明。

  • PersistentVolume (持久卷, 简称 PV)
  • PersistentVolumeClaim(持久卷声明,简称 PVC)

这两者之间的关系,可以根据下面的关系图简单的了解


image.png

首先,集群上首先需要创建类似于nfs类型的网络存储,然后管理员通过创建PV持久卷申请存储资源,PV持久卷声明了申请的空间大小和操作权限,POD不能直接使用PV创建的持久卷,需要借助于PVC持久卷声明来实现持久化存储。

PV示例

这里简单的使用了hostPath示例,直接使用宿主机的存储,实际使用中一般为nfs类的网络存储。

  • ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个 Pod 挂载。
  • ReadOnlyMany(ROX):可以以只读的方式被多个 Pod 挂载。
  • ReadWriteMany(RWX):这种存储可以以读写的方式被多个 Pod 共享。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
  #nfs:
  #  path: /tmp
  #  server: xx.xx.xx.xx

PVC示例

假设现在需要部署一个需要持久化存储的 pod,将要用到之前创建的持久卷, 但是不能直接在 pod 内使用,需要先声明 一个 。为了像使用Volume那样使用这个PV,创建一个PVC对象,并在Pod定义中使用这个PVC。
我们可以看到以下配置:
storageClassName:manual:此配置用于绑定PVC和PV,可以看到PV上面定义的storageClassName:manual与PVC的一致;
accessModes: ReadWriteOnce:可读可写
storage: 20Gi:存储大小20Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:  # PVC也需要定义访问模式,不过它的模式一定是和现有PV相同或者是它的子集,否则匹配不到PV,这里我们使用的是hostPath模式,只支持ReadWriteOnce,若使用nfs,则支持以上三种
    - ReadWriteOnce
  resources: # 定义资源要求PV满足这个PVC的要求才会被匹配到
    requests:
      storage: 20Gi

在pod中的使用跟volume类似

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

StorageClass

如你所见,使用持久卷和持久卷声 明可以轻松获得持久化存储资源,无须研发人员处理下面实际使用的存储技术,但这仍然 需要一个集群管理员来支 持实际的存储 。幸运的是, Kubemetes 还可以通过动态配置持久卷来自动执行此任务。

集群管理员可以创建一个持久卷配置,并定义一个或多个 StorageClass对象, 从而让用户选择他们想要的持久卷类型而不仅仅只是创建持久卷 。 用户可以在其持 久卷声明中引用 Storag巳Class,而配置程序在配置持久存储时将采用这一点。

PV是运维人员来创建的,开发操作PVC,可是大规模集群中可能会有很多PV,如果这些PV都需要运维手动来处理这也是一件很繁琐的事情,所以就有了StorageClass,它的作用就是动态创建PV模板。

创建StorageClass里面需要定义PV属性比如存储类型、大小等;另外创建这种PV需要用到存储插件。最终效果是,用户提交PVC,里面指定存储类型,如果符合我们定义的StorageClass,则会为其自动创建PV并进行绑定。

具体的nfs这一块待完善。。。

相关文章

网友评论

      本文标题:k8s的持久卷和持久卷声明

      本文链接:https://www.haomeiwen.com/subject/yphdzhtx.html