K8S持久化存储数据volumeMounts&volumes

环境:

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卷中的数据也会被永久删除。

bash 复制代码
  volumeMounts:
  - moutPath: /cache
    name: cache-volume
volumes:
- name: cache-volume
  emptyDir: {}

emptyDir验证:

写一个yaml文件:vim empty.yaml

bash 复制代码
[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:

bash 复制代码
[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上查看:

bash 复制代码
[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上是否生成我们创建的。

bash 复制代码
[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文件:

bash 复制代码
[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上的数据也就一并删除消失:

bash 复制代码
[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

bash 复制代码
[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/下查看是否有我们创建的文件夹和文件。

bash 复制代码
[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适合存储永久存储的数据,不丢失。

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

bash 复制代码
[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上查看。还没有任何数据。

bash 复制代码
[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文件。

bash 复制代码
[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的数据。

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

---end---

相关推荐
€☞扫地僧☜€3 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
全能全知者4 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
为什么这亚子6 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
ZHOU西口7 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
牛角上的男孩8 小时前
Istio Gateway发布服务
云原生·gateway·istio
JuiceFS9 小时前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
景天科技苑10 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge11 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇11 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试13 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana