目录
1、EmptyDir(Volumes EmptyDir实现数据共享)
2、HostPath(Volumes HostPath挂载宿主机路径)
Volume:官网
1、背景
容器中的文件是在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题,首先,当 容器崩溃时,kubelet将重新启动容器。容器中的文件将会丢失----因为容器会以干净的状态重建,其次,当在一个pod中同时运行多个容器时,常常需要在这些容器之间共享文件,kubernetes抽象出Volume对象来解决这两个问题
一些需要持久化的数据或者一些需要共享数据的容器才需要用到Volumes
日志收集的需求:需要在应用程序的容器里边加一个sidecar,这个容器是一个收集日志的容器,比如flebeat它通过volumes共享应用程序的日志文件目录
2、概念
Volume是k8s抽象出来的对象,用于解决Pod中的容器运行时,文件存放的问题以及多容器数据共享的问题。Kubernetes 卷具有明确的生命周期——与包裹它的 Pod 相同。卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。
更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录。 特定的卷类型可以决定这个目录如何形成的,并能决定它支持何种介质,以及目录中存放什么内容。使用卷时, Pod 声明中需要提供卷的类型 (.spec.volumes 字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段)。
3、常用类型使用:
1、EmptyDir(Volumes EmptyDir实现数据共享)
当pod指定到某一个节点上时,首先创建的是一个emptyDir卷,并且只要Pod在该节点上运行,卷就一直存在。
容器崩溃并不会导致Pod被从节点上移除,因此容器崩溃时emptyDir卷中的数据是安全的。
用途:
- 缓存空间,例如基于磁盘的归并排序。
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
- 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
演示:
1、创建一个deploy
[root@k8s-master-1 volumes]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: volumes-test
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx
volumeMounts:
- mountPath: /opt
name: share-volume
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx2
command:
- sh
- -c
- sleep 3600
volumeMounts:
- mountPath: /mnt
name: share-volume
volumes:
- name: share-volume
emptyDir: {}
- - - :以上配置是创建了两个容器,nginx和nginx2,nginx挂载到/opt/,nginx2挂载到/mnt/ ,使用emptyDir做数据共享,
这里emptyDir后面使用了{},表示emptyDir后面并没有数据。我们在容器1中写入一个文件夹,看容器2是否共享,步骤如下:
2、[root@k8s-master-1 volumes]# kubectl get pod
NAME READY STATUS RESTARTS AGE
volumes-test-67b794c87b-7872x 2/2 Running 0 3s
volumes-test-67b794c87b-7prtw 2/2 Running 0 3s
3、进入容器演示 -c nginx 是指定进入哪个容器
[root@k8s-master-1 volumes]# kubectl exec -it volumes-test-67b794c87b-7872x -c nginx -- bash
4、在/opt/touch 一个文件夹
root@volumes-test-67b794c87b-7872x:/opt# touch 123
5、然后退出去,进入nginx2容器
[root@k8s-master-1 volumes]# kubectl exec -it volumes-test-67b794c87b-7872x -c nginx2 -- bash
nginx2是挂载到/mnt/的,
root@volumes-test-67b794c87b-7872x:/# cd /mnt/
root@volumes-test-67b794c87b-7872x:/mnt# ls
123
root@volumes-test-67b794c87b-7872x:/mnt#
root@volumes-test-67b794c87b-7872x:/mnt# echo "test volume emptyDir" > 123
root@volumes-test-67b794c87b-7872x:/mnt# cat 123
test volume emptyDir
root@volumes-test-67b794c87b-7872x:/mnt# exit
exit
[root@k8s-master-1 volumes]# kubectl exec -it volumes-test-67b794c87b-7872x -c nginx -- bash
root@volumes-test-67b794c87b-7872x:/# cd /opt/
root@volumes-test-67b794c87b-7872x:/opt# ls
123
root@volumes-test-67b794c87b-7872x:/opt# cat 123
test volume emptyDir
root@volumes-test-67b794c87b-7872x:/opt#
2、HostPath(Volumes HostPath挂载宿主机路径)
hostPath 卷能将主机节点文件系统上的文件或目录挂载到 Pod 中。用于Pod自定义日志输出或者访问Docker内部的容器等等。
hostPath用法:
- 运行一个需要访问Docker引擎内部机制的容器;请使用hostPAth挂载/var/lib/docker路径
- 在容器中运行cAdvisor时,以hostPath方式挂载/sys
- 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。
除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。
支持的 type 值如下:
取值 | 行为 |
空字符串(默认)用于向后兼容,这意味着在安装hostPath卷之前不会执行任何检查 | |
DirectoryOrCreate | 如果在给定的路径上什么都不存在,那么将根据需要创建空目录,权限为0755,具有与kubelet相同点组合所有权 |
Directory | 在给定路径上必须存在的目录。 |
FileOrCreate | 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。 |
File | 在给定路径上必须存在的文件。 |
Socket | 在给定路径上必须存在的 UNIX 套接字。 |
CharDevice | 在给定路径上必须存在的字符设备。 |
BlockDevice | 在给定路径上必须存在的块设备。 |
1、编写yaml文件
[root@k8s-master-1 volumes]# vim deployment.yaml
在emptyDir 配置文件基础上 添加
volumeMounts:
- mountPath: /mnt
name: share-volume
- mountPath: /data
name: hostpath-test
volumes:
- name: share-volume
emptyDir: {}
- name: hostpath-test
hostPath:
path: /data
type: DirectoryOrCreate
创建成功之后 看下调度到了那个节点,因为我的副本数是2,所以每个节点都有一个,在node1上 查看有个data目录
[root@k8s-node-1 /]# cd data/
[root@k8s-node-1 data]# date > date.log #把当前时间写进去 然后去master上进入容器的挂载路径下查看是否存在该文件
[root@k8s-master-1 volumes]# kubectl exec -it volumes-test-55f8479fd4-gkhxt -c nginx2 -- bash
root@volumes-test-55f8479fd4-gkhxt:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@volumes-test-55f8479fd4-gkhxt:/# cd data/
root@volumes-test-55f8479fd4-gkhxt:/data# ls
date.log
root@volumes-test-55f8479fd4-gkhxt:/data# cat date.log
2023年 06月 02日 星期五 16:51:27 CST
root@volumes-test-55f8479fd4-gkhxt:/data#
3、挂载NFS至容器
1、安装nfs-utils,服务端安装
[root@k8s-lb-backup /]# yum -y install rpcbind nfs-utils
2、在master上创建挂载目录并授权
[root@k8s-master-1 log]# mkdir /nfsdata
授权
[root@k8s-master-1 /]# chmod 777 /nfsdata
3、添加配置项
[root@k8s-node-1 k8s]# vim /etc/exports
/nfsdata 192.168.134.0/24(rw,sync,no_subtree_check,no_root_squash)
[root@k8s-node-1 k8s]# exportfs -r 配置生效
4、启动nfs-service、rpcbind
systemctl enable rpcbind && systemctl start rpcbind
systemctl enable nfs && systemctl start nfs
5、查看RPC的服务状态
[root@k8s-master-1 /]# rpcinfo -p localhost
6、showmount令来查阅是否可以联机
[root@k8s-master-1 /]# showmount -e
Export list for localhost:
/nfsdata 192.168.134.0/24
-----客户端配置------
7、安装nfs-utils客户端
yum -y install nfs-utils
8、查看服务器抛出的共享目录信息
[root@k8s-node-1 ~]# showmount -e 192.168.134.135
Export list for 192.168.134.135:
/nfsdata 192.168.134.0/24
9、挂载服务器共享目录
[root@k8s-master-1 ~]# mount -t nfs 192.168.134.135:/nfsdata /mnt/
[root@k8s-master-1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
192.168.134.137:/k8s/kubernetes/nfs/data 36G 7.7G 28G 22% /mnt
[root@k8s-master-1 ~]# 测试成功
#在服务节点的目录下创建一个文件测试
[root@k8s-master-1 data]# vim test
[root@k8s-master-1 data]# cat test123
123
#然后去从节点的挂载目录查看
[root@k8s-node-1 mnt]# cat test123
123
exit 退出
10、卸载已挂在的NFS
umount /mnt
安装完就可以直接使用volume挂载
11、查看nfs-server版本号
[root@k8s-master-1 pvc-zd]# nfsstat -v
其中 “Server nfs v4” 说明版本为4
查看客户端版本:[root@k8s-node-1 ~]# nfsstat -c
Client nfs v4:
# nfs客户端版本号查看 其中 “Client nfs v4” 说明客户端版本为4
# nfs客户端版本号查看 其中 “Client nfs v4” 说明客户端版本为4
12、编辑deployment
[root@k8s-master-1 volumes]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: volumes-test
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx
volumeMounts:
- mountPath: /opt
name: share-volume
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx2
command:
- sh
- -c
- sleep 3600
volumeMounts:
- mountPath: /mnt
name: share-volume
- mountPath: /data
name: hostpath-test
- mountPath: /opt
name: nfs-volume
volumes:
- name: share-volume
emptyDir: {}
- name: hostpath-test
hostPath:
path: /data
type: DirectoryOrCreate
- name: nfs-volume
nfs:
server: 192.168.134.137
path: /k8s/nfs
创建测试,再此不做演示