k8s之Volume类型emptyDir和hostPath
//
Kubernetes存储官方文档 (opens new window)
在docker里面,需要把文件持久化就需要把需要持久化的目录挂载到宿主机,在默认情况下,删除容器同时也会把容器里面的文件删除,有时候需要将容器文件做持久化,或把宿主机的文件挂载到容器
# k8s常见Volume类型
一般有四种:emptyDir,hostPath,NFS以及云存储(ceph, glasterfs...)等。
# emptyDir类型
emptyDir知识积累
当 Pod 分派到某个 Node 上时,emptyDir 卷会被创建,并且在 Pod 在该节点上运行期间,卷一直存在。 就像其名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。 Pod 启动时为空,存储空间来自本地的 kubelet 根目录(通常是根磁盘)或内存,默认目录:/var/lib/kubelet/pods/容器id Note: 容器崩溃并不会导致 Pod 被从节点上移除,因此容器崩溃期间 emptyDir 卷中的数据是安全的。
创建一个emptyDir容器
vi nginx-test-emptyDir.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-test01
spec:
containers:
- image: nginx:1.21.1
name: nginx-test01
volumeMounts:
- name: nginx-test01
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-test01
emptyDir: {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# hostPath类型
HostPath卷存在许多安全风险,尽可能避免使用HostPath是一种最佳实践。当必须使用HostPath卷时,应该将其限定为只需要的文件或目录,并将其挂载为只读。
如果通过AdmissionPolicy限制HostPath对特定目录的访问,volumeMounts必须使用readOnly挂载才能使策略生效。
hostPath 的一些用法有:
运行一个需要访问 Docker 内部机制的容器;可使用 hostPath 挂载 /var/lib/docker 路径。
在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。
type值 | 行为 |
---|---|
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。 | |
DirectoryOrCreate | 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。 |
Directory | 在给定路径上必须存在的目录。 |
FileOrCreate | 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。 |
File | 在给定路径上必须存在的文件。 |
Socket | 在给定路径上必须存在的 UNIX 套接字。 |
CharDevice | 在给定路径上必须存在的字符设备。 |
BlockDevice | 在给定路径上必须存在的块设备。 |
# 创建一个hostpath容器
- 将Pod分配给节点
#查看标签
kubectl get nodes --show-labels
#择其中一个节点,添加标签
kubectl label nodes hdss-22 nginx=web
#删除标签,删除标签只需要加 key名 -
kubectl label nodes hdss-22 nginx-
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
一般情况下,使用hostpath会和nodeSelector结合起来使用,Kubernetes只会将 Pod 调度到拥有你所指定的每个标签的节点上。
nodeSelector:是节点选择约束的最简单推荐形式。你可以将 nodeSelector 字段添加到 Pod 的规约中设置你希望目标节点所具有的节点标签。
K8s文档 将pod指派到节点 (opens new window)
- 创建yml
vi nginx-hostpath.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-test01
spec:
containers:
- image: nginx:1.21.1
name: nginx-test01
volumeMounts:
- name: nginx-test01
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-test01
hostPath:
path: /data/nginx-test
type: DirectoryOrCreate #当目录不存在就创建
nodeSelector:
nginx: web #指定分配给打了这个标签的node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# nfs类型
//
如果此文章对您有帮助,点击 -->> 请博主喝咖啡 (opens new window)
上次更新: 2022/12/29, 16:26:13