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 小时前
Logs 可观测性 | Grafana Loki 架构窥探与实践
运维·云原生·容器
塑遂3 小时前
Kubernetes高级调度01
容器·kubernetes
MarkGosling3 小时前
【开源项目】轻量加速利器 HubProxy自建 Docker、GitHub 下载加速服务
docker·容器·github
MarkGosling3 小时前
【开源项目】轻量加速利器 HubProxy 自建 Docker、GitHub 下载加速服务
运维·git·docker·容器·开源·github·个人开发
chanalbert3 小时前
Docker网络技术深度研究与实战手册
docker·容器·自动化运维
东风微鸣4 小时前
AI 赋能的故障排除:技术趋势与实践
docker·云原生·kubernetes·可观察性
KubeSphere 云原生4 小时前
云原生周刊:2025年的服务网格
云原生
Etual4 小时前
云原生联调利器:Telepresence实战
云原生
陌上阳光17 小时前
docker搭建ray集群
docker·容器·ray
这就是佬们吗17 小时前
初识 docker [上]
java·开发语言·笔记·docker·容器