前言
本文记录了存储卷管理、临时卷、持久卷、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 : nginx
image : myos:nginx
volumeMounts : # 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 : nginx
image : myos:nginx
volumeMounts : # 映射存储卷
- 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完成绑定
存储卷能提供的访问模式
RWO ReadWriteOnce 卷可以以读写方式被一个节点挂载。 ReadWriteOnce 访问模式也允许在同一节点上运行多个 Pod 访问卷。
ROX ReadOnlyMany 卷可以被多个节点以只读方式挂载。
RWX ReadWriteMany 卷可以被多个节点以读写方式挂载。
RWOP ReadWriteOncePod 卷可以被单个 Pod 以读写方式挂载。 如果你想确保整个集群中只有一个 Pod 可以读取或写入该 PVC, 使用 ReadWriteOncePod 访问模式。RWOP只支持 CSI 卷且 Kubernetes需要1.22 以上版本。
PV资源文件
---
kind : PersistentVolume
apiVersion : v1
metadata :
name : mypv
spec :
volumeMode : Filesystem # 提供资源的类型[Filesystem, Block]
accessModes : # 存储卷能提供的访问模式
- ReadWriteOnce # 卷支持的模式,支持多种
- ReadOnlyMnay # RWO,ROX,RWX,RWOP
capacity : # 存储卷能提供的存储空间
storage : 30Gi # 空间大小
persistentVolumeReclaimPolicy : Retain # 数据回收方式
...... # 存储配置
PV资源文件(hostPath)
... ...
metadata :
name : pv-local
spec :
volumeMode : Filesystem # 提供Filesystem访问方式
accessModes :
- ReadWriteOnce # hostPath 只支持RWO
capacity :
storage : 30Gi # 提供的磁盘空间大小
persistentVolumeReclaimPolicy : Retain # 数据手工回收
hostPath : # hostPath配置
path : /var/weblog
type :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 : nginx
image : myos:nginx
volumeMounts :
- 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 : nginx
image : myos:nginx
envFrom : # 配置环境变量
- configMapRef : # 调用资源对象
name : timezone # Configmap 名称
配置nginx解析php
在Pod中增加php容器,与nginx共享一张网卡
containers :
- name : nginx
... ...
- name : php
image : myos:php-fpm
envFrom :
- configmapRef : # 配置时区
name : timezone
volumeMounts :
- name : website # 挂载NFS
mountPath : /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 : apache
image : harbor:443/myimg/httpd:latest # 使用私有仓库里的镜像
3、emptyDir 卷
emptyDir的本质是一个简单的空目录,可以提供临时空间,同一个Pod中容器也可以用来共享数据eg:缓存服务器、数据分析统计、排序等
emptyDir随Pod创建而创建,Pod在该节点上运行期间一直存在,当Pod被删除时,临时卷中的数据也会被永久删除
重启Pod中容器不会造成emptyDir数据丢失
... ...
spec :
volumes : # 定义卷
- name : cache # 卷的名字
emptyDir : {} # 卷的类型
containers :
- name : apache
image : harbor:443/myimg/httpd:latest
volumeMounts : # 在容器中挂载卷
- name : cache # 卷名
mountPath : /var/cache # 路径不存在就创建,存在就覆盖