定义存储卷与配置
在K8S中定义的存储卷主要包含了四种类型。
(1)本地存储卷:主要适用于Pod中容器之间的数据共享,或者实现Pod与Node数据存储和共享
(2)网络存储卷:主要是用于多个Pod之间或者多个Node之间的数据存储和共享。
(3)持久存储卷:基于网络存储卷,用户无需关心存储卷所使用的存储系统,只需要定义所需要消费的资源,可以将Pod与具体的存储系统解耦。
(4)配置存储卷:用于向各个Pod注入配置信息。
1.本地存储卷
本地存储卷包含了emptyDir和HostPath两种类型,都会使用本地文件系统,用于Pod中容器之间的数据共享,或者Pod与Node中的数据存储和共享。
(1)emptyDir(干净的空目录)
把这个目录来映射到主机的一个临时目录下,Pod中的所有的容器都可以读写这个目录,对其生命周期管理和Pod完全一致。其作用主要是用于存放和共享Pod的不同容器之间在运行过程中产生的文件。
[root@master ~]# vi testemptyDir.yaml
apiVersion: v1
kind: Pod
metadata:
name: testemptydir
spec:
apiVersion: v1
kind: Pod
metadata:
name: testemptydir
spec:
containers:
- name: containerwrite
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh','-c']
args: ['echo "This is a test data!" >/write_dir/data; sleep 3600']
volumeMounts:
- name: filedata
mountPath: /write_dir
- name: containerread
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh','-c']
args: ['cat /read_dir/data; sleep 3600']
volumeMounts:
- name: filedata
mountPath: /read_dir
volumes:
- name: filedata
emptyDir: {}
[root@master ~]# kubectl apply -f testemptyDir.yaml
pod/testemptydir created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
testemptydir 1/1 Running 0 20s
[root@master ~]# kubectl logs testemptydir containerread
This is a test data!
(2)HostPtah
把主机上指定的目录映射到Pod中的容器上,如果Pod需要在主机上存储或共享文件,或者使用主机上的文件,就可以采用这种方式。存放在主机上的文件不会被销毁,会永久保存。Pod被销毁后,如果在这条台机器上重建,可以再次读取原来的内容,但是如果这台机器出现故障或者Pod被调度在了其他节点上,就无法再次读取原来内容。
这种方式比较适合DaemonSet控制器,运行于DaemonSet控制器下的Pod可以直接操作或者使用主机上的文件。
[root@master ~]# vi testhostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: testhostpath
spec:
containers:
- name: containerhostpath
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh','-c']
args: ['echo "This is a test data!" >/write_dir/data; sleep 3600']
volumeMounts:
- name: filedata
mountPath: /write_dir
volumes:
- name: filedata
hostPath:
path: /home/k8sadmin/testhostpath
//在这个yaml文件中,我们创建了一个名字为containerhostpath的容器,然后需要向这个容器中写入数据,数据为“This is a test data!”,容器内数据卷的地址为/write_dir,引用的存储卷为filedata。在这个例子中存储卷的名字为filedata,这个存储卷会被容器设置的数据卷所引用。存储卷的类型为hostPath,代表主机上指定的目录,路径为/home/k8sadmin/testhostpath,容器中的 /write_dir会映射到主机的 /home/k8sadmin/testhostpath目录下。
[root@master ~]# kubectl apply -f testhostpath.yaml
pod/testhostpath created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
testhostpath 1/1 Running 0 15s
[root@master ~]# kubectl describe pod testhostpath |grep Node
Node: worker2/192.168.200.13
//可以从pod详细信息中查看到pod调度的位置在worker2节点,所以需要去worker2节点上,查找宿主机的映射目录
[root@worker2 ~]# cat /home/k8sadmin/testhostpath/data
This is a test data!
//我们可以看到容器中的数据已经被同步映射到宿主机目录下,然后可以对数据进行修改
[root@worker2 ~]# echo "This is test data! change1" > /home/k8sadmin/testhostpath/data
//再次查看,容器中的数据
[root@master ~]# kubectl exec -it testhostpath -- /bin/sh
/ # cat /write_dir/data
This is test data! change1