十四、K8S存储Volumes

目录

1、背景

2、概念

3、常用类型使用: 

1、EmptyDir(Volumes EmptyDir实现数据共享)

2、HostPath(Volumes HostPath挂载宿主机路径)

3、挂载NFS至容器


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卷中的数据是安全的。

用途:

  1. 缓存空间,例如基于磁盘的归并排序。
  2. 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  3. 在 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用法:

  1. 运行一个需要访问Docker引擎内部机制的容器;请使用hostPAth挂载/var/lib/docker路径
  2. 在容器中运行cAdvisor时,以hostPath方式挂载/sys
  3. 允许 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
创建测试,再此不做演示

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁华依在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值