卷管理-1

我们之前创建的Pod是没有做存储的,那么这个Pod产生的数据文件都是会随着Pod的删除而删除,不能做到数据持久存储,现在开始看卷管理,通过定义volume,然后pod去挂载pod就可以实现数据存储,共享

k8s的卷从总体上来说,分为3类

  1. 本地存储
  2. 网络存储
  3. 持久化存储

1. 本地存储

1.1 emptyDir

对于emptyDir来说,他会在Pod所在的物理机上创建一个随机目录,Pod里的容器会挂载到这个目录,但是当容器删除之后,这个随机目录也会随着删除,数据不会持久化存储到本地,适用于多个容器之间共享数据。

我们来看看如何去定义以及使用emptyDir

apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: volume1
name: volume1
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: volume1
resources: {}
# 加上这一段
volumeMounts:
# 这里的name是已经定义好的名字
- name: volume1
# 这个是挂载到容器内的哪个目录
mountPath: /volumes # 这里是定义卷
volumes:
- name: volume1
emptyDir: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

通过这个yaml文件来创建pod

[root@master k8s]# kubectl apply -f volume.yaml
pod/volume1 created
[root@master k8s]# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
volume1 1/1 Running 0 6s 10.244.166.176 node1 <none> <none>

查看到这个pod是被调度到了node1上,那么我们进入到容器内去创建一个文件,看看在node1上是否会存在

[root@master k8s]# kubectl exec -it volume1 -- /bin/bash
root@volume1:/volumes# echo volume_file > volume_file
root@volume1:/volumes# ls
volume_file
# 现在我们来到node1节点使用find去查找文件volume_file
[root@node1 ~]# find / -name volume_file
/var/lib/kubelet/pods/e7db8b1c-2df5-4b62-b33e-ef1c1e45b60c/volumes/kubernetes.io~empty-dir/volume1/volume_file
# 是可以找得到这个文件的,那么我们来看看这个文件的内容,是否与之前的一致
[root@node1 ~]# cat /var/lib/kubelet/pods/e7db8b1c-2df5-4b62-b33e-ef1c1e45b60c/volumes/kubernetes.io~empty-dir/volume1/volume_file
volume_file

通过这个实验我们发现他确实是将文件存储在了本地,但是emptyDir是会随着pod的删除而去删除物理机上的目录的,我们来到master删除pod

[root@master k8s]# kubectl delete -f volume.yaml
pod "volume1" deleted
# 再次回到node1查找文件
[root@node1 ~]# find / -name volume_file

再次去node1上查找文件的时候他是已经找不到了,说明pod删除这个目录也删除,所以说这个类型并不适合持久化存储文件。而且在物理机上产生的目录也是随机的,那我们能不能让他不随机产生呢,我们去手动给他指定呢?可以的,继续看

1.2 hostPath

hostPath他是可以让你手动指定存储在物理机的哪个目录上的,并且这个目录并不会随着pod的删除而删除。我们通过实验来看看

apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: volume2
name: volume2
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: volume2
resources: {}
volumeMounts:
- name: hostpath
mountPath: /volumes
# 定义卷,
volumes:
- name: hostpath
hostPath:
path: /hostpath
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

通过这个文件来创建pod

[root@master k8s]# kubectl apply -f hostpath.yaml
pod/volume2 created
[root@master k8s]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
volume2 1/1 Running 0 3s 10.244.166.177 node1 <none> <none>

我们进入容器来创建文件,然后删除pod,看看node1上的/hostpath是否还存在

[root@master k8s]# kubectl exec -it pods/volume2 -- /bin/bash
root@volume2:/volumes# echo hostpath > hostpath
root@volume2:/volumes# ls
hostpath
root@volume2:/volumes#
# 退出容器并删除pod
root@volume2:/volumes# exit
exit
[root@master k8s]# kubectl delete -f hostpath.yaml
pod "volume2" deleted
# 我们来到node1查看
[root@node1 /]# cd hostpath/
[root@node1 hostpath]# ls
hostpath

