CKAD备战笔记(7)- 可持久化数据
1. 卷(Volume)
Docker 容器本质上是 瞬态(transient) 的。 这意味着它们只能持续很短的时间。它们在App被创建时被调用,容器被销毁时,数据与容器一起被销毁。
为了使容器的数据持久化,我们将容器所在的 Pod 连接到卷。 容器中的数据放在该卷中,即使容器被删除,数据会仍然存在。
下面的yaml文件为Pod创建并连接卷:
- Container:其中的App随机生成一个0-100之间的数,并存到文件夹
/opt
中 - Volume:该卷名为
data-volume
,实际上是当前Node上的一个文件夹/data
。所有用卷data-volume
存储的信息,最后都会被放在Node的/data
文件夹下
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp
spec:
containers:
- name: simple-webapp
image: simple-webapp
command: ["/bin/sh", "-c"]
args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]
# (1) 将容器文件夹`/opt`挂载到名为data-volume的卷上
volumeMounts:
- mountPath: /opt
name: data-volume
# (2) 创建卷:这里申明了一个在Node上的文件夹(Directory),也可以使用其他存储方式,比如引用(PersistentVolumeClaim)
volumes:
- name: data-volume
hostPath:
path: /data
type: Directory
卷的使用确保了Pod被删除后,该Pod所产生的数据还被保留在所在的Node上,如图:
上面图中的的挂载方法只适用于单Node的集群。如果是多个Node,那么每个Node其实都是不同的服务器,它们都有的/data
文件路径,分别存储了不同的内容。所以我们要另找解决方法。
⚠️ 卷与Pod相连 -> 每次新建一个需要存储空间的Pod,都需要手动配置卷
⚠️ 卷存在于Node服务器上 -> 分布在不同Node上的App无法访问到同一个的卷
卷的这两个特性导致管理困难,而且也不利于扩大应用规模,因为无法支持多Node的应用,而持久卷能解决该问题
2. 持久卷(PersistentVolume / PV)
我们想要一个更中心化的解决方法,如有某个多Node的应用需要修改存储空间,管理员(Administrator)可以统一对其进行管理。持久卷池可以帮我们解决这个问题。
持久卷是Cluster层级的,放满 存储卷 的池子(Pool),由集群的管理员进行管理和配置。然后由Pod根据自己的需求发送 存储卷请求(PersistentVolumeClaim / PVC)。
⚠️ 一个PV本身是不可分割的单位,而管理员管理的是一堆存储容量大小各异的PV
# 持久卷(PersistentVolume)的定义
# my-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume
spec:
# 可能的mode