容器化带来的问题

容器中的文件在磁盘上是临时存放

1,当容器崩溃或者重启的时候,会重新去镜像重启容器,容器内的历史数据会丢失

2,当容器被删除(k8s没有停止容器的概念,只有创建,删除),容器内的数据也会被清理

3,多个容器中有共享文件或者目录的需求(nfs)

卷是个抽象化的存储设备

为什么在k8s上使用卷

卷可以解决容器崩溃或者重启后 ,数据丢失的问题

卷可以解决容器或Pod被删除后数据持久保存的问题

卷可以解决在多个容器的共享数据的问题

pod可以同时使用任意数目的卷

k8s 不提供存储,任何存储先映射成卷 volume

持久卷    临时卷    投射卷

持久卷:集群中的存储资源,就像他的名字一样,在里面存储的数据不会随着Pod的删除而丢失

临时卷:有些应用程序需要额外的存储,但并不关心数据在重启是否仍然可用。卷会遵循Pod的生命周期,与pod一起创建和删除

投射卷: 多个现有卷源映射到同一个目录。通过将不同类型的卷源组合成统一的卷,方便管理

如何使用卷?

首先编写一个Pod的资源对象文件

在pod.spec 下添加volums字段,配置外部存储为卷

在pod.spec.containers[*] 中添加volumeMounts字段,声明卷在容器中的挂载位置

注意事项:

卷不能挂载到其他卷之上,也不能与其他卷有硬链接

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

hostPath   持久卷

hostPath卷的本质是使用本地设备, 例如磁盘,分区,目录,socket ,chardevice

,blockdevice。hostPath卷的可用性取决于底层节点的可用性,如果节点变的不健康,hostPath卷也将不可被访问

hostPath 卷里面的数据不会随着Pod的结束而消失

注意事项: 配置相同的Pod ,可能在不同的节点上表现不同,因为不同节点上映射的文件内容不同

k8s 中允许将nfs存储以卷的方式挂载到你的Pod中。

NFS存储

在删除Pod时,nfs存储卷会被卸载(umount),而不是被删除。nfs卷可以在不同节点的Pod之间共享数据

NFS卷的用途

NFS最大的功能就是在不同节点的不同Pod中共享读写数据。本地NFS的客户端可以透明的读写位于远端NFS服务器上的文件,就像访问本地文件一样

由于Pod存在随机调度,为了保证NFS存储卷可以正确加载,需要在所有node节点都安装NFS包

PV/PVC

PV ---  Persistent Volume   持久卷

PVC --- PersistentVolumeClaim   持久卷声明

提供一个通用的API来完成Pod对卷的部署管理与使用 ,PV/PVG 使集群具备了存储的逻辑抽象能力

k8s支持的存储卷:

 - CephFS   - CSI 容器存储接口- FC 存储  - hostPath卷 - iscsi 存储 -nfs  - rbd       

三大特点 :

卷的模式 volumeMode 直接可用的filesystem  文件系统 (存储)

                                     需要格式化的块设备 block (块设备)

访问模式 accessModes  (读和写) 

存储空间  storage    存储空间大小

回收策略

目前的回收策略有:

  • Retain -- 手动回收
  • Recycle -- 简单擦除 (rm -rf /thevolume/*)
  • Delete -- 删除存储卷

如何使用PV/PVC

PV是资源的提供者 , 我提供--,集群的基础设施变化而变化,由k8s集群管理员配置

PVC是资源的使用者,我需要--,根据业务服务的需求变化来配置,用户无需知道PV的技术细节,只需要声明你需求什么样的资源

PVC会根据用户声明的需求,自动找到PV完成绑定

PVC资源文件,映射PVC为卷,persistentVolumeClaim

使用PVC用户无需关心后端存储设备,系统会自动查找匹配

存储卷挂载路径  volumeMounts

configMap   临时卷

configMap卷提供了向Pod注入配置数据的方法,允许你将配置文件与镜像分离,使容器化的应用具有可移植性

configMap在使用之前先创建它,configMap不是用来保存大量数据的,在其中保存的数据不可超过1MiB

configMap 用途:

配置环境变量

修改配置文件的参数,数据库的地址

1,修改系统时区

kubectl  create  configmap 名称  [选项/参数]

2.资源对象文件

kind: ConfigMap 

...

      TZ: Asia/Shanghai

configMap卷

配置nginx解析php,在pod中加php容器,与nginx共享同一块网卡

制作configMap配置文件    location ~\.php$ ...

kubectl create configmap nginx-php --from-file=nginx.conf

映射配置文件

configmap  引用资料对象

subPath 键值(不设置键值映射为目录)

mountPath 路径

secret卷   加密    临时卷

secret 类似于configMap 但专门用于保存机密数据

在设置secret.data 字段时,所有键值都必须是经过base64

编码的字符串

有加密需求的  -----  用 secret 卷

-  配置一些需要加密的环境变量或者文件   (https证书)

-  访问需要认证登陆的私有镜像仓库 (harbor私有仓库)

kubectl create secret 子类型 名称 [选项/参数]

子类型  通用   kubectl create secret generic 名称 [选项/参数]

认证登陆私用仓库类型 kubectl create secret docker-registry  名称 [选项/参数]

创建TLS证书的子类型 kubectl create secret  tls  名称 [选项/参数]

登陆私有仓库

仓库harbor:443/myimg/httpd:latest 需要认证

使用私有仓库中的镜像创建容器

emptyDir卷

临时卷 

本质就是一个简单的空目录

可以提供临时空间,同一个Pod中容器来共享数据。  (缓存服务器,数据统计分析,排序)

随着Pod创建而创建,Pod在该节点上运行期间,一直存在。Pod被节点上删除时,临时卷中的数据也会永远删除

重启Pod中的容器不会造成emptyDir 数据的丢失

配置缓存目录
  volumes:                #定义卷
  - name: cache        # 容器内卷名称
    emptyDir: {}           #卷类型


    volumeMounts:     #在容器中挂载卷
    - name: cache       #卷名称
      mountPath: /var/cache   #路径不存在,就创建

                                             #路径存在,就覆盖

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