k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

在docker和K8S中都存在容器是有生命周期的,因此数据卷可以实现数据持久化。

数据卷解决的主要问题:

1.数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失。

2.数据共享:在同一个Pod中运行容器,会存在共享文件的需求。

数据卷的类型:

1.emptyDir
emptyDir数据卷类似于docker数据持久化的docker manager volume,该数据卷初分配时,是一个空目录,同一个Pod中的容器可以对该容器中的目录具有执行读写操作,并且共享数据。
场景特点:一个相同的pod,不同的容器,共享数据卷
如果容器被删除,数据仍然存在,如果Pod被删除,数据也会被删除

测试:

**vim  emptyDir.yaml**
apiVersion: v1
kind: Pod
metadata:
  name: producer-consumer
spec:
  containers:
  - image: busybox
    name: producer
    volumeMounts:
    - mountPath: /producer_dir#这里的路径指的是容器内的路径
      name: shared-volume#指定本地的目录名
    args:#定义容器运行后,会进行的操作
    - /bin/sh
    - -c
    - echo "hello k8s" > /producer_dir/hello; sleep 30000

  - image: busybox
    name: consumer
    volumeMounts:
    - mountPath: /consumer_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - cat /consumer_dir/hello; sleep 30000

  volumes:
  - name: shared-volume#这里的值需要与上面Pod的mountPath的name值对应
    emptyDir: {}#定义数据持久化的类型,即表示空目录

kubectl apply -f emptyDir.yaml #执行文件
docker inspect (查看容器的详细信息):Mount挂载点

可以进入目录在宿主机查看数据。

kubectl get pod -o wide (-w):可以详细的查看pod信息
加上-w:可以实时查看。并且知道容器运行在那个节点。

kubectl logs {pod名} consumer可以查看目录中的数据。

根据测试可以查看节点上的容器,挂载目录是否相同。相同则环境正确。可以删除容器查看数据是否丢失,在删除master节点pod查看数据是否还在。
根据测试,emptyDir数据持久化一般只能作为临时存储使用。

2.hostPath Volume
1》将Pod所在节点的文件系统上某一个文件或目录挂载进容器内。
2》类似于docker数据持久化的bind mount。如果Pod被删除,数据会保留。相比较emptyDir要好一些,不过一但host崩溃,hostPath也无法访问了。
3》使用这种数据持久化的场景不多,因为会增加Pod与节点之间的耦合性。

3.Persistent  Volume :pv (持久卷) 提前做好的,数据持久化的存放目录。
    persistentVolumeClaim: PVC (持久卷使用声明 | 申请)
    pvc是用户存储的请求。类似于pod。pod消耗节点资源,pvc消耗存储资源。pod可以请求特定级别的资源(cpu,内存)。pvc根据权限可以请求特定的大小和访问模式。

基于NFS服务来做PV:

安装NFS服务及rpcbind服务:
1.[[email protected]?yaml]#?yum?install?-y?nfs-utils?rpcbind??#这里注意三台都要安装NFS服务。
2.[[email protected]?yaml]#?vim?/etc/exports??
文件中添加/nfsdata??*(rw,sync,no_root_squash)??
4.[[email protected]?yaml]#?mkdir?/nfsdata??
5.[[email protected]?yaml]#?systemctl?start?rpcbind??
6.[[email protected]?yaml]#?systemctl?start?nfs-server.service???
7.[[email protected]?yaml]#?showmount?-e??
Export?list?for?master:??
/nfsdata?*??

创建PV资源对象:

vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test
spec:
  capacity:#给予的容量大小
    storage: 1Gi
  accessModes:#PV支持的访问模式
    - ReadWriteOnce#这里表示只能以读写的方式挂载到单个节点
  persistentVolumeReclaimPolicy: Recycle#pv的回收策略:表示自动清楚数据
  storageClassName: nfs#定义的存储类名字
  nfs:#这里要和上面定义的存储类名字一致
    path: /nfsdata/pv1#指定NFS的目录
    server: 192.168.1.1#指定NFS服务器的IP
执行nfs-pv.yaml文件:
**`?kubectl?apply?-f?nfs-pv.yaml??`?**
persistentvolume/test?created??
**`?kubectl?get?pv??`**
NAME??????CAPACITY???ACCESS?MODES???RECLAIM?POLICY???STATUS??????CLAIM???STORAGECLASS???REASON???AGE??
test???1Gi????????RWO????????????Recycle?????????**?Available?**??????????nfs?????????????????????7s??
**这里注意STATUS状态为Available才能够使用。**

pv支持的访问模式:
ReadWriteOnce:访问模式为只能以读写的方式挂载到单个节点
ReadWriteMany:访问模式为只能以读写的方式挂载到多个节点
ReadOnlyMany:访问模式为只能以只读的方式挂载到多个节点
PV存储空间的回收策略
Recycle:自动清除数据。
Retain:需要管理员手动回收。
Delete:云存储专用。
PV和PVC相互的关联:通过的是storageClassName与accessModes

创建PVC:
 vim nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test
