目录
(一)卷的概述
1:容器化带来的问题
- #容器中的文件在磁盘上是临时存放的,这给容器中运行的重要的应用程序带来了一些问题。
- Q1:当容器崩溃或重启时,kubelet会以干净的状态(镜像的状态)重启容器,容器内的历史数据会丢失。
- Q2:当容器被删除时,容器内的数据也会一起被清理。
- Q3:多个容器中有共享文件或目录的需求。
2:卷的概念
- 卷是一个抽象化的存储设备。
- 卷可以解决容器崩溃或重启后,历史数据丢失的问题。
- 卷可以解决容器或pod被删除后,数据持久保存的问题。
- 卷可以解决在多个容器内共享数据的问题。
3:卷的类型
- k8s支持很多类型的卷。pod可以同时使用任意数目的卷类型;pod中的容器在崩溃或重启后数据都不会丢失。
- 临时卷:临时卷类型的生命周期与pod相同。当pod不再存在时,临时卷也会被k8s销毁。提供存储空间,可以在多个容器间共享数据。
- 持久卷:当pod执行结束或被删除以后,持久卷不会被k8s销毁。适用于需要长久保存的数据。
4:如何使用卷
- 使用卷时,在spec.volumes中设置为pod提供卷,并在spec.containers[*].volumeMounts字段中声明卷在容器中的挂载位置。
- 卷挂载在镜像中的路径下。pod配置中的每个容器必须独立指定各个卷的挂载位置。
- 卷不能挂载到其他卷之上,也不能与其他卷有硬链接。
- 不管使用哪种存储类型,都需要先把它们映射成卷,然后再在容器中使用这些卷,pod只能引用卷。
- 如果同一个pod中的两个容器挂载的同一个卷,那么它们就能共享数据。
(二)临时卷
1:emptyDir卷
基本概述
- emptyDir是一种临时卷。
- emptyDir的本质是一个简单的空目录。
- 当pod被创建时,emptyDir也会同时被创建,并且在pod在该节点上运行期间,一直存在。当pod被从节点上删除时,emptyDir卷中的数据也会永久被删除。
用途
- 临时空间,例如缓存服务器、数据统计分析、归并排序。
- 同一个pod中,容器共享数据。
如何配置?
---
apiVersion: v1
kind: Pod
metadata:
name: web1
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
volumes: # 卷配置
- name: cache-volume # 卷名称
emptyDir: {} # emptyDir 资源类型 ;{}表示空;默认就是宿主机的剩余磁盘
containers:
- name: nginx
image: myos:nginx
volumeMounts: #在容器中引用卷
- name: cache-volume # 引用卷的名称
mountPath: /var/cache # 卷在容器中映射的路径。若不存在,会自动创建;若存在,会覆盖
ports:
- protocol: TCP
containerPort: 80
2:configMap卷
基本概述
- configMap是一种临时卷。
- configMap提供向pod注入配置数据的方法,允许你将配置文件与镜像分离,使容器化的应用具有可移植性。
- configMap在使用之前需要先创建它。configMap不是用来保存大量数据的,在其中保存的数据不可超过1MiB。
用途
- 定义临时变量。
- 修改各种配置文件的参数,数据库的地址,用户名密码等。
命令行创建
语法格式:kubectl create configmap [选项/参数]
例:kubectl create configmap mycm1 --from-literal=username=admin --from-literal=password=123
资源文件中配置configMap
#案例:实现nginx解析php
#把目录做成configMap[root@master ~]# kubectl create configmap website --from-file=webphp
(webphp中有网页文件和php页面)#修改nginx配置文件,并做成configMap
.....
[root@master ~]# kubectl create configmap webconf --from-file=nginx.conf#nginx解析php
[root@master ~]# vim myv2.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: web2
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
volumes: # 卷配置 #设置为Pod提供的卷
- name: myphp # 卷名称
configMap: #资源对象类型,写卷的类型
name: website #configmap 名称(网页文件)
- name: webconf # 卷名称
configMap: # configmap 资源对象
name: webconf # configmap 名称(配置文件)
containers:
- name: nginx
image: myos:nginx
volumeMounts: #挂载卷的配置
- name: myphp # 卷名称。要挂载的卷名,不同的卷下面写的参数不同
mountPath: /usr/local/nginx/html/myphp #路径
- name: webconf # 卷名称
subPath: nginx.conf # 如果是单一文件,需要指定键名称 #这一步就是让目录成为文件
mountPath: /usr/local/nginx/conf/nginx.conf # 路径
ports:
- protocol: TCP
containerPort: 80
envFrom: #引用一个卷来配置环境变量
- configMapRef: #引用configMap资源对象
name: timezone #引用configMap资源对象名称
- name: php
image: myos:phpfpm
volumeMounts: #让php也能读取文件这里也必须挂载
- name: myphp
mountPath: /usr/local/nginx/html/myphp
3:secret卷
基本概述
- secret卷是一种临时卷。
- secret类似与configMap,但专门用于保存机密数据。
- 在设置secret.data字段时,所有键值都必须是经过base64编码的字符串。
用途
- 为容器配置环境变量。
- 挂载配置文件/目录到容器上。
- 由kubelet在为pod拉取镜像时使用(需要登录的仓库)
命令行创建
#语法:kubectl create secret 子类型 名称 [选项/参数]
#例:kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123
子类型
- 通用类型:kubectl create secret generic 名称 [选项/参数]
- 用于创建访问docker仓库的子类型:kubectl create secret docker-registry 名称 [选项/参数]
- 用于创建TLS证书的子类型:kubectl create secret tls 名称 [选项/参数]
登录认证仓库
#创建需要登录私有仓库的资源对象
kubectl create secret docker-registry harbor-auth \
--docker-server=harbor:443 \ #仓库主机端口号
--docker-username=admin \ #登录用户名
--docker-password=123 \ #密码
---
kind: Pod
apiVersion: v1
metadata:
name: myapp
spec:
restartPolicy: Always
imagePullScrets: #镜像仓库认证数据
- name: harbor-auth #引用secret卷名称
containers:
- name: nginx
image: harbor:443/myimg/myos:nginx
imagePullScrets: Always
创建secret资源文件
# 生成加密 base64 数据,创建认证文件
[root@web2 html]# htpasswd -nbm admin 123456 |base64
YWRtaW46JGFwcjEkdGJqOXJISUckdk9DRFpDaFZJUHl0ZHdGSXl1Qm91MAoK# 使用 secret 设置密码[root@master ~]# vim myv2.yaml---
kind: Secret
apiVersion: v1
metadata:
name: myauth
type: Opaque #数据类型
data:
webauth: YWRtaW46JGFwcjEkdGJqOXJISUckdk9DRFpDaFZJUHl0ZHdGSXl1Qm91MAoK---
apiVersion: v1
kind: Pod
metadata:
name: web2
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
volumes:
- name: webconf
configMap:
name: webconf
- name: webauth # 卷名称
secret: # secret 资源对象
secretName: myauth # secret 名称
items: # 枚举多个键值#声明映射的健值,可以配置多组,唯一一组时可省略
- key: webauth # 键值名称
path: webauth # 文件名称;映射后的文件名
mode: 0644 # 权限 ;映射后的权限
containers:
- name: nginx
image: myos:nginx
volumeMounts:
- name: webconf
subPath: nginx.conf
mountPath: /usr/local/nginx/conf/nginx.conf
- name: webauth # 卷名称
subPath: webauth # 键名称
mountPath: /usr/local/nginx/conf/webauth # 路径错误的话,验证检测不到会报403
....
(三)持久卷
1:hostPath卷
基本概述
- hostPath是持久卷。
- hostPath卷的本质是使用本地设备,例如磁盘、分区、目录、Socket、CharDevice和BlockDevice等。
- hostPath卷的可用性取决于底层节点的可用性,如果节点变得不健康,那么hostPath卷也将不可被访问。
- configMap和secret是往容器里注入文件,hostPath 是把文件保存在宿主机,从而实现数据持久化,即使容器被删除,数据依然还在。
- 局限性:不能实现跨主机的数据共享,只能在一个宿主机保存日志,适用于保存日志。
type对应类型
type类型 | 说明 |
DirectoryOrCreate | 卷映射对象是一个目录,若不存在则自动创建 |
Directory | 卷映射对象是一个目录,且必须存在 |
FileOrCreate | 卷映射对象是一个文件,若不存在则自动创建 |
File | 卷映射对象是一个文件,且必须存在 |
Socket | 卷映射对象是一个Socket套接字,且必须存在 |
CharDevice | 卷映射对象是一个字符设备,且必须存在 |
BlockDevice | 卷映射对象是一个块设备,且必须存在 |
创建hostPath资源文件
[root@master ~]# vim myv3.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: web3
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
volumes: # 卷配置
- name: logdata # 卷名称
hostPath: # hostPath 资源类型
path: /var/weblog # 宿主机路径
type: DirectoryOrCreate # 目录不存在就创建
containers:
- name: nginx
image: myos:nginx
ports:
- protocol: TCP
containerPort: 80
volumeMounts: # 挂载卷的配置
- name: logdata # 引用卷名称
mountPath: /usr/local/nginx/logs # 路径
2:NFS卷
基本概述
- NFS卷是持久卷。
- NFS卷能将NFS挂载到pod中。
- NFS卷的内容在删除pod时会被卸载(umount),而不是被删除。
- NFS卷可以在不同节点的pod之间共享数据。
用途
- 主要功能是实现不同节点的不同pod之间共享数据。
配置NFS卷
1:配置NFS服务器
—在registry主机上搭建NFS服务器
2:配置NFS客户端应用—Pod随机调度到不同node节点上
—所有节点都需要安装NFS客户端应用
3:pod调用NFS卷
[root@master ~]# vim myv3.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: web3
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
volumes: #定义卷
- name: logdata
hostPath:
path: /var/weblog
type: DirectoryOrCreate
- name: website # 卷名称
nfs: # NFS 资源类型
server: registry # NFS 服务器地址
path: /var/webroot # NFS 共享目录
containers:
- name: nginx
image: myos:nginx
ports:
- protocol: TCP
containerPort: 80
volumeMounts: #引用卷
- name: logdata
mountPath: /usr/local/nginx/logs
- name: website # 卷名称
mountPath: /usr/local/nginx/html # 路径
3:PV/PVC卷
基本概述
- PV是持久卷,PV卷是集群中的资源,是集群中的一块存储,可以由管理员事先制备。
- PVC是持久卷申领,表示用户对存储的请求。
用途
- 通过提供一种通用的API来完成pod对卷的部署管理、使用。
- PV/PVC的引入让集群具备了存储的逻辑抽象能力。
- 解决k8s存储的问题,并将所有的存储抽象化成三种特性。
空间大小:
访问模式:单用户读写、多用户读写、只能读不能写等等
使用模式:块设备或文件系统
k8s支持的插件
#PV 持久卷是用插件的形式来实现的。
- cephfs - CephFS volume
- csi - 容器存储接口 (CSI)
- fc - Fibre Channel (FC) 存储
- hostPath - HostPath 卷 (仅供单节点测试使用;不适用于多节点集群;请尝试使用
local
卷作为替代) - iscsi - iSCSI (SCSI over IP) 存储
- local - 节点上挂载的本地存储设备
- nfs - 网络文件系统 (NFS) 存储
- rbd - Rados 块设备 (RBD)
如何使用PV/PVC?
- PV是资源的提供者,根据集群的基础设施变化而变化,由k8s集群管理员配置
- PVC是资源的使用者,根据业务服务的需求变化来配置。作为用户,无需知道PV的技术细节,只需要声明需要的资源类型即可。
- PVC会根据用户声明的需求,自动找到PV完成绑定。
PV资源文件(模板)
#PV的状态在变成bound之前不能使用
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: mypv
spec:
volumeMode: Filesystem #提供资源的类型[Filesystem,Block]
accessModes: #存储卷能提供的访问模式
- ReadWriteOnce #卷支持的模式,支持多种
- ReadOnlyMany #RWO,ROX,RWX,RWOP
capacity: #存储卷能提供的存储空间
storage: 30Gi #空间大小
persistentVolumeReclaimPolicy: Retain #数据回收方式[Retain,Recycle,Delete]
... ... #存储配置
PV资源文件(hostPath)
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-local
spec:
volumeMode: Filesystem #提供资源的类型[Filesystem,Block]
accessModes: #存储卷能提供的访问模式
- ReadWriteOnce #卷支持的模式,支持多种
capacity: #存储卷能提供的存储空间
storage: 30Gi #空间大小
persistentVolumeReclaimPolicy: Retain #数据回收方式[Retain,Recycle,Delete]
hostPath:
path: /var/weblog
type: DirectoryOrCreate
PV资源文件(NFS)
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-nfs
spec:
volumeMode: Filesystem #提供资源的类型[Filesystem,Block]
accessModes: #存储卷能提供的访问模式
- ReadWriteOnce #卷支持的模式,支持多种
- ReadOnlyMany
- ReadWriteMany
capacity: #存储卷能提供的存储空间
storage: 20Gi #空间大小
persistentVolumeReclaimPolicy: Retain #数据回收方式[Retain,Recycle,Delete]
nfs:
server: registry
path: /var/webroot
PVC资源文件
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1
spec: #定义需求
volumeMode: Filesystem #需要使用Filesystem的存储卷
accessModes:- ReadWriteOnce #需要支持RWO的存储卷
resources:
requests:
storage: 18Gi #最小磁盘空间需求
pod调用PVC
#映射PVC为卷
#存储卷挂载
---
apiVersion: v1
kind: Pod
metadata:
name: web3
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
volumes: #定义存储卷
- name: logdata # 存储卷名称
persistentVolumeClaim: # (定义资源对象)通过PVC引用存储资源
claimName: pvc1 # PVC名称(资源对象PVC1)
- name: website # 存储卷名称
persistentVolumeClaim: #(定义资源对象) 通过PVC引用存储资源
claimName: pvc2 # PVC名称(资源对象PVC2)
containers:
- name: nginx
image: myos:nginx
ports:
- protocol: TCP
containerPort: 80
volumeMounts: #引用存储卷
- name: logdata #PVC卷名称
mountPath: /usr/local/nginx/logs #挂载路径
- name: website #PVC卷名称
mountPath: /usr/local/nginx/html #挂载路径
#由于k8s支持的存储卷类型较多,而每一种存储卷对应的PV/PVC资源文件的参数都不一样,在实际配置过程中可查阅官方手册,以下是链接。
持久卷 | Kubernetes