一、存储卷概述
应用程序在处理请求时,可根据其对当前请求的处理是否受影响与此前的请求,将应用划分为有状态和无状态应用两种。微服务体系中,各种应用均被拆分了众多微服务或更小的应用模块,因此往往会存在为数不少的有状态应用,于是数据持久化几乎是必然只需。
Kubernetes提供的存储卷(volume)隶属于Pod资源,共享于Pod内的所有容器,可用于在容器的文件系统之外存储应用程序的相关数据,甚至还可以独立于Pod的生命周期之外实现数据持久化。
Pod本身具有生命周期,故其内部运行的容器及其相关数据自身均无法持久存在。Docker支持配置容器使用存储卷将数据持久存储于容器自身文件系统之外的存储空间中,它们可以是节点文件系统或网络文件系统之上的存储系统,不过,其存储卷是与Pod资源绑定而非容器。简单来说,存储卷是定义在Pod资源之上的、可被其内部的所有容器挂载的共享目录,它关联至某外部的存储设备之上的存储空间,从而独立于容器自身的文件系统,而数据是否具有持久化能力则取决于存储卷自身是否支持持久机制。
Kubernetes支持的存储卷类型
二、临时存储卷
Kubernetes支持存储卷类型,emptyDir存储卷的生命周期与其所属的Pod对象相同,它无法脱离Pod对象的生命周期提供数据存储功能,因此emptyDir通常仅用于数据缓存或临时存储。不过,基于emptyDir构建的gitRepo存储卷可以在Pod对象的生命周期起始时从相应的Git仓库中复制相应的数据文件到底层的emptrDir中,从而使得它具有一定意义上的持久性;但是,自Kubernetes 1.12版本起,girRepo存储卷已被废弃,所以不再进行说明。
emptyDir存储卷是Pod对象生命周期中的一个临时存储目录,类似于Docker上的"docker挂载卷",在Pod对象启动时即被创建,而在Pod对象被移除时会被一并删除。不具持久能力的emptyDir存储卷只能用于某些特殊场景。例如,同一Pod内的多个容器间文件共享,或者作为容器数据的临时存储目录用于数据缓存系统等等。
emptyDir存储卷则定义于.spec.volumes.emptyDir嵌套字段中,可用字段主要包含两个,具体如下:
medium:此目录所在的存储介质的类型,可取值为"default"或"Memory",默认为default,表示使用节点的默认存储介质;"Memory"表示使用基于RAM的临时文件系统tmpfs,空间受限于内存,但是性能非常好,通过用于为容器中的应用提供缓存空间。
sizeLimit:当前存储卷的空间限额,默认值为nil,表示不限制;不过在medium字段值为"Memory"时建议务必使用此限额。
1)编写emptyDir的yaml文件
]# cat emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol-emptydir-pod
spec:
volumes:
- name: html
emptyDir: {
}
containers:
- name: nginx
image: nginx:1.12-alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
- name: pagegen
image: alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /html
command: ["/bin/sh", "-c"]
args:
- while true; do
echo $(homename) $(date) >> /html/index.html;
sleep 10;
done
]# kubectl apply -f emptydir.yaml
pod/vol-emptydir-pod created
2)查看Pod详细信息
]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
vol-emptydir-pod 2/2 Running 0 4s 10.244.1.95 node1 <none> <none>
]# kubectl describe pods vol-emptydir-pod
Name: vol-emptydir-pod
Namespace: default
Priority: 0
Node: node1/172.16.2.101
Start Time: Thu, 27 Aug 2020 19:18:58 +0800
Labels: <none>
Annotations: Status: Running
IP: 10.244.1.95
IPs:
IP: 10.244.1.95
Containers:
nginx:
Container ID: docker://3f912041344a89bc846b0b0b669e7a8f5a23b121d07600a79f8eb3deaea937ec
Image: nginx:1.12-alpine
Image ID: docker-pullable://nginx@sha256:db5acc22920799fe387a903437eb89387607e5b3f63cf0f4472ac182d7bad644
Port: <none>
Host