K8S之持久化存储

这篇具有很好参考价值的文章主要介绍了K8S之持久化存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


在K8S中部署的应用都是以pod容器的形式运行的,假如部署数据库服务 例如:MySQL、Redis等,需要对产生的数据做备份。如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,想要长久的保留这些数据就要用到pod数据持久化存储。

支持的持久化存储类型

查看K8S支持哪些存储

kubectl explain pods.spec.volumes

K8S之持久化存储,kubernetes,kubernetes,容器,云原生
K8S之持久化存储,kubernetes,kubernetes,容器,云原生
K8S之持久化存储,kubernetes,kubernetes,容器,云原生

常用的如下:

  • emptyDir :临时性存储卷类型
  • hostPath :在节点上使用本地磁盘进行数据存储
  • nfs:通过 Network File System(网络文件系统)共享文件系统进行数据存储
  • persistentVolumeClaim:持久卷声明,是K8S的一个特定类型的存储资源
  • glusterfs:通过分布式文件系统GlusterFS进行数据存储
  • cephfs:通过分布式文件系统Ceph进行数据存储
  • configMap: 通过ConfigMap资源存储应用程序的配置文件
  • secret:通过Secret资源存储应用程序的机密信息

本篇对前三种进行展开介绍,并例举实践中的使用

EmptyDir

emptyDir类型的Volume是在Pod分配到Node上时被创建,K8S会在Node上自动分配一个目录,无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。
emptyDir 主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

实践

创建一个pod,挂载临时目录emptyDir

vim emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-empty
spec:
  containers:
  - name: container-empty
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: cache-volume  # 匹配volumes.name。把卷挂载到容器里
      mountPath: /cache   # 挂载到容器里的目录下 
  volumes:
  - name: cache-volume 
    emptyDir:{}

更新资源清单文件

kubectl apply -f emptydir.yaml
kubectl describe pods pod-empty

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

查看分配到Node上的临时目录存在的位置

1、查看pod的uid

kubectl get pods pod-empty -o yaml | grep uid

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

uid: adff4bf3-62ac-41fe-9b25-abcae1c8598a

2、查看pod调度到哪个节点

kubectl get pods -o wide | grep empty

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

3、登录到k8s-node1上

ps. 安装tree 方便看目录结构

 yum install tree -y

根据 uid 看目录

tree /var/lib/kubelet/pods/adff4bf3-62ac-41fe-9b25-abcae1c8598a

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

由上可知,临时目录在本地的/var/lib/kubelet/pods/adff4bf3-62ac-41fe-9b25-abcae1c8598a/volumes/kubernetes.io~empty-dir/cache-volume/下

pod删了,临时目录也没了

kubectl delete -f emptydir.yaml

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

该类型可使用的场景:测试数据

HostPath

hostPath Volume是指Pod挂载宿主机上的目录或文件。 hostPath Volume使得容器可以使用宿主机的文件系统进行存储,hostpath(宿主机路径):节点级别的存储卷,在pod被删除,这个存储卷还是存在的,不会被删除。
所以只要同一个pod被调度到同一个节点上来,在pod被删除重新被调度到这个节点之后,对应的数据依然是存在的。

查看hostPath存储卷的用法

kubectl explain pods.spec.volumes.hostPath

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

hostPath的type类型:
K8S之持久化存储,kubernetes,kubernetes,容器,云原生

实践

创建一个pod,挂载hostPath存储卷

vim hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
spec:
  containers:
  - name: container-nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: hostpath-volume
      mountPath: /hostpath-nginx
  - name: container-tomcat
    image: tomcat:8.5-jre8-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: hostpath-volume
      mountPath: /hostpath-tomcat
  volumes:
  - name: hostpath-volume
    hostPath:
      path: /data-hostpath  # 必须字段,指定存储目录
      type: DirectoryOrCreate # 表示本地有/data-hostpath目录,就用本地的,本地没有就会在pod调度到的节点自动创建一个

更新资源清单文件

kubectl apply -f hostpath.yaml

查看pod调度到了哪个物理节点

kubectl get pods -o wide | grep hostpath

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

由上面可以知道pod调度到了k8s-node1上,登录到k8s-node1机器,查看是否在这台机器创建了存储目录

ll /data-hostpath/

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

上面可以看到已经创建了存储目录/data-hostpath,这个【/data-hostpath】会作为pod的持久化存储目录

在k8s-node1上的/data-hostpath下创建一个目录

cd /data-hostpath

mkdir aa

测试存储卷是否可以正常使用

1、登录到nginx容器

