tnblog
首页
视频
资源
登录

Kubernetes 应用存储和持久化数据卷

6423人阅读 2021/3/16 14:49 总访问:3470826 评论:0 收藏:0 手机
分类: 容器编排

Kubernetes

Kubernetes 应用配置管理

Volumes介绍

Pod Volumes


1. 如果一个Pod中某一个容器异常退出,被kubelet拉起如何保证之前的重要数据不丢?
2. 同一个Pod的多个容器如何共享数据?

Kubernetes Volume 类型:
1. 本地存储: emptydir/hostpath…
2. 网络存储:
- in-tree: awsElasticBlockStore/gcePersistentDisk/nfs …
- out-of-tree: flexvolume/csi等网络存储volume plugins
3. Projected Volume: secret/configmap/downwardAPI/serviceAccountToken
4. PVC与PV体系

Persistent Volumes(持久卷)


Pod中声明的volume的生命周期与Pod相同,以下常见场景:
1. Pod销毁重建(如Deployment管理的Pod镜像升级)
2. 宿主机故障迁移(如StatefulSet管理的Pod带远程volume迁移)
3. 多Pod共享同一个数据volume
4. 数据volume snapshot,resize等功能的扩展实现

不足之处:
使用Pod Volumes无法准确表达数据volume复用/共享语义,新功能扩展很难实现。

优化:
如果能将存储与计算分离,使用不同的组件(Controllers)管理存储与计算资源,解耦Pod与Volume的生命周期关联,可以很好的解决这些场景下的问题。

PersistentVolumeClaim(PVC)设计意图


有了PV,为什么又设计了PVC?

1. 职责分离,PVC中只声明自己需要的存储size,access mode(单node独占还是多node共享?只读还是读写访问?)等业务真正关心的存储需求(不用关心存储实现细节),PV和其对应的后端存储信息则由交给cluster admin统一运维和管控,安全访问策略更容易控制。

2. PVC简化了User对存储的需求,PV才是存储的实际信息的承载体,通过kube-controller-manager中的PersisentVolumeController将PVC与合适的PV bound到一起,从而满足User对存储的实际需求。

3. PVC像是面向对象编程中抽象出来的接口,PV是接口对应的实现。

Static Volume Provisioning


Static Volume Provisioning的不足:

Cluster Admin需要提前规划或预测存储需求,而User的需求是多样化的,很容易导致User提交的PVC找不到合适的PV。
(举例我只需要20G,但你告诉我只有50G和100G的PV,这样就造成了资源浪费)

更好的方式:

Cluster Admin只创建不同类型存储的模板,User在PVC中指定使用哪种存储模板以及自己需要的大小、访问方式等参数,然后K8s自动生成相应的PV对象。

Dynamic Volume Provisioning


这里的StorageClass就是前文所说的创建PV的模板,它包含了创建某种具体类型的PV所需要的参数信息,User无需关心这些PV的细节。

而K8s则会结合PVC和SC两者的信息动态创建PV对象

Pod Volumes使用



.spec.volumes 声明pod的volumes信息

.spec.containers.volumeMounts声明container如何使用pod的volumes

多个container共享同一个volume时,可以通过.spec.containers.volumeMounts.subPath隔离不同容器在同个volume上数据存储的路径

Static Volume Provisioning


以使用阿里云文件存储(NAS)为例:
Cluster Admin:
1. 通过阿里云文件存储控制台,创建NAS文件系统和添加挂载点。
2. 创建PV对象,将NAS文件系统大小,挂载点,以及PV的access mode,reclaim policy等信息添加到PV对象中。

User:
1. 创建PVC对象,声明存储需求。
2. 创建应员工pod并通过.spec.volumes中通过PVC声明volume,通过.spec.containers.volumeMounts声明container挂载使用该volume。

系统管理员预先创建PV

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv-nas
  5. labels:
  6. alicloud-pvname: pv-nas
  7. spec:
  8. capacity:
  9. storage: 5Gi # 该volume的总容量大小
  10. accessModes:
  11. - ReadWriteMany # 该volume可以被多个node上的pod挂载使用且都具有读写权限
  12. persisentVolumeReclaimPolicy: Retain # 该volume使用后被release之后的回收策略
  13. csi:
  14. driver: nasplugin.csi.alibabacloud.com # 指定由什么volume plugin来挂载该volume(需要提前在node上部署)
  15. volumeHandle: pv-nas
  16. volumeAttributes:
  17. server: "2564f49129-ysu87.cn-shenzhen.nas.aliyuncs.com"
  18. path: "/csi"
  19. mountOptions:
  20. - nolock,tcp,noresvport
  21. - vers=3