spec:
  accessModes:
    - ReadWriteOnce#定义访问模式,这里必须与Pv定义一致
  resources:
    requests:
      storage: 1Gi#请求容量的大小
  storageClassName: nfs#存储类的名字,必须与pv定义的一致。

运行,并查看PVC和PV:
kubectl?apply?-f?nfs-pvc.yaml???
关联后会看见,Bound:

原文地址:https://blog.51cto.com/13911055/2471235

时间: 2024-08-28 13:03:15

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC的相关文章

LAMP平台扩展:基于NFS服务实现博客站点负载均衡

nfs简介: nfs:Network File System,网络文件系统:是一种分布式文件系统协议,最初由Sun公司开发.其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件. NFS和其他许多协议一样,是基于RPC协议实现的. rpc:Remote Procedure Call,远程过程调用:是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序.调用远程主机上的函数,一部分功能由本地程序,另一部分功能由远程主机上的函数完成. rpcbind:RPC

Kubernetes-卷/存储卷(emptyDir/hostPath/pv/pvc)

1 卷的介绍 1.1 卷的概念 ??在搞容器的时候,我们在处理完应用如何起,如何运行,最终落实到数据的时候,我们又要考虑2个问题:容器是如何访问外部磁盘存储的?容器之间如何共享存储空间?在一些场景下,我们经常希望新起的容器可以在之前容器over的那个卡点处继续运行下去. ??怎么做?怎么能解决上面的问题?这个时候k8s中的卷,也就是存储卷应运而生.卷不是独立的k8s对象,它是pod的一部分,和pod同生命周期(共享),不能单独创建和销毁,即跟随pod启动时创建,删除时销毁.当重启容器时,卷可以保

K8s实现数据持久化

前言 在一切虚拟化解决方案中,数据的持久化都是需要我们非常关心的问题,docker如此,K8s也不例外.在k8s中,有一个数据卷的概念. k8s数据卷主要解决了以下两方面问题: 数据持久性:通常情况下,容器运行起来后,写入到其文件系统的文件时暂时性的.当容器崩溃后,kebelet将这个容器kill掉,然后生成一个新的容器,此时,新运行的容器将没有原来容器内的文件,因为容器是重新从镜像创建的. 数据共享:同一个pod中运行的容器之间,经常会存在共享文件/文件夹的需求. 在k8s中,Volume(数

k8s 基于NFS部署storageclass pv自动供给

在k8s中部署有状态应用时,通常需要做数据持久化存储. 后端存储的方式有以下几种: 1.基于宿主机本地的存储方式: (重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节点上没有该应用存储过的数据,所以并不持久化) 2.基于本地过云存储服务的方式,如:(NFS.glusterfs.cephfs.awsElasticBlockStore.azureDisk.gcePersistentDisk等) (在资源清单中指明URL地址和共享挂载卷目录即可实现数据持久化存储) 3

CentOS7基于NFS服务的文件共享

1        NFS服务器安装与配置 1.1   环境信息 操作系统:centos7 内核版本:3.10.0-327.el7.x86_64 1.2   NFS安装与配置 关闭selinux功能: [[email protected] ~]# setenforce 0 查看selinux状态: [[email protected] ~]# sestatus SELinux status:                 disabled 服务器NFS软件包安装: [[email protect

k8s之volumes持久化存储

k8s之数据持久化 kubernetes存储卷:我们知道默认情况下容器的数据都是非持久化的,在容器销毁以后数据也跟着丢失,所以docker提供了volume机制以便将数据持久化存储.类似的,k8s提供了更强大的volume机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题. volume:我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除.为了持久化保存容器的数据,可以使用k8s volum

k8s数据持久化

k8s数据持久化 Docker容器是有生命周期的,因此数据卷可以实现数据持久化 数据卷主要解决的问题: 数据持久性:当我们写入数据时,文件都是暂时性的存在,当容器崩溃后,host就会将这个容器杀死,然后重新从镜像创建容器,数据就会丢失 数据共享:在同一个Pod中运行容器,会存在共享文件的需求 存储类(Storage class)是k8s资源类型的一种,它是有管理员为管理PV更加方便创建的一个逻辑组,可以按照存储系统的性能高低,或者综合服务质量,备份策略等分类.不过k8s本身不知道类别到底是什么,

K8s数据持久化之自动创建PV

在前两篇实现k8s的数据持久化的流程为:搭建nfs底层存储===>创建PV====>创建PVC===>创建pod.最终pod中的container实现数据的持久化. 上述流程中,看似没什么问题,但细想一下,PVC在向PV申请存储空间的时候,是根据指定的pv名称.访问模式.容量大小来决定具体向哪个PV来申请空间的,如果PV的容量为20G,定义的访问模式是WRO(只允许以读写的方式挂载到单个节点),而PVC申请的存储空间为10G,那么一旦这个PVC是向上面的PV申请的空间,也就是说,那个PV

k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

一:Statefulset StatefulSet是为了解决有状态服务的问题,对应的Deployment和ReplicaSet是为了无状态服务而设计,其应用场景包括:1.稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现2.稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现3.有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依