云原生第6课:Kubernetes持久化数据卷管理

点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

本篇文章来自《华为云云原生王者之路训练营》黄金系列课程第6课,由华为云容器技术专家Jabin主讲,详细介绍有状态应用StagefulSet,PersistentVolume,PersistentVolumeClaim及StorageClass的概念及使用。

主要内容包含4个部分:

  • 有状态应用(StatefulSet)介绍

  • PV/PVC/SC介绍

  • 华为云CCE存储管理功能使用介绍

  • 实验:基于CCE集群快速部署web系统的有状态应用DB数据库

前言

从上节课程(云原生第5课:Kubernetes工作负载管理应用是为了某项特殊的任务而编写的程序。程序是由算法和数据组成的。在生产环境中,除了一些无状态应用外,还有一部分应用需要将结果数据(也即:状态)缓存下来,并永久的记录在存储中,以供后续使用。这类应用就是我们将要讨论的“有状态应用”,与“无状态应用”相比,我们期望“有状态应用” 具有哪些能力呢?

1)计算维度:

  • 每个pod的名字需要是稳定的,不会发生变化的;

  • pods之间的启动、升级、退出可以按照某种顺序控制的;

2)存储维度:

  • 存储是持久的,拥有独立于pod的生命周期,不会随着pod的生命周期结束而销毁;

  • 每个pod与其使用的存储关系是稳定的,不会因升级等因素而发生变化;

3)网络维度:

  • 每个pod的有独立、稳定的网络标识;

01

有状态应用(StatefulSet)介绍 

有状态应用(StatefulSet)概念介绍

基于社区对有状态应用的通用需求,K8S设计了一种有状态应用对象,也即:StatefulSet。它可以为用户提供一组具有稳定、有序、唯一特性的应用实例集合。如右图所示:

9b1cf6d041fc76a900a94abaf04c1816.png

1)稳定:

  • 稳定的podName:{stsName}-{序号[0-n]}

  • 稳定的网络标识:{podName}. {headless-svcName}.{namespace}.svc.cluster.local

  • 稳定的存储关系:{volumeClaimTemplatesName}-{podName}

2)有序:

  • 按照编号从小到大顺序的部署:0 ~ n

  • 按照编号从大到小进行删除:n ~ 0

  • 支持有序的扩缩容和升级策略

3)唯一:

  • 每个pod拥有一个唯一的网络标识:{podName}. {headless-svcName}.{namespace}.svc.cluster.local

从下图可以看出,与Deployment通过ReplicaSet来管理pod生命周期不同,StatefulSet是直接管理pod的。

cd57ae4b61d41a914c6141c3fd307be9.png

有状态应用(StatefulSet)样例模板详解

请观看课程视频5分12秒-6分23秒:

https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXI035+Self-paced/about

83bfee21cd3da2ba5159980d7f02521a.png

常用操作小结

# kubectl create -f mysql-adv-sts.yaml

# kubectl -n default get sts

NAME        READY   AGE
mysql-adv   3/3     17m

# kubectl -n default get svc

NAME       TYPE     CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
mysql-adv      ClusterIP   10.247.168.413306/TCP   17m
mysql-adv-headless   ClusterIP   None3306/TCP   17m

# kubectl -n default get pod

NAME                       READY   STATUS    RESTARTS   AGE
mysql-adv-0                1/1     Running   0          17m
mysql-adv-1                1/1     Running   0          17m
mysql-adv-2                1/1     Running   0          17m

# kubectl -n default scale statefulset mysql-adv --replicas=1

# kubectl -n default scale statefulset mysql-adv --replicas=3

# kubectl patch statefulset mysql-adv --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"mysql:5.7"}]‘

# kubectl -n default get pod

NAME                       READY   STATUS    RESTARTS   AGE
mysql-adv-0                1/1     Running   0          20m
mysql-adv-1                1/1     Running   0          12s
mysql-adv-2                1/1     Running   0          12s

# kubectl get pods -o wide

