前言
本文记录了存储卷管理、临时卷、持久卷、PV/PVC管理
一、持久卷
卷概述
容器化带来的问题
容器中的文件在磁盘上是临时存放的,这对于容器运行重要应用程序带来一些问题
1、容器崩溃重启时,kubelet会以纯净(镜像)状态重启,容器内的历史数据会丢失
2、容器被删除时,容器内数据会一并被清理
3、多个容器可能会有共享文件和目录的需求
ps:因为K8s是没有停止容器的概念的,所以只有创建和删除容器
卷
卷是一个抽象化的存储设备
使用卷可以解决容器崩溃重启后的历史数据丢失的问题,也可以解决容器或Pod被删除后数据持久保存的问题,
同时可以解决多个容器内数据共享的问题。
Pod可以使用任意数目的卷
k8s支持的卷类型
持久卷
持久卷是集群中的存储资源,里面的数据不会随着Pod的删除而丢失
临时卷
有些应用程序需要额外的存储,但并不关心数据在重启后是否仍然可用。临时卷会同Pod一起创建删除
投射卷
它允许将多个现有卷源映射到同一个目录,通过这些不同类型的卷源组合成一个统一的卷,可以更方便的管理和使用这些资源
卷的使用
1、编写一个Pod资源对象文件
2、在Pod.spec下添加volumes字段,配置外部存储为卷
3、在Pod.spec.comtainers[*] 中添加volumeMounts 字段,声明卷在容器中的挂载位置
ps:卷不能挂载到其他卷上,也不能与其他卷有硬连接
Pod配置中每个容器都必须独立指定各个卷的挂载位置
hostPath卷
hostPath是持久卷,本质是使用本地设备,例如磁盘、分区、目录、Socket、CharDevice和BlockDevice等等。
hostPath卷的可用性取决于底层节点的可用性,如果节点变得不健康,那么hostPath卷也将不可被访问。
hostPath卷里面的数据不会随着Pod结束而消失
ps : 配置相同的Pod,可能在不同节点上表现不同,应为不同节点上映射的文件内容不同
spec : volumes : # 卷定义- name : logdata # 卷名称hostPath : # 使用hostPath 创建卷path : /var/weblog # 在节点上存放的路径type : DirectoryOrCreate # 目录不存在就创建新的containers : - name : nginximage : myos:nginxvolumeMounts : # mount卷- name : logdata # 卷的名字mountPath : /usr/local/nginx/logs # 容器内路径
type对应内型 :
type类型 | 说明 |
---|---|
DirectoryOrCreate | 卷映射对象是一个目录,如果不存在就创建 |
Directory | 卷映射对象是一个目录,且必须存在 |
FileOrCreate | 卷映射对象是一个文件,如果不存在就创建 |
File | 卷映射对象是一个文件,且必须存在 |
Socket | 卷映射对象是一个Socket套接字,且必须存在 |
CharDevice | 卷映射对象是一个字符设备,且必须存在 |
BlockDevice | 卷映射对象是一个块设备,且必须存在 |
NFS卷
k8s中允许将NFS存储以卷的方式挂载到Pod中,删除Pod时,nfs存储卷会被卸载(umount),而不是被删除,nfs卷可以在不同节点的Pod之间共享数据
NFS最大的功能就是在不同节点的不同Pod中共享读写数据,本地NFS的客户端可以透明地读写位于远端NFS服务骑上的文件,就像访问本地文件一样
spec : volumes : ... ...- name : website # 存储卷名称nfs : # 定义资源对象server : 192.168.1.10 # 指明NFS服务器地址path : /var/webroot # NFS共享目录containers : - name : nginximage : myos:nginxvolumeMounts : # 映射存储卷- name : website # 映射的存储卷名称mountPath : /usr/local/nginx/html # 映射到容器中的路径
PV/PVC
PV:Persistent Volume 是持久卷
PVC : PersistentVolumeClaim 是持久卷声明
PV/PVC用途
存储的管理是一个与计算机实例的管理完全不同的问题。管理员希望能提供一种通用的API来完成Pod对卷的部署管理与使用。PV/PVC就是为了满足这种需求而诞生的,PV/PVC的引入使集群具备了存储的逻辑抽象能力
k8s支持的存储卷
cephfs : CephFS volume
csi : 容器存储接口(CSI)
fc : Fibre Channel(FC)存储
hostPath HostPath 卷
iscsi : ISCSI(SCSI over IP) 存储
nfs 网络文件系统(NFS)存储
rbd Rados块设备(RBD)卷
PV/PVC使用
PV是资源提供者,根据集群的基础设施变化而变化,由k8s集群管理员配置
PVC是资源的使用者,根据业务服务的需求变化来配置,用户无需知道PV的技术细节,只需要声明你需要什么类型的资源即可
PVC会根据用户的声明需求,自动找到PV完成绑定
PV资源文件
---
kind : PersistentVolume
apiVersion : v1
metadata : name : mypv
spec : volumeMode : Filesystem # 提供资源的类型[Filesystem, Block]accessModes : # 存储卷能提供的访问模式- ReadWriteOnce # 卷支持的模式,支持多种- ReadOnlyMnay # RWO,ROX,RWX,RWOPcapacity : # 存储卷能提供的存储空间storage : 30Gi # 空间大小persistentVolumeReclaimPolicy : Retain # 数据回收方式...... # 存储配置
PV资源文件(hostPath)
... ...
metadata : name : pv-local
spec : volumeMode : Filesystem # 提供Filesystem访问方式accessModes : - ReadWriteOnce # hostPath 只支持RWOcapacity : storage : 30Gi # 提供的磁盘空间大小persistentVolumeReclaimPolicy : Retain # 数据手工回收hostPath : # hostPath配置path : /var/weblogtype :DirectoryOrCreate
PV资源文件(NFS)
spec : volumeMode : Filesystem # 提供Filesystem访问方式accessModes : # NFS 支持多种访问方式- ReadOnlyMany # RWO,ROX,RWX- ReadWriteMany
... ...capacity : storage : 30Gi # 提供的磁盘空间大小persistentVolumeReclaimPolicy : Retain # 数据手工回收mountOptions : # mount的参数- nolock nfs : # NFS配置server : <NFS服务器地址>path : <共享目录路径>
PVC资源文件
---
kind : PersistentVolumeClaim
apiVersion : v1
metadata : name : pvc1
spec : # 定义需求volumMode : Filesystem 需要使用Filesystem的存储卷accessModes : - ReadWriteOnce # 需要支持RWO的存储卷resources : requests : storage : 25Gi # 最小磁盘空间需求
Pod调用PVC
映射PVC为卷
使用PVC用户无需关心后端存储设备
系统会自动查找匹配
... ...
spec : Volumes : # 定义存储卷- name : logdata # 定义卷名persistentVolumeClaim : # 定义PVC资源对象claimName : pvc1 # 使用的PVC为pvc1- name : website # 定义卷名persistentVolumeClaim : # 定义PVC资源对象 claimName : pvc2 # 定义使用的PVC为pvc2
存储卷挂载路径
... ...
spec : containers : - name : nginximage : myos:nginxvolumeMounts :- name : logdata # 挂载卷名mountPath : /usr/local/nginx/logs # 挂载路径- name : website # 挂载卷名mountPath : /usr/local/nginx/html # 挂载路径
二、临时卷
1、configMap 卷
configMap卷提供了向Pod注入配置数据的方法,允许你将配置文件与镜像分离,使容器化的应用具有可移植性
configMap 在使用之前需要先创建它,configMap 不是用来保存大量数据的,在其中保存的数据不可超过1Mib
configMap用途
配置环境变量
修改配置文件的参数,数据库的地址等
修改系统时区
创建configMap语法格式
kubectl create configmap 名称 [选项/参数]
kubectl create configmap tz --from-literal=TZ="Asia/Shanghai"
kubectl get configmap
使用资源对象创建configmap
---
kind : ConfigMap
apiVersion : v1
metadata : name : timezone
data : TZ="Asia/Shanghai"
使用 :
---
kind : Pod
apiVersion : v1
metadata : name : web1
spec : ... ... containers : - name : nginximage : myos:nginxenvFrom : # 配置环境变量- configMapRef : # 调用资源对象name : timezone # Configmap 名称
配置nginx解析php
在Pod中增加php容器,与nginx共享一张网卡
containers :
- name : nginx
... ...
- name : php image : myos:php-fpmenvFrom : - configmapRef : # 配置时区name : timezone volumeMounts : - name : website # 挂载NFSmountPath : /usr/local/nginx/html
制作Configmap配置文件
获取配置文件并修改
kubectl cp -c nginx web1:/usr/local/nginx/conf/nginx.conf nginx.conf
# vim nginx.conf
location ~\.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi.conf;
}
###
使用命令创建configmap
kubectl create configmap nginx-php --from-file=nginx.conf
映射配置文件
spec : volumes : - name : nginx-php # 卷名称configMap : # 引用资源对像name : nginx-php # 资源对象名称... ...containers : - name : nginx... ...volumeMounts : - name : nginx-php # 卷名称subPath : nginx.conf # 键值(不设置键值映射为目录)mountPath : /usr/local/nginx/conf/nginx.conf # 路径
2、secret卷
secret卷是一种临时卷,类似于ConfigMap但专门用于保存机密数据
在设置Secret.data字段时,所有简直都必须是经过base64编码的字符串
secret用途
配置一些需要加密的环境变量或文件(eg:https证书)
访问需要认证登陆的私有镜像仓库(eg:harbor私有仓库)
创建secret语法格式
kubectl create secret 子类型 名称 [选项/参数]
子类型
通用类型:
kubectl create secret generic 名称 [选项/参数]
用于创建认证登陆私有仓库的子类型
kubectl create secret docker-registry 名称 [选项/参数]
用于创建TLS证书的子类型
kubectl create secret tls 名称 [选项/参数]
登陆私有仓库
kubectl create secret docker-registry harbor-auth --docker-server="harbor:443" --docker-username="username" --docker-password="password" # 仓库主机端口号 登陆用户名 密码
yaml文件:
---
kind : Pod
apiVersion : v1
metadata : name : web2
spec : imagePullSecret : # secret数据- name : harbor-auth # 资源对象名称containers : - name : apacheimage : harbor:443/myimg/httpd:latest # 使用私有仓库里的镜像
3、emptyDir 卷
emptyDir的本质是一个简单的空目录,可以提供临时空间,同一个Pod中容器也可以用来共享数据eg:缓存服务器、数据分析统计、排序等
emptyDir随Pod创建而创建,Pod在该节点上运行期间一直存在,当Pod被删除时,临时卷中的数据也会被永久删除
重启Pod中容器不会造成emptyDir数据丢失
... ...
spec : volumes : # 定义卷- name : cache # 卷的名字emptyDir : {} # 卷的类型containers : - name : apacheimage : harbor:443/myimg/httpd:latest volumeMounts : # 在容器中挂载卷- name : cache # 卷名mountPath : /var/cache # 路径不存在就创建,存在就覆盖