K8S持久化存储数据

news2024/11/23 16:55:19

环境:

Ubuntu-1:192.168.114.110作为主

Ubuntu-2:192.168.114.120作为从1,node节点1

Ubuntu-3:192.168.114.130作为从2,node节点2

持久化volumeMounts

pod里面:emptyDir和hostPath。存储在node,NFS...,Cloud

当创建若干个pod后,其容器中的重要数据需要持久化存储,但如果删除了一个pod,则这个容器中的所有数据都将清空,故需要将容器中的数据持久化存储。那么就引入了两个持久化的机制:volumes和volumeMounts。

volumeMounts是pod中的容器内部中的持久化的数据,将其内部的数据挂载到指定的持久化存储目录下。而volumes则是被pod挂载访问的存储目录。它支持同一个pod下的多个容器挂载到该目录下,来达到共享数据的目的。

在持久化存储中,有两种方式:emptyDir,hostPath方式

emptyDir:

emptyDir:当Pod因为某些原因被从节点上删除时,emptyDir卷中的数据也会被永久删除。

  volumeMounts:
  - moutPath: /cache
    name: cache-volume
volumes:
- name: cache-volume
  emptyDir: {}

emptyDir验证:

写一个yaml文件:vim empty.yaml

[root@Node-1 data]#:cat empty.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-empty-dir
spec:
  containers:
  - name: empty-dir-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

metadata:

  name: pod-empty-dir     #pod的名字

spec:

  containers:

  - name:empty-dir-container                #镜像的名字

    image: harbor.hiuiu.com/nginx/nginx:1.21.5            #镜像,最好在node节点上有本地镜像

    volumeMounts:                #指定容器中的路径,挂载点

    - mountPath: /cache                #容器中的目录,会自动创建/cache/这个目录

      name: chache-volume                #卷名

  volumes:                                #本地挂载点,系统的路径下,默认在/var/lib/kubelet/pods/下

  - name: cache-volume                #与volumeMounts中的名字一致

    emptyDir: {}                        #emptyDir类型

创建pod:

[root@Node-1 data]#:kubectl apply -f empty.yaml 
pod/pod-empty-dir created

 查看调度到了哪个node节点上,通过kubectl get pod -o wide发现调度到了从2上,也就是node-3节点。

通过yaml的形式展示出来,过滤出pod的uid。

去从2节点node-3上查看:

[root@Node-3 ~]#:cd /var/lib/kubelet/pods
[root@Node-3 pods]#:ls
20ddc71d-281f-4919-abe7-47c18ecda2f4  e0f4f44f-d8dc-407f-a07e-4a72ba4c9bc3
21b8e3bc-aa44-4dea-9ed7-beac6028ba76
[root@Node-3 pods]#:cd 20ddc71d-281f-4919-abe7-47c18ecda2f4/volumes/kubernetes.io~empty-dir/cache-volume/
[root@Node-3 cache-volume]#:ls
[root@Node-3 cache-volume]#:

这里为空。我们去主node-1上。进入pod里面到/cache/下,创建文件和文件夹。看在node-3上是否生成我们创建的。

[root@Node-1 data]#:kubectl exec -it pod-empty-dir bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@pod-empty-dir:/# cd /cache/
root@pod-empty-dir:/cache# ls
root@pod-empty-dir:/cache# touch 123
root@pod-empty-dir:/cache# mkdir abc
root@pod-empty-dir:/cache# ls
123  abc
root@pod-empty-dir:/cache# exit
exit
[root@Node-1 data]#:

在node-3上的目录下查看是否创建了abc文件夹和123文件:

[root@Node-3 cache-volume]#:ls
[root@Node-3 cache-volume]#:
[root@Node-3 cache-volume]#:
[root@Node-3 cache-volume]#:ls
123  abc

但如果我们删除了pod后,在node-3上的数据也就一并删除消失:

[root@Node-1 data]#:kubectl delete -f empty.yaml 
pod "pod-empty-dir" deleted
[root@Node-1 data]#:kubectl get pod 
NAME    READY   STATUS    RESTARTS       AGE
nginx   1/1     Running   10 (55m ago)   6d7h

