1、HostPath 持久化存储
1.1 持久卷 HostPath(节点上的文件或目录挂载到Pod上)
- 将节点上的文件或目录挂载到Pod上,此时该目录会变成持久化存储目录,即使Pod被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失。
1.2 配置文件
- volumes 中如何与node节点主机共享目录时,type类型有多种,如下类型:
- 空字符串:默认类型,不做任何检查
- DirectoryOrCreate:如果给定的path不存在,就创建一个755的空目录
- Directory:这个目录必须存在
- FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为644
- File:这个文件必须存在
- Socket:UNIX套接字,必须存在
- CharDevice:字符设备,必须存在
- BlockDevice:块设备,必须存在
yaml
apiVersion: v1
kind: Pod
metadata:
name: test-host-volume-pod
spec:
containers:
- image: nginx:1.20
name: nginx-volume
volumeMounts:
- mountPath: /data # 挂载到容器哪个目录
name: host-volume # 挂载的数据卷的名字
volumes:
- name: host-volume
hostPath: # 与主机共享目录
path: /data # node节点上的目录
type: DirectoryOrCreate #检查类型,在挂数前对挂载目录做什么检查操作,有多种选项,默认为空字符串,不做任何检查
1.3 创建这个pod资源
c
[root@k8s-master volume]# kubectl create -f host-volume.yaml
pod/host-volume-pod created
[root@k8s-master volume]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
configfile-po 0/1 Completed 0 178m 10.2.1.69 k8s-node-02 <none> <none>
dns-test 1/1 Running 2 (12h ago) 2d21h 10.2.1.58 k8s-node-02 <none> <none>
fluentd-59k8k 1/1 Running 1 (12h ago) 2d4h 10.2.2.34 k8s-node-01 <none> <none>
fluentd-hhtls 1/1 Running 1 (12h ago) 2d4h 10.2.1.59 k8s-node-02 <none> <none>
host-volume-pod 0/1 ContainerCreating 0 13s <none> k8s-node-02 <none> <none>
nginx-deploy-6fb8d6548-8khhv 1/1 Running 6 (33m ago) 6h33m 10.2.1.67 k8s-node-02 <none> <none>
nginx-deploy-6fb8d6548-fd9tx 1/1 Running 6 (33m ago) 6h33m 10.2.2.40 k8s-node-01 <none> <none>
[root@k8s-master volume]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
configfile-po 0/1 Completed 0 179m 10.2.1.69 k8s-node-02 <none> <none>
dns-test 1/1 Running 2 (12h ago) 2d21h 10.2.1.58 k8s-node-02 <none> <none>
fluentd-59k8k 1/1 Running 1 (12h ago) 2d4h 10.2.2.34 k8s-node-01 <none> <none>
fluentd-hhtls 1/1 Running 1 (12h ago) 2d4h 10.2.1.59 k8s-node-02 <none> <none>
host-volume-pod 1/1 Running 0 61s 10.2.1.71 k8s-node-02 <none> <none>
nginx-deploy-6fb8d6548-8khhv 1/1 Running 6 (34m ago) 6h34m 10.2.1.67 k8s-node-02 <none> <none>
nginx-deploy-6fb8d6548-fd9tx 1/1 Running 6 (34m ago) 6h34m 10.2.2.40 k8s-node-01 <none> <none>
1.4 在容器中查看这个挂载的数据目录,并且在容器中创建文件
c
[root@k8s-master volume]# kubectl exec -it host-volume-pod -- sh -c 'ls -l /data/'
total 0
[root@k8s-master volume]# kubectl exec -it host-volume-pod -- sh -c 'cd /data/ && echo "hello kubernetes..." > index.html'
1.5 刚才查到这个pod创建到了k8s-node-02节点上,查看这个文件内容
c
[root@k8s-node-02 ~]# cd /data/
[root@k8s-node-02 data]# ll
总用量 4
-rw-r--r--. 1 root root 20 2月 27 00:30 index.html
[root@k8s-node-02 data]# cat index.html
hello kubernetes...
2、临时卷 EmptyDir
2.1 EmptyDir 共享多个pod的数据共享,但是数据不能做之久话存储
- EmptyDir主要用于一个Pod中不同的Container共享致据使用的,由于只是在Pod内部使用,因此与英他volume比较大的区别是,当Pod如果被除了,那么emptyDir也会被除。
- 存价质可以是任意类型,如SSD、磁盈或网焰存储。可以将emptyDir.medium设置为Memory让k8s使用tmpfs(内存支待文件系统),速度比较快,但是里启tmp形节点时,数据会被清除,且设旦的大小会计入到Container的内存限制中.
2.2 配置文件
yaml
apiVersion: v1
kind: Pod
metadata:
name: emptydir-volume-pod
spec:
containers:
- image: alpine
name: alpine-volume-01
command: ['/bin/sh', '-c', 'sleep 3600;']
volumeMounts:
- mountPath: /emptydir-1 # 挂载到容器哪个目录
name: emptydir-volume # 挂载的数据卷的名字
- image: alpine
name: alpine-volume-02
command: ['/bin/sh', '-c', 'sleep 3600;']
volumeMounts:
- mountPath: /emptydir-2 # 挂载到容器哪个目录
name: emptydir-volume # 挂载的数据卷的名字
volumes:
- name: emptydir-volume
emptyDir: {}
2.3 创建这个pod资源
c
[root@k8s-master volume]# kubectl create -f emptydir-volume.yaml
pod/emptydir-volume-pod created
[root@k8s-master volume]#
[root@k8s-master volume]# kubectl get po
NAME READY STATUS RESTARTS AGE
configfile-po 0/1 Completed 0 3h15m
dns-test 1/1 Running 2 (13h ago) 2d21h
emptydir-volume-pod 0/2 ContainerCreating 0 5s
fluentd-59k8k 1/1 Running 1 (13h ago) 2d4h
fluentd-hhtls 1/1 Running 1 (13h ago) 2d4h
host-volume-pod 1/1 Running 0 17m
nginx-deploy-6fb8d6548-8khhv 1/1 Running 6 (50m ago) 6h50m
nginx-deploy-6fb8d6548-fd9tx 1/1 Running 6 (50m ago) 6h50m
[root@k8s-master volume]# kubectl get po
NAME READY STATUS RESTARTS AGE
configfile-po 0/1 Completed 0 3h17m
dns-test 1/1 Running 2 (13h ago) 2d22h
emptydir-volume-pod 2/2 Running 0 81s
fluentd-59k8k 1/1 Running 1 (13h ago) 2d4h
fluentd-hhtls 1/1 Running 1 (13h ago) 2d4h
host-volume-pod 1/1 Running 0 18m
nginx-deploy-6fb8d6548-8khhv 1/1 Running 6 (51m ago) 6h52m
nginx-deploy-6fb8d6548-fd9tx 1/1 Running 6 (51m ago) 6h52m
2.4 emptydir 共享数据测试
2.4.1 在 alpine-volume-01 容器内创建文件
c
[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod -c alpine-volume-01 -- sh -c 'cd /emptydir-1 && touch test.log '
2.4.2 在 alpine-volume-02 容器内查看这个文件
c
[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod -c alpine-volume-02 -- sh -c 'cd /emptydir-2 && ls -l '
total 0
-rw-r--r-- 1 root root 0 Feb 26 16:48 test.log
2.4.3 在 alpine-volume-02 容器内创建文件
c
[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod -c alpine-volume-02 -- sh -c 'cd /emptydir-2 && touch aaa.txt '
2.4.4 在 alpine-volume-01 容器内查看文件
c
[root@k8s-master volume]# kubectl exec -it emptydir-volume-pod -c alpine-volume-01 -- sh -c 'cd /emptydir-1 && ls -l '
total 0
-rw-r--r-- 1 root root 0 Feb 26 16:50 aaa.txt
-rw-r--r-- 1 root root 0 Feb 26 16:48 test.log
3、NFS(网络文件系统)持久化存储
- nfs卷能将NFS(网络文件系统挂载到你的Pod中。不像emptyDir那样会在删除Pod的同时也会被除,nfs卷的内容在删除Pod时会被保存,卷只是被卸载。这意味着fs卷可以被预先填充数据,并且这些数据可以在Pod之间共享
3.1 安装nfs服务
3.1.1 k8s 3台节点都安装nfs服务
c
yum install -y nfs-utils
3.1.2 节点都启动nfs服务
c
systemctl start nfs
3.1.3 在master节点创建nfs的共享目录
c
mkdir -p /data/nfs/{ro,rw}
3.1.4 设置共享目录
c
echo "/data/nfs/rw 10.10.10.0/24(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports
echo "/data/nfs/ro 10.10.10.0/24(ro,sync,no_subtree_check,no_root_squash)" >> /etc/exports
3.1.5 重新加载配置并重启nfs服务
c
exportfs -f
systemctl restart nfs
3.1.6 挂载nfs共享目录
c
[root@k8s-node-01 ~]# mkdir -p /data/nfs/{ro,rw}
[root@k8s-node-01 ~]# mount -t nfs 10.10.10.100:/data/nfs/rw /data/nfs/rw/
[root@k8s-node-01 ~]# mount -t nfs 10.10.10.100:/data/nfs/ro /data/nfs/ro/
3.1.7 测试挂载目录是否成功
master 上在ro目录创建一个文件
c
[root@k8s-master ~]# cd /data/nfs/ro/
[root@k8s-master ro]# echo "这是一个只读目录" > Readme.md
[root@k8s-master ro]# ll
总用量 4
-rw-r--r--. 1 root root 25 2月 27 01:39 Readme.md
在node-01节点上查看这个ro目录中的文件内容,并且确认是否可写
c
[root@k8s-node-01 ~]# cd /data/nfs/ro
[root@k8s-node-01 ro]# ll
总用量 4
-rw-r--r--. 1 root root 25 2月 27 01:39 Readme.md
[root@k8s-node-01 ro]# cat Readme.md
这是一个只读目录
[root@k8s-node-01 ro]# touch node.md
touch: 无法创建"node.md": 只读文件系统
在node-01节点上rw目录创建一个文件
c
[root@k8s-node-01 ro]# cd ../rw/
[root@k8s-node-01 rw]# echo "这个是可读可写目录" > Readme.md
[root@k8s-node-01 rw]#
我们在master节点上看是否有这个文件
c
[root@k8s-master ro]# cd ../rw/
[root@k8s-master rw]# cat Readme.md
这个是可读可写目录
3.2 创建配置文件
c
apiVersion: v1
kind: Pod
metadata:
name: nfs-volume-pod
spec:
containers:
- image: nginx:1.20
name: nfs-nginx
command: ['/bin/sh', '-c', 'sleep 3600;']
volumeMounts:
- mountPath: /usr/share/nginx/html # 挂载到容器哪个目录
name: nfs-volume # 挂载的数据卷的名字
volumes:
- name: nfs-volume
nfs:
server: "10.10.10.100"
path: "/data/nfs/rw"
readOnly: false
3.3 提前在rw目录中创建一个index.html文件
c
[root@k8s-master ~]# echo "k8s-master: 10.10.10.100 " > /data/nfs/rw/index.html
3.4 创建pod
c
[root@k8s-master nfs]# kubectl create -f nfs-volume.yaml
pod/nfs-volume-pod-1 created
[root@k8s-master nfs]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
configfile-po 0/1 Completed 0 4h30m 10.2.1.69 k8s-node-02 <none> <none>
dns-test 1/1 Running 2 (14h ago) 2d23h 10.2.1.58 k8s-node-02 <none> <none>
emptydir-volume-pod 2/2 Running 2 (14m ago) 74m 10.2.1.72 k8s-node-02 <none> <none>
fluentd-59k8k 1/1 Running 1 (14h ago) 2d5h 10.2.2.34 k8s-node-01 <none> <none>
fluentd-hhtls 1/1 Running 1 (14h ago) 2d5h 10.2.1.59 k8s-node-02 <none> <none>
host-volume-pod 1/1 Running 0 92m 10.2.1.71 k8s-node-02 <none> <none>
nfs-volume-pod-1 1/1 Running 0 64s 10.2.2.41 k8s-node-01 <none> <none>
nginx-deploy-6fb8d6548-8khhv 1/1 Running 8 (5m27s ago) 8h 10.2.1.67 k8s-node-02 <none> <none>
nginx-deploy-6fb8d6548-fd9tx 1/1 Running 8 (5m26s ago) 8h 10.2.2.40 k8s-node-01 <none> <none>
3.5 使用curl访问这个nginx服务
刚才我创建的index.html文件在访问nginx的时候生效,也就是说通过nfs网络挂成功。
c
[root@k8s-master nfs]# curl 10.2.2.41
k8s-master: 10.10.10.100
3.6 使用配置文件再创建一个pod,需要修改pod名字
c
[root@k8s-master nfs]# kubectl create -f nfs-volume2.yaml
pod/nfs-volume-pod-2 created
[root@k8s-master nfs]# kubectl get po
NAME READY STATUS RESTARTS AGE
configfile-po 0/1 Completed 0 4h36m
dns-test 1/1 Running 2 (14h ago) 2d23h
emptydir-volume-pod 2/2 Running 2 (19m ago) 80m
fluentd-59k8k 1/1 Running 1 (14h ago) 2d5h
fluentd-hhtls 1/1 Running 1 (14h ago) 2d5h
host-volume-pod 1/1 Running 0 97m
nfs-volume-pod-1 1/1 Running 0 6m19s
nfs-volume-pod-2 1/1 Running 0 6s
nginx-deploy-6fb8d6548-8khhv 1/1 Running 8 (10m ago) 8h
nginx-deploy-6fb8d6548-fd9tx 1/1 Running 8 (10m ago) 8h
[root@k8s-master nfs]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
configfile-po 0/1 Completed 0 4h36m 10.2.1.69 k8s-node-02 <none> <none>
dns-test 1/1 Running 2 (14h ago) 2d23h 10.2.1.58 k8s-node-02 <none> <none>
emptydir-volume-pod 2/2 Running 2 (19m ago) 80m 10.2.1.72 k8s-node-02 <none> <none>
fluentd-59k8k 1/1 Running 1 (14h ago) 2d5h 10.2.2.34 k8s-node-01 <none> <none>
fluentd-hhtls 1/1 Running 1 (14h ago) 2d5h 10.2.1.59 k8s-node-02 <none> <none>
host-volume-pod 1/1 Running 0 97m 10.2.1.71 k8s-node-02 <none> <none>
nfs-volume-pod-1 1/1 Running 0 6m25s 10.2.2.41 k8s-node-01 <none> <none>
nfs-volume-pod-2 1/1 Running 0 12s 10.2.2.42 k8s-node-01 <none> <none>
nginx-deploy-6fb8d6548-8khhv 1/1 Running 8 (10m ago) 8h 10.2.1.67 k8s-node-02 <none> <none>
nginx-deploy-6fb8d6548-fd9tx 1/1 Running 8 (10m ago) 8h 10.2.2.40 k8s-node-01 <none> <none>
3.7 访问这个新的pod上的nginx服务
c
[root@k8s-master nfs]# curl 10.2.2.42
k8s-master: 10.10.10.100
3.8 小结
通过刚才创建的两个nginx-pod资源,我们使用nfs共享目录到两个pod中,通过访问nginx服务,可以看到两个pod资源显示的结果都是一致的。