0%

Volume

当一个容器崩溃了,kubelet将会尝试重启它,但是之前容器中的文件将会丢失。另外,一个Pod中多个容器之间共享文件也是必需的。Kubernetes提供了一个Volume抽象概念来解决这些问题。

Volume的生命周期

Volume的生命周期与Pod一致。当Pod停止,Volume也将停止。
比Pod中的任何容器存活时间长。容器如果意外退出后,可能会自动重启。

如何使用Volume

通过.spec.volumes字段为Pod指定一组Volume。
通过.spec.containers[*].volumeMounts为某一个容器挂在一组Volume。

示例: 创建一个Nginx的deployment并暴露出去,在浏览器中请求该服务,显示”Hello World!”

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx-app
ports:
- port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-app
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: web-dir
initContainers:
- name: busybox
image: busybox
command:
- "sh"
- "-c"
- "echo 'Hello World!'> /web/index.html"
volumeMounts:
- mountPath: /web
name: web-dir
volumes:
- name: web-dir
emptyDir: {}

执行命令:

1
2
kubectl apply -f https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/volumes/example-01.yaml
kubectl proxy --port 8081

在浏览器打开http://localhost:8081/api/v1/namespaces/default/services/nginx-service/proxy/就可以看见`Hello World!`

Volume的类型

Kubenetes支持的Volume很多,详细的可以看https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes。
我大致将其分为如下四类:

  1. 云提供者提供的存储资源:awsElasticBlockStoreazureDiskazureFilegcePersistentDiskvsphereVolume(vSphere)和cinder(OpenStack)。
  2. Kubernetes对象和集群中的存储资源:configMapsecretdownwardAPIemptyDirprojectedlocalhostPathpersistentVolumeClaim
  3. 其他外部存储资源:cephfsfc (fibre channel)flockergitRepo (deprecated)glusterfsiscsinfsportworxVolumequobyterbdscaleIOstorageos
  4. 插件:Container Storage Interface (CSI)FlexVolume

emptyDir

该类型的Volume是一个临时的空间,主要用来临时存储数据。当Pod被删除(被kubelet驱逐,手动删除等)时,在该类型Volume上的数据会被永久清除。
上面的示例中使用的就是该类型的Volume。还可以用来在不同容器之间共享数据。

configMapsecretdownwardAPI

ConfigMap 和 Secret 是Kubernetes对象。
ConfigMap用于存储配置信息,Secret用来存储敏感信息(比如密码),这两种资源可以挂载到Pod上作为Volume。
downwardAPI类型的Volume用来使应用程序可以使用下行的API数据。

如果一个应用程序需要很多很多配置信息和敏感信息,如果直接挂载Pod上会很麻烦。projected可以帮助我们将多个volume映射到同一个目录下。