主上操作删除pod后,去node-3上查看,看是否还存在文件夹abc和123文件:

hostPath:

编写yaml文件:vim hostpath.yaml

[root@Node-1 data]#:cat hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath-dir
spec:
  containers:
  - name: host-dir-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: nginx-volume
  volumes:
  - name: nginx-volume
    hostPath:
      path: /data/nginx
      type: DirectoryOrCreate

解释说明:

volumes:

- name: nginx-volume                #改名字与volumeMounts.name的名字相同

  hostPath:                                #hostPath形式

    path: /data/nginx                        #指定本地挂载点的路径,在/data/nginx/下

    type: DirectoryOrCreate         #类型指定为DirectoryOrCreate ,如果本地没有这个路径就自动创建

运行创建pod:发现调度到了node-3上。

那么去node-3上查看:发现自动创建了/data/nginx/挂载共享目录。

在主上进入容器中的/usr/share/nginx/html/路径下,创建文件夹和文件,在本地的/data/nginx/下查看是否有我们创建的文件夹和文件。

[root@Node-1 data]#:kubectl exec -it pod-hostpath-dir bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@pod-hostpath-dir:/# touch /usr/share/nginx/html/123
root@pod-hostpath-dir:/# mkdir /usr/share/nginx/html/abc
root@pod-hostpath-dir:/# exit
exit
[root@Node-1 data]#:

在node-3上查看:

有了我们创建的文件夹和文件。在hostPath类型下,我们删除pod后,node-3上的/data/nginx/下的数据不会被删除。

查看node-3上的/data/nginx/下是否还存在文件夹abc和文件123

依旧存在!实现了数据的持久化存储。相比于emptyDir来说,emptyDir更适合存储一些临时数据。hostPath适合存储永久存储的数据,不丢失。

除此之外,还可以将容器中的多个目录挂载到本机的一个目录挂载点下。

[root@Node-1 data]#:cat hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath-dir
spec:
  containers:
  - name: host-dir-container
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: nginx-volume
    - mountPath: /data
      name: nginx-volume
    - mountPath: /mnt
      name: nginx-volume
  volumes:
  - name: nginx-volume
    hostPath:
      path: /datas/nginx
      type: DirectoryOrCreate

/usr/share/nginx/html

/data

/mnt

都挂在到node节点的/datas/nginx/下

可以发现,调度在了node-3上。在node-3上查看。还没有任何数据。

[root@Node-3 ~]#:cd /datas/nginx/
[root@Node-3 nginx]#:ls
[root@Node-3 nginx]#:

我们在主上进入容器,在三个挂载的共享目录下创建文件,再在node-3上的/datas/nginx/查看:

 我们分别在/usr/share/nginx/html/下创建了aaa文件。在/data/下创建了bbb文件。在/mnt/下创建了ccc文件。

[root@Node-1 data]#:kubectl exec -it pod-hostpath-dir bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@pod-hostpath-dir:/# touch /usr/share/nginx/html/aaa
root@pod-hostpath-dir:/# touch /data/bbb
root@pod-hostpath-dir:/# touch /mnt/ccc
root@pod-hostpath-dir:/# exit
exit
[root@Node-1 data]#:

去node-3上查看。发现同时是挂载了容器中的三个目录。持久化的三个目录的数据。

这里在本机的目录下,可以对数据大小做个限制,比如在/datas/nginx/下持久化的数据量不超过500M的数据。

emptyDir:
  sizeLimit: 500Mi		#限额,在本机默认的路径下,限制500M的数据

NFS存储

实操:

nfs存储需要下载nfs。主master上

#安装nfs-kerner-server
[root@Node-1 data]#:apt install -y nfs-kernel-server

 添加挂载点:vim /etc/exports,在最后添加一行。重启nfs-kernel-server

#挂载点,添加一行。
[root@Node-1 data]#:vim /etc/exports 
/data/disk *(rw,sync,no_root_squash)
#重新生成一下
[root@Node-1 data]#:exportfs -arv
#重启
[root@Node-1 data]#:systemctl restart nfs-kernel-server
[root@Node-1 data]#:mkdir /data/disk

