iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Kubernetes存储系统数据持久化管理方法是什么
  • 104
分享到

Kubernetes存储系统数据持久化管理方法是什么

2023-07-04 16:07:24 104人浏览 八月长安
摘要

本篇内容主要讲解“kubernetes存储系统数据持久化管理方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Kubernetes存储系统数据持久化管理方法是什么”吧!引言Kubernet

本篇内容主要讲解“kubernetes存储系统数据持久化管理方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Kubernetes存储系统数据持久化管理方法是什么”吧!

引言

Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和StorageClass资源对象来对存储进行管理。

PV的全称是Persistent Volume(持久化卷),是对底层数据存储的抽象,PV由管理员创建、维护以及配置,它和底层的数据存储实现方法有关,比如Ceph,NFS,ClusterFS等,都是通过插件机制完成和共享存储对接。

PVC的全称是Persistent Volume Claim(持久化卷声明),我们可以将PV比喻为接口,里面封装了我们底层的数据存储,PVC就是调用接口实现数据存储操作,PVC消耗的是PV的资源。

StorageClass是为了满足用于对存储设备的不同需求,比如快速存储,慢速存储等,通过对StorageClass的定义,管理员就可以将存储设备定义为某种资源类型,用户根据StorageClass的描述可以非常直观的知道各种存储资源的具体特性,这样就可以根据应用特性去申请合适的资源了。

安装存储系统

存储系统的选择有很多,常见的有NFS、Ceph、GlusterFS、FastDFS等,具体使用什么根据企业情况而定。在这里使用的是NFS,下面简单介绍一下如何安装。

(1)安装服务

$ yum install nfs-utils rpcbind -y

(2)创建共享目录

$ mkdir /data/k8s -p

(3)配置NFS配置文件

$ vim /etc/exports/data/k8s *(rw,sync,no_root_squash)

(4)启动服务

$ systemctl start rpcbind$ systemctl start nfs$ systemctl enable rpcbind$ systemctl enable nfs

(5)测试

$ showmount -e 192.168.205.128Export list for 192.168.205.128:/data/k8s *

PS:所有节点都需要安装NFS客户端

PV

PV(Persistent Volume)作为Kubernetes存储设备,可以由管理员提前配置,也可以通过StorageClass来动态供应。

PV是集群资源,可以通过kubectl explain pv来查看如何配置,主要包括存储能力,访问模式,存储类型,回收信息等关键信息。例如:

apiVersion: v1kind: PersistentVolumemetadata:  name: my-pv01  labels:    storage: pvspec:  acceSSModes:  - ReadWriteOnce  capacity:    storage: 1Gi  persistentVolumeReclaimPolicy: Recycle  nfs:    path: /data/k8s    server: 192.168.205.128

参数说明:

(1)、accessMode:访问模式,有ReadWriteOnce,ReadOnlyMany,ReadWriteMany。其中:

  • ReadWriteOnce:表示具有读写权限,但是只能被一个node挂载一次

  • ReadOnlyMany:表示具有只读权限,可以被多个node多次挂载

  • ReadWriteMany:表示具有读写权限,可以被多个node多次挂载

(2)、capacity:持久卷资源和容量的描述,存储大小是唯一可设置或请求的资源。

