K8S之Storage
kubernetes使用NFS共享存储有两种方式:
- (1)手动方式静态创建所需要的PV和PVC(见本文1.3.2小节)。
- (2)通过创建PVC动态地申请PV(见本文1.4.2小节)。
一、Storage
1.1、Volume
1.1.1、Volume简介
volume(/ˈvɒljuːm/,IT词汇–百度百科): 在电脑中, volume(文件集)是一个可辨认的数据存储(storage)单元。
Volume地址
:https://kubernetes.io/docs/concepts/storage/volumes/容器中的磁盘文件是临时的,这对于在容器中运行的非平凡(重大)应用程序会带来一些问题:
- (1)容器崩溃时文件丢失。
- (2)Kubelet重新启动容器后为clean状态。
在Pod中一起运行的容器之间共享文件时,会出现第二个问题。
Kubernetes的Volume抽象地解决了这两个问题。
1.2.1、Host类型volume实战
思路: 查看volume挂载目录是否同步。
定义一个Pod,其中包含两个Container,都使用Pod的Volume。
(1)创建volume-pod.yaml
创建volume-pod.yaml:
[root@m test]# mkdir volume
[root@m test]# cd volume
[root@m volume]# vi volume-pod.yaml
内容:
apiVersion: v1
kind: Pod
metadata:
name: volume-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: volume-pod
mountPath: /nginx-volume
- name: busybox-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
volumeMounts:
- name: volume-pod
mountPath: /busybox-volume
volumes:
- name: volume-pod
hostPath:
path: /tmp/volume-pod
(2)创建pod
[root@m volume]# kubectl apply -f volume-pod.yaml
pod/volume-pod created
[root@m volume]#
[root@m volume]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
volume-pod 2/2 Running 0 82s 192.168.80.248 w2 <none> <none>
[root@m volume]#
(3)查看pod的容器ID
在volume-pod所在的集群节点,查看容器ID:
[root@w2 ~]# docker ps | grep volume
容器busybox-volume的ID为:a91b394009ff
容器nginx-volume的ID为:3a7201c4a656
(4)测试volume挂载目录是否同步
① 在宿主系统中/tmp/volume-pod目录创建1.txt:
[root@w2 ~]# cd /tmp/volume-pod
[root@w2 volume-pod]# vi 1.txt
[root@w2 volume-pod]# ls
1.txt
[root@w2 volume-pod]#
② 进入nginx-volume容器查看/nginx-volume目录
[root@w2 volume-pod]# docker exec -it a91b394009ff sh
/ # ls /busybox-volume
1.txt
/ # cat /busybox-volume/1.txt
1234
/ # exit
[root@w2 volume-pod]#
③ 进入busybox-volume容器查看/busybox-volume目录
[root@w2 volume-pod]# docker exec -it 3a7201c4a656 sh
# ls /nginx-volume
1.txt
# cat /nginx-volume/1.txt
1234
# exit
[root@w2 volume-pod]#
(5)测试结果
总结:
volume挂载目录是同步的
。
(6)删除测试资源
[root@m volume]# kubectl delete -f volume-pod.yaml
[root@m volume]# rm volume-pod.yaml
1.2.3、查看pod中的容器里面的hosts文件
查看nginx-volume容器hosts
[root@w2 volume-pod]# docker exec -it 3a7201c4a656 cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
192.168.80.248 volume-pod
[root@w2 volume-pod]#
查看busybox-volume容器的hosts文件
[root@w2 volume-pod]# docker exec -it a91b394009ff cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
192.168.80.248 volume-pod
[root@w2 volume-pod]#
结论:
发现两个容器的hosts是一样的,并且都是由pod管理的。所以一般container中的存储或网络内容,不要在container层面直接修改,而是在pod中进行修改。
1.2、PersistentVolume(PV)
官网
:https://kubernetes.io/docs/concepts/storage/persistent-volumes/
PersistentVolume(PV)是已经由管理员提供或者动态使用供应的集群中的一块存储的存储类。它是集群中的资源,就像节点是集群资源一样。PV是类似于Volumes的卷插件,但是其生命周期独立于使用PV的任何单个Pod。
yaml示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi # 存储空间大小
volumeMode: Filesystem
accessModes