【Kubernetes存储篇】常见存储方案及场景分析

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

一、持久化存储理论

官方中文参考文档:

1、为什么要做数据持久化存储?

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

2、常见持久化存储方案

  • emptyDir:是一种临时性的卷,它的生命周期与 Pod 相同。emptyDir 卷是在 Pod 被调度到节点上时创建的,并且在 Pod 被删除时一并删除。emptyDir 卷通常用于在容器之间共享文件或者缓存数据。
  • HostPath:是一种本地存储卷,可以将宿主机目录映射到容器中,删除Pod后宿主机卷不会跟随删除,但是调用到不通节点,卷内容会不一致(MySQL数据在Node1节点存储,删除MySQL Pod后调度到Node2上了,导致数据不一致)。
  • NFS:是一种共享卷,需要依赖于NFS服务端,所有Pod共享NFS卷内容,不需要考虑Pod调度在不同节点导致数据不一致问题,但是NFS基于网络传输,会占用带宽。
  • PVC:用来实现持久化存储,可以将存储资源独立出来,方便管理和共享。

二、案例:持久化存储方案

1、emptydir临时存储卷

临时卷,当Pod被删除时,卷也会删除,用于存储一些不重要的数据。

创建Pod资源,使用emptydir卷方式挂载 ,YAML如下:

cat emptydir-pod.yaml 

---
apiVersion: v1
kind: Pod
metadata:
  name: empty-pod
  labels: 
    type: empty-pod
spec:
  containers:
  - name: empty-pod
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts: 
    - name: volume-empty  # 挂载路径名称,必须与下面卷名称一致
      mountPath: /usr/share/nginx/html  # 卷挂载目录
  volumes:
  - emptyDir: {}         # emptyDir类型,{}表示一个空的配置
    name: volume-empty   # 卷名称

执行YAML文件:

kubectl apply -f emptydir-pod.yaml

如何查看本地挂载卷路径位置呢?

第一步:确认Pod当前所在节点,可以使用以下命令确认:

kubectl get pods empty-pod -o wide

第二步:确认Pod的uid值,可以使用以下名称确认:

kubectl get pods empty-pod -o yaml|grep uid
uid: 9f76e568-05a9-41c3-9fb2-c43505214b99

第三步:在Pod所在节点中的/var/lib/kubelet/pods/uid 目录下:

cd /var/lib/kubelet/pods/9f76e568-05a9-41c3-9fb2-c43505214b99
cd volumes/kubernetes.io~empty-dir/volume-empty  # 此目录对应Pod中/usr/share/nginx/html 目录

确认本地卷对应目录后,我们进入路径,创建index.html文件:

cd /var/lib/kubelet/pods/9f76e568-05a9-41c3-9fb2-c43505214b99/volumes/kubernetes.io~empty-dir/volume-empty

echo "qinzt666" > index.html 

访问Pod网站内容:

kubectl get pods empty-pod -o wide
curl 10.244.235.233

【Kubernetes存储篇】常见存储方案及场景分析

我们删除Pod后宿主机上此目录也会跟随删除

kubectl delete pods empty-pod

【Kubernetes存储篇】常见存储方案及场景分析

2、hostPath本地存储卷

本地存储卷,指定宿主机目录,与容器目录做映射,删除Pod,宿主机目录不会跟随删除,hostPath可以支持很多挂载类型,如挂载目录,挂载文件等,如下图,此图来自官方:

【Kubernetes存储篇】常见存储方案及场景分析

创建Pod资源,使用hostPath卷方式挂载 ,YAML如下:

cat hostpath-pod.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
  labels: 
    type: hostpath-pod
spec:
  containers:
  - name: hostpath-pod
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts: 
    - name: volume-hostpath  # 挂载路径名称,必须与下面卷名称一致
      mountPath: /usr/share/nginx/html  # 容器挂载目录
  volumes:
  - hostPath:
      path: /data1              # 宿主机挂载目录
      type: DirectoryOrCreate   # 卷类型,DirectoryOrCreate表示目录,宿主机不存在则创建空目录
    name: volume-hostpath       # 卷名称

执行YAML文件:

kubectl apply -f hostpath-pod.yaml

在Pod调度节点的宿主机挂载卷位置创建 index.html 文件

kubectl get pods hostpath-pod -o wide

【Kubernetes存储篇】常见存储方案及场景分析

echo "hello world qinzt 666 ...." >/data1/index.html

访问Pod网站内容,Pod 的IP地址如上图也可以查看到:

curl 10.244.235.198

【Kubernetes存储篇】常见存储方案及场景分析

删除此Pod,节点上的数据依旧存在。

kubectl delete pod hostpath-pod
ls /data1/

index.html

3、NFS网络共享存储卷

NFS共享存储卷,需要先搭建NFS服务端,Pod共享NFS服务端数据,解决了Pod调度在不通Node节点,导致数据不一致问题,但是NFS需要依赖网络带宽。

搭建NFS服务端:所有Node节点上都需要安装 nfs-utils

yum install nfs-utils -y
mkdir /data/volumes -p

vim /etc/exports
/data/volumes *(rw,no_root_squash)