NAME  READY   STATUS   RESTARTS   AGE  IP   NODE   NOMINATED NODE   READINESS GATES
mysql-adv-0   1/1     Running      0     47m     172.16.1.111   10.1.20.7
mysql-adv-1    1/1     Running     0     26m     172.16.0.107   10.1.19.71
mysql-adv-2    0/1     ContainerCreating   0  11s10.1.23.66

# kubectl delete sts mysql-adv

02

 PV/PVC/SC介绍 

PV/PVC/SC概念介绍

  • PersistentVolume:简称pv,持久化存储,是k8s为云原生应用提供一种拥有独立生命周期的、用户可管理的存储的抽象设计。

  • PersistentVolumeClaim:简称pvc,持久化存储声明,是k8s为解耦云原生应用和数据存储而设计的,通过pvc可以让资源管控更细更灵活、应用模板更通用。

  • StorageClass:简称sc,存储类,是k8s平台为存储提供商提供存储接入的一种声明。通过sc和相应的存储插件(csi)为容器应用提供持久存储卷的能力。

1e68b89bc91dfab97fc9c39690b8f83f.png

PVC样例模板详解

PVC中定义应用所需的规格等配置:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
everest.io/disk-volume-type: sata
volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
labels:
app: mysql-adv-mgmd
release: mysql-adv
name: mysql-data-mysql-adv-mgmd-0
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-disk
volumeMode: Filesystem

1)accessModes:

  • ReadWriteOnce:允许以读写能力挂载到一个host上,如:云盘

  • ReadOnlyMany:允许以只读能力挂到多个host上,如:文件存储

  • ReadWriteMany:允许以读写能力挂载到多个host上,如:文件存储

2)volumeMode:

  • Filesystem:将云盘挂载为文件系统

  • Block:将云盘挂载为块设备

3)Resources:

  • Requests:最小容量

  • Limites:最大容量

4)storageClassName:sc名字

5)mountOptions:mount指令中的options

SC样例模板详解

apiVersion: storage.k8s.io/v1


kind: StorageClass
metadata:
name: csi-disk-ssd
parameters:
csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
csi.storage.k8s.io/fstype: ext4
everest.io/disk-volume-type: SSD
everest.io/passthrough: "true"
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

SC中定义存储类型和驱动等配置:

1)Parameters:插件驱动定义的参数

2)Provisioner:指定存储卷的供应者

3)reclaimPolicy:

  • Retain:保留

  • Delete:删除

4)volumeBindingMode:

  • Immediate:立即绑定

  • WaitForFirstConsumer:延迟绑定

5)allowVolumeExpansion:

  • True:允许扩容

  • False:不允许扩容

PV样例模板详解

apiVersion: v1
kind: PersistentVolume
metadata:
name: static-volume
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 10Gi
csi:
driver: disk.csi.everest.io
fsType: ext4
volumeAttributes:
everest.io/disk-mode: SCSI
everest.io/disk-volume-type: SATA
storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner
volumeHandle: 9a074a5b-a67e-4fae-860e-07c5307594ea
persistentVolumeReclaimPolicy: Delete
storageClassName: csi-disk
volumeMode: Filesystem

PV中定义应用所需的规格等配置:

1)accessModes:

  • ReadWriteOnce:允许以读写能力挂载到一个host上,如:云盘

  • ReadOnlyMany:允许以只读能力挂到多个host上,如:文件存储

  • ReadWriteMany:允许以读写能力挂载到多个host上,如:文件存储

2)capacity

  • storage:容量大小

3)csi:out-tree驱动类型

  • Driver:驱动名字

  • fstType:磁盘文件类型

  • volumeAttributes:存储驱动定义的参数

  • volumeHandle:存储volume的唯一ID

4)persistentVolumeReclaimPolicy:

  • Retain:保留

  • Delete:删除

5)storageClassName:sc名字

6)volumeMode:

  • Filesystem:将云盘挂载为文件系统

  • Block:将云盘挂载为块设备

有状态应用&持久化存储的最佳实践

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-adv
  namespace: default
spec:
  podManagementPolicy: Parallel
  replicas: 3
  serviceName: mysql-adv-headless
  template:
    spec:
      containers:
        image: mysql:latest
        imagePullPolicy: Always
        name: container-0
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 2
    type: RollingUpdate
  volumeClaimTemplates:
  - metadata:
      annotations:
        everest.io/disk-volume-type: SATA
      name: mysql-data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: csi-disk
      volumeMode: Filesystem

