Overview
根据应用是否需要持久存储数据以及某一次请求与当前请求是否具有关联性。
可以分为四类应用:
-
有状态有持久存储
-
有状态无持久存储
-
无状态无持久存储
-
无状态有持久存储
容器有生命周期,意味着数据若存放在容器自有名称中,随着pod的终结数据会被销毁。为此,需要将数据存放在pod自有的文件系统之外的地方。
为了能够将数据安全地持久化存储,则需要存在一个脱离节点的存储设备来存放数据,该存储设备应该被共享。
存储卷并不属于容器, 而属于pod。
docker image ls
查看镜像。
pod为什么能拥有存储卷和命名空间,pod底层有一个基础容器pause。在pod中运行的主容器是共享pause的命名空间的,属于基础架构容器。容器挂载存储卷实际是挂载pause的存储卷的。
容器的存储卷挂载宿主机的存储卷,宿主机的存储卷挂载外部的存储卷。 3级存储关系。
kubernetes 的存储卷
-
emptyDir 临时目录, 随着pod删除emptyDir也随之删除,当做缓存用。
-
hostPath 本地目录, 也不是持久性的存储。
-
SAN,NAS脱离主机节点的存储设备, NAS网络存储, SAN存储区域网络。 NAS中常见的协议nfs, cifs, http. SAN常见的协议, iSCSI.
-
分布式存储: glusterfs, rbd(ceph的块存储), cephfs
-
云存储: EBS(弹性块存储), Azure Disk
kubernetes 使用存储卷
清单1
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
sky.com/create-by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
volumeMounts:
- name: html
MountPath: /data/web/html/ # 挂载点
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data/ # 挂载点
command:
- "/bin/sh"
- "-c"
- "sleep 7200"
volumes:
- name: html # 配置的卷
emptyDir: {}
清单2
第一个主容器向web端提供服务,第二个pod生成新的网页。
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
sky.com/created.by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data/
command: ['/bin/sh']
args: ['-c', 'while true; do echo $(date) >> /data/index.html; sleep 2; done']
volumes:
- name: html
empdir: {}
示例应用
-
示例1, 查看kubernetes支持哪几种方式的存储。
kubectl explain pods.spec.volumes
-
示例2, 创建清单1的示例,
kubectl apply -f pod-vol-demo.yaml
-
示例3, 连接pod-demo容器,
kubectl exec -it pod-demo -c busybox -- /bin/sh
ls
mount
#
echo $(date) >> /data/index.html
- 示例4, 连接pod-demo容器,
kubectl exec -it pod-demo -c myapp -- /bin/sh
ls /data/web/html
# 检查是否是共享的文件
- 示例5, 创建清单2的示例,
kubectl apply -f pod-vol-demo.yaml