前面讲解了那么多的案例,其实会发现一个问题,就是应用的数据存储,由于pod是无状态的,当pod销毁后,pod中产生的数据也随之销毁,那如果pod中运行的是持久化数据,例如数据库,在销毁或者重建pod的时候,该如何保留之前的数据。Kubernetes提供了一个思路----Volume(卷)。
在Kubernetes(K8S)中,Volume(卷) 是用于为Pod中的容器提供持久化存储或共享数据的核心机制。由于容器本身是临时性的,Volume的存在解决了数据持久化、容器间数据共享及配置管理等问题。
一、Volume的核心作用
- 数据持久化:容器重启或Pod被删除时保留数据。
- 数据共享:同一Pod内的多个容器共享同一存储。
- 配置注入:将配置文件、密钥等注入容器。
- 外部存储集成:对接云存储、网络存储等外部存储系统。
二、Volume的类型及使用场景
Kubernetes支持多种Volume类型,常见的有:
1. 临时存储
- **
emptyDir
**:- 特点:生命周期与Pod一致,Pod删除时数据清除。
- 用途:临时存储、缓存或容器间共享中间数据。
- 示例:
volumes:
- name: cache-volume
emptyDir: {}
2. 节点本地存储
- **
hostPath
**:- 特点:将节点(Node)上的目录或文件挂载到Pod中。
- 用途:访问节点日志、调试工具或依赖节点特定文件的应用。
- 风险:依赖节点路径,Pod调度到其他节点时可能失效。
- 示例:
volumes:
- name: node-log
hostPath:
path: /var/log
3. 持久化存储抽象(PV/PVC)
- **
persistentVolumeClaim
(PVC)**:- 特点:用户通过PVC请求存储资源,由管理员配置的PersistentVolume(PV)提供存储。
- 用途:解耦存储细节,支持动态供给(Dynamic Provisioning)。
- 流程:
- 管理员创建
StorageClass
定义存储类型。 - 用户创建
PersistentVolumeClaim
请求存储。 - 系统自动创建
PersistentVolume
并绑定到PVC。
- 管理员创建
- 示例:
# StorageClass定义(AWS EBS)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
# PVC请求存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
storageClassName: fast
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
4. 配置与密钥
这两种情况后面会有具体章节另外讲解
-
**
configMap
**:- 特点:将配置数据以键值对形式挂载到容器。
- 用途:注入配置文件或环境变量。
- 示例:
volumes:
- name: app-config
configMap:
name: my-configmap
-
**
secret
**:- 特点:存储敏感数据(如密码、证书),以Base64编码。
- 用途:安全地传递密钥信息。
- 示例:
volumes:
- name: db-secret
secret:
secretName: mysql-credentials
三、高级特性
1. 动态存储供给(Dynamic Provisioning)
通过StorageClass
自动创建PV,无需手动预配置:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
2. Volume访问模式(Access Modes)
- **
ReadWriteOnce
(RWO)**:单节点读写。 - **
ReadOnlyMany
(ROX)**:多节点只读。 - **
ReadWriteMany
(RWX)**:多节点读写。
3. 存储卷扩容
某些存储类型(如云存储)支持在线扩容PVC:
spec:
resources:
requests:
storage: 200Gi # 从100Gi扩容到200Gi
下一章节我们将针对上面的几种情况分别走出例子讲解