kubernetes Volume这里写目录标题
- 问题
- 背景
- 卷的类型
- emptyDir
- emptyDir 的用法:
- 一、挂载空卷
- HostPath
- hostPath 的用途如下:
Pod 持久化操作用到 Volume
问题
容器磁盘上的文件生命周期是短暂的,这就使得容器在运行重要应用时会出现一些问题。
- 首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失,容器会以最初的状态重启。
- 其次,在 Pod 中运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中 volume 抽象就很好解决了这些问题。
背景
kubernetes 中的卷有明确的寿命 – 与封装它的 Pod 相同。所以,卷的生命比 Pod 中的所有容器都长,当这个容器重启时数据仍然得以保存。
当 Pod 不再存在时,卷也不复存在。更重要的是,Kubernetes支持多种类型的卷,Pod 可以同时使用任意数量的卷。
卷的类型
kubernetes 支持以下类型的卷
-
awsElasticBlockStore
azureDisk
azureFile
cephfs
csi
downwardAPI
emptyDir
-
fc
flocker
gcePersistenDisk
gitRepo
glusterfs
hostPath
iscsi
local
nfs
-
persistemVolumeClaim
projected
portworxVolume
quobyte
rdb
scaleIO
secret
-
storageos
vsphereVolume
emptyDir
当 Pod 被分配给 Node 节点时,首先创建 emptyDir
卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入 emptyDir
卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或者不同路径上。当出于任何原因从节点删除 Pod 时,emptyDir
中的数据将被永久删除。
emptyDir 的用法:
- 暂存空间,例如用于基于磁盘的合并排序
- 用作长时间计算崩溃恢复时的检查点
- Web服务器容器提供数据时,保存内容管理器 容器提取的文件
- 节点本机为 Pod 提供存储时使用,不常用
一、挂载空卷
在一个 Pod 里面创建两个容器,为两个容器都挂载此空卷
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-pod
spec:
replicas: 1
selector:
matchLabels:
app: test-pod
template:
metadata:
labels:
app: test-pod
spec:
containers:
- image: nginx:1.9.1
name: nginx-1
ports:
- containerPort: 80
volumeMounts: #挂载数据卷
- mountPath: /cache #挂载路径
name: cache-volume #数据卷名字
- name: php
image: php:7.3.12
ports:
- containerPort: 9000
command: ["/bin/sh","-c","php-fpm;sleep 3600"]
volumeMounts:
- mountPath: /test
name: cache-volume
volumes: #定义一个数据卷
- name: cache-volume #数据卷名字
emptyDir: {} #内容为空
查看生成了一个 Pod,在这个Pod当中有两个容器,nginx-1 php
kubectl get pod
查看这两个容器的详细信息
kubectl describe pod test-pod-7cb5cdbdc5-hqxlp
进入此 Pod 的两个容器
kubectl exec test-pod-7cb5cdbdc5-hqxlp -c nginx-1 -it -- /bin/bash
kubectl exec test-pod-7cb5cdbdc5-hqxlp -c php -it -- /bin/bash
在其挂载目录下创建文件,验证是否能够共享访问使用
cd /test ; touch php
cd /cache ; touch nginx
HostPath
- hostPath 卷,将主机节点的文件系统中的文件或目录挂载到集群中。
- 将存储服务器的 块设备共享到 node节点,Pod 通过 HostPath 挂载共享过来的块设备即可实现持久性存储。
- 企业持久化备份常用方法,最为灵活的 Volume存储卷
hostPath 的用途如下:
运行需要访问 Docker 内部的容器:使用 /var/lib/docker 的 hostPath
在容器中运行 cAdvisor;使用 /dev/cgroups 的 hostPath
除了所需的 Path 属性之外,用户还可以为 hostPath 卷指定 type
值 | 行为 |
空字符串用于向后兼容,这意味着在挂载 hostPath 卷之前不会执行任何检查。 | |
DirectoryOrCreate | 如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置0755,与 kubelet 具有相同的组和所有权。 |
Directory | 给定的路径下必须存在目录 |
FileOrCreate | 如果在给定的路径上没有任何东西存在,那么根据需要创建一个空文件,权限设置为0644,与 kubelet 具有相同的组和所有权。 |
File | 给定的路径下必须存在文件 |
Socket | 给定的路径下必须存在 UNIX 套接字 |
CharDevice | 给定的路径下必须存在字符设备 |
BlockDevice | 给定的路径下必须存在块设备 |
apiVersion: apps/v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx:1.9.1
name: test-nginx
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes: #数据卷声明
- name: test-volume #数据卷名称:test-volume
hostPath: #在本机路径
path: /data #本机的/path
type: Directory #是一个目录
注意:所有 Node 节点要提前创建 HostPath 目录:mkidr /data
查看 Pod 详细的挂载信息: kubectl describe pod test-pd
查看 Pod 容器运行的节点:kubectl get pod -o wide
在 Pod 容器的共享目录内写入数据,并在运行节点查看 /data 目录是否同步
kubectl exec test-pd -it -- touch /test-pd/shm.txt