现在我们可以发现,pod删除之后他的目录并没有删除,那这样岂不是可以做到持久化存储吗?不可以的

因为是这样,他目前只是在node1上创建了这个目录并保存了文件,如果你用deployment控制器,然后给他一个Drain,他开始驱逐pod了,然后pod被调度到node2上了,那么他还能读取到我之前产生的数据文件吗?显然是不可以的

网络存储

网络存储支持非常多的类型,比如NFS,Ceph以及iScsi等等,当然,k8s的更新非常的快,非常的频繁,可能现在能用这些网络存储,但是等到过几个版本他就用不了了也是很正常的

我们就使用master节点来充当nfs服务器吧

搭建NFS服务器

这个相信有Linux的基础的是肯定会搞的

# 1. 安装nfs工具,所有节点都需要做,没有nfs-utils是挂载不上的
[root@master k8s]# yum install nfs* -y
# 2. 创建共享目录,master做就可以了
[root@master k8s]# mkdir /nfs
# 3. 将共享目录导出,master做
[root@master k8s]# echo "/nfs *(rw,no_root_squash)" >> /etc/exports
# 4. 重启服务
[root@master k8s]# systemctl restart nfs-server rpcbind

使用NFS网络存储

好了,现在nfs服务器已经搞好了,现在开始给pod挂载nfs,他的定义其实也是很简单的

apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: volume1
name: volume1
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: nfs1
resources: {}
volumeMounts:
- name: nfs1
mountPath: /volumes
volumes:
- name: nfs1
# 将这里的hostPath改成nfs就可以了
nfs:
server: master
path: /nfs
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

我们来创建pod然后进入容器创建文件

[root@master k8s]# kubectl apply -f nfs.yaml
[root@master k8s]# kubectl exec -it pods/volume1 -- /bin/bash
root@volume1:/volumes# echo "this is a nfsfile" > nfsfile
root@volume1:/volumes# ls
nfsfile

我们在master节点的共享目录上查看这个文件

[root@master k8s]# cat /nfs/nfsfile
this is a nfsfile

是没有任何问题的,那么我们现在再创建一个pod也让他挂载这个nfs,看看这个pod能不能读取到这个文件

yaml文件还是用刚刚那个,你只需要将他的pod名字改一下就可以了

[root@master k8s]# kubectl apply -f nfs.yaml
pod/volume2 created
[root@master k8s]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
volume1 1/1 Running 0 15m 10.244.166.179 node1 <none> <none>
volume2 1/1 Running 0 15s 10.244.104.14 node2 <none> <none>

现在node1和node2上各被调度了一个pod,那我们进入volume2看看文件是否存在

[root@master k8s]# kubectl exec -it volume2 -- /bin/bash
root@volume2:/# cd /volumes/
root@volume2:/volumes# ls
nfsfile
root@volume2:/volumes# cat nfsfile
this is a nfsfile

我们可以发现,是可以看到文件的,没有任何的问题,那么现在pod之间的数据就可以做到共享,以及持久存储了,这个是NFS,我们再来看一个iSCSI网络存储

搭建iSCSI服务器

我们还是在master上搭建这个服务,首先我们先给master加上一块硬盘,大小随意,然后我们安装iSCSI服务程序

