K8s: 持久化存储之卷, NFS卷

卷 Volume


1 ) 概述

  • 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题
    • 首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失——因为容器会以干净的状态重建
    • 其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件
  • K8s 抽象出 Volume 对象来解决这两个问题
  • Docker 也有 Volume 的概念,但对它只有少量且松散的管理
  • 在 Docker 中,Volume 是磁盘上或者另外一个容器内的一个目录
  • 直到最近,Docker 才支持对基于本地磁盘的 Volume 的生存期进行管理
  • 虽然 Docker 现在也能提供 Volume 驱动程序,但是目前功能还非常有限
    • 每个容器只允许有一个 Volume 驱动程序,并且无法将参数传递给卷
  • 另一方面,K8s 卷具有明确的生命周期——与包裹它的 Pod 相同
  • 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留
  • 当然,当一个 Pod 不再存在时,卷也将不再存在, 也许更重要的是
  • K8s 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷
  • 卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录
  • 特定的卷类型可以决定这个目录如何形成的
  • 并能决定它支持何种介质,以及目录中存放什么内容
  • 使 用 卷 时 , Pod 声 明 中 需 要 提 供 卷 的 类 型 (.spec.volumes 字 段 )
  • 和 卷 挂 载 的 位 置(.spec.containers.volumeMounts 字段)
  • K8s 提供了众多的volume类型,包括emptyDir、hostPath、nfs、glusterfs、cephfs、ceph,

2 ) 关于 emptyDir

  • 当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷
  • 并且只要 Pod 在该节点上运行,卷就一直存在
  • 就像它的名称表示的那样,卷最初是空的
  • 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同
  • 但是这些容器都可以读写 emptyDir 卷中相同的文件
  • 当 Pod 因为某些原因被从节点上删除时
  • emptyDir 卷中的数据也会永久删除
  • 说明
    • 容器崩溃并不会导致 Pod 被从节点上移除
    • 因此容器崩溃时 emptyDir 卷中的数据是安全的
  • emptyDir 的一些用途
    • 缓存空间,例如基于磁盘的归并排序
    • 为耗时较长的计算任务提供检查点
    • 以便任务能方便地从崩溃前状态恢复执行
    • 在 Web 服务器容器服务数据时,保存内容管理器类型容器获取的文件

3 )关于 hostPath

  • hostPath卷能将主机节点文件系统上的文件或目录挂载到Pod中

  • 虽然这不是大多数Pod需要的

  • 但是它为一些应用程序提供了强大的持久化能力

  • 现在写一个应用 $ vi vol-hostpath.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: hostpath-pod
    spec:
      containers:
      - name: test-container
        image: nginx
        volumeMounts:
        - mountPath: /test-nginx
          name: myhostpath
      volumes:
      - name: myhostpath
        hostPath:
          path: /tmp/nginx
          type: DirectoryOrCreate # 不存在目录则创建
    
  • $ kubectl apply -f vol-hostpath.yaml

    pod/hostpath-pod created
    
  • $ kubectl get pod

    NAME           READY   STATUS    RESTARTS   AGE
    hostpath-pod   1/1     Running   0          18m
    
  • $ kubectl exec -it hostpath-pod -- sh 进入 pod

  • $ ls | grep test

    test-nginx
    
  • $ cd test-nginx

  • $ touch a.txt

  • $ echo 1 > a.txt

  • 这时候在pod内 /test-nginx/a.txt 中写入了 1

  • 现在,退出 pod, $ exit

  • 查看pod被部署到了哪台node节点上,$ kubectl describe pod hostpath-pod | grep Node

    Node:         node1.k8s/10.211.55.11
    Node-Selectors:              <none>
    
  • 好,定位到这个node机器上,执行 $ cat /tmp/nginx/a.txt

    1
    
  • 可以看到,数据是同步的了,当然 hostPath 仍然是有局限的

    • 也就是和work node绑定了,如果应用服务多了,就麻烦了
    • 在一台work node存在,但是在另一台却不存在

NFS 卷


