k8s挂载磁盘的方式
# 说明
# https://blog.csdn.net/qq_34842671/article/details/120104330
# 如何理解 storageClassName PersistentVolume PersistentVolumeClaim
# 关系
存储类:他是一个存储提供者
PV:
EmptyDir:这是一种临时存储,当Pod运行在同一个节点上时,它会创建一个空目录,并在Pod之间共享数据。但是,一旦Pod被删除或迁移,数据也会被清除。
HostPath:使用节点上的特定文件或目录来挂载到Pod中。这可以让Pod访问节点文件系统上的文件,但这种方式不太适合在生产环境中使用,因为它依赖于节点的特定文件路径。
Persistent Volumes (PVs) 和 Persistent Volume Claims (PVCs):这种方式是用于持久化数据的一种方法。PV是集群中的存储资源,PVC是对PV的申请。Pod通过PVC来请求存储,而不用关心实际的存储位置或类型。这种方式允许数据在Pod之间持久化和共享。
ConfigMap 和 Secrets:这些是Kubernetes提供的资源类型,用于将配置信息或敏感数据挂载到Pod中。ConfigMap用于非敏感配置,而Secrets则用于敏感信息,它们以文件或环境变量的形式挂载到Pod中。
# 存储类
local: 指定local只会存储在一个node节点,数据不会被共享,适合云手机
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# pvc
# 使用 juicefs 存储数据
# PersistentVolumeClaim 依赖于 PersistentVolume
# PersistentVolume 是存储的提供者 PersistentVolumeClaim 使用PersistentVolume 进行存储
apiVersion: v1
kind: PersistentVolume
metadata:
name: minio-pv-volume
namespace: minio
spec:
storageClassName: local
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/minio"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: etcd-pv-claim
spec:
storageClassName: local
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
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
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
# hostPath
生命周期和Pod无关,Pod迁移或者销毁,日志文件还保留在现有磁盘上。
优点:生命周期和Pod无关,即使Pod销毁,日志文件依然在节点磁盘上,假设Agent没有采集日志,仍然可以找到日志文件
缺点:默认无隔离性,需要控制挂载的日志路径;另外,Pod迁移节点后,残留的日志文件长期积累容易占据磁盘,同时日志占据的磁盘无法控制使用的配额
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
replicas: 1
serviceName: mongodb
selector:
matchLabels:
name: mongodb
template:
metadata:
labels:
name: mongodb
spec:
containers:
- name: mongodb
image: mongo:4.2.1
command:
- sh
- -c
- "exec mongod -f /data/middleware-data/mongodb/conf/mongodb.conf"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 27017
name: mongodb
protocol: TCP
volumeMounts:
- name: mongodb-config
mountPath: /data/middleware-data/mongodb/conf/
- name: data
mountPath: /data/middleware-data/mongodb/
volumes:
- name: mongodb-config
configMap:
name: mongodb-conf
- name: data
hostPath:
path: /data/middleware-data/mongodb/
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
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
# emtpyDir
emtpyDir的生命周期跟随Pod,Pod销毁后其中存储的日志也会消失。
优点:使用简单,不同Pod都使用自己的emtpyDir,有一定的隔离性。
缺点:日志如果采集不及时,在Pod消耗后,存在丢失的可能性。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tomcat
name: tomcat
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
volumeMounts:
- mountPath: /usr/local/tomcat/logs
name: log
volumes:
- emptyDir: {}
name: log
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
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
# pv
Pv的访问模式包括:
ReadWriteOnce(RWO):读写权限,并且只能被单个Node挂载。
ReadOnlyMany(ROX):只读权限,允许被多个Node挂载。
ReadWriteMany(RWX):读写权限,允许被多个Node挂载。
对于大部分的业务来说,都是Deployment无状态部署,需要挂载同一个Pv共享;对于一些中间件等有状态服务,一般会使用StatefulSet部署,每个Pod会使用独立的Pv。
优点:存储日志不容易丢失;
缺点:有一定的使用和运维复杂度;多个Pod共享同一个Pv时存在隔离性问题;很多的日志Agent对采集云盘上的日志文件支持不够成熟,可能存在一些隐患;
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 参考
上次更新: 2023-11-15 09:35:36