0%

Kubernetes Volume之emptyDir卷、hostPath卷

这里介绍Kubernetes卷中的emptyDir、hostPath卷

abstract.png

emptyDir卷

emptyDir卷的生命周期与Pod的生命周期相关联。换言之当Pod被删除时卷中的内容即会丢失,故其是一种临时性存储。由于Pod中各容器的文件系统是独立的,故通过emptyDir卷可以实现对同一个Pod中多个容器的数据共享

这里我们在一个Pod当中分别使用两个容器:fortune、nginx。前者会每隔几秒向卷中的html文件生成新内容;后者则会读取卷中的内容。配置文件如下所示

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
46
47
apiVersion: apps/v1
# 资源类型
kind: ReplicaSet
metadata:
# RS名称
name: my-rs-1
spec:
# 副本数量
replicas: 1
# 标签选择器
selector:
matchLabels:
company: Microsoft
# Pod 模板
template:
metadata:
# 标签信息
labels:
company: Microsoft
spec:
# 容器信息
containers:
# 容器1: 生成Html文件
- name: html-generator
image: luksa/fortune
volumeMounts:
# 将名为html-volume的卷挂载到容器内的指定路径
- name: html-volume
mountPath: /var/htdocs
# 容器2: Nginx服务
- name: my-nginx
image: nginx:alpine
# 仅用于展示容器所使用的端口
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
# 将名为html-volume的卷挂载到容器内的指定路径
- name: html-volume
mountPath: /usr/share/nginx/html
# 容器对该卷只读
readOnly: true
# 卷信息
volumes:
# 名为html-volume的emptyDir类型卷
- name: html-volume
emptyDir: {}

效果如下所示,可以看到每隔一段时间通过Nginx访问的内容都不一样。说明nginx容器使用的文件内容是fortune容器是生成的

figure 1.jpeg

hostPath卷

hostPath卷指向的是K8s节点上的文件系统上的文件/目录。换言之,通过hostPath卷可以实现对同一K8s节点中多个Pod、容器的数据共享。而且由于该类型的卷不会因为Pod的消失而消失,故其是一种持久性存储。这里我们使用一个单节点的K8集群,确保测试Pod全部部署在一个集群节点当中。通过配置文件分别创建两个Pod。其中,第1个Pod包含2个容器;第2个Pod包含1个容器

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
apiVersion: apps/v1
# 资源类型
kind: ReplicaSet
metadata:
# RS名称
name: my-rs-a
spec:
# 副本数量
replicas: 1
# 标签选择器
selector:
matchLabels:
company: Microsoft
# Pod 模板
template:
metadata:
# 标签信息
labels:
company: Microsoft
spec:
# 容器信息
containers:
# 容器 1
- name: my-a-1
image: jocatalin/kubernetes-bootcamp:v1
volumeMounts:
# 将名为my-volume的卷挂载到容器内的指定路径
- name: my-volume
mountPath: /Aaron/A1
# 容器 2
- name: my-a-2
image: nginx:alpine
volumeMounts:
# 将名为my-volume的卷挂载到容器内的指定路径
- name: my-volume
mountPath: /Aaron/A2
# 卷信息
volumes:
# 名为my-volume的hostpath类型卷
- name: my-volume
hostPath:
path: /Data/Aaron
# 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息
type: DirectoryOrCreate

---

apiVersion: apps/v1
# 资源类型
kind: ReplicaSet
metadata:
# RS名称
name: my-rs-b
spec:
# 副本数量
replicas: 1
# 标签选择器
selector:
matchLabels:
company: Microsoft
# Pod 模板
template:
metadata:
# 标签信息
labels:
company: Microsoft
spec:
# 容器信息
containers:
- name: my-b-1
image: jocatalin/kubernetes-bootcamp:v1
volumeMounts:
# 将名为my-volume的卷挂载到容器内的指定路径
- name: my-volume
mountPath: /Aaron/B1
# 卷信息
volumes:
# 名为my-volume的hostpath类型卷
- name: my-volume
hostPath:
path: /Data/Aaron
# 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息
type: DirectoryOrCreate

部署成功,如下所示

figure 2.jpeg

当我们通过节点的文件系统对hostpath卷建立文件内容时,该节点使用该卷的所有Pod、容器均可以看到,效果如下所示。

figure 3.jpeg

参考文献

  1. Kubernetes in Action中文版 Marko Luksa著
  2. 深入剖析Kubernetes 张磊著
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