1 )概述

  • Network File System 简称 NFS
  • 很多应用需要在集群内部有一个统一的地方在存储文件,比如图片,日志等等
  • 而使用 hostPath 方式并不灵活,因为你需要指定 host 的地址
  • 如果在node1上上传的,在node2上就找不到了,所以,hostPath不适合一般传统业务场景
  • 我们需要,文件存储后,让所有应该都能访问到,而且要兼顾管理的便捷性
  • NFS 是一个成熟的技术,NFS 在大规模使用下会有性能问题
  • 如果文件量存储较大,建议还是用对象存储
  • 如果上传文件不多,也不大,可以推荐使用NFS
  • 可见,NFS解决了hostPath的问题
  • 一般,在 master 节点上装nfs服务专门管理文件存储
  • 在node1或node2上挂nfs服务器,写文件时,会写入 master 节点上

2 ) 安装 nfs 服务

  • 在 Master 和 所有Worker Node 安装 nfs 服务

    • $ yum install -y nfs-utils rpcbind centos 8 可以用 yum, centos 9已经使用dnf来
    • $ sudo dnf install nfs-utils rpcbind centos 9 安装
    • 注意,在centos9 上使用 yum 安装可能会出问题
    • 下面就使用 dnf 和 centos 9 作为安装的环境
  • 在 Master 节点配置 $ vi /etc/exports 修改配置

    /nfsdata *(rw,sync,no_root_squash)
    
  • 在 Master 节点 $ sudo exportfs -ra 修改了/etc/exports,需要重新激活配置

    sudo exportfs -ra
    
  • 在 Master 节点启动 NFS 服务和 rpcbind,并设置它们在系统启动时自动运行

    sudo systemctl start rpcbind
    sudo systemctl start nfs-server
    sudo systemctl enable rpcbind
    sudo systemctl enable nfs-server
    
  • 在 Master节点检查 NFS 服务和 rpcbind 是否运行正常

    sudo systemctl status rpcbind
    sudo systemctl status nfs-server
    
    • 检查Active的状态为: active
  • 在 Master 节点查看挂载效果 $ showmount -e master

    Export list for master:
    /nfsdata *
    
    • 目前这样即为挂载/nfsdata成功

3 ) 在 node 节点 运行服务

  • $ vi nfs-demo1.yaml 编写yaml文件进行测试
    apiVersion: v1
    kind: Pod
    metadata:
      name: nfs-pd
    spec:
      containers:
      - name: test-container
        image: nginx
        volumeMounts: # 上面的容器内挂载目录为
        - mountPath: /usr/share/nginx/html
          name: test-volume
      volumes: # 物理机
      - name: test-volume
        nfs:
          server: master.k8s # 这里配置的是 master 节点的 hostname
          path: /nfsdata
    
  • $ kubectl get po -w 监控 nfs pod 的状态
    NAME           READY   STATUS    RESTARTS       AGE
    nfs-pd         1/1     Running   0              36s
    
  • $ kubectl exec -it nfs-pd -- sh 进入pod
  • $ mount 执行 mount 看容器起来后,挂载哪些卷,这里是全部的
    overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/TGJN2AK5DUCHXGQSXLTICMH6CV:/var/lib/docker/overlay2/l/4EYRGAW5MFRGLIJKCOJFKWNRDT:/var/lib/docker/overlay2/l/Y5QO2NJ6REXYEVRYLCHKIWZOLG:/var/lib/docker/overlay2/l/T5HUWMG4LKHET6APDBVJ25QIPE:/var/lib/docker/overlay2/l/PCJEGNJOYLSPYYP5TJBFNNAPF6:/var/lib/docker/overlay2/l/4EUOTLMHJJFA2AXOALXRHNAIOA:/var/lib/docker/overlay2/l/7WCTJFFWY4TZNAN3GM4JWTIBSV:/var/lib/docker/overlay2/l/UI7F22MIRB2NZSHHGF6U6IJU2U,upperdir=/var/lib/docker/overlay2/f3010a94dda626c9b3f8249c61f03b3e6caf6557b1193d7f9979308f7bf8d4e5/diff,workdir=/var/lib/docker/overlay2/f3010a94dda626c9b3f8249c61f03b3e6caf6557b1193d7f9979308f7bf8d4e5/work)
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
    devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
    sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
    cgroup on /sys/fs/cgroup type cgroup2 (ro,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
    mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
    shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k,inode64)
    /dev/mapper/cs-root on /dev/termination-log type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
    /dev/mapper/cs-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
    /dev/mapper/cs-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
    /dev/mapper/cs-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
    master.k8s:/nfsdata on /usr/share/nginx/html type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.211.55.12,local_lock=none,addr=10.211.55.13)
    tmpfs on /run/secrets/kubernetes.io/serviceaccount type tmpfs (ro,relatime,size=1704516k,inode64)
    proc on /proc/asound type proc (ro,nosuid,nodev,noexec,relatime)
    proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
    proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime)
    proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
    proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
    proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
    tmpfs on /proc/acpi type tmpfs (ro,relatime,inode64)
    tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
    tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
    tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755,inode64)
    tmpfs on /proc/scsi type tmpfs (ro,relatime,inode64)
    tmpfs on /sys/firmware type tmpfs (ro,relatime,inode64)
    
  • $ mount | grep nfs 查看 nfs 挂载效果
    master.k8s:/nfsdata on /usr/share/nginx/html type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.211.55.12,local_lock=none,addr=10.211.55.13)
    
  • 在 node 节点上创建文件并写入数据
    • $ cd /usr/share/nginx/html
    • $ touch x.txt
    • $ echo nfs > x.txt
    • $ cat x.txt
      nfs
      

