全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:将无存储集群的Flexvolume迁移至CSI

更新时间:Aug 12, 2024

由于Flexvolume存储插件已弃用,新建集群已不再支持Flexvolume存储插件。对于现有使用Flexvolume插件的集群,建议迁移改用CSI插件。您可以通过卸载Flexvolume插件,并安装新的CSI插件,修改节点池配置和现有节点配置等方法完成插件的迁移。本文介绍如何将无存储集群的Flexvolume迁移至CSI。

插件区别

CSI和Flexvolume存储插件的区别如下表所示。

插件

组成

kubelet参数

相关文档

CSI

  • CSI-Provisioner(Deployment)

    实现存储卷、快照自动创建的能力。支持存储误删除后的恢复功能、CNFS存储等功能。

  • CSI-Plugin(DaemonSet)

    实现存储卷的自动挂载和卸载能力。支持多种存储类型,默认支持云盘、NAS、OSS三种存储类型。

插件运行依赖的kubelet参数不同。

配置kubelet的enable-controller-attach-detachtrue

存储CSI概述

Flexvolume

  • Disk-Controller(Deployment)

    实现云盘卷的自动创建能力。

  • Flexvolume(DaemonSet)

    实现数据卷的挂载、卸载功能。ACK默认提供云盘、NAS、OSS三种存储卷的挂载能力。

插件运行依赖的kubelet参数不同。

配置kubelet的enable-controller-attach-detachfalse

存储Flexvolume概述

使用场景

CSI插件体系较Flexvolume更加稳定高效,在以下场景中,推荐您将集群从Flexvolume插件迁移到CSI插件方案。

  • 集群没有使用Flexvolume挂载过数据卷,当前集群中不包含Flexvolume类型的存储数据。

  • 集群使用Flexvolume挂载过数据卷,但相关存储数据已被删除,当前集群中不包含Flexvolume类型的存储数据。

步骤一:卸载Flexvolume插件

  1. 登录OpenAPI平台,调用UnInstallClusterAddons卸载Flexvolume插件。

    • ClusterId:您的集群ID。您可以通过集群的基本信息页面,查看集群ID。

    • name:Flexvolume。

    具体操作,请参见卸载集群组件

  2. 执行以下命令,删除alicloud-disk-controlleralicloud-nas-controller

    kubectl delete deploy -nkube-system alicloud-disk-controller alicloud-nas-controller
  3. 执行以下命令,检查集群中Flexvolume插件是否卸载完成。

    kubectl get pods -n kube-system | grep 'flexvolume\|alicloud-disk-controller\|alicloud-nas-controller'

    输出为空,说明集群中Flexvolume插件已卸载完成。

  4. 执行以下命令,删除集群中Flexvolume类型的StorageClass,Flexvolume类型的StorageClass PROVISIONER类型为alicloud/disk。

    kubectl delete storageclass alicloud-disk-available alicloud-disk-efficiency alicloud-disk-essd alicloud-disk-ssd

    预期输出:

    storageclass.storage.k8s.io "alicloud-disk-available" deleted
    storageclass.storage.k8s.io "alicloud-disk-efficiency" deleted
    storageclass.storage.k8s.io "alicloud-disk-essd" deleted
    storageclass.storage.k8s.io "alicloud-disk-ssd" deleted

    存在以上输出,说明StorageClass删除成功。

步骤二:安装CSI插件

  • 如果您使用了csi-compatible-controller插件,说明集群中已存在CSI插件。但是该CSI插件是定制化的,不是标准的CSI插件。您需要先通过以下命令,删除之前定制化的CSI组件,再安装标准的CSI插件。

    kubectl delete deploy csi-provisioner -nkube-system
    kubectl delete ds csi-plugin -nkube-system
    kubectl delete csidriver diskplugin.csi.alibabacloud.com nasplugin.csi.alibabacloud.com ossplugin.csi.alibabacloud.com
    说明

    以上删除操作不影响集群内现有的Pod应用,但是在删除后,安装标准的CSI插件之前,不能有Pod变更。

  • 如果未使用csi-compatible-controller插件,您可以直接调用OpenAPI安装标准的CSI插件。

  1. 登录OpenAPI平台,调用InstallClusterAddons安装CSI插件。

    • ClusterId:您的集群ID。

    • name:csi-provisioner。

    • version:最新CSI插件版本。关于CSI版本信息,请参见csi-provisioner

    具体操作,请参见安装集群组件

  2. 执行以下命令,检查集群中CSI插件是否正常运行。

    kubectl get pods -nkube-system | grep csi

    预期输出:

    csi-plugin-577mm                              4/4     Running   0          3d20h
    csi-plugin-k9mzt                              4/4     Running   0          41d
    csi-provisioner-6b58f46989-8wwl5              9/9     Running   0          41d
    csi-provisioner-6b58f46989-qzh8l              9/9     Running   0          6d20h

    存在以上预期输出,说明集群中CSI插件正常运行。

步骤三:修改集群中所有节点池的配置

由于节点池的配置随着集群的存储组件变化而变化,您在安装新的CSI标准组件后,已经存在的节点池配置不会自动更改,需要手动修改节点池配置触发更新。如果更新成功,该节点池上新建节点的kubelet参数--enable-controller-attach-detach将会由false更新为true

重要

手动修改节点池配置触发更新的操作会重启kubelet,建议您在业务低峰期操作,确认在某个节点池上更新无误后,再逐步更新其他节点池。

您可以通过添加任意一个实例规格或修改节点池登录密码两种方式修改集群中所有节点池的配置,更新后台集群存储插件类型,触发后台更新节点初始化脚本,确保新扩容的节点参数设置无误。

说明

您也可以新建一个节点池,然后逐步将旧节点池的节点缩容,直到最后删除旧的节点池,然后直接使用新的节点池。这种方式不需要进行如下操作步骤。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,单击目标节点池右侧操作列下的编辑

  4. 在弹出的节点池信息页面,您可以通过以下两种方式修改集群的节点池配置。

    • 添加任意一个实例规格。

      添加节点后,可以触发更新后台集群存储插件类型。待节点池配置修改生效后,可以将此处添加的节点删除。

    • 修改节点池的登录密码。

  5. 单击确认

步骤四:修改现有节点配置

执行以下YAML内容,修改插件运行依赖的kubelet参数,使其匹配CSI插件的运行要求。 该DaemonSet有将现有节点的kubelet参数--enable-controller-attach-detach修改为true的能力,当本步骤操作执行完成后,可以将该DaemonSet删除。

重要

执行以下YAML文件时,会重启kubelet,请评估对现有应用的影响。

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: kubelet-set
spec:
  selector:
    matchLabels:
      app: kubelet-set
  template:
    metadata:
      labels:
        app: kubelet-set
    spec:
      tolerations:
        - operator: "Exists"
      hostNetwork: true
      hostPID: true
      containers:
        - name: kubelet-set
          securityContext:
            privileged: true
            capabilities:
              add: ["SYS_ADMIN"]
            allowPrivilegeEscalation: true
          image: registry.cn-hangzhou.aliyuncs.com/acs/csi-plugin:v1.26.5-56d1e30-aliyun
          imagePullPolicy: "Always"
          env:
          - name: enableADController
            value: "true"
          command: ["sh", "-c"]
          args:
          - echo "Starting kubelet flag set to $enableADController";
            ifFlagTrueNum=`cat /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf | grep enable-controller-attach-detach=$enableADController | grep -v grep | wc -l`;
            echo "ifFlagTrueNum is $ifFlagTrueNum";
            if [ "$ifFlagTrueNum" = "0" ]; then
                curValue="true";
                if [ "$enableADController" = "true" ]; then
                    curValue="false";
                fi;
                sed -i "s/enable-controller-attach-detach=$curValue/enable-controller-attach-detach=$enableADController/" /host/etc/systemd/system/kubelet.service.d/10-kubeadm.conf;
                restartKubelet="true";
                echo "current value is $curValue, change to expect "$enableADController;
            fi;
            if [ "$restartKubelet" = "true" ]; then
                /nsenter --mount=/proc/1/ns/mnt systemctl daemon-reload;
                /nsenter --mount=/proc/1/ns/mnt service kubelet restart;
                echo "restart kubelet";
            fi;
            while true;
            do
                sleep 5;
            done;
          volumeMounts:
          - name: etc
            mountPath: /host/etc
      volumes:
        - name: etc
          hostPath:
            path: /etc

后续步骤

Flexvolume插件类型的集群迁移完成后,您可以通过使用云盘动态存储卷的操作,验证迁移后的CSI插件已正常工作。具体操作,请参见使用云盘动态存储卷