存储卷原理和编排

编程

Volume基础

Volume(存储卷)是Pod中能够被多个容器访问的共享目录。k8s的volume被定义在pod上,与pod的生命周期相同,支持多种先进的分布式文件系统。下面是一个使用emptyDir类型挂载存储卷的例子:

apiVersion: v1

kind: Pod

metadata:

name: test-pd

spec:

containers:

- image: k8s.gcr.io/test-webserver

name: test-container

volumeMounts:

- mountPath: /cache

name: cache-volume

volumes:

- name: cache-volume

emptyDir: {}

Volume类型

Kubernetes提供了非常丰富的Volume类型,以下是其中3种:

emptyDir

一个emptyDir Volume是在Pod分配到Node时创建的它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为这是Kubernetes自动分配的一个目录,当Pod从Node上移除时,emptyDir中的数据也会被永久删除。

hostPath

hostPath为在Pod上挂载宿主机上的文件或目录。

NFS

使用NFS网络文件系统提供的共享目录存储数据时,我们需要在系统中部署一个NFS Server。不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。

persistentVolumeClaim

persistentVolumeClaim卷用来将持久卷(PersistentVolume)挂载到 Pod 中。 持久卷是用户在不知道特定云环境细节的情况下"申领"持久存储(例如 GCE PersistentDisk 或者 iSCSI 卷)的一种方法。

subPath

volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径。下面是一个使用同一共享卷的、内含 LAMP 栈(Linux Apache Mysql PHP)的 Pod 的示例。 HTML 内容被映射到卷的 html 文件夹,数据库将被存储在卷的 mysql 文件夹中:

apiVersion: v1

kind: Pod

metadata:

name: my-lamp-site

spec:

containers:

- name: mysql

image: mysql

volumeMounts:

- mountPath: /var/lib/mysql

name: site-data

subPath: mysql

- name: php

image: php:7.0-apache

volumeMounts:

- mountPath: /var/www/html

name: site-data

subPath: html

volumes:

- name: site-data

persistentVolumeClaim:

claimName: my-lamp-site-data

PersistentVolume(PV)

PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”,比如Node也是一种容器应用可以“消费”的资源。PV由管理员创建和配置,它与共享存储的具体实现直接相关,例如GlusterFS、iSCSI、RBD或GCE或AWS公有云提供的共享存储,通过插件式的机制完成与共享存储的对接,以供应用访问和使用。

PV关键配置参数

存储能力(Capacity)

目前仅支持对存储空间的设置(storage=xx)

存储类别(Class)

PV可以设定其存储的类别,通过storageClassName参数指定一个StorageClass资源对象的名称

访问模式(Access Modes)

  • ReadWriteOnce(RWO):读写权限,并且只能被单个Node挂载。

  • ReadOnlyMany(ROX):只读权限,允许被多个Node挂载。

  • ReadWriteMany(RWX):读写权限,允许被多个Node挂载

回收策略(Reclaim Policy)

  • 保留(Retain):保留数据,需要手工处理。
  • 回收空间(Recycle):简单清除文件的操作(例如执行rm -rf /thevolume/*命令)。
  • 删除(Delete):与PV相连的后端存储完成Volume的删除操作

PV生命周期的各个阶段

  • Available:可用状态,还未与某个PVC绑定。
  • Bound:已与某个PVC绑定。
  • Released:绑定的PVC已经删除,资源已释放,但没有被集群回收。
  • Failed:自动资源回收失败。

PersistentVolumeClaim(PVC)

PVC则是用户对存储资源的一个“申请”。就像Pod“消费”Node的资源一样,PVC能够“消费”PV资源。PVC可以申请特定的存储空间和访问模式。

StorageClass

使用PVC“申请”到一定的存储空间仍然不能满足应用对存储设备的各种需求。通常应用程序都会对存储设备的特性和性能有不同的要求,包括读写速度、并发性能、数据冗余等更高的要求,Kubernetes从1.4版本开始引入了一个新的资源对象StorageClass,用于标记存储资源的特性和性能。基于StorageClass的动态资源供应模式将逐步成为云平台的标准存储配置模式。

StatefulSets的Volume配置

  • 给定 Pod 的存储必须由 PersistentVolume 驱动 (StorageClass存储提供者)基于所请求的 storage class 来提供,或者由管理员预先提供。
  • 删除或者收缩 StatefulSet 并不会删除它关联的存储卷。这样做是为了保证数据安全,它通常比自动清除 StatefulSet 所有相关的资源更有价值。

template:

metadata:

labels:

app: nginx

spec:

terminationGracePeriodSeconds: 10

containers:

- name: nginx

image: k8s.gcr.io/nginx-slim:0.8

volumeMounts:

- name: www

mountPath: /usr/share/nginx/html

volumeClaimTemplates: #与template对齐

- metadata:

name: www

spec:

accessModes: [ "ReadWriteOnce" ]

storageClassName: "my-storage-class"

resources:

requests:

storage: 1Gi

以上是 存储卷原理和编排 的全部内容, 来源链接: utcz.com/z/518533.html

回到顶部