Kubernetes存储
在Docker的设计实现中,容器数据是临时性的,当容器销毁或重启时存储在容器内部数据将全部丢失
但实际上很多容器化应用是需要持久化保存数据,K8S的POD和容器一样,重建销毁数据就会丢失,
K8S也通过挂载数据卷的方式为POD数据持久能力,这些数据卷以Pod为最小单位进行存储,
通过共享存储或分布式存储在POD之间实现共享。
存储使用场景
K8S是由Master节点以及Node节点组成,在Master节点中通过了etcd存储了K8S集群的节点信息、POD信息、容器信息、配置信息。
Node节点主要对外提供容器服务。
- 无转态服务:这种服务无需持久化存储,Pod重建也不会有任何影响。只要确保服务可靠性即可。
- 普通有状态服务:这类服务需要保留服务转态,通常有K8S提供vloume以及Persistent Volume、Persistent Volume Claim 来保存状态
- 有转态集群服务:这类服务除了保存服务转态,还需要提供集群管理接口和功能。此功能需要保存集群相关数据。
K8S中设计存储的主要使用场景
- 容器集群相关配置信息及运行时信息保存,这类存储在etcd中。
- 服务的配置信息及证书信息。
- 服务的状态存储、数据信息。
- 集群内不同服务交换共享的数据信息。
数据持久化的方式
- 临时文件形式:同一个POD中容器之间通过共享内存方式访问,会创建一个空目录,交换完毕后会删除
- HostPath方式:同一个Node中不同的POD之间信息共享使用HostPath方式。如果配置了EmptyDir数据卷,则Pod生命周期中都会存在。
- PV及PVC:K8S的持久化存储机制的核心是PV、PVC。PV是Volume插件,关联到真正的存储系统。
PVC从PV中申请PV资源,无需关心PV提供方。 POD获取PV资源,PVC提供资源。 - 网络方式: 不同的NODE节点之间数据共享通过网络方式使用,通常采用分布式存储。有GlusterFS和Ceph等分布式存储
Kubernetes提供了许多Volume类型:
- emptyDir
- hostPath
- gcePersistentDisk
- awsElasticBlockStore
- nfs
- iscsi
- flocker
- glusterfs
- rbd
- cephfs
- gitRepo
- secret
- persistentVolumeClaim
- downwardAPI
- azureDisk
- azureFileVolume
- vsphereVolume
- Quobyte
#emptyDir
apiVersion: v1
kind: Pod
metadata:
name: emptyDir-pd
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
#HostPath
apiVersion: v1
kind: Pod
metadata:
name: HostPath-pd
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
#pv-pvc-nfs.yml
#----------------创建pv---------------------
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-pv01 #创建的pv名称可创建多个.
namespace: mt-math #属于的命名空间
labels:
pv: pv-nfs-01 #定义pv标签,后续通过pvc绑定特定的pv标签。通常如果不写标签则默认通过访问方式和storage大小进行批量绑定。(重要)
spec:
capacity:
storage: 1Gi #创建的pv-nfs-pv01大小为1G
accessModes:
- ReadWriteMany
nfs: #创建的pv数据来源
path: /NFS/pv01 #数据源目录
server: 192.168.0.14 #数据源ip
---
#-----------------创建pvc------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-data-pvc #创建的pvc名称
namespace: mt-math #属于的命名空间
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi #请求大小为1G
selector: #定义标签选择器,此时k8s会根据标签,storage,访问方式 进行匹配。三者同时满足才会绑定。如果不定义,则系统会根据storage的大小和访问方式进行匹配绑定.
matchLabels:
pv: pv-nfs-01 #定义请求标签为pv-nfs-pv01的pv且大小为1G
Flex Volume存储方案管理
由于K8S提供PV、PVC创建时静态额,不够灵活,所以需要扩展。灵活存储有点:
- 方便用户存储,只需要UI或API中指定所需持久卷的名称和容量。然后用存储组件自动完成PVC、PV、Volume的动态创建。
- 存储组件使用唯一标识确定用户名的持久卷,并和分布存储(GlusterFS)真正物理Volume保存唯一映射。
- 在Pod进行重建或者迁移到其他节点是,POD可以自动挂载会原来的存储卷。
- 多个Pod可以共享一个持久卷。达到容器间文件共享目的。