详情页标题前

阿里云容器服务ACK实现StatefulSet持久化存储的最佳实践-CSI-云淘科技

详情页1

有状态服务StatefulSet支持通过VolumeClaimTemplate为每个Pod创建PV和PVC。并且删除和减少Pod时,不会删除StatefulSet的PV和PVC。本文为您介绍如何通过VolumeClaimTemplate实现StatefulSet持久化存储

前提条件

创建Kubernetes托管版集群

应用场景

有状态服务StatefulSet的应用场景:

  • 稳定的部署次序:有序部署或扩展,需要根据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前,所有之前的Pod必须都是Running和Ready状态)。

  • 稳定的缩容次序:有序收缩或删除,需要根据定义的顺序依次进行(即从N-1到0,从N-1到0, 在下一个Pod执行结束之前 ,所有之前的Pod都需要删除完成)。

  • 稳定的网络标志:Pod重新调度后其PodName和HostName不变。

  • 稳定的持久化存储:基于PVC,Pod重新调度后仍能访问到相同的持久化数据。

创建StatefulSet服务

您可以通过VolumeClaimTemplates自动创建PVC及PV。

说明

volumeClaimTemplates:表示一类PVC的模板,系统会根据有状态服务-StatefulSet配置的replicas数量,创建相应数量的PVC。这些PVC除了名字不一样,其他配置都相同。

  1. 使用以下内容,创建statefulset.yaml。

    创建一个Service和StatefulSet,并且设置该StatefulSet包含2个Pod。

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: disk-ssd
              mountPath: /data
      volumeClaimTemplates:
      - metadata:
          name: disk-ssd
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alicloud-disk-ssd"
          resources:
            requests:
              storage: 20Gi
    • replicas:本例中设置为2,表示创建2个Pod。

    • mountPath:云盘在容器中挂载的位置。

    • accessModes:访问模式。

    • storageClassName:本例配置为alicloud-disk-ssd,表示使用的是阿里SSD类型的云盘。

    • storage:声明应用的使用量。

  2. 执行以下命令,部署StatefulSet服务。

    kubectl create -f statefulset.yaml
  3. 执行以下命令,查看已部署的Pod。

    kubectl get pod

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    web-0                         1/1     Running   0          6m
    web-1                         1/1     Running   0          6m
  4. 执行以下命令,查看PVC。

    kubectl get pvc

    预期输出:

    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    disk-ssd-web-0   Bound    d-2zegw7et6xc96nbojuoo   20Gi       RWO            alicloud-disk-ssd   7m
    disk-ssd-web-1   Bound    d-2zefbrqggvkd10xb523h   20Gi       RWO            alicloud-disk-ssd   6m

验证PVC会根据StatefulSet服务扩容而扩容

  1. 执行以下命令,扩容StatefulSet服务到3个Pod。

    kubectl scale sts web --replicas=3

    预期输出:

    statefulset.apps/web scaled
  2. 执行以下命令,查看扩容后的Pod。

    kubectl get pod

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    web-0                         1/1     Running   0          34m
    web-1                         1/1     Running   0          33m
    web-2                         1/1     Running   0          26m
  3. 执行以下命令,查看扩容后的PVC。

    kubectl get pvc

    预期输出:

    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    disk-ssd-web-0   Bound    d-2zegw7et6xc96nbojuoo   20Gi       RWO            alicloud-disk-ssd   35m
    disk-ssd-web-1   Bound    d-2zefbrqggvkd10xb523h   20Gi       RWO            alicloud-disk-ssd   34m
    disk-ssd-web-2   Bound    d-2ze4jx1zymn4n9j3pic2   20Gi       RWO            alicloud-disk-ssd   27m

    可以看到,StatefulSet扩容到3个Pod后,PVC也扩容到3个。

验证缩容StatefulSet后,PVC保持不变

  1. 执行以下命令,缩减StatefulSet服务到2个Pod。

    kubectl scale sts web --replicas=2

    预期输出:

    statefulset.apps/web scaled
  2. 执行以下命令,查看缩容后的Pod。

    kubectl get pod

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    web-0                         1/1     Running   0          38m
    web-1                         1/1     Running   0          38m

    Pod的数量已缩减为2。

  3. 执行以下命令,查看缩容后的PVC。

    kubectl get pvc

    预期输出:

    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    disk-ssd-web-0   Bound    d-2zegw7et6xc96nbojuoo   20Gi       RWO            alicloud-disk-ssd   39m
    disk-ssd-web-1   Bound    d-2zefbrqggvkd10xb523h   20Gi       RWO            alicloud-disk-ssd   39m
    disk-ssd-web-2   Bound    d-2ze4jx1zymn4n9j3pic2   20Gi       RWO            alicloud-disk-ssd   31m

    缩容StatefulSet到2个Pod后,PVC仍为3个。说明PVC不会因StatefulSet缩容而缩减。

验证StatefulSet再次扩容后,PVC保持不变

验证StatefulSet扩容后缩容,再次扩容后,PVC保持不变。

  1. 执行以下命令,扩容StatefulSet服务到3个Pod。

    kubectl scale sts web --replicas=3

    预期输出:

    statefulset.apps/web scaled
  2. 执行以下命令,查看扩容后的Pod。

    kubectl get pod

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    web-0                         1/1     Running   0          1h
    web-1                         1/1     Running   0          1h
    web-2                         1/1     Running   0          8s
  3. 执行以下命令,查看扩容后的PVC。

    kubectl get pvc

    预期输出:

    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    disk-ssd-web-0   Bound    d-2zegw7et6xc96nbojuoo   20Gi       RWO            alicloud-disk-ssd   1h
    disk-ssd-web-1   Bound    d-2zefbrqggvkd10xb523h   20Gi       RWO            alicloud-disk-ssd   1h
    disk-ssd-web-2   Bound    d-2ze4jx1zymn4n9j3pic2   20Gi       RWO            alicloud-disk-ssd   1h

    扩容后新创建的Pod仍会使用原来的PVC。

