一、卷概述
由于容器中的文件在磁盘上是临时存放的,当容器崩溃或停止时,容器状态不会被保存,在此生命周期内所创建或修改的文件都将被丢失。如果多个容器在一个Pod中运行并需要共享文件时,因为隔离限制的存在,会导致容器之间设置和访问共享文件系统会有很大的难度。为了解决数据持久性跟共享存储的问题,卷(Volume)便承担了这个责任,它是一个抽象化的存储设备。
卷的使用:
编写一个Pod的资源清单文件,在文件内的spec下添加volumes字段,把外部主机存储配置为卷,在spec下的containers
二、持久卷
1.hostPath卷
它能够将主机节点上的文件系统挂载到Pod中,可以用来访问主机系统日志,Docker内部文件以及运行需要访问主机文件系统的容器,hostPath卷里面的数据不会因为Pod的结束而消失。
示例:
apiVersion: v1 kind: Pod metadata: name: web1 spec: volumes: - name: volume-name hostPath: path: /host/path type: DirectoryOrCreate containers: - name: nginx image: myos:nginx volumeMounts: - name: volume-name mountPath: /container/path
2.NFS卷
NFS卷允许将现有的NFS共享挂载到Pod中,能够实现在不同节点的不同Pod中共享读写数据,能使数据持久化,独立于Pod生命周期,非常适合在共享存储场景下使用,本地客户端可以透明第读写位于远端服务器上的文件,就如同访问本地文件一样。
示例:
apiVersion: v1 kind: Pod metadata: name: nfs-pod spec: containers: - name: nfs-container image: 镜像地址 volumeMounts: - name: 卷名称 mountPath: /usr/share/nginx/html volumes: - name: 卷名称 nfs: server: NFS服务器地址 path: NFS共享路径 readOnly: false # 设置为true表示只读
3.PV/PVC
PV的全称是PersistentVolume(持久卷),集群级别的存储资源,可由管理员事先制备,或者使用存储类来动态制备,代表实际的存储资源(如NFS、ISCSI、云存储)。
PVC的全称是PersistentVolumeClaim(持久卷声明),表达的是用户对存储的请求,概念上与Pod类似,Pod消耗节点资源,PVC声明会消耗PV资源。PVC 申领也可以请求特定的大小和访问模式。
管理员希望能够提供一种通过API来完成Pod对卷的部署管理与使用,而PV/PVC的诞生就是为了满足这种需求,PV/PVC的引入使得K8s能够有效支持各种需要持久化存储的业务场景,同时又保持云原生应用的弹性和可移植性。
关于它们的使用,集群会检视 PVC 声明,找到所绑定的卷, 并为 Pod 挂载该卷。对于支持多种访问模式的卷, 用户要在 Pod 中以卷的形式使用声明时指定期望的访问模式。一旦用户有了申领对象并且该申领已经被绑定, 则所绑定的 PV 卷在用户仍然需要它期间一直属于该用户。 用户通过在 Pod 的 volumes
块中包含 persistentVolumeClaim
节区来调度 Pod,访问所声明的 PV 卷。
注意:持久卷声明准循节约原则,优先匹配访问模式,最后是根据空间大小。
PV示例:
yaml
metadata: pv
spec:volumeMode: Filesystem #提供的资源类型(Filesystem,Block)
capacity: #存储卷能提供的存储空间
storage: 10Gi #空间大小
accessModes: #存储卷能提供的访问模式
- ReadWriteOnce- ReadOnlyMany
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain #数据回收方式,手工回收#Recycle简单擦除,Delete删除存储卷
PVC示例:
metadata: name: pvc spec: volumeMode: Filesystem accessModes: - ReadWriteOnce resources: requests: storage: 8Gi
Pod挂载PVC示例:
spec: volumes: - name: logdata persistentVolumeClaim: claimName: pvc
三、临时卷
有些应用程序需要额外的存储,但并不关心数据在重启后是否仍然可用,或者有些应用程序需要以文件的形式注入只读数据。而临时卷就是为这些类的应用涉及的,因为卷会遵从 Pod 的生命周期,与 Pod 一起创建和删除, 所以停止和重新启动 Pod 时,不会受持久卷在何处可用的限制。
1.configMap卷
ConfigMap 卷能够将配置与容器镜像解耦,从而实现更灵活的应用程序部署。它支持以环境变量形式传递配置,或作为文件挂载到容器中。这种方式便于修改配置文件参数,如数据库地址等配置项。
创建configMap
# kubectl create configmap 名称 选项/参数 --dry-run=client -o yaml
2.secret卷
Secret 卷是 Kubernetes 中用于安全存储和传递敏感数据的机制,能够安全地向 Pod 提供密码、OAuth 令牌、SSH 密钥等信息。相比直接使用环境变量或 ConfigMap,Secret 通过卷挂载方式实现更精细的访问控制,可以限制特定服务账户或用户的访问权限,从而提供更高的安全性保障。
生成仓库密钥
#kubectl create secret docker-registry harbor-auth --docker-server=harbor:443 --docker-server=仓库服务器地址和窗口 username="用户名" --docker-password="密码"
spec: imagePullSecrets: - name: harbor-auth containers: - name: apache image: harbor:443/private/httpd:latest
3.emptyDir卷
EmptyDir 是 Kubernetes 中最基础的卷类型,它随 Pod 的创建而生成,随 Pod 的删除而销毁。该卷数据存储在 Pod 所在节点的磁盘上,支持同一 Pod 内的多个容器共享访问。用户可根据需求选择将数据存储在节点磁盘或内存中。
简单的yaml示例:
kind: Pod apiVersion: v1 metadata: name: web2 spec: imagePullSecrets: - name: harbor-auth volumes: - name: volume-name emptyDir: {} containers: - name: apache image: harbor:443/private/httpd:latest volumeMounts: - name: volume-name mountPath: /path/to/mount