首页 > 其他分享 >k8s卷管理-1

k8s卷管理-1

时间:2024-01-10 16:13:14浏览次数:28  
标签:管理 master volumes node1 pod k8s root

目录

卷管理-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下一篇继续写

标签:管理,master,volumes,node1,pod,k8s,root
From: https://www.cnblogs.com/fsdstudy/p/17956304

相关文章

  • K8S集群搭建
    K8S各节点环境准备1虚拟机操作系统环境准备参考链接:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/2关闭swap分区2.1临时关闭swapoff-a&&sysctl-wvm.swappiness=02.2基于配置文件关闭sed-ri'/^[^#]*swap/......
  • 管理员cmd ipconfig/flushdns 解决 git push
    这个问题可能是由于你在PowerShell中执行了`ipconfig/flushdns`命令,而不是在命令提示符(CMD)中执行。你可以尝试以下步骤来解决这个问题:1.**使用命令提示符(CMD)**²:右键点击系统桌面左下角的【开始】,在开始的右键菜单中点击【命令提示符(管理员)】或者点击开始菜单后输入cmd,右键选......
  • k8s集群证书过期怎么办
    记录一次集群更新证书过程,因为集群证书已经更新了,以下只记录操作过程了。参考:https://blog.csdn.net/Harry_z666/article/details/1280151751、集群情况版本:v1.23.6部署方式:kubeadm部署由于使用kubeadm部署,证书有效期为一年,到期后证书失效。2、master更新集群证书#1、ma......
  • RHCSA之网络管理
    网络管理网络基础概念ip地址:类似于个人地址;在it的世界中,计算机和计算机之间通过ip地址进行访问。P地址通常由两部分组成:网络地址和广播地址。网络地址用来标识计算机所属的网络,广播地址用来标识计算机在网段中的位置。IP地址可以分为公有地址和私有地址,公有地址是由因特网直接负......
  • Salesforce管理员必看!带你全方位了解 ⌈字段⌋
    Salesforce字段虽然很简单,但对于Salesforce配置来说至关重要。每个字段都包含单独的数据片段,允许跟踪和报告与标准或自定义对象相关的信息。标准字段vs自定义字段标准字段是Salesforce开箱即用的字段。标准对象(如Account、Opportunity或Product)中的标准字段可供所有Salesforc......
  • K8S系列一:概念入门
    K8S系列一:概念入门写在前面本文组织方式:K8S的架构、作用和目的。需要首先对K8S整体有所了解。K8S是什么?为什么是K8S?K8S怎么做?K8S的重要概念,即K8S的API对象。要学习和使用K8S必须知道和掌握的几个对象。Pod实例Volume数据卷Container容器Deployment和ReplicaS......
  • 10分钟看懂Docker和K8S
    10分钟看懂Docker和K8S2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。  <imgsrc="https://pic4.zhimg.com/v2-e6390d9358b05d82105fe391762346b3_b.jpg"data-caption=""data-size="normal"data-rawwidth="420"data-rawheight=&......
  • k8s主要概念大梳理!
    k8s已经成为了绝对热门的技术,一个上点规模的公司,如果不搞k8s,都不好意思出去见人。安装k8s要突破种种网络阻碍,但更大的阻碍还在后面...我发现,很多k8s的文章,根本不说人话,包括那要命的官网。要弄明白k8s的细节,需要知道k8s是个什么东西。它的主要功能,就是容器的调度--也就是把部署......
  • es for k8s
    deploy.yaml基于nfsapiVersion:v1kind:PersistentVolumemetadata:name:es-pv-datanamespace:testspec:capacity:storage:1GiaccessModes:-ReadWriteManypersistentVolumeReclaimPolicy:RetainstorageClassName:es-data-nfsnfs:......
  • nacos for k8s
    nacos-deploy.yaml基于nfs---apiVersion:v1kind:Servicemetadata:name:nacos-headlessnamespace:testlabels:app:nacos-headlessspec:type:ClusterIPports:-port:8848name:servertargetPort:8848-port:9848......