环境:
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---