验证删除StatefulSet服务的Pod,PVC保持不变

  1. 执行以下命令,查看名称为web-1的Pod,引用的PVC。

    kubectl describe pod web-1 | grep ClaimName

    预期输出:

    ClaimName:  disk-ssd-web-1
  2. 执行以下命令,删除名称为web-1的Pod。

    kubectl delete pod web-1

    预期输出:

    pod "web-1" deleted
  3. 执行以下命令,查看Pod。

    kubectl get pod

    预期输出:

    NAME                          READY   STATUS    RESTARTS   AGE
    web-0                         1/1     Running   0          1h
    web-1                         1/1     Running   0          25s
    web-2                         1/1     Running   0          9m

    重新创建的Pod与删除前的Pod名称一致。

  4. 执行以下命令,查看PVC。

    kubectl get pvc

    预期输出:

    NAME             STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    disk-ssd-web-0   Bound    d-2zegw7et6xc96nbojuoo   20Gi       RWO            alicloud-disk-ssd   1h
    disk-ssd-web-1   Bound    d-2zefbrqggvkd10xb523h   20Gi       RWO            alicloud-disk-ssd   1h
    disk-ssd-web-2   Bound    d-2ze4jx1zymn4n9j3pic2   20Gi       RWO            alicloud-disk-ssd   1h

    删除后新创建的Pod仍会使用原来的PVC。

验证StatefulSet服务的持久化存储

  1. 执行以下命令,查看/data路径下的文件。

    kubectl exec web-1 -- ls /data

    预期输出:

    lost+found
  2. 执行以下命令,在/data路径下创建文件statefulset。

    kubectl exec web-1 -- touch /data/statefulset
  3. 执行以下命令,查看/data路径下的文件。

    kubectl exec web-1 -- ls /data

    预期输出:

    lost+found
    statefulset
  4. 执行以下命令,删除名称为web-1的Pod。

    kubectl delete pod web-1

    预期输出:

    pod "web-1" deleted
  5. 执行以下命令,查看/data路径下的文件。

    kubectl exec web-1 -- ls /data

    预期输出:

    lost+found
    statefulset

    statefulset文件仍然存在,说明云盘的数据可持久化保存。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:http://www.yunxiaoer.com/171278.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云容器服务ACK存储CSI概述-云淘科技

    容器服务ACK Serverless支持自动绑定阿里云云盘、阿里云文件存储NAS(Network Attached Storage ),支持CSI挂载方式。本文介绍支持的存储卷及存储插件。 CSI存储卷 目前CSI驱动支持静态存储卷和动态存储卷。每种数据卷的支持情况如下: 阿里云存储 静态数据卷 动态数据卷 阿里云云盘 支持使用CSI驱动以PV、PVC方式挂…

    阿里云容器服务 2023年12月10日
  • 阿里云容器服务ACK使用NAS静态存储卷-云淘科技

    NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。本文介绍如何使用阿里云NAS静态存储卷,及如何实现持久化存储与共享存储。 前提条件 已创建Kubernetes集群。具体操作,请参见创建Kubernetes托管版集群。 已创建NAS文件系统。具体操作,请参见创建文件系统。 若需要加密NAS存储卷中的数据,创建NAS文件系统时请配置加密…

    阿里云容器服务 2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云容器服务ACK使用云盘静态存储卷-云淘科技

    云盘是阿里云为云服务器ECS提供的数据块级别的块存储产品,具有低时延、高性能、持久性、高可靠等特点。集群支持使用CSI插件创建云盘静态存储卷和动态存储卷。本文介绍如何在CSI插件中挂载云盘静态存储卷及使用云盘静态存储卷如何实现持久化存储。 前提条件 已创建集群,并且在该集群中安装CSI插件。具体操作,请参见创建Kubernetes托管版集群、创建ACK Se…

    阿里云容器服务 2023年12月10日
  • 阿里云容器服务ACK使用NAS静态存储卷-云淘科技

    NAS存储卷是一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。本文介绍如何使用阿里云NAS静态存储卷,及如何实现持久化存储与共享存储。 前提条件 已创建ACK Serverless集群。具体操作,请参见创建ACK Serverless集群。 已创建NAS文件系统。具体操作,请参见创建文件系统。 若需要加密NAS存储卷中的数据,创建NAS文件系统时…

    阿里云容器服务 2023年12月10日
  • 阿里云容器服务ACK使用云盘动态存储卷-云淘科技

    云盘是阿里云为云服务器ECS提供的数据块级别的块存储产品,具有低时延、高性能、持久性、高可靠等特点。ACK支持使用CSI插件创建云盘动态存储卷。本文介绍如何使用云盘动态存储卷,以及如何验证云盘动态存储卷的持久化存储特性。 索引 前提条件 使用说明 操作步骤 通过控制台的方式使用云盘动态存储卷 通过kubectl命令行的方式使用云盘动态存储卷 验证动态云盘的持…

    2023年12月10日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。