volume 根据使用可以分为以下三类
参考;https://kubernetes.io/docs/concepts/storage/volumes/
Volume:
• Kubernetes中的Volume提供了在容器中挂载外部存储的能力
• Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个
信息后才可以使用相应的Volume
本地数据卷:emptyDir、hostPath
网络数据卷:NFS
创建一个空卷,挂载到Pod中的容器。Pod删除该卷也会被删除。 应用场景:Pod中容器之间数据共享,
我们可以创建2个容器,一个写,一个读,来测试我们数据是否共享
[root@master volume]# cat empty.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: write
image: busybox
command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
volumeMounts:
#根据下面的数据卷名字使用名为data的数据卷,挂载在/data下面
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
#根据下面的数据卷名字使用名为data的数据卷,挂载在/data下面
- name: data
mountPath: /data
#定义一个数据卷来源
volumes:
#定义数据卷名字
- name: data
emptyDir: {}
这样,我们2个容器都将名为data的数据卷挂载在/data目录下,
创建:
kubectl create -f empty.yaml
检测:
kubectl logs my-pod -c write
这个下面因为写入没有日志。
kubectl logs my-pod -c read
1
2
3
因为我们是每隔一秒写入,所以我们能够不停的看见打印的数据。
挂载Node文件系统上文件或者目录到Pod中的容器。 应用场景:Pod中容器需要访问宿主机文件
[root@master volume]# cat hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 36000
# 挂载点
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
#挂载来源,宿主机的/tmp目录
hostPath:
path: /tmp
type: Directory
创建:
kubectl create -f hostpath.yaml
查看pod具体在那个node上面:
[root@master volume]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
my-pod 1/1 Running 0 20m 172.17.33.3 192.168.1.40
此时我们知道pod在node 192.168.1.40上面运行,此时,我们可以查看192.168.1.40上的/tmp目录里面的数据是否在容器中展示:
node 192.168.1.40中:
[root@k8s-g1 tmp]# ls
mongodb-27017.sock zabbix_agentd.log zabbix_agentd.pid
[root@k8s-g1 tmp]# touch 1.txt
[root@k8s-g1 tmp]# ls
1.txt mongodb-27017.sock zabbix_agentd.log zabbix_agentd.pid
我们进入pod中:
kubectl exec -it my-pod sh
/ # ls /data/
1.txt mongodb-27017.sock zabbix_agentd.log zabbix_agentd.pid
此时,我们可以看到宿主机上/tmp上的数据,成功展示在pod 的/data目录下
安装nfs:(需要使用nfs服务,每台机器都需要安装)
yum install -y nfs-utils
此处我们设置192.168.1.39为服务端,配置/opt/container_data 目录共享出来,并且具有读写权限
[root@master volume]# cat /etc/export
/opt/container_data 192.168.1.0/24(rw,no_root_squash)
此时,我们在客户端的时候,不用刻意去用mount 挂载,因为k8s会帮我们自动挂载
nfs部署yaml文件:
[root@master volume]# cat nfs.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
#启用数据卷的名字为wwwroot,并挂载到nginx的html目录下
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
#定义数据卷名字为wwwroot,类型为nfs
volumes:
- name: wwwroot
nfs:
server: 192.168.1.39
path: /opt/container_data
创建:
kubectl create -f nfs.yaml
查看挂载点下的文件:
[root@master container_data]# ls
index.html test.html wordpress wordpress-4.7.4-zh_CN.tar.gz wp-mysql wp-wwwroot
[root@master container_data]# echo "xianrenqiu" > index.html
根据kubectl get all
找到一个对应的pod,查看 /usr/share/nginx/html 下面是否有挂载进来的数据:
kubectl exec -it pod/nginx-deployment-98c677b96-fc9rl sh
# ls /usr/share/nginx/html
index.html test.html wordpress wordpress-4.7.4-zh_CN.tar.gz wp-mysql wp-wwwroot
# more /usr/share/nginx/html/index.html
xianrenqiu
测试页面显示:
#找到ip
kubectl get pod -o wide
在node上面测试:
[root@k8s-g1 tmp]# curl 172.17.33.4
xianrenqiu