环境:
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卷中的数据也会被永久删除。
volumeMounts:
- moutPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
emptyDir验证:
写一个yaml文件:vim empty.yaml
[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:
[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上查看:
[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上是否生成我们创建的。
[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文件:
[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上的数据也就一并删除消失:
[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
[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/下查看是否有我们创建的文件夹和文件。
[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适合存储永久存储的数据,不丢失。
除此之外,还可以将容器中的多个目录挂载到本机的一个目录挂载点下。
[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上查看。还没有任何数据。
[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文件。
[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的数据。
emptyDir:
sizeLimit: 500Mi #限额,在本机默认的路径下,限制500M的数据
NFS存储
实操:
nfs存储需要下载nfs。主master上
#安装nfs-kerner-server
[root@Node-1 data]#:apt install -y nfs-kernel-server
添加挂载点:vim /etc/exports,在最后添加一行。重启nfs-kernel-server
#挂载点,添加一行。
[root@Node-1 data]#:vim /etc/exports
/data/disk *(rw,sync,no_root_squash)
#重新生成一下
[root@Node-1 data]#:exportfs -arv
#重启
[root@Node-1 data]#:systemctl restart nfs-kernel-server
[root@Node-1 data]#:mkdir /data/disk
yaml文件:
[root@Node-1 data]#:cat nfs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep
labels:
app: nginx-dep
spec:
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: harbor.hiuiu.com/nginx/nginx:1.21.5
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-volume
volumes:
- name: nginx-volume
nfs:
server: 192.168.114.110
path: /data/disk
readOnly: false
---
apiVersion: v1
kind: Service
metadata:
name: my-nodeport
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 90
targetPort: 80
nodePort: 30008
解释:
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-volume #容器内的路径,指定一个名字,这与volumes的名字相同
volumes:
- name: nginx-volume #这里与volumeMounts中的name匹配。
nfs: #nfs存储
server: 192.168.114.110 #存储的主机
path: /data/disk #宿主机的路径
readOnly: false #只读形式
运行查看pod:
[root@Node-1 data]#:kubectl apply -f nfs.yaml
deployment.apps/nginx-dep created
service/my-nodeport created
[root@Node-1 data]#:kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-dep-6fcb8c557f-g5mmd 1/1 Running 0 3s
nginx-dep-6fcb8c557f-pl7kd 1/1 Running 0 3s
nginx-dep-6fcb8c557f-rgkc9 1/1 Running 0 3s
nginx-dep-6fcb8c557f-w52sw 1/1 Running 0 3s
nginx-dep-6fcb8c557f-wwwhp 1/1 Running 0 3s
nginxtest 1/1 Running 3 (119m ago) 9h
进入容器:写一个主页。在宿主机中看是否存在我们在宿主机中创建的文件。
[root@Node-1 data]#:kubectl exec -it nginx-dep-6fcb8c557f-w52sw bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-dep-6fcb8c557f-w52sw:/# echo "nginx-nginx" > /usr/share/nginx/html/index.html
root@nginx-dep-6fcb8c557f-w52sw:/# exit
exit
[root@Node-1 data]#:
[root@Node-1 data]#:cd /data/disk/
[root@Node-1 disk]#:ls
index.html
[root@Node-1 disk]#:cat index.html
nginx-nginx
#访问本机主的地址:端口号
[root@Node-1 disk]#:curl 192.168.114.110:30008
nginx-nginx
---end---