引言

存储是Kubernetes的重要组成部分。本文介绍K8s的存储管理机制。

一、Volume类型

1.1 EmptyDir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: cache
mountPath: /cache
volumes:
- name: cache
emptyDir: {}

1.2 HostPath

1
2
3
4
5
volumes:
- name: data
hostPath:
path: /data
type: Directory

1.3 ConfigMap

1
2
3
4
volumes:
- name: config
configMap:
name: app-config

1.4 Secret

1
2
3
4
volumes:
- name: secret
secret:
secretName: app-secret

二、PV和PVC

2.1 PersistentVolume

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 192.168.1.100
path: /data

2.2 PersistentVolumeClaim

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi

2.3 在Pod中使用PVC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-nfs

三、StorageClass

1
2
3
4
5
6
7
8
9
10
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

动态供应PVC

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast-ssd
resources:
requests:
storage: 10Gi

四、StatefulSet存储

1
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
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: fast-ssd
resources:
requests:
storage: 10Gi

五、备份与恢复

1
2
3
4
5
6
7
8
# 使用Velero备份
velero backup create my-backup --include-namespaces default

# 恢复
velero restore create --from-backup my-backup

# 定时备份
velero schedule create daily-backup --schedule="0 1 * * *"

总结

Kubernetes存储核心:

  1. Volume:临时存储
  2. PV/PVC:持久化存储
  3. StorageClass:动态供应
  4. StatefulSet:有状态应用

参考资料