目录

什么是volumes

emptyDir卷

hostPath 卷

nfs卷


什么是volumes

在K8S中,volume是kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,被这个pod的多个容器挂载到相同或不同的路径下。

volume的生命周期与pod的生命周期相同,pod内的容器停止和重启时一般不会影响volume中的数据。所以一般volume被用于持久化pod产生的数据。

Pod 中的每个容器必须独立地指定每个卷的挂载位置。

k8s支持的常见Volume类型如下: 基本存储:EmptyDir、HostPath、NFS 高级存储

emptyDir卷

又称临时存储卷

emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配 一个目录,因此无需指定宿主机node上对应的目录文件。这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除。

创建volume目录并进入,编辑yaml文件

一个pod中创建两个容器共享volumes,他们镜像不同,挂载点不同,但是共享卷

[root@k8s2 volumes]# vim emptydir.yaml

apiVersion: v1

kind: Pod

metadata:

name: vol1

spec:

containers:

- image: busyboxplus

name: vm1

command: ["sleep", "300"]

volumeMounts:

- mountPath: /cache #vm1中的卷挂载到容器内的/cache

name: cache-volume

- name: vm2

image: nginx

volumeMounts:

- mountPath: /usr/share/nginx/html #vm2中的卷挂载到容器内的/usr/share/nginx/html

name: cache-volume

volumes:

- name: cache-volume

emptyDir:

medium: Memory #使用内存介质

sizeLimit: 100Mi #可以使用100M内存

创建pod

[root@k8s2 volumes]# kubectl apply -f emptydir.yaml

查看pod,vol1的ip是10.244.141.228,访问,403错误是因为没有发布内容。

[root@k8s2 volumes]# kubectl get pod

NAME READY STATUS RESTARTS AGE

vol1 2/2 Running 0 44s

进入容器,访问vol1,出现403错误,是因为没有发布内容。

[root@k8s2 volumes]# kubectl exec vol1 -c vm1 -it -- sh

/ # cd /cache/

/cache # ls

/cache # curl localhost

<html>

<head><title>403 Forbidden</title></head>

<body>

<center><h1>403 Forbidden</h1></center>

<hr><center>nginx/1.21.5</center>

</body>

</html>

进入vol1的vm1容器,在/cache中写入发布内容,可看见发布内容,并且与nginx容器共享

/cache # echo www.westos.org > index.html

/cache # curl localhost

www.westos.org

尝试写入200m文件,失败

/cache # dd if=/dev/zero of=bigfile bs=1M count=200

dd: writing 'bigfile': No space left on device

101+0 records in

99+1 records out

查看,只写入100m文件

/cache # du -h bigfile

100.0M bigfile

hostPath 卷

hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。对于容器内如何访问宿主机,它提供了简单的方式。

hostPath 的主哟用法有:
(1)运行一个需要访问 Docker 引擎内部机制的容器,挂载 /var/lib/docker 路径。
(2)在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
(3)允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。

主机内目录挂载到pod中
创建yaml 文件

[root@k8s2 volumes]# vim hostpath.yaml

apiVersion: v1

kind: Pod

metadata:

name: vol2

spec:

nodeName: k8s3

containers:

- image: nginx

name: test-container

volumeMounts:

- mountPath: /usr/share/nginx/html  #把卷挂载到容器内的/usr/share/nginx/html

name: test-volume

volumes:

- name: test-volume

hostPath:

path: /data  #卷的路径在/data

type: DirectoryOrCreate #如果在指定路径上不存在,那么根据需要创建空目录,权限为0755,具有与kubelet相同的组和所有权

[root@k8s2 secret]# kubectl apply -f hostpath.yaml

查看pod,被调到4上面

[root@k8s2 secret]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

vol2 1/1 Running 0 6s 10.244.106.140 k8s4 <none> <none>

进入4主机目录,在里面写入数据

[root@k8s4 net.d]# cd /data/

[root@k8s4 data]# echo www.westos.org > index.html

在pod内访问,同样的页面

[root@k8s2 secret]# curl 10.244.106.140

www.westos.org

nfs卷

nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

在使用 NFS 卷之前,你必须运行自己的 NFS 服务器并将目标 share 导出备用。

一般来说文件存储是独立于k8s集群的,所以nfs和仓库一样都放在了server1。

配置nfsserver

[root@k8s1 ~]# yum install -y nfs-utils

[root@k8s1 ~]# vim /etc/exports

/nfsdata *(rw,sync,no_root_squash) #读写,同步,身份

开启nfs

[root@k8s1 ~]# mkdir -m 777 /nfsdata

[root@k8s1 ~]# systemctl enable --now nfs

测试是否正常

[root@k8s1 ~]# showmount -e

Export list for k8s1:

/nfsdata *

在节点上编辑yaml文件

[root@k8s2 volumes]# vim nfs.yaml

apiVersion: v1

kind: Pod

metadata:

name: nfs

spec:

containers:

- image: nginx

name: test-container

volumeMounts:

- mountPath: /usr/share/nginx/html

name: test-volume

volumes:

- name: test-volume

nfs:

server: 192.168.56.171

path: /nfsdata

需要在所有k8s节点上安装nfs-utils软件包

yum install -y nfs-utils

没有安装会有以下错误

Kubernetes 使用 RBD 作为 StorageClass kubernetes的volume类型_Pod

[root@k8s2 volumes]# kubectl apply -f nfs.yaml

查看,正常运行

[root@k8s2 volumes]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

nfs 1/1 Running 0 19s 10.244.106.141 k8s4 <none> <none>

在nfsserver端创建测试页,测试是否同步,在server1中,创建发布内容

[root@k8s1 ~]# cd /nfsdata/

[root@k8s1 nfsdata]# echo www.westos.org > index.html

成功访问

[root@k8s2 volumes]# curl 10.244.106.141

www.westos.org