# 1. 查看刚刚添加的磁盘
[root@master ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
nvme0n1 259:0 0 50G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 49G 0 part
├─cs-root 253:0 0 45.1G 0 lvm /
└─cs-swap 253:1 0 3.9G 0 lvm
# sda就是刚刚添加的
# 2. 安装iSCSI
[root@master ~]# yum install targetcli -y
# 3. 配置iSCSI
# 3.1 创建块设备
/> cd /backstores/block
/backstores/block> create block01 /dev/sda
Created block storage object block01 using /dev/sda.
# 3.2 创建iqn
/backstores/block> cd /iscsi
/iscsi> create iqn.2024-01.com.fsdstudy:k8s
Created target iqn.2024-01.com.fsdstudy:k8s.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
# 3.3 创建lun
/iscsi> cd /iscsi/iqn.2024-01.com.fsdstudy:k8s/tpg1/luns
/iscsi/iqn.20...k8s/tpg1/luns> create /backstores/block/block01
Created LUN 0.
# 3.4 创建acl,只有是这个iqn名字的才能连接成功,相当于口令一样
/iscsi/iqn.20...k8s/tpg1/luns> cd /iscsi/iqn.2024-01.com.fsdstudy:k8s/tpg1/acls
/iscsi/iqn.20...k8s/tpg1/acls> create iqn.2024-01.com.fsdstudy:pod
Created Node ACL for iqn.2024-01.com.fsdstudy:pod
Created mapped LUN 0.
# 3.5 退出即可
/iscsi/iqn.20...k8s/tpg1/acls> exit
# 3.6 node节点安装客户端
[root@node1 ~]# yum install -y iscsi*
[root@node2 ~]# yum install -y iscsi*
# 3.7 将node节点的iqn号修改成之前在master上定义的acl,所有的node节点都要做
[root@node1 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2024-01.com.fsdstudy:pod

我们现在的iSCSI服务器就已经搭建好了,直接开始使用

使用iSCSI网络存储

apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: volume3
name: iscsi
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: iscsi
resources: {}
volumeMounts:
- name: iscsi
mountPath: /volumes
volumes:
- name: iscsi
iscsi:
# 这里写要链接的iqn号,并不是写acl
iqn: iqn.2024-01.com.fsdstudy:k8s
lun: 0
targetPortal: 192.168.200.200:3260
# 连接好之后把设备格式化成什么文件系统
fsType: xfs
readOnly: false
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

使用yaml文件创建pod

[root@master k8s]# kubectl apply -f iscsi.yaml
# 容器创建过程会相对来说慢一点,稍等片刻
[root@master k8s]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
iscsi 1/1 Running 0 20s 10.244.104.15 node2 <none> <none>
volume1 1/1 Running 0 88m 10.244.166.179 node1 <none> <none>
volume2 1/1 Running 0 73m 10.244.104.14 node2 <none> <none>

后续的操作也就是进入容器查看,但是这个iSCSI是做不到数据互通的,他只能做到将你的数据保存下来

还有pv和pvc下一篇继续写

k8s卷管理-1的更多相关文章

  1. CentOS 6.3下配置LVM(逻辑卷管理)

    一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵 ...

  2. 学习OpenStack之 (4): Linux 磁盘、分区、挂载、逻辑卷管理 (Logical Volume Manager)

    0. 背景: inux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间.普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻 ...

  3. linux学习之lvm-逻辑卷管理器

    一.简介 lvm即逻辑卷管理器(logical volume manager),它是linux环境下对磁盘分区进行管理的一种机制.lvm是建立在硬盘和分区之上的一个逻辑层,来提高分区管理的灵活性.它是 ...

  4. Linux 添加新硬盘 LVM操作(作用:新增硬盘的卷管理)

    1 查看当前系统硬盘及分区情况 (注:linux中SCSI的第1个硬盘/dev/sda,第2个硬盘/dev/sdb依此类推) 2 初始化分区sdb为物理卷pv pvcreate /dev/sdb  / ...

  5. 关于xfce中桌面没法显示回收站以及thunar中无法进行卷管理的解决办法

    出现这种问题的原因应该不是当前用户没在storage这个组里,因为我试过将用户从storage组里移除并不对影响桌面上回收站的显示. 问题的原因是没有安装gvfs这个软件,装上之后,重新登录当前用户, ...

  6. LVM逻辑卷管理

    一.LVM简介 LVM(Logic Volume Manager)逻辑卷管理,简单理解就是将一块或多块硬盘的分区在逻辑上集合,当一块大硬盘来使用. 其特点是: 1.可以实现在线动态扩展,也可以缩减 2 ...

  7. 逻辑卷管理LVM (Logical Volume Manager)

    什么是LVM? LVM(Logical Volume Manager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的 ...

  8. Linux逻辑卷管理器(LVM)

    LVM基础 通过使用Linux的逻辑卷管理器(Logical Volume Manager, LVM),用户可以在系统运行时动态调整文件系统的大小,把数据从一块硬盘重定位到另一块硬盘,也可以提高I/O ...

  9. linux逻辑卷管理

    近期在进行linux充电,依据网络资料自己整理的资料,分享一下 ---------------------------------------------------------- Linux逻辑卷管 ...

  10. 逻辑卷管理lvm

    逻辑卷管理LVM 一 创建逻辑卷 1准备分区或硬盘 这里使用/dev/sdb./dev/sdc两块硬盘和/dev/sda9./dev/sda10两个分区,大小都为1G,磁盘有限,我也不想这么抠的. 添 ...

随机推荐

  1. Q-REG论文阅读

    Q-REG Jin, S., Barath, D., Pollefeys, M., & Armeni, I. (2023). Q-REG: End-to-End Trainable Point ...

  2. 聊聊JDK19特性之虚拟线程

    1.前言 在读<深入理解JVM虚拟机>这本书前两章的时候整理了JDK从1.0到最新版本发展史,其中记录了JDK这么多年来演进过程中的一些趣闻及引人注目的一些特性,在调研JDK19新增特性的 ...

  3. Insert a scratch project into a ppt (MSPowerPoinT file)在powerpoint中播放Scratch动画

    Insert a scratch project into a ppt (MSPowerPoinT file)在powerpoint中播放Scratch动画 Contributed by liu pe ...

  4. 高可用mongodb集群(分片+副本):性能测试

    目录 ■ 为指定的库和表指定hash分片 ■ 测试模型,即workload模型 ■ 测试指标 ■ workload_s6 ■ 分片集群性能测试数据统计分析 ■ 测试结论 Yahoo! Cloud Se ...

  5. PHP -pop魔术方法

    PHP魔术方法: PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利,在 PHP 中的作用是非常重要的.PHP 中的魔术方法通常以__(两个下划线)开始,可以在要使用时灵活调用. 例题 [ ...

  6. JS深入之内存详解,数据结构,存储方式

    理解了本文,就知道深拷贝和浅拷贝的底层,了解赋值的底层原理. 可以结合另一篇文章一起食用:深拷贝与浅拷贝的区别,实现深拷贝的方法介绍. 以下是正文: 栈数据结构 栈的结构就是后进先出(LIFO),如果 ...

  7. trafilatura 网页解析原理分析

    trafilatura 介绍 Trafilatura是一个Python包和命令行工具,用于收集网络上的文本.其主要应用场景包括网络爬虫下载和网页解析等. 今天我们不讨论爬虫和抓取,主要看他的数据解析是 ...

  8. ruoyi框架里面设置登录超时时间不能生效

    问题 项目使用到了ruoyi框架,给登录超时限制了12小时,但是每次几个小时后就提示过期,要求再登录一次. 首先怀疑是不是redis内存淘汰策略出现了问题. 先使用一下的命令 systemctl st ...

  9. 3.1 IDA Pro编写IDC脚本入门

    IDA Pro内置的IDC脚本语言是一种灵活的.C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析.IDC脚本语言支持变量.表达式.循环.分支.函数等C语言中的常见语法结构,并且还提 ...

  10. .NET8依赖注入新特性Keyed services

    什么是Keyed service Keyed service是指,为一个需要注入的服务定义一个Key Name,并使用使用Key Name检索依赖项注入 (DI) 服务的机制. 使用方法 通过调用 A ...