博客:cbb777.fun
全平台账号:安妮的心动录
github: https://github.com/anneheartrecord
下文中我说的可能对,也可能不对,鉴于笔者水平有限,请君自辨。有问题欢迎大家找我讨论
为什么需要卷?
容器中的文件在磁盘上是临时存放的,这给在容器中运行较重要的应用带来一些问题。 当容器崩溃或停止的时候会出现一个问题:此时容器状态未保存,因此在容器生命中期内创建或修改的文件都将丢失。
在崩溃期间,kubelet会以clean的状态重新启动容器,当多个容器在一个Pod中运行并且需要共享文件的时候,会出现另一个问题:无法做到跨容器访问文件
K8S支持很多类型的卷,Pod可以同时使用任意数目的卷类型,临时卷类型的生命周期和Pod相同,但持久卷可以比Pod更长。当Pod不存在的时候,K8S也会销毁临时卷,不会销毁持久卷。在容器重启期间,Pod中任何类型的卷都不会丢失
卷的核心是一个目录,其中可能存有数据,Pod中的容器可以访问该目录中的数据。所采用的特定的卷类型会决定该目录是如何形成的、使用何种介质保存数据以及目录中存放的内容 在使用卷的时候,.spec.volumes
字段中设置为pod提供的卷,并在.spec.containers[*].volumeMounts
字段中声明卷在容器中的挂载位置。容器中的进程看到的文件系统视图是由他们的容器镜像的初始内容以及挂载在容器中的卷所组成的。其中根文件系统同容器镜像的内容相吻合。任何在该文件系统下的写入操作,如果被允许的话都会影响到容器中进程访问文件系统时看到的内容
卷挂载在镜像的指定路径下,pod配置中的每个容器必须独立指定各个卷的挂载位置 卷不能挂载到其他卷之上(不过存在一种subPath的机制,可以实现卷上挂载卷)
卷类型
cephfs
cephfs
卷允许你将现存的cephFS
卷挂载到Pod
中,不像EmptyDir
那样会在Pod被删除的同时也删除,同一个CephFs
可以被多个写者挂载
apiVersion: v1
kind: Pod
metadata:
name: cephfs
spec:
containers:
- name: cephfs-rw
image: kubernetes/pause
volumeMounts:
- mountPath: "/mnt/cephfs"
name: cephfs
volumes:
- name: cephfs
cephfs:
monitors:
- 10.16.154.78:6789
- 10.16.154.82:6789
- 10.16.154.83:6789
# by default the path is /, but you can override and mount a specific path of the filesystem by using the path attribute
# path: /some/path/in/side/cephfs
user: admin
secretFile: "/etc/ceph/admin.secret"
readOnly: true
configMap
configMap
卷提供了向Pod
注入配置数据的方法,ConfigMap
对象中存储的数据可以被解析,然后被Pod
中运行的容器化应用使用。在使用ConfigMap
之前首先要创建它,并且ConfigMap
总是以readOnly
的模式挂载,容器以subPath卷挂载方式使用ConfigMap
时,将无法接收ConfigMap
的更新
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
spec:
containers:
- name: test
image: busybox:1.28
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
config-Map:
name: log-config
items:
- key: log_level
path: log_level
emptyDir
当Pod
被分配到某个节点上的时候,emptyDir
会被创建,并且在Pod
在该节点上运行期间,卷一直存在。就像其名称表示的那样,卷最初是空的。尽管Pod
中的容器挂载emptyDir
卷的路径可能相同也可能不同,这些容器都可以读写emptyDir
卷中相同的文件。当pod
因为某些原因被从节点上删除的时候,emptyDir
卷中的数据也会被永久删除。容器崩溃并不会导致Pod
从节点上移除,因此容器崩溃期间emptyDir
的数据是安全的
emptyDir.medium
字段用来控制emptyDir
卷的存储位置,默认情况下,emptyDir
卷存储在该节点所使用的介质上;此处的介质可以是磁盘、SSD或者网络存储,可以将emptyDir.medium
设置为Memory
,以告诉K8S为你挂载tmpfs
emptyDir
的一些用途
-
缓存空间,例如基于磁盘的归并排序 -
为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行 -
在web服务器容器服务数据时,保存内容管理器容器获取的文件
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
sizeLimit: 500Mi
fc
fc(光纤通道)类型允许将现有的光纤通道快存储卷挂载到Pod中,可以使用卷配置中的参数来制定单个或者多个目标WWN
hostPath
hostPath
卷存在许多安全风险,最佳做法是应该尽可能避免HostPath
,当必须使用HostPath
的时候,它的范围应该仅限于所需的文件或者目录,并以只读的方式挂载
如果通过AdmissionPolicy
限制HostPath
对特定目录的访问,则必须要求volumeMounts
使用readOnly
挂载以使得策略生效
hostPath
卷能将主机结点文件系统上的文件或目录挂载到你的Pod
中,虽然这不是大多数Pod
需要的,但是它为一些应用程序提供了强大的逃生舱
hostPath的一些用法
-
运行一个需要访问Dock