kubernetes Volume 个人学习记录


Pod 持久化操作用到 Volume


问题

容器磁盘上的文件生命周期是短暂的,这就使得容器在运行重要应用时会出现一些问题。

  1. 首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失,容器会以最初的状态重启。
  2. 其次,在 Pod 中运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中 volume 抽象就很好解决了这些问题。

背景

​ kubernetes 中的卷有明确的寿命 – 与封装它的 Pod 相同。所以,卷的生命比 Pod 中的所有容器都长,当这个容器重启时数据仍然得以保存。
​ 当 Pod 不再存在时,卷也不复存在。更重要的是,Kubernetes支持多种类型的卷,Pod 可以同时使用任意数量的卷。


卷的类型

kubernetes 支持以下类型的卷

  • awsElasticBlockStore azureDisk azureFile cephfs csi downwardAPI emptyDir
  • fc flocker gcePersistenDisk gitRepo glusterfs hostPath iscsi local nfs
  • persistemVolumeClaim projected portworxVolume quobyte rdb scaleIO secret
  • storageos vsphereVolume


emptyDir

当 Pod 被分配给 Node 节点时,首先创建 emptyDir卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入 emptyDir 卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或者不同路径上。当出于任何原因从节点删除 Pod 时,emptyDir 中的数据将被永久删除。

emptyDir 的用法:

  • 暂存空间,例如用于基于磁盘的合并排序
  • 用作长时间计算崩溃恢复时的检查点
  • Web服务器容器提供数据时,保存内容管理器 容器提取的文件
  • 节点本机为 Pod 提供存储时使用,不常用
一、挂载空卷

在一个 Pod 里面创建两个容器,为两个容器都挂载此空卷

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-pod
spec:
  replicas: 1
  selector:
    matchLabels:
       app: test-pod

  template:
    metadata:
      labels:
         app: test-pod
    spec:
     containers:
       - image: nginx:1.9.1
         name: nginx-1
         ports:
           - containerPort: 80
         volumeMounts:                     #挂载数据卷                     
           - mountPath: /cache             #挂载路径
             name: cache-volume            #数据卷名字

       - name: php
         image: php:7.3.12
         ports:
           - containerPort: 9000
         command: ["/bin/sh","-c","php-fpm;sleep 3600"]
         volumeMounts:
           - mountPath: /test
             name: cache-volume

     volumes:                      #定义一个数据卷
       - name: cache-volume        #数据卷名字
         emptyDir: {}              #内容为空

查看生成了一个 Pod,在这个Pod当中有两个容器,nginx-1 php

kubectl get pod
在这里插入图片描述

查看这两个容器的详细信息

kubectl describe pod test-pod-7cb5cdbdc5-hqxlp

在这里插入图片描述
在这里插入图片描述

进入此 Pod 的两个容器

kubectl exec test-pod-7cb5cdbdc5-hqxlp -c nginx-1 -it -- /bin/bash

kubectl exec test-pod-7cb5cdbdc5-hqxlp -c php -it -- /bin/bash

在其挂载目录下创建文件,验证是否能够共享访问使用

cd /test ; touch php

cd /cache ; touch nginx



HostPath

  1. hostPath 卷,将主机节点的文件系统中的文件或目录挂载到集群中。
  2. 将存储服务器的 块设备共享到 node节点,Pod 通过 HostPath 挂载共享过来的块设备即可实现持久性存储。
  3. 企业持久化备份常用方法,最为灵活的 Volume存储卷

hostPath 的用途如下:

运行需要访问 Docker 内部的容器:使用 /var/lib/docker 的 hostPath

在容器中运行 cAdvisor;使用 /dev/cgroups 的 hostPath

除了所需的 Path 属性之外,用户还可以为 hostPath 卷指定 type

行为
空字符串用于向后兼容,这意味着在挂载 hostPath 卷之前不会执行任何检查。
DirectoryOrCreate如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置0755,与 kubelet 具有相同的组和所有权。
Directory给定的路径下必须存在目录
FileOrCreate如果在给定的路径上没有任何东西存在,那么根据需要创建一个空文件,权限设置为0644,与 kubelet 具有相同的组和所有权。
File给定的路径下必须存在文件
Socket给定的路径下必须存在 UNIX 套接字
CharDevice给定的路径下必须存在字符设备
BlockDevice给定的路径下必须存在块设备
apiVersion: apps/v1
kind: Pod
metadata: 
  name: test-pd
spec:
  containers: 
    - image: nginx:1.9.1
      name: test-nginx
      volumeMounts: 
        - mountPath: /test-pd
          name: test-volume
  volumes: 					#数据卷声明
    - name: test-volume		#数据卷名称:test-volume
      hostPath: 			#在本机路径
        path: /data			#本机的/path
        type: Directory		#是一个目录

注意:所有 Node 节点要提前创建 HostPath 目录:mkidr /data

查看 Pod 详细的挂载信息: kubectl describe pod test-pd

查看 Pod 容器运行的节点:kubectl get pod -o wide

在 Pod 容器的共享目录内写入数据,并在运行节点查看 /data 目录是否同步

kubectl exec test-pd -it -- touch /test-pd/shm.txt

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值