yaml文件: 

[root@Node-1 data]#:cat nfs.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dep
  labels:
    app: nginx-dep
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: nginx-volume
      volumes:
      - name: nginx-volume
        nfs:
          server: 192.168.114.110
          path: /data/disk
          readOnly: false
---
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 90
    targetPort: 80
    nodePort: 30008

解释:

  volumeMounts:

  - mountPath: /usr/share/nginx/html

    name: nginx-volume                #容器内的路径,指定一个名字,这与volumes的名字相同

volumes:

- name: nginx-volume                #这里与volumeMounts中的name匹配。

  nfs:                                           #nfs存储

    server: 192.168.114.110        #存储的主机

    path: /data/disk                      #宿主机的路径

    readOnly: false                        #只读形式

运行查看pod:

[root@Node-1 data]#:kubectl apply -f nfs.yaml 
deployment.apps/nginx-dep created
service/my-nodeport created
[root@Node-1 data]#:kubectl get pod 
NAME                         READY   STATUS    RESTARTS       AGE
nginx-dep-6fcb8c557f-g5mmd   1/1     Running   0              3s
nginx-dep-6fcb8c557f-pl7kd   1/1     Running   0              3s
nginx-dep-6fcb8c557f-rgkc9   1/1     Running   0              3s
nginx-dep-6fcb8c557f-w52sw   1/1     Running   0              3s
nginx-dep-6fcb8c557f-wwwhp   1/1     Running   0              3s
nginxtest                    1/1     Running   3 (119m ago)   9h

 进入容器:写一个主页。在宿主机中看是否存在我们在宿主机中创建的文件。

[root@Node-1 data]#:kubectl exec -it nginx-dep-6fcb8c557f-w52sw bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-dep-6fcb8c557f-w52sw:/# echo "nginx-nginx" > /usr/share/nginx/html/index.html
root@nginx-dep-6fcb8c557f-w52sw:/# exit
exit
[root@Node-1 data]#:
[root@Node-1 data]#:cd /data/disk/
[root@Node-1 disk]#:ls
index.html
[root@Node-1 disk]#:cat index.html 
nginx-nginx
#访问本机主的地址:端口号
[root@Node-1 disk]#:curl 192.168.114.110:30008
nginx-nginx

---end---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微软Win11 24H2最新可选更新补丁26100.1591发布!

系统之家于8月28日发出最新报道,微软面向Win11 24H2用户推出八月最新的可选更新KB5041865,系统更新后版本号升至26100.1591。本次更新进行了多项改进,还优化了小组件面板。接下来,跟随小编一起深入了解这次更新的详细内容吧。 更新…

RSA非对称性加密02: 加密redis的连接密码(下)-私钥加密,公钥解密

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.2 上文传送门 2. 使用方式2.1 使用druid自带的RSA加密工具2.1.1 引入druid依赖2.1.2 原yml配置(对比使用)2.1.2 新yml配置 2.2 springboot的redis配置类2.2.1 例如在RedisConfig中2.2.2 设置序列化与反序列化代码示例如下: 2.3 …

Golang小项目(1)

Golang小项目(1) 前言 本项目适合Golang初学者,通过简单的项目实践来加深对Golang的基本语法和Web开发的理解。 建议前往 torna.top 查阅效果更佳 项目结构 . ├── main.go └── static├── form.html└── index.html项目流程图 定义三个路由: /:首页,显示static…

SWOT分析:解锁个人优势,规划未来成功路径

在传统的SWOT分析中,人们常常采用手工绘制的方式来创建图表,这种方式不仅过程繁琐,而且耗费大量时间和精力。为了简化这一流程,本文推荐使用可免费使用的实时在线编辑工具——即时白板,它是一款高效便捷的SWOT分析工具…

照片清晰度修复,这里总结了三种方法

照片清晰度修复,在数字化时代,照片不仅记录着生活的点滴,更承载着我们的情感和回忆。如今,有许多珍贵的老照片逐渐失去了原有的清晰度,变得模糊不堪。但随着科技的发展,我们有了多种方法来修复这些模糊的照…

专利检索的重要性

专利检索的重要性

从零开学C++:string类

