kubernetes卷的几种类型
以下是一些常见的Kubernetes卷类型:
EmptyDir卷:EmptyDir卷在Pod之间共享数据,并且在Pod重新启动时会被清空。它适用于需要临时存储的数据,例如在多个容器之间共享的临时文件或缓存数据。
ConfigMap卷:ConfigMap卷用于将配置文件以键值对的形式注入到Pod中。它可以用来传递配置信息给应用程序,例如环境变量、配置文件等。
Secret卷:Secret卷用于将敏感信息(如密码、证书等)以安全的方式注入到Pod中。它可以用来存储和传递敏感数据给应用程序,而无需将这些数据明文存储在镜像或配置文件中。
PersistentVolumeClaim (PVC):PersistentVolumeClaim是一种用于请求持久化存储资源的声明。它允许Pod请求并使用集群中的持久化存储卷。PVC与后端存储技术(如NFS、iSCSI等)相结合,提供了可靠的数据持久化解决方案。
NFS卷:NFS卷通过网络文件系统(NFS)将远程文件系统挂载到Pod中。它允许Pod与NFS服务器之间进行文件的读写操作,从而实现跨节点或跨集群的文件共享。
HostPath卷:它允许Pod访问宿主机上的文件或目录。当你在Kubernetes中创建一个使用HostPath卷的Pod时,它将能够读取和写入宿主机上指定路径下的文件。
这只是一些常见的Kubernetes卷类型,实际上还有其他类型的卷可供选择,例如PersistentVolume、GlusterFS、RBD等,每种卷类型都有其独特的功能和适用场景。选择适当的卷类型取决于你的应用程序的需求和环境配置。
以下是 Kubernetes 主要卷类型及其实际使用场景的概览:下面逐一给出每种卷类型的具体 YAML 示例。
# 1. emptyDir — 容器间数据共享
典型场景:Nginx 主容器写入日志,Sidecar 容器读取并上报。
apiVersion: v1
kind: Pod
metadata:
name: nginx-with-log-sidecar
spec:
volumes:
- name: shared-logs
emptyDir: {} # Pod 删除后数据消失
containers:
- name: nginx
image: nginx:1.25
volumeMounts:
- name: shared-logs
mountPath: /var/log/nginx
- name: log-shipper
image: fluent/fluent-bit:2.2
volumeMounts:
- name: shared-logs
mountPath: /logs # 读取 nginx 写入的日志
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2. configMap + secret — 配置与凭据注入
不把配置硬编码进镜像,支持热更新。
# 先创建 ConfigMap 和 Secret
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
config.yaml: |
server:
port: 8080
timeout: 30s
---
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData:
DB_PASSWORD: "s3cr3t"
---
apiVersion: v1
kind: Pod
metadata:
name: backend-app
spec:
volumes:
- name: config-volume
configMap:
name: app-config
- name: secret-volume
secret:
secretName: db-secret
containers:
- name: app
image: myapp:v2
volumeMounts:
- name: config-volume
mountPath: /etc/config # config.yaml 挂载为文件
- name: secret-volume
mountPath: /etc/secrets
readOnly: true
env:
- name: APP_ENV # 也可以注入为环境变量
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 3. PersistentVolumeClaim — 数据库持久化
MySQL 重启后数据不丢失,配合 StorageClass 动态申请云盘。
# StorageClass(AWS EBS 示例)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: ebs.csi.aws.com
parameters:
type: gp3
fsType: ext4
reclaimPolicy: Retain # 删除 PVC 后保留数据
allowVolumeExpansion: true
---
# PVC:声明需要多少存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
spec:
storageClassName: fast-ssd
accessModes:
- ReadWriteOnce # 同一时间只有一个节点可写
resources:
requests:
storage: 50Gi
---
# StatefulSet 使用 PVC
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORD
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
persistentVolumeClaim:
claimName: mysql-data
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 4. hostPath — 节点级资源访问
适用于 DaemonSet 收集宿主机日志,或访问节点 /dev 设备。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-log-collector
spec:
selector:
matchLabels:
app: log-collector
template:
metadata:
labels:
app: log-collector
spec:
volumes:
- name: host-logs
hostPath:
path: /var/log/pods # 挂载宿主机目录
type: Directory
- name: docker-sock
hostPath:
path: /var/run/docker.sock
type: Socket # 访问 Docker daemon
containers:
- name: filebeat
image: elastic/filebeat:8.11
securityContext:
runAsUser: 0 # 需要 root 读取系统日志
volumeMounts:
- name: host-logs
mountPath: /host/logs
readOnly: true
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
⚠️
hostPath存在安全风险,生产环境应配合 PodSecurityPolicy / OPA 限制使用路径。
# 5. nfs — 多 Pod 共享读写(RWX)
适合多副本服务共享上传目录、静态资源等场景。
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 200Gi
accessModes:
- ReadWriteMany # 多节点多 Pod 同时读写
nfs:
server: 10.0.0.100 # NFS 服务器地址
path: /exports/uploads
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: uploads-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Gi
---
# Deployment 多副本共享同一目录
apiVersion: apps/v1
kind: Deployment
metadata:
name: file-service
spec:
replicas: 4 # 4 个副本共享同一 NFS 目录
template:
spec:
containers:
- name: app
image: file-service:v1
volumeMounts:
- name: uploads
mountPath: /app/uploads
volumes:
- name: uploads
persistentVolumeClaim:
claimName: uploads-pvc
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 访问模式速查
| 模式 | 缩写 | 适用场景 |
|---|---|---|
| ReadWriteOnce | RWO | 单节点读写,数据库 |
| ReadWriteMany | RWX | 多节点共享,文件服务 |
| ReadOnlyMany | ROX | 多节点只读,静态资源 |
| ReadWriteOncePod | RWOP | 单 Pod 独占(K8s 1.22+) |
核心原则是:无状态服务用 emptyDir/configMap/secret;有状态服务(数据库、队列)用 PVC + StorageClass;多副本共享文件用 NFS 或支持 RWX 的 CSI 驱动(如 AWS EFS、Azure Files)。
|