4 )回到 master 节点上检查

  • 现在回到 master.k8s 这个 master 节点上查看

    • $ cat /nfsdata/x.txt
      nfs
      
  • 现在,可以看到,nfs 服务正常工作了

5 ) 总结

  • 文件共享,静态资源共享, 图片上传,…
  • 一切需要统一存储的地方,都适合 nfs

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

einsum 表达式

Einsun 简介 ein 就是爱因斯坦的ein&#xff0c;sum就是求和。einsum就是爱因斯坦求和约定&#xff0c;其实作用就是把求和符号省略。 B torch.einsum("ij->i", A) einsum接收的第一个参数为einsum表达式&#xff0c;-> 符号就相当于要把->前面的张量变…

求三个字符数组最大者(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <string.h>int main() {//初始化变量值&#xff1b;int i 0;char str[3][20];char string[20];//循环输入3个字符…

软件测试笔记_习题_面经

软件测试------按测试阶段划分有几个阶段? 单元测试、集成测试、系统测试、验收测试 软件测试------按是否查看源代码划分有几种测试方法? 黑盒、白盒、灰盒 软件测试------按是否运行划分有几种测试方法? 静态测试、动态测试 软件测试------按是否自动化划分有几种测试方…

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time 问题描述解决办法方式一方式二 小结 问题描述 在Android应用开发过程中&#xff0c;经常需要自定义控件&#xff0c;并且定义控件的属性&#xff0c;方便灵活的修改控件的显示样式&#xff0c;提…

生成对抗网络的无载体信息隐藏算法简介

一、研究背景 随着互联网技术的广泛应用和移动智能设备的快速普及&#xff0c;人们有了更多的途径传播和获取信息。每天海量的数据以视频、音频、图像、文字等各类形式在互联网中产生&#xff0c;这为人们的生活带来了极大的便利&#xff0c;但同时也引起了人们对信息泄露的担…

从零入门区块链和比特币(第三期)

欢迎来到我的区块链与比特币入门指南&#xff01;如果你对区块链和比特币感兴趣&#xff0c;但不知道从何开始&#xff0c;那么你来对地方了。本博客将为你提供一个简明扼要的介绍&#xff0c;帮助你了解这个领域的基础知识&#xff0c;并引导你进一步探索这个激动人心的领域。…

【yolov8算法道路-墙面裂缝检测-汽车车身凹陷-抓痕-损伤检测】

yolo算法道路-墙面裂缝检测-汽车车身凹陷-抓痕-损伤检测 1. yolo算法裂缝检测-汽车车身凹陷-抓痕检测-汽车车身损伤检测2. yolo房屋墙面路面裂缝-发霉-油漆脱落-渗水-墙皮脱落检测3. 水泥墙面裂缝检测 YOLOv8算法是一种先进的目标检测技术&#xff0c;它基于YOLO系列算法的改进…

卓越体验的秘密武器:评测ToDesk云电脑、青椒云、天翼云的稳定性和流畅度

大家好&#xff0c;我是猫头虎。近两年随着大模型的火爆&#xff0c;我们本地环境常常难以满足运行这些大模型的硬件需求。因此&#xff0c;云电脑平台成为了一个理想的解决方案。今天&#xff0c;我将介绍并评测几款主流云电脑产品&#xff1a;ToDesk云电脑、天翼云电脑和青椒…

基于 SpringCloud 的在线交易平台乐优商城的设计与实现(四)

第 4 章 数据库设计 4.1 数据库设计原则 4.2.数据库概念结构设计 4.3 数据库表设计 4.4.本章小结 前面内容请移步 基于 SpringCloud 的在线交易平台乐优商城的设计与实现&#xff08;三&#xff09; 相关免费源码资源 乐优商城 第 4 章 数据库设计 4.1 数据库设计原…

现代永磁同步电机控制原理pdf及全套matlab仿真模型

现代永磁同步电机控制原理pdf及matlab仿真模型。全书包含SVPWM, DTC, Lun, smo, EKF, HFI等经典控制算法。将书中10章节涉及到的模型复原搭建模型。 模型获取链接&#xff1a;现代永磁同步电机控制原理pdf及全套matlab仿真模型

C语言 | Leetcode C语言题解之第56题合并区间

题目&#xff1a; 题解&#xff1a; /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ stru…

mintab计数型测量系统分析

计数型测量系统是一种在特定领域内广泛应用的测量工具&#xff0c;它主要用于对事件发生的次数进行计数&#xff0c;而不是提供具体的数值数据。这种类型的测量系统在工业生产、科研领域以及通信、电子和航空航天等多个领域都有广泛的应用价值。计数型测量系统的分析方法包括重…

matlab回归学习

前言 所谓回归学习即预测&#xff0c;便是由已知的数据推测未知的数据&#xff0c;利用转速与转矩来推测电流。 1、数据准备 下面虚拟一组转速转矩以及电流数据。 speed [100 220 330 440 550 660]; torque [200 300 400 500 700 900]; I [400 500 603 739 821 912]; arr …

职场进阶秘籍:张驰咨询的六西格玛黑带培训!

你们是否对“六西格玛黑带培训”感到好奇&#xff1f;别担心&#xff0c;这不是什么遥不可及的概念&#xff0c;而是一次能让你职场生涯焕然一新的机会&#xff01; 六西格玛黑带培训在张驰咨询 在张驰咨询&#xff0c;我们提供的六西格玛黑带培训&#xff0c;就像是一把为你量…

mysql-sql-练习题-2

日期topN 日期最值 topN 任意区间topN 每年温度top2建表排名函数万能公式&#xff08;条关&#xff09; 任意区间 各科第1,3,5名排名函数万能公式 日期 本周过生日 -- 本周表示 加减日期 格式化 拼接 select * from student where date_format(s_age,concat(year(curdate()),…

微信小程序开发:2.小程序组件

常用的视图容器类组件 View 普通的视图区域类似于div常用来进行布局效果 scroll-view 可以滚动的视图&#xff0c;常用来进行滚动列表区域 swiper and swiper-item 轮播图的容器组件和轮播图的item项目组件 View组件的基本使用 案例1 <view class"container"&…

【FPGA】优化设计指南(一):设计原则

目录 避免采用不可综合的语句设计时采用同步的时钟组合逻辑与毛刺异步复位与同步复位动态分析与静态分析功能流水线时序违例乒乓操作面积和速度的平衡避免采用不可综合的语句 1.#1000延时语句 2.除法运算/,除非除数为2的整次幂 3.实数类型不可综合(real) 4.综上,使用可综合…

远程连接docker,实现本地发布版本到服务器

最近在学jenkins的时候&#xff0c;发现涉及到了docker的远程发布调用。后续应该还要自己搭建一个docker的本地仓库。 简单描述一下具体是如何实现的&#xff1a; 1、将docker的服务器开启2375端口&#xff08;注意&#xff0c;这里的开启是将端口直接暴露出去&#xff0c;不用…

【python技术】akshare爬取A股最新业绩预告保存进excel的简单示例

最近A股上市公司陆续在出年报和一季度报了&#xff0c; 心里寻思着要不用python把这些数据爬取下来分析下&#xff0c;说干就干。 数据来源网站东方财富&#xff1a;https://data.eastmoney.com/bbsj/ 我这个人比较懒&#xff0c;直接用akshare封装的方法来搞定 之前用aksha…

uniapp 对接谷歌第三方登录

1.登录谷歌开发者后台 https://console.developers.google.com/ 2.添加凭证 3.拿到客户端id后&#xff0c;项目中配置google登录&#xff1a; 示例代码&#xff1a; async googleLogin(){const { provider } await uni.getProvider({ service:oauth })if(provider.includes…
最新文章