参数 描述
driver 定义驱动类型。本例中取值为nasplugin.csi.alibabacloud.com,表示使用阿里云NAS CSI插件。
volumeHandle 配置PV的名称。
server NAS挂载点。
path 挂载子目录,极速NAS需要以/share开头
vers 挂载NAS数据卷的NFS协议版本号,推荐使用v3;极速类型NAS只支持v3。
AccessModes PV访问策略控制列表,必须同PVC的访问策略控制列表匹配才能绑定(bound)
- ReadWriteOnce只允许单node访问
- ReadOnlyMany允许多个node只读访问
- ReadWriteMany允许多node读写访问
一个PV可以设置多个访问策略,PVC与PV bound时,PV Controller会优先找到 AccessModes 列表最短并且匹配PVC AccessModes 列表的 PV 集合,然后从该集合中找到Capacity最小且符合PVC size 需求的PV对象
PersistentVolumeReclaimPolicy PV被release之后(与之bound的PVC被删除)回收再利用策略
- Recycle
- Delete: volume被release之后直接delete,需要volume plugin支持
- Retain: 默认策略,由系统管理员来手动管理该volume
StorageClassName PVC可通过该字段找到相同值的PV(静态provisioning),也可通过字段对应的storageclass从而动态provisioning新PV对象
NodeAffinity 限制可以访问该volume的nodes,对使用该volume的pod的调度有影响(因为使用该volume的pod只能调度访问该PV的node上才能正常访问)

用户创建PVC对象

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: pvc-nas
  5. spec:
  6. accessModes:
  7. - ReadWriteMany
  8. resources:
  9. requests:
  10. storage: 5Gi
  11. selector:
  12. matchLabels:
  13. alicloud-pvname: pv-nas

创建应用示例

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-nas
  5. labels:
  6. app: nginx
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: nginx
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: nginx:1.7.9
  19. ports:
  20. - containerPort: 80
  21. volumeMounts:
  22. - name: pv-nas
  23. mountPath: "/data"
  24. volumes:
  25. - name: pv-nas
  26. persistentVolumeClaim:
  27. claimName: pvc-nas

Dynamic Volume Provisioning

  1. # 创建storage-class-topology.yaml文件。
  2. vim storage-class-topology.yaml
  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: alicloud-disk-topology-ssd
  5. provisioner: diskplugin.csi.alibabacloud.com
  6. parameters:
  7. type: cloud_ssd
  8. reclaimPolicy: Retain
  9. volumeBindingMode: WaitForFirstConsumer
  10. allowVolumeExpansion: true
参数 描述
provisioner 配置为diskplugin.csi.alibabacloud.com。标识StorageClass使用阿里云云盘provisioner插件创建。
type 标识云盘类型,支持cloud_efficiency、cloud_ssd、cloud_essd、available四种参数,其中available会对ESSD、SSD、高效依次尝试创建,直到创建成功。
reclaimPolicy 云盘的回收策略,默认为Delete,支持Retain。
Delete模式:删除PVC的时候,PV和云盘会一起删除。
Retain模式:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain方式以免误删数据。
encrypted 可选参数,标识创建的云盘是否加密。默认情况是false,创建的云盘不加密。
volumeBindingMode WaitForFirstConsumer时表示使用延迟绑定,即调度器先调度pod,并根据pod的可用区信息创建云盘。
allowVolumeExpansion 配置为true时,可以实现云盘的自动扩容。
performanceLevel 值为PL1、PL2、或PL3。更多信息,请参见容量范围与性能级别的关系。
  1. # 执行以下命令,创建StorageClass。
  2. kubectl apply -f storage-class-csi.yaml

创建 PVC 以下模板为创建动态卷PV的示例YAML。

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: disk-pvc
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. resources:
  9. requests:
  10. storage: 25Gi
  11. storageClassName: alicloud-disk-ssd

注意:storage:定义申请云盘大小,最小为20GiB。