(3)、persistentVolumeReclaimPolicy:回收策略,也就是释放持久化卷时的策略,其有以下几种:

  • Retain:保留数据,如果要清理需要手动清理数据,默认的策略;

  • Delete:删除,将从Kubernetes中删除PV对象,以及外部基础设施中相关的存储资产,比如AWS EBS, GCE PD, Azure Disk, 或Cinder volume;

  • Recycle:回收,清楚PV中的所有数据,相当于执行rm -rf /pv-volume/*;

创建过后,PV的状态如下:

$ kubectl get pvNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGEmy-pv01   1Gi        RWO            Recycle          Available                                   5s$ kubectl describe pv my-pv01 Name:            my-pv01Labels:          storage=pvAnnotations:     <none>Finalizers:      [kubernetes.io/pv-protection]StorageClass:    Status:          AvailableClaim:           Reclaim Policy:  RecycleAccess Modes:    RWOVolumeMode:      FilesystemCapacity:        1GiNode Affinity:   <none>Message:         Source:    Type:      NFS (an NFS mount that lasts the lifetime of a pod)    Server:    192.168.205.128    Path:      /data/k8s    ReadOnly:  falseEvents:        <none>

当前PV的状态是Available,表示处于随时可用状态。PV总共有以下四种状态:

  • Available(可用):表示可用状态,还未被任何 PVC 绑定

  • Bound(已绑定):表示 PVC 已经被 PVC 绑定

  • Released(已释放):PVC 被删除,但是资源还未被集群重新声明

  • Failed(失败):表示该 PV 的自动回收失败

单纯的创建PV,我们并不能直接使用,需要使用PVC(Persistent Volume Claim)来进行声明。

PVC

PVC(Persistent Volume Claim)用于表达用户对存储的需求,申请PVC会消耗掉PV的资源,可以通过kubectl explain pvc来查看帮助文档。

在上一节我们创建了PV,现在要申明PVC,如下:

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: pvc-testspec:  accessModes:  - ReadWriteOnce  resources:    requests:      storage: 1Gi

spec参数说明:

(1)、accessModes:主要定义卷所应该拥有的访问模式

(2)、resources:主要定义卷应该拥有的最小资源

(3)、dataSource:定义如果提供者具有卷快照功能,就会创建卷,并将数据恢复到卷中,反之不创建

(4)、selector:定义绑定卷的标签查询

(5)、storageClassName:定义的storageClass的名字

(6)、volumeMode:定义卷的类型

(7)、volumeName:需要绑定的PV的名称链接

创建过后,查看PV和PVC的状态,如下:

$ kubectl get pvcNAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGEpvc-test   Bound    my-pv01   1Gi        RWO                           2s$ kubectl get pvNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   REASON   AGEmy-pv01   1Gi        RWO            Recycle          Bound    default/pvc-test                           20m

我们从上面可以看到pvc处于Bound状态,Bound的VOLUME是my-pv01,我们再看pv的状态有Available变为Bound,其CLAIM是default/pvc-test,其中default为namespace名称。

在上面我们创建了一个PVC,其绑定了我们创建的PV,如果此时我们再创建一个PVC,结果又会如何?我们copy以下上面的PVC文件,将其名称改一下,如下:

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: pvc-test2spec:  accessModes:  - ReadWriteOnce  resources:    requests:      storage: 1Gi

然后查看PVC的状态,如下

$ kubectl get pvcNAME        STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGEpvc-test    Bound     my-pv01   1Gi        RWO                           3m57spvc-test2   Pending                                                      4s

我们可以看到我们刚创建的pvc-test2的STATUS处于Pending状态,这是由于集群里声明的PV都使用完了,PVC在申请的时候没有找到合适的PV,所以处于这个状态,这时候如果我们创建一个新的并满足要求的PV,则可以看到这个PVC会处于Bound状态。如下:

$ kubectl get pvNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM              STORAGECLASS   REASON   AGEmy-pv01   1Gi        RWO            Recycle          Bound       default/pvc-test                           27mmy-pv02   1Gi        RWO            Recycle          Available                                              5s$ kubectl get pvcNAME        STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGEpvc-test    Bound    my-pv01   1Gi        RWO                           6m50spvc-test2   Bound    my-pv02   1Gi        RWO                           2m57s

PVC也在申领PV的时候也不是随意申领的,它需要符合以下要求:

(1)PVC申领的模式要和PV匹配上,假如PVC的模式是ReadWriteOnce,而PV的模式是ReadWriteMany,则申领部成功。

(2)PVC申领的容量要小于等于PV的容量,否则申请不成功。

(3)一个PV只能绑定一个PVC

另外,如果我们的PVC需求的容量小于PV的可用容量,绑定的容量是PV的可用容量。

StorageClass

上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。

具体来说,StorageClass会定义一下两部分:

  • PV的属性 ,比如存储的大小、类型等;

  • 创建这种PV需要使用到的存储插件,比如Ceph等;

有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。

这里我们以NFS为例,要使用NFS,我们就需要一个nfs-client的自动装载程序,我们称之为Provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。说明:

  • 自动创建的PV会以{pvcName}-${pvName}的目录格式放到NFS服务器上;

  • 如果这个PV被回收,则会以archieved-{pvcName}-${pvName}这样的格式存放到NFS服务器上;

安装NFS Provisioner

(1)创建ServiceAccount,为NFS Provisioner授权

---apiVersion: v1kind: ServiceAccountmetadata:  name: nfs-client-provisioner---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  name: nfs-client-provisioner-clusterrolerules:  - apiGroups: [""]    resources: ["persistentvolumes"]    verbs: ["get", "list", "watch", "create", "delete"]  - apiGroups: [""]    resources: ["persistentvolumeclaims"]    verbs: ["get", "list", "watch", "update"]  - apiGroups: ["storage.k8s.io"]    resources: ["storageclasses"]    verbs: ["get", "list", "watch"]  - apiGroups: [""]    resources: ["events"]    verbs: ["list", "watch", "create", "update", "patch"]  - apiGroups: [""]    resources: ["endpoints"]    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: nfs-client-provisioner-clusterrolebindingsubjects:- kind: ServiceAccount  name: nfs-client-provisioner  namespace: defaultroleRef:  kind: ClusterRole  name: nfs-client-provisioner-clusterrole  apiGroup: rbac.authorization.k8s.io

(2)创建NFS Provisioner

---apiVersion: apps/v1 kind: Deploymentmetadata:  name: nfs-client-prosionerspec:  replicas: 1  strategy:    type: Recreate  selector:    matchLabels:      app: nfs-client-prosioner  template:    metadata:      labels:        app: nfs-client-prosioner    spec:      serviceAccountName: nfs-client-provisioner      containers:      - name: nfs-client-prosioner        image: reGIStry.cn-hangzhou.aliyuncs.com/rookieops/nfs-client-provisioner:4.0        imagePullPolicy: IfNotPresent        volumeMounts:        - name: nfs-client-root          mountPath: /data/pv        env:        - name: PROVISIONER_NAME          value: rookieops/nfs        - name: NFS_SERVER          value: 192.168.205.128        - name: NFS_PATH          value: /data/k8s      volumes:      - name: nfs-client-root        nfs:          server: 192.168.205.128          path: /data/k8s

执行完成后,查看NFS Provisioner的状态,如下:

$ kubectl get poNAME                                    READY   STATUS    RESTARTS   AGEnfs-client-prosioner-54d64dfc85-b4ht4   1/1     Running   0          10s

使用StorageClass

上面已经创建好NFS Provisioner,现在我们可以直接创建StroageClass,如下:

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: nfsprovisioner: rookieops/nfs

每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。

在配置StorageClass的时候,如果没有指定reclaimPolicy,则默认是Delete,除此之外,还有Retain。

StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。

使用kubectl apply -f sc.yaml创建StorageClass,创建完成过后如下:

$ kubectl get scNAME   PROVISIONER     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGEnfs    rookieops/nfs   Delete          Immediate           false                  9m41s

现在,我们就可以使用动态存储申领PVC,如下:

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: pvc-from-scspec:  accessModes:    - ReadWriteOnce  storageClassName: nfs  resources:    requests:      storage: 1Gi

使用kubectl apply -f pvc-from-sc.yaml,查看PVC创建情况,如下:

$ kubectl get pvcNAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGEpvc-from-sc   Bound    pvc-a4a71b8c-5664-4d1a-b286-9e4adcf6f96a   1Gi        RWO            nfs            8s$ kubectl get pvNAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGEpvc-a4a71b8c-5664-4d1a-b286-9e4adcf6f96a   1Gi        RWO            Delete           Bound    default/pvc-from-sc   nfs                     86s

可以看到自动创建了一个PV,然后和PVC进行绑定。

为了方便使用,有时候会给集群默认设置一个StorageClass,以便在需要使用动态存储,但是未声明的情况下使用默认的动态存储。设置方式如下:

$ kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

通过向其添加 storageclass.kubernetes.io/is-default-class 注解来将特定的 StorageClass 标记为默认。当集群中存在默认的 StorageClass 并且用户创建了一个未指定 storageClassName 的 PersistentVolumeClaim 时, DefaultStorageClass 准入控制器会自动向其中添加指向默认存储类的 storageClassName 字段。

请注意,集群上最多只能有一个 默认 存储类,否则无法创建没有明确指定 storageClassName 的 PersistentVolumeClaim。

如果要取消默认StorageClass,只需要把注解设置为flase即可,如下:

$ kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

如果我们要在Pod中使用PVC,则直接如下声明:

apiVersion: v1kind: Podmetadata:  name: Nginxspec:  containers:  - name: nginx    image: nginx    imagePullPolicy: IfNotPresent    volumeMounts:    - name: nfs-pvc      mountPath: /mnt  restartPolicy: Never  volumes:  - name: nfs-pvc    persistentVolumeClaim:      claimName: pvc-from-sc

可以进入容器,到挂载目录输出,例如:

$ kubectl exec -it nginx -- /bin/bashroot@nginx:/mnt# echo "test" > /mnt/text.txt

然后到NFS对应的目录查看是否一致。

$ cd /data/k8s/default-pvc-from-sc-pvc-a4a71b8c-5664-4d1a-b286-9e4adcf6f96a$ cat text.txt test

这表示Pod使用持久化成功。

到此,相信大家对“Kubernetes存储系统数据持久化管理方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Kubernetes存储系统数据持久化管理方法是什么

本文链接: https://www.lsjlt.com/news/346341.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Kubernetes存储系统数据持久化管理方法是什么
    本篇内容主要讲解“Kubernetes存储系统数据持久化管理方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Kubernetes存储系统数据持久化管理方法是什么”吧!引言Kubernet...
    99+
    2023-07-04
  • docker持久化存储数据的方法是什么
    Docker提供了多种方法来实现持久化存储数据:1. 数据卷(Volumes):数据卷是一个特殊的目录,可以绕过容器文件系统来直接访...
    99+
    2023-10-27
    docker
  • Docker的持久化存储和数据共享是什么
    这篇“Docker的持久化存储和数据共享是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2022-10-19
  • 优化MySQL数据库发布系统存储的方法是什么
    优化MySQL数据库发布系统存储的方法有:mysql库主从读写分离。适当的添加索引。选取最适用的字段属性。不经常改动的页面,生成静态页面。添加缓存机制。找规律分表,减少单表中的数据量提高查询速度。选择合适的表字段数据类型和存储引擎。尽量避免...
    99+
    2022-10-18
  • redis存储数据序列化的方法是什么
    Redis存储数据时,可以使用以下几种序列化方法:1. 字符串序列化:将数据以字符串的形式进行存储,可以使用Redis提供的字符串数...
    99+
    2023-08-24
    redis
  • Linux操作系统的内存管理方法是什么
    这篇文章主要讲解了“Linux操作系统的内存管理方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux操作系统的内存管理方法是什么”吧!在Linux下查看内存我们一般用comma...
    99+
    2023-06-17
  • Redis做数据持久化的解决方案及底层原理是什么
    本篇内容介绍了“Redis做数据持久化的解决方案及底层原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录数据持久化RDB生成方法s...
    99+
    2023-06-20
  • 后台管理系统中数据库存储文章用什么类型,mysql数据库中怎么存储大段文字呢?(1000个中文字符以上)
    问题 一个小型的文章系统的网站,用来存储内容content的字段,我选择的是varchar(8000),最多可容纳4000汉字,对绝大多数用户来说,应该够用了。但是一个问题是允许用户输入代码(HTML,JS,CSS等),实际上如果...
    99+
    2023-08-18
    数据库 mysql java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作