kubectl exec -it pod-hostpath -c container-nginx -- /bin/bash 
cd /hostpath-nginx/ 

/hostpath-nginx/目录存在,说明已经把宿主机目录挂载到了容器里

ls

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

2、登录到tomcat容器

kubectl exec -it pod-hostpath -c container-tomcat -- /bin/bash
cd /hostpath-tomcat/

/hostpath-tomcat/目录存在,说明已经把宿主机目录挂载到了容器里

ls

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

通过上面测试可以看到,同一个pod里的 container-nginx 和 container-tomcat 这两个容器是共享存储卷的

删除pod,指定调度到另外的node上

kubectl delete -f hostpath.yaml
vim hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
spec:
  nodeName: k8s-node2 # 指定调度到node2节点上
  containers:
  - name: container-nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: hostpath-volume
      mountPath: /hostpath-nginx
  - name: container-tomcat
    image: tomcat:8.5-jre8-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: hostpath-volume
      mountPath: /hostpath-tomcat
  volumes:
  - name: hostpath-volume 
    hostPath: 
      path: /data-hostpath
      type: DirectoryOrCreate

更新资源清单文件

kubectl apply -f hostpath.yaml

看容器里的目录,登录到nginx容器

kubectl exec -it pod-hostpath -c container-nginx -- /bin/bash 
cd /hostpath-nginx 
ls

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

aa 文件不在了

hostpath存储卷缺点:单节点,pod删除之后重新创建必须调度到同一个node节点,数据才不会丢失

NFS

以上 emptyDir 和 hostPath 是两种本地存储解决方案,仅适用于单个节点上的容器。如果需要在多个Pod或多节点之间共享持久化存储,可使用NFS。
NFS存储允许多个Pod从网络共享中读取数据,还支持高可用性配置,可以使用多个NFS服务器来提供容错和负载均衡。此外NFS还支持更高级的存储管理功能,如快照和备份,以及可配置的访问控制策略。

实践

1、搭建NFS服务
以k8s的控制节点(k8s-master1)作为NFS服务端

yum install nfs-utils -y

该命令的主要作用是使用yum包管理器自动安装nfs-utils软件包,以支持NFS协议的功能。

2、在宿主机创建NFS需要的共享目录,作为NFS服务端

mkdir /data/volumes -pv 

-p表示:创建目录的过程中,如果父级不存在,则自动创建父目录。
-v表示:可向用户展示更多信息,例如显示执行mkdir创建了哪些目录等。

3、配置NFS共享服务器上的/data/volumes目录

执行以下命令启动NFS

systemctl start nfs

编辑配置NFS服务访问的目录/data/volumes的访问权限

vim /etc/exports
# 允许任何客户端挂载
/data/volumes *(rw,no_root_squash)

参数说明:

  • /data/volumes:要共享的目录
  • ‘**’:允许哪些客户端挂载NFS共享的目录,“*”表示允许任何能访问NFS服务的网段客户端挂载NFS共享的目录
  • rw 该主机对该共享目录有读写权限
  • no_root_squash 登入:用户具有根目录的完全管理访问权限
    K8S之持久化存储,kubernetes,kubernetes,容器,云原生

4、使NFS配置生效

执行以下命令使NFS配置生效

exportfs -arv

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

service nfs restart

查看nfs是否启动成功

systemctl enable nfs

查看nfs是否启动成功

systemctl status nfs

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

Active: active
看到nfs是active,说明nfs正常启动了

5、k8s-node2和k8s-node1上也安装nfs驱动

yum install nfs-utils -y

systemctl enable nfs --now

在k8s-node1上手动挂载

mkdir /test 
mount 192.168.40.182:/data/volumes /test/

以上【192.168.40.182】为服务端(k8s-master1)的IP

df -h

K8S之持久化存储,kubernetes,kubernetes,容器,云原生
nfs可以被正常挂载

手动卸载

umount /test

6、创建Pod,挂载NFS共享出来的目录

vim nfs.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-test
spec:
  replicas: 3
  selector:
    matchLabels:
      storage: nfs
  template: 
    metadata:
      labels:
         storage: nfs
    spec:
      containers:
      - name: container-nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nfs-volumes
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-volumes
        nfs:
          server: 192.168.40.182 # 安装nfs服务的地址
          path: /data/volumes    # nfs的共享目录

更新资源清单文件

kubectl apply -f nfs.yaml

查看pod是否创建成功

kubectl get pods -owide

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

登录到nfs服务器,在共享目录创建一个index.html

cd /data/volumes/

vim index.html 

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