引言:现在我们将正式踏入C起飞阶段,C语言自带的各种类能极大地简化我们所编写的代码的量,而我们今天要学的string就是其中之一。 更多有关C的知识点详解可前往个人主页:计信猫​​​​​ 一,认识string string其实很简…

zoom 会议 javascript 转录例子

一、启动server-to-server zoom api服务,用于创建会议,参考:如何使用Zoom API创建一个会议?-CSDN博客 二、启动meetingsdk-auth-endpoint服务,用于加入会议,参考:zoom 会议机器人web例子-CSDN博…

前端问答:如何在HTML中插入度数符号?

在前端开发中,你可能经常需要在网页中显示温度、角度或地理坐标,这时就需要用到度数符号()。那么,如何在HTML中正确地插入这个符号呢?今天,我来手把手教你三种简单又实用的方法,让你…

怎么压缩图片大小?7款实用图片压缩免费软件大公开,赶紧收藏试试!

电脑怎么压缩图片大小?您是否也正在寻找一种方法,可以在不损失质量的情况下压缩图片?在我们的日常生活中,图片记录着无数美好瞬间,已经成为我们日常生活中不可或缺的一部分,无论是个人使用还是专业需求。随…

解决TESSY导入测试用例后出现提示接口有改变的问题

Tessy支持测试用例的导入,不懂测试用例怎么导入,可以看这一篇文章: TESSY导入导出测试用例-CSDN博客 当成功的导入测试用例到工程后,在TIE中查看了用例的源码和头文件路径都没有问题后,就可以执行分析: 但是…

分享一个基于Python的广东热门旅游数据可视化分析系统flask毕设(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

ESP Friends 技术沙龙报名开启|带您掌握高效 GUI 开发

乐鑫 ESP32 系列 SoC 凭借其功能多样、高性价比、封装友好、资源丰富等优势,已成为全球开发者在需要屏幕显示的泛 IoT 应用里作为项目开发的首选平台。 乐鑫信息科技 (688018.SH) 即将举办 ESP Friends 线下技术沙龙。我们将带您深入探索 ESP32-C2 在小尺寸 LCD (0…

【源码】IMX6uLL与QT的串口通信

文章目录 [TOC](文章目录) 前言1、QT编写串口2、编译3、加载触摸屏驱动4、硬件接线5、运行可执行程序6、结果 前言 仓库:https://gitee.com/wangyoujie11/im6u-ll-qt-seriral 1、QT编写串口 2、编译 编译将生成的可执行文件:QtSerial放在板子上【这里…

计算机辅助编码

计算机辅助编码(Computer Assisted Coding, CAC) 背景 在医疗行业中 Coding 是一个细分行业,从业人员在国外有专门的 培训 开始 资格认证。在国内也有医疗编码员考试。主要工作就是根据病人的信息、病案 给出医疗编码(ICD、CPT&…

React学习day03-components插件安装(仅基于火狐浏览器)、受控表单绑定、在React中获取dom、组件通信(组件间的数据传递)

7、components插件安装(仅基于火狐浏览器) (1)点击“打开应用程序菜单” (2)点击“扩展和主题” (3)在“扩展”的“寻找更多组件”搜索“Components”,找到“React Deve…

Leetcode 46. 全排列 排列型回溯 C++实现

Leetcode 46. 全排列 问题:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以按任意顺序返回答案。 算法: 创建二维返回数组 ans ,和临时数组 path ,on_path 。 进入 dfs 函数,当 in …

xshell 终端选中文本后自动执行ctrl+c

1. 退出钉钉后,解决问题, xshell终端可以正常使用了。 2. 修改钉钉设置来解决问题: 设置-> 通用-> AI助理 , 取消指定选项。

89.游戏安全项目-htdSdk安装

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:88.游戏改造-UI修正保存到可执行文件 文件名为:黑兔sdk.zip 链接&#xff1…

Linux下UDP编程

一.概念介绍 1.socket 是什么? socket(套接字)本质上是一个抽象的概念,它是一组用于网络通信的 API,提供了一种统一的接口,使得应用程序可以通过网络进行通信。在不同的操作系统中,socket 的实…