加载配置生效 && 启动NFS服务

exportfs -arv
systemctl enable nfs --now

在其他Node节点上面测试 NFS 是否可以正常挂载:

yum install nfs-utils -y
mkdir /test
mount 16.32.15.200:/data/volumes /test

df -hT /test/

【Kubernetes存储篇】常见存储方案及场景分析

如上图测试无问题,卸载挂载:

umount /test

OK,至此NFS服务端已经搭建完成,测试没有问题了。

编写 YAML 使用 NFS 类型存储卷:

cat nfs-deployment.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-test
  namespace: default
  labels:
    type: nfs
spec:
  replicas: 3
  selector:
    matchLabels:
      type: nfs
  template:
    metadata:
      labels:
        type: nfs
    spec:
      volumes:
      - name: nfs-test-volume     # 卷名称
        nfs: 
          server: 16.32.15.200    # NFS服务端IP地址
          path: /data/volumes     # NFS服务端共享目录
      containers:
      - name: nfs-test
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: nfs-test-volume             # 挂载卷名称
          mountPath: /usr/share/nginx/html  # 容器内挂载目录

执行YAML 资源清单文件:

kubectl apply -f nfs-deployment.yaml

在 宿主机NFS共享卷创建 index.html 文件

echo "qinzt coolest 666." > /data/volumes/index.html

访问 Pod网站,由于没有创建Service资源,我们使用Pod IP地址进行访问。

kubectl get pods -o wide

【Kubernetes存储篇】常见存储方案及场景分析

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

到了这里,关于【Kubernetes存储篇】常见存储方案及场景分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 飞天使-k8s基础组件分析-持久化存储

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

    2024年02月11日
    浏览(46)
  • 腾讯数据持久化方案MMKV原理分析

    提到数据持久化存储的方案,Android提供的手段有很多,在项目中常用的就是SharedPreference(简称SP),但是SP使用虽然简单,但是存在缺陷: 写入速度慢,尤其在主线程频繁执行写入操作易导致卡顿或者ANR; 不支持跨进程 因此针对这种缺陷,我们往往会换其他的技术方案,例如

    2024年02月07日
    浏览(38)
  • ThingsBoard使用持久化RPC案例场景

    昨天,有个兄弟找到我,他说他遇到问题了,场景如下:他有一个扫描枪A设备,A设备上报数据到ThingsBoard,然后需要将数据发送给B设备,其实这样想实现很简单的就是一个给B设备下发RPC即可,但是啊,这个兄弟说B设备可能会离线,如何保证B设备上线后照样能收到A设备的消

    2024年02月12日
    浏览(99)
  • 【pinia持久化存储】使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储

    使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储。 存储方式 : localStorage sessionStorage pinia-plugin-persistedstate 中文官网 pinia 中文官网 安装和使用 pinia ,请参考使用pinia文章。 安装 pinia-plugin-persistedstate : 使用前先将 pinia-plugin-persistedstate添加到pinia实例上。 在添加的时

    2023年04月17日
    浏览(47)
  • React+Redux 数据存储持久化

    yarn add @reduxjs/toolkit redux react-redux redux-persist 默认已经模块化了reducers,如下图所示 数据持续化存储github redux-persist redux工具 redux RTK redux官网 redux

    2024年02月16日
    浏览(56)
  • k8s 持久化存储

    我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁 那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问节点的设备 这个时候,我们就可以让 hostP

    2024年02月16日
    浏览(43)
  • 浅谈Kafka持久化与日志存储

    Apache Kafka是一个分布式流处理平台,用于构建实时数据流管道和流式应用程序。Kafka具有高吞吐量、低延迟、可扩展性和容错性等特点。本文档将介绍Kafka的持久化与日志存储机制,包括Kafka的存储架构、数据压缩和数据清理等;此外还将分析如何在 Kafka 中进行日志监控和维护

    2024年02月03日
    浏览(43)
  • 【k8s存储--使用OpenEBS做持久化存储】

    使用OpenEBS,你可以将有持久化数据的容器,像对待其他普通容器一样来对待。OpenEBS本身也是通过容器来部署的,支持Kubernetes、Swarm、Mesos、Rancher编排调度,存储服务可以分派给每个pod、应用程序、集群或者容器级别,包括: 跨节点的数据持久化 跨可用区和云厂商的数据同步

    2024年04月23日
    浏览(37)
  • Pinia使用方法及持久化存储

    Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。它跟 Vuex 有一定的相似度,但还是有很大的区别。 愿意看这篇博客的人,想必已经看过了官方文档,官方文档很详细,包含各种使用情景和理论,因此本文不说理论,只说具体的使用方法,想深入研究的建议去

    2024年02月08日
    浏览(53)
  • docker学习(十)Docker 持久化存储

    docker学习(一)docker 概述 docker学习(二)docker 安装部署 docker学习(三)常用命令 docker学习(四)使用 commit 制作镜像 docker学习(五)使用 Dockerfile 制作镜像 docker学习(六)卷 Volume docker学习(七)docker daemon docker学习(八)HTTP/HTTPS 代理 docker学习(九)docker 调试 docker学习

    2024年02月12日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包