2ab915853a15c20181e1090812869286.png

# kubectl get pvc

NAME                      STATUS    VOLUME                                 CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-data-mysql-adv-0   Bound    pvc-b4d21c69-9101-4721-bc97-8d319a5f961e   1Gi        RWO            csi-disk    10h
mysql-data-mysql-adv-1   Bound    pvc-d7387797-8ff5-457a-a2b9-2fb22d5d4e11    1Gi        RWO            csi-disk    10h
mysql-data-mysql-adv-2   Bound    pvc-85fb7ffc-8ca4-4381-8b23-9156dd929fea     1Gi         RWO            csi-disk    10h

# kubectl get pv

NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM         STORAGECLASS   REASON   AGE
pvc-85fb7ffc-8ca4-4381-8b23-9156dd929fea    1Gi  RWO  Delete    Bound  default/mysql-data-mysql-adv-2 csi-disk   10h
pvc-b4d21c69-9101-4721-bc97-8d319a5f961e  1Gi  RWO  Delete    Bound  default/mysql-data-mysql-adv-0 csi-disk   10h
pvc-d7387797-8ff5-457a-a2b9-2fb22d5d4e11   1Gi  RWO  Delete    Bound  default/mysql-data-mysql-adv-1 csi-disk   10h

常用操作小结

# kubectl create -f pv.yaml

# kubectl get pv | grep static-volume

static-volume 10Gi  RWO Delete  Available   csi-disk  3s

# kubectl create -f pvc.yaml

# kubectl get pvc,pv -A | grep mysql-data-mysql-adv

NAME           PROVISIONER               RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE


default     persistentvolumeclaim/mysql-data-mysql-adv-0   Bound    static-volume       10Gi       RWO    csi-disk       2m44s


persistentvolume/static-volume  10Gi  RWO Delete  Bound    default/mysql-data-mysql-adv-0   csi-disk       18m

# kubectl create -f sc.yaml

# kubectl get sc csi-disk-ssd

csi-disk-ssd   everest-csi-provisioner   Delete          Immediate           true                   9s

# kubectl delete pvc mysql-data-mysql-adv-0

# kubectl delete pv static-volume

# kubectl delete sc csi-disk-ssd

03

 华为云CCE存储管理功能使用介绍

华为云CCE存储管理功能使用介绍:静态卷

CCE提供多种存储:

  • 云硬盘存储卷

  • 文件存储卷

  • 极速文件系统存储卷

  • 对象存储卷

CCE提供两种静态卷的创建方式:

  • 通过购买新的存储创建PVC;

  • 通过导入已有的存储创建PVC;

3afb4f0fa1680a4ff44b21f0fb325403.png

19a8cac40b2e8537c9efa7c63aae7ca2.png

a5f46685a9c24929502ed517a07c12c4.png

华为云CCE存储管理功能使用介绍:动态卷

动态卷也提供云硬盘存储卷、文件存储卷、极速文件系统存储卷、对象存储卷四大类,同样在使用动态卷的过程中,也根据存储卷得不同类型对用户展示也是不同的。

以云盘为例,提供访问的方式、可用区域、是否要加密,挂载到容器的目录路径等:

93eff0ca25c96be546caee3a86ceecae.png

当创建完成后,在页面的列表中容器可以使用多个存储卷:

a84f36c76fc12b6d07f85dc124c8c4b7.png

另外,如下如展示也可以添加对象存储以及极速文件系统:

3f0e589368e24756eae51a0a3c85af6e.png

b99d24c00fa04f7d17d9cfeca0d4d039.png

04

 实验:基于CCE集群快速部署web系统的有状态应用DB数据库 


本课实验:基于CCE集群快速部署web系统的有状态应用DB数据库

请观看课程视频16分58秒-22分:

https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXI035+Self-paced/about


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

5aa16095fdddd46047d7b6e5c3894463.gif

0a621201005e865892e913a74b42cf41.gif

喜欢就点个"在看"呗,留言、转发朋友圈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值