目前有两个问题摆在大家面前:
第一、由于容器本身是非持久化的,当容器崩溃后,kubelet将以镜像的初始状态重新启动容器,但是此时之前容器的数据已经丢失,我们该如何保护好容器的数据呢?
第二、在同一Pod中的容器往往需要共享一些数据,此时我们又该如何实现呢?
kubernetes为了解决以上问题,引入了存储卷Volume。
- Kubernetes中的卷有明确的寿命——与封装它的Pod相同,所以卷的生命比Pod中的所有容器都长,当容器重启时数据仍然存在。
- 同时卷是独立于容器之外的,容器可以引用卷中的数据就可以达到共享数据的目的
在Pod中通过指定下面的字段来使用存储卷:
- spec.volumes:通过此字段提供指定的存储卷
- spec.containers.volumeMounts:通过此字段将存储卷挂接到容器中
一、存储卷类型
- awsElasticBlockStore
- azureDisk
- azureFile
- cephfs
- configMap
- csi
- downwardAPI
- emptyDir
- fc (fibre channel)
- flocker
- gcePersistentDisk
- gitRepo (deprecated)
- glusterfs
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- projected
- portworxVolume
- quobyte
- rbd
- scaleIO
- secret
- storageos
- vsphereVolume
- configMap
二、存储卷使用实例
1. emptyDir
属于本地存储,只要Pod一删,emptyDir也将会一并删除,所以其生命周期和Pod一样,它是当临时目录或缓存使用的,没有持久性。下面我们创建一个使用emptyDir存储卷的Pod。
创建Pod配置清单文件(使用volumes和volumeMounts字段):
[root@master manifests]# vim pod-vol-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
magedu.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/
co