创建应用

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: nginx
  5. labels:
  6. app: nginx
  7. spec:
  8. ports:
  9. - port: 80
  10. name: web
  11. clusterIP: None
  12. selector:
  13. app: nginx
  14. ---
  15. apiVersion: apps/v1
  16. kind: StatefulSet
  17. metadata:
  18. name: web
  19. spec:
  20. selector:
  21. matchLabels:
  22. app: nginx
  23. serviceName: "nginx"
  24. template:
  25. metadata:
  26. labels:
  27. app: nginx
  28. spec:
  29. containers:
  30. - name: nginx
  31. image: nginx
  32. ports:
  33. - containerPort: 80
  34. name: web
  35. volumeMounts:
  36. - name: pvc-disk
  37. mountPath: /data
  38. volumes:
  39. - name: pvc-disk
  40. persistentVolumeClaim:
  41. claimName: disk-pvc

PV状态流转


达到released状态的PV无法根据Reclaim Policy回到available状态而再次bound新的PVC。此时,如果想复用原来PV对应的存储中的数据,只有两种方式:
1. 复用old PV中记录的存储信息新建PV对象。
2. 直接从PVC对象复用,即不unbound PVC和PV(即:StatefulSet处理存储状态的原理)。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

阿里云 Kubernetes

https://help.aliyun.com/document_detail/86759.html 可以有三种计费方式https://ecs-buy.aliyun.com/wizard?spm=5176.13...

Kubernetes Job讲解

kubernetes Job讲解[TOC] 需求来源Job 背景问题我们可以通过Pod来直接运行任务进程吗?这样做将会产生以下几种问题:1. 我...

Kubernetes DaemonSet讲解

Kubernetes DaemonSet讲解[TOC] 需求来源背景问题我们可以让每个集群内的节点都运行一个相同的Pod吗?如果这样做,以下的...

Kubernetes Pod中断预算【PDB】

Kubernetes Pod中断预算【PDB】[TOC] 尽管Deployment或ReplicaSet一类的控制器能够确保相应Pod对象的副本数量不断逼近期...

Kubernetes Velero 备份的运用

Velero 的运用[TOC] Velero简介Velero是一个开源工具,可以安全地备份,恢复和迁移Kubernetes集群和持久卷。它既可以在本...

Kubernetes 应用配置管理

Kubernetes 应用配置管理[TOC] 需求来源背景问题除了依托容器镜像来定义运行的Container,Pod还需要解决如下问题:1. 不可...

Kubernetes 应用存储和持久化数据卷:存储快照与拓扑调度

Kubernetes 应用存储和持久化数据卷:存储快照与拓扑调度[TOC] 基本知识存储快照产生背景1. 如何保证重要数据在误操作之后...

Kubernetes网络(IPVLAN与MACVLAN)

Kubernetes网络模型[TOC] 三种网络模型 在k8s中一般常见的网络模型支持三种,虚拟网桥、多路复用和硬件交换。 虚拟网...

Kubernetes IP Address

Kubernetes IP Address[TOC] IP AddressIP地址是在计算机网络中被用来唯一标识设备的一组数字。IPv4地址由32位二进制数值...

Dapr 官方教程第二章(Hello World Kubernetes)

Dapr 官方教程第二章(Hello World Kubernetes)[TOC] 本教程将帮助您在 Kubernetes 集群中使用 Dapr。您将从Hello World部...

Kubernetes 搭建RabbitMq集群环境

Kubernetes 搭建RabbitMq集群环境[TOC] 由于Kubectl RabbitMQ 插件在官方是基于krew进行安装的所以我们首先需要安装krew插...

Kubernetes 删除命名空间

Kubernetes 删除命名空间[TOC] 可以直接通过如下命令删除k8s中命名空间下的所有资源。kubectl delete ns [namespace] ...

Kubernetes top之安装metrics-server

Kubernetes top之安装metrics-server[TOC] 一般我们需要知道kubernetes的pod与node的cpu与内存使用情况时,我们可以通过ku...

Kubernetes ExternalName Service

Kubernetes ExternalName Service[TOC] ExternalName 的服务与普通服务的区别在于:将服务映射到 DNS 名称。如下图所示: ...

Kubernetes 自定义Endpoint资源

Kubernetes 自定义Endpoint资源[TOC] 当pod需要服务发布出去的时候中间所关联的还有一个Endpoint这个资源,它能确定服务关...
这一世以无限游戏为使命!
排名
2
文章
635
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术