请求pod,看结果
K8S之持久化存储,kubernetes,kubernetes,容器,云原生

通过上面可以看到,在共享目录创建的index.html已经被pod挂载了
登录到pod验证下

kubectl exec -it nfs-test-65db89988d-4hs7h  -- /bin/bash
cat /usr/share/nginx/html/index.html 

K8S之持久化存储,kubernetes,kubernetes,容器,云原生

上面说明挂载nfs存储卷成功了,nfs支持多个客户端挂载,可以创建多个pod,挂载同一个nfs服务器共享出来的目录;
但是nfs如果宕机了,数据也就丢失了,想要高可用可使用分布式存储,常见的分布式存储有glusterfs和cephfs。文章来源地址https://www.toymoban.com/news/detail-845170.html

到了这里,关于K8S之持久化存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (九)K8S数据持久化高级存储

    NFS(Network File System)是一种分布式文件系统协议,用于通过网络共享文件和目录。它允许客户端计算机通过网络访问和读取远程服务器上的文件,就像它们在本地文件系统中一样。NFS 是一种常见的网络文件共享协议,在许多环境中被广泛使用。 在 Kubernetes 中,NFS 可以作为一

    2024年02月06日
    浏览(54)
  • K8S持久化存储--- PVC和PV的存储

    PersistentVolume ( PV )是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像 pod 是 k8s 集群资源一样。 PV是容量插件,如 Volumes ,其生命周期独立于使用 PV 的任何单个 pod 。 PersistentVolumeClaim ( PVC )是一个持久化存储卷,我们在创建 pod 时可以

    2023年04月10日
    浏览(37)
  • 飞天使-k8s基础组件分析-持久化存储

    emptyDir hostpath pv和pvc介绍 nfs作为静态pv案例 nfs作为动态pv案例 使用本地文件夹作为pv 改变默认存储类及回收策略 参考文档

    2024年02月11日
    浏览(34)
  • 如何借助Kafka持久化存储K8S事件数据?

    大家应该对 Kubernetes Events 并不陌生,特别是当你使用 kubectl describe 命令或 Event API 资源来了解集群中的故障时。     尽管这些信息十分有用,但它只是临时的,保留时间最长为30天。如果出于审计或是故障诊断等目的,你可能想要把这些信息保留得更久,比如保存在像 Kafka

    2024年02月05日
    浏览(37)
  • 持续集成部署-k8s-数据持久化-基本存储方式

    关于k8s 数据持久化,可以先看下官方的介绍:

    2024年02月13日
    浏览(55)
  • 持续集成部署-k8s-数据持久化-高级存储方式

    持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用

    2024年02月16日
    浏览(31)
  • k8s篇-应用持久化存储(PV和PVC)

    一般来说,容器一旦被删除后,容器运行时内部产生的所有文件数据也会被清理掉,因此,Docker提供了 Volume 这种方式来将数据持久化存储。 可以说,Volume 是Pod与外部存储设备进行数据传递的通道,也是Pod内部容器间、Pod与Pod间、Pod与外部环境进行数据共享的方式。 实际上

    2023年04月08日
    浏览(32)
  • 第18关 K8s数据安全无忧——持久化存储详解

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,本期课程将深入解析Kubernetes的持久化存储机制,包括PV、PVC、StorageClass等的工作原理、使用场景、最佳实践等,帮您构建稳定可靠的状态存储,确保应用和数据 100% 安全。 Volume 我们这里先来聊聊K8s的存储模型V

    2024年02月05日
    浏览(32)
  • k8s通过nfs-provisioner配置持久化存储

    一、nfs-client-provisioner简介 Kubernetes集群中NFS类型的存储没有内置 Provisioner。但是你可以在集群中为NFS配置外部Provisioner。 Nfs-client-provisioner是一个开源的NFS 外部Provisioner,利用NFS Server为Kubernetes集群提供持久化存储,并且支持动态购买PV。但是nfs-client-provisioner本身不提供NFS,需

    2024年02月11日
    浏览(33)
  • K8S使用持久化卷存储到NFS(NAS盘)

    参考文章:K8S-v1.20中使用PVC持久卷 - 知乎 目录 1、概念: 1.1 基础概念 1.2 PV的配置 1.2.1 静态PV配置 1.2.2 动态PV配置 1.2.3 PVC与PV的绑定 1.2.4 PVC及PV的使用 2 部署PV及PVC 2.1 所有K8S机器都需要安装NFS程序 2.2 仅针对需要暴露文件服务的机器开启NFS服务         2.2.1 Linux为例开启NFS服

    2023年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包