文章目录

一、相关概念二、EmptyDir存储三、HostPath存储四、NFS存储

一、相关概念

概述 Volumn定义在Pod上,然后被该Pod里面的多个容器挂载到具体的文件目录下。实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命周期不和Pod中的单个容器的生命周期有关。Volume的生命周期和Pod的生命周期关系需要根据储存类型来定 kubernetes支持的常见Volume类型 基本存储:EmptyDir、HostPath、NFS 高级存储:PV、PVC 配置存储:ConfigMap、Secret

二、EmptyDir存储

概述 EmptyDir在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时,EmptyDir中的数据也会被永久删除,所以也被称为临时存储。 实操逻辑 1. 先声明一个EmptyDir储存类型的volume

2. 在一个Pod中准备两个容器nginx和busybox

3. 将volume分别挂载到两个容器的目录中

4. 然后nginx容器负责向volume中写日志,busybox中通过命令从volume读取日志文件内容到控制台

编写yml文件:vi /opt/volume-emptydir.yaml apiVersion: v1

kind: Pod

metadata:

name: volume-emptydir

spec:

containers:

- name: nginx

image: nginx:latest

ports:

- name: nginx-port

containerPort: 80

protocol: TCP

volumeMounts: # 将logs-volume挂载到nginx容器的/var/log/nginx目录, nginx会将用户的访问日志写入到该目录的access.log文件中

- name: logs-volume

mountPath: /var/log/nginx

- name: busybox

image: busybox:latest

command: ["/bin/sh", "-c", "tail -f /logs/access.log"]

volumeMounts: # 将logs-volume挂载到busybox容器中的/logs目录

- name: logs-volume

mountPath: /logs

volumes: # 声明volume

- name: logs-volume

emptyDir: {}

运行:kubectl apply -f /opt/volume-emptydir.yaml 查看是否启动:kubectl get pod -o wide 测试访问,生成日志: curl 192.169.189.78 查看日志(-c是指定容器):kubectl logs volume-emptydir -c busybox -f

三、HostPath存储

概述 HostPath就是将Node主机中的一个实际目录挂载到Pod中,以供容器使用。即使Pod销毁,数据依旧可以保存在Node主机上,也被称为本地存储。 实操逻辑 1. 先声明一个HostPath储存类型的volume,数据储存在Node主机的目录中

2. 在一个Pod中准备两个容器nginx和busybox

3. 将volume分别挂载到两个容器的目录中

4. 然后nginx容器负责向volume中写日志,busybox中通过命令从volume读取日志文件内容到控制台

编写yml文件:vi /opt/volume-hostpath.yaml apiVersion: v1

kind: Pod

metadata:

name: volume-hostpath

spec:

containers:

- name: nginx

image: nginx:latest

ports:

- name: nginx-port

containerPort: 80

protocol: TCP

volumeMounts: # 将logs-volume挂载到nginx容器的/var/log/nginx目录, nginx会将用户的访问日志写入到该目录的access.log文件中

- name: logs-volume

mountPath: /var/log/nginx

- name: busybox

image: busybox:latest

command: ["/bin/sh", "-c", "tail -f /logs/access.log"]

volumeMounts: # 将logs-volume挂载到busybox容器中的/logs目录

- name: logs-volume

mountPath: /logs

volumes: # 声明volume

- name: logs-volume

hostPath:

path: /root/logs

type: DirectoryOrCreate

ps:type类型解析 DirectoryOrCreate:目录存在就使用,不存在就先创建

Directory:目录必须存在

FileOrCreate:文件存在就使用,不存在就先创建

File:文件必须存在

Socket:unix socket必须存在

CharDevice:字符设备必须存在

BlockDevice:块设备必须存在

启动pod:kubectl apply -f /opt/volume-hostpath.yaml 查看pod:kubectl get pod volume-hostpath -o wide 访问nginx:curl 192.169.235.141 查看日志(-c是指定容器):kubectl logs volume-hostpath -c busybox -f 查看节点: kubectl describe pod volume-hostpath 该pod在节点11,则查看日志:ls /root/logs

四、NFS存储

概述 HostPath虽然可以解决数据持久化问题,但是一旦Node节点故障了,Pod如果转移到别的Node节点上,又会出现问题。此时需要准备单独的网络存储系统。比较常用的是NFS和CIFS NFS是一个网络文件存储系统,可以搭建NFS服务器,然后将Pod中的存储直接连接到NFS系统上。无论Pod在节点上怎么转移,只要Node和NFS的对接没有问题,数据就可以成功访问。 搭建NFS服务器(所有的k8s服务器) ps1:生产环境可以使用nfs + keepalived做高可用防止单点故障,rsync + inotify实现主备间共享数据同步 这里测试环境只搭建一台NFS服务器 ​ 1)安装NFS服务(客户端只需安装NFS服务即可,用于客户端驱动NFS设备):yum install -y nfs-utils ​ 2)准备共享目录:mkdir -p /root/data/nfs ​ 3)将共享目录以读写权限暴露给192.168.248.0/24网段中的所有主机:vi /etc/exports ​ 添加 /root/data/nfs 192.168.248.0/24(rw,no_root_squash) ​ ps1:原来/etc/exports是空的 ​ ps2:其中no_root_squash表示:NFS客户端连接服务端时如果使用的是root的话,那么对服务端共享目录也拥有root权限 ​ 5)启动NFS服务:systemctl start nfs --》 systemctl enable nfs ​ 6)查看:exportfs -v ​ 7)如果其他台也装nfs,可以将dnf服务器的存储路径挂载出去,共享挂载路径(可忽略):mount -t nfs 192.168.248.11:/root/data/nfs /root/data/nfs 实操逻辑 1. 先声明一个NFS储存类型的volume,数据储存在远程主机的目录中

2. 在一个Pod中准备两个容器nginx和busybox

3. 将volume分别挂载到两个容器的目录中

4. 然后nginx容器负责向volume中写日志,busybox中通过命令从volume读取日志文件内容到控制台

编写脚本:vi /opt/volume-nfs.yaml apiVersion: v1

kind: Pod

metadata:

name: volume-nfs

spec:

containers:

- name: nginx

image: nginx:latest

ports:

- name: nginx-port

containerPort: 80

protocol: TCP

volumeMounts: # 将logs-volume挂载到nginx容器的/var/log/nginx目录, nginx会将用户的访问日志写入到该目录的access.log文件中

- name: logs-volume

mountPath: /var/log/nginx

- name: busybox

image: busybox:latest

command: ["/bin/sh", "-c", "tail -f /logs/access.log"]

volumeMounts: # 将logs-volume挂载到busybox容器中的/logs目录

- name: logs-volume

mountPath: /logs

volumes: # 声明volume

- name: logs-volume

nfs:

server: 192.168.248.10 # NFS服务器地址

path: /root/data/nfs # NFS服务器的共享目录

readOnly: false # 是否只读

启动:kubectl apply -f /opt/volume-nfs.yaml 查看pod:kubectl get pod volume-nfs -o wide 访问Pod中的Nginx:curl 192.169.189.68 查看日志(-c是指定容器):kubectl logs volume-nfs -c busybox -f 查看文件:ls /root/data/nfs

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: