K8s(12)——存储之volumes
在K8S中,volume是kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,被这个pod的多个容器挂载到相同或不同的路径下。volume的生命周期与pod的生命周期相同,pod内的容器停止和重启时一般不会影响volume中的数据。所以一般volume被用于持久化pod产生的数据。Pod 中的每个容器必须独立地指定每个卷的挂载位置。k8s支持的常见Volume类型如
目录
什么是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
没有安装会有以下错误
[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
更多推荐
所有评论(0)