这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

华为容器存储套件

您可以通过以下链接,获取PDF版用户指南:

PDF下载

1 - 前言

读者对象

本文档主要适用于以下读者对象:

  • 技术支持工程师
  • 运维工程师
  • 具备存储和Kubernetes基础知识的工程师

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

2 - 概述

容器存储接口(Container Storage Interface),简称 CSI,是一种行业标准,用于将块和文件存储系统暴露给 Kubernetes 等容器编排系统 (CO) 上的容器工作负载。华为CSI插件用于和华为企业存储和分布式存储产品进行通信,为Kubernetes的容器工作负载提供存储服务。是华为企业存储和分布式存储在Kubernetes环境中使用的必须插件。

Kubernetes通过其官方维护的一系列sidecar组件负责注册监听Kubernetes对象资源,并在需要的时候通过gRPC发起对CSI Driver调用,华为CSI Driver将sidecar发起的调用在华为存储上实施,如创建一个持久卷(Persistent Volume,PV)的操作被实施为在华为存储上创建一个LUN/文件系统。Kubernetes、华为CSI以及华为存储的整体结构如下图所示:

图 1 CSI整体架构

华为CSI主要有两大组件,分别为huawei-csi-controller和huawei-csi-node:

  • huawei-csi-controller:包含Controller Service和Identity Service,以Deployment方式运行的一个或多个Pod,主要负责与华为存储交互,使用RESTful方式进行通信,因此运行huawei-csi-controller组件的节点需要连通存储的管理面网络。
  • huawei-csi-node:包含Node Service和Identity Service,以DaemonSet方式运行在Kubernetes工作节点上的Pod,用于在工作节点上对华为存储提供的LUN/文件系统资源进行挂载和卸载等操作,因此运行huawei-csi-node组件的节点需要连通存储的业务面网络。

华为CSI的部署模型如下所示:

图 2 CSI部署模型

本文档主要介绍华为CSI V4.5.0插件的安装部署和使用。

3 - 快速开始

本章节说明如何快速上手安装并使用华为CSI管理PVC。

华为CSI使用流程概览

图 1 CSI安装及使用流程图

兼容性和特性

使用前请先了解对接的华为存储、容器平台和主机操作系统相关的兼容性以及支持的特性。

兼容性和特性

安装前准备

安装华为CSI前,需要对容器平台、主机等环境做相关配置准备。

安装前准备

安装部署

华为CSI提供了Helm和手动安装两种安装方式,并适用于包含Kubernetes、OpenShift等不同的容器平台。

安装部署

创建存储后端

在使用华为CSI前,需要先创建存储后端资源。

创建存储后端

使用华为CSI

现在,您可以开始使用华为CSI进行PVC管理了。

使用华为CSI

4 - 兼容性和特性

本章节会详细说明华为CSI插件支持的容器管理平台、操作系统、多路径软件以及CSI插件配合华为存储所提供的特性和功能。

4.1 - Kubernetes及操作系统兼容性

华为CSI插件支持如下容器管理平台:

表 1 支持的容器管理平台

容器管理平台

版本

Kubernetes

1.16~1.30

Red Hat OpenShift Container Platform

4.6 EUS, 4.7, 4.8, 4.9, 4.10, 4.11, 4.12, 4.13, 4.14, 4.15

Tanzu Kubernetes

TKGI 1.14.1, TKGI 1.15, TKGI 1.16, TKGI 1.17, TKGI 1.18

CCE Agile

22.3.2

CCE

22.9.5

华为CSI插件支持的操作系统以及多路径信息如下表所示。

表 2 支持的主机操作系统及多路径软件版本

操作系统名称

操作系统版本

原生DM-Multipath版本

华为UltraPath版本

CentOS x86_64

7.6, 7.7, 7.9

随OS自带,支持FC/iSCSI

UltraPath 31.1.0,支持FC/iSCSI

CentOS x86_64

8.2, 8.4

随OS自带,支持FC/iSCSI

UltraPath 31.1.0,支持FC/iSCSI

UltraPath-NVMe 31.1.RC8,支持NVMe over RoCE/NVMe over FC

CentOS ARM

7.6

随OS自带,支持FC/iSCSI

不支持

Rocky Linux x86_64

8.6

随OS自带,支持FC/iSCSI

UltraPath 31.2.1,支持NVMe over RoCE

SUSE 15 x86_64

SP2, SP3

随OS自带,支持FC/iSCSI

UltraPath 31.1.0,支持FC/iSCSI

UltraPath-NVMe 31.1.RC8,支持NVMe over RoCE/NVMe over FC

Red Hat CoreOS x86_64

4.6, 4.7, 4.8, 4.9, 4.10, 4.11, 4.12, 4.13, 4.14, 4.15

随OS自带,支持FC/iSCSI

不支持

Ubuntu x86_64

18.04, 20.04, 22.04

随OS自带,支持FC/iSCSI

不支持

Ubuntu ARM

22.04

随OS自带,支持FC/iSCSI

不支持

Kylin x86_64

7.6, V10 SP1, V10 SP2, V10 SP3

随OS自带,支持FC/iSCSI

UltraPath 31.2.0,支持FC/iSCSI1

Kylin ARM

V10 SP1, V10 SP2, V10 SP3

随OS自带,支持FC/iSCSI

UltraPath 31.3.0,支持iSCSI2

Debian x86_64

9, 11, 12

随OS自带,支持FC/iSCSI

不支持

EulerOS x86_64

V2R9, V2R10, V2R11, V2R12

随OS自带,支持FC/iSCSI

不支持

EulerOS ARM

V2R10, V2R12

随OS自带,支持FC/iSCSI

不支持

UOS x86_64

V20

随OS自带,支持FC/iSCSI

不支持

BC-Linux ARM

21.10

随OS自带,支持FC/iSCSI

不支持

Anolis OS3

8.8

随OS自带,支持iSCSI

不支持

OpenEuler x86_64

22.03 LTS SP1

随OS自带,支持iSCSI

不支持

Red Hat Enterprise Linux x86_64

8.6, 8.7, 8.8

随OS自带,支持FC/iSCSI

不支持

注释1 仅Kylin x86_64 V10 SP2支持UltraPath 31.2.0。

注释2 仅Kylin ARM V10 SP3支持UltraPath 31.3.0。

注释3 Anolis OS仅支持OceanStor Pacific存储。

因DM-Multipath在0.7版本存在执行multipathd show maps时可能无法回显所有的虚拟设备,因此建议使用0.8及以上版本。 DM-Multipath版本可以通过以下途径查询:

  • 如果使用的是rpm包,执行:rpm -qa | grep multipath或rpm -qa | grep device-mapper。
  • 如果使用的是deb包,执行:dpkg -l | grep multipath。

4.2 - Kubernetes特性矩阵

本章节说明华为CSI在不同Kubernetes版本下支持的特性。

表 1 Kubernetes版本与支持的特性

特性

V1.16

V1.17

V1.18

V1.19

V1.20

V1.21+

Static Provisioning

Dynamic Provisioning

Manage Provisioning1

Expand Persistent Volume

Create VolumeSnapshot

x

Restore VolumeSnapshot

x

Delete VolumeSnapshot

x

Clone Persistent Volume

x

Modify Volume2

Raw Block Volume

Topology

Generic Ephemeral Inline Volumes

x

x

x

x

x

Volume Limits

x

FSGroup Support

x

x

x

x

  • 注释1 Manage Provisioning是华为CSI自定义的纳管卷特性,该特性支持将已有存储资源纳管至Kubernetes。不允许将一个存储资源纳管多次和针对同一个存储资源进行并发删除/创建操作。当同一个存储资源被多个集群纳管时,在单个集群中针对该纳管卷的操作仅在当前集群内生效,不会同步到其他集群中,需要使用者自行在其他集群中对该纳管卷进行数据同步操作。
  • 注释2 Modify Volume是华为CSI自定义的PVC变更特性,该特性支持将普通卷变更为双活卷,使用该特性需要对接存储支持卷双活特性。

4.3 - 华为企业存储兼容性

华为CSI插件兼容华为OceanStor系列的全闪存存储和混合闪存存储,具体支持的存储版本如下表所示:

表 1 支持的华为企业存储

存储产品

版本

OceanStor V5

V500R007, V500R007 Kunpeng

OceanStor Dorado V3

V300R002

OceanStor

6.1.3, 6.1.5, 6.1.6, 6.1.7, 6.1.8

OceanStor Dorado

6.1.0, 6.1.2, 6.1.3, 6.1.5, 6.1.6, 6.1.7, 6.1.8

华为CSI插件针对华为企业存储支持如下特性。

表 2 华为企业存储支持的特性及约束

特性

OceanStor V5

OceanStor Dorado V3

OceanStor

OceanStor Dorado

Static Provisioning

SAN:FC/iSCSI2

NAS:NFS 3

SAN:FC/iSCSI2

SAN:FC/iSCSI/NVMe over RoCE/NVMe over FC3

NAS:NFS 3/4.0/4.1/4.2

SAN:FC/iSCSI/NVMe over RoCE/NVMe over FC3

NAS:NFS 3/4.0/4.1/4.24

Dynamic Provisioning

Manage Provisioning1

Expand Persistent Volume5

支持使用Dynamic Provisioning,Manage Provisioning方式创建的卷

Create VolumeSnapshot

支持使用Dynamic Provisioning,Manage Provisioning方式创建的卷

Delete VolumeSnapshot

支持

支持

支持

支持

Restore VolumeSnapshot

支持

支持

SAN:支持

NAS:仅6.1.5及其之后版本支持

SAN:支持

NAS:仅6.1.5及其之后版本支持

Clone Persistent Volume

支持使用Dynamic Provisioning,Manage Provisioning方式创建的非双活卷

SAN:支持使用Dynamic Provisioning,Manage Provisioning方式创建的非双活卷

NAS:仅6.1.5及其之后版本支持使用Dynamic Provisioning,Manage Provisioning方式创建的卷

Raw Block Volume

仅支持SAN类型的卷

仅支持SAN类型的卷

仅支持SAN类型的卷

仅支持SAN类型的卷

Topology

支持

支持

支持

支持

Generic Ephemeral Volumes

支持

支持

支持

支持

Access Mode

RWO/ROX/RWOP:所有类型卷均支持,RWOPKubernetes 1.22版本以上支持。

RWX:仅Raw Block卷和NFS类型的卷支持

QoS

支持6

支持

支持

支持

应用类型

不涉及

不涉及

支持

支持

卷双活7

不支持

不涉及

仅支持NAS类型的卷

存储多租户

仅支持NAS类型的卷

不涉及

仅支持NAS类型的卷8

  • 注释1 Manage Provisioning是华为CSI自定义的纳管卷特性,该特性支持将已有存储资源纳管至Kubernetes。不允许将一个存储资源纳管多次和针对同一个存储资源进行并发删除/创建操作。
  • 注释2 若用户的容器平台部署在虚拟化环境中,则仅支持iSCSI组网。
  • 注释3 使用NVMe over RoCE或NVMe over FC时,worker节点nvme-cli工具版本不低于1.9,查询命令为:nvme version。
  • 注释4 仅OceanStor Dorado 6.1.0及以后版本支持NFS。仅OceanStor Dorado 6.1.3及以后版本支持NFS 4.1,OceanStor Dorado 6.1.7及以后版本支持NFS over RDMA,仅OceanStor Dorado 6.1.8及以后版本支持NFS 4.2。
  • 注释5 发放的volumeType为lun且accessModes为ReadOnlyMany的PVC不支持扩容。
  • 注释6 仅系统用户支持配置QoS。
  • 注释7 仅支持AA双活。
  • 注释8 仅OceanStor Dorado 6.1.3及以后版本支持多租户。

华为CSI插件针对华为企业存储Dtree特性支持如下表所示。

表 3 Dtree支持的特性

特性

支持情况

Static Provisioning

Dynamic Provisioning

Expand Persistent Volume

Access Mode

√ (RWX/RWO/ROX/RWOP:RWOP需Kubernetes 1.22版本以上支持。)

多租户

Create VolumeSnapshot

X

Delete VolumeSnapshot

X

Restore VolumeSnapshot

X

Clone Persistent Volume

X

QoS

X

卷双活

X

应用类型

X

表 4 Dtree支持的华为存储版本

存储产品

版本

OceanStor Dorado

6.1.0, 6.1.2, 6.1.3, 6.1.5, 6.1.6, 6.1.7, 6.1.8

4.4 - 华为分布式存储兼容性

华为CSI插件兼容华为OceanStor系列的分布式存储系统,具体支持的存储版本如下表所示:

表 1 支持的华为分布式存储

存储产品

版本

FusionStorage Block

8.0.1

OceanStor Pacific系列

8.1.0, 8.1.1, 8.1.2, 8.1.3, 8.1.5, 8.2.0

华为CSI插件针对华为分布式存储支持如下特性。

表 2 华为分布式存储支持的特性及约束

特性

FusionStorage Block

OceanStor Pacific系列

Static Provisioning

SAN:iSCSI/SCSI

SAN:iSCSI/SCSI

NAS:DPC2/NFS 3/4.13

Dynamic Provisioning

Manage Provisioning1

Expand Persistent Volume4

支持使用Dynamic Provisioning,Manage Provisioning方式创建的卷

Create VolumeSnapshot

支持使用Dynamic Provisioning,Manage Provisioning方式创建的SAN类型卷

Delete VolumeSnapshot

支持

仅支持SAN类型的卷快照

Restore VolumeSnapshot

支持

仅支持SAN类型的卷快照

Clone Persistent Volume

支持使用Dynamic Provisioning,Manage Provisioning方式创建的SAN类型卷

Raw Block Volume

仅支持SAN类型的卷

仅支持SAN类型的卷

Topology

支持

支持

Generic Ephemeral Inline Volumes

支持

支持

Access Mode

RWO/ROX/RWOP:所有类型卷均支持,RWOP在Kubernetes 1.22及以上版本支持。

RWX:仅Raw Block卷和NFS类型的卷支持。

QoS

支持

支持

软硬配额

不支持

仅支持NAS类型的卷

存储多租户

不支持

仅支持NAS类型的卷

  • 注释1 Manage Provisioning是华为CSI自定义的纳管卷特性,该特性支持将已有存储资源纳管至Kubernetes。不允许将一个存储资源纳管多次和针对同一个存储资源进行并发删除/创建操作。
  • 注释2 仅OceanStor Pacific系列 8.1.2及以后版本支持DPC。华为CSI支持的操作系统对DPC的支持请参考对应产品版本兼容性文档。
  • 注释3 仅OceanStor Pacific系列 8.1.2及以后版本支持NFS 4.1。
  • 注释4 发放的volumeType为lun且accessModes为ReadOnlyMany的PVC不支持扩容。

5 - 安装部署

5.1 - 安装前准备

本章节将对安装前的准备工作进行详细说明。

前提条件

在进行本章节所说明的操作前,请确保如下条件已经具备:

  • 容器管理平台已部署完成并正常运行,且兼容性满足Kubernetes及操作系统兼容性章节的要求。
  • (企业存储必选)已完成对接华为企业存储初始化配置,包括存储池划分、端口配置等。且存储产品的版本满足华为企业存储兼容性章节的要求。
  • (分布式存储必选)已完成对接华为分布式存储初始化配置,包括存储池划分、端口配置等。且存储产品的版本满足华为分布式存储兼容性章节的要求。
  • 完成华为存储和容器平台主机连通性配置,例如运行huawei-csi-controller的worker节点与待接入的存储设备的管理IP地址通信正常,运行huawei-csi-node的worker节点与待接入的存储设备的业务IP地址通信正常,iSCSI场景下允许使用ping命令进行连通性校验。
  • 请确保操作系统的语言是英文。
  • 请确保存储池、租户名称等相关存储资源名称是英文。

5.1.1 - 下载华为CSI软件包

本章节详细说明了下载方法以及软件包组件结构。

  1. 打开浏览器,访问仓库地址:https://github.com/Huawei/eSDK_K8S_Plugin/releases

  2. 根据CPU架构,下载对应的4.5.0版本软件包。

    软件包命名规范:插件名称(eSDK_Huawei_Storage_Kubernetes_CSI_Plugin)+版本号+CPU架构

  3. 将下载的软件包解压。软件包组件结构如下表所示。

    表 1 软件包组件描述

    组件

    组件描述

    image/huawei-csi-v4.5.0-arch.tar

    huawei-csi-driver镜像,"arch"为X86或ARM。

    image/storage-backend-controller-v4.5.0-arch.tar

    后端管理控制器镜像,"arch"为X86或ARM。

    image/storage-backend-sidecar-v4.5.0-arch.tar

    后端管理sidecar镜像,"arch"为X86或ARM。

    image/huawei-csi-extender-v4.5.0-arch.tar

    huawei-csi-extender镜像,"arch"为X86或ARM。

    bin/

    华为提供的镜像使用的二进制文件。

    bin/oceanctl

    华为提供的命令行工具,可用于管理存储后端。

    helm/

    Helm工程,用于部署华为CSI。

    manual/

    用于手动安装部署华为CSI。

    examples/

    CSI使用过程中的yaml示例文件。

    examples/backend

    创建存储后端的yaml示例文件。

5.1.2 - 上传华为CSI镜像

华为提供huawei-csi镜像供用户使用,镜像文件获取请参考下载华为CSI软件包

为了后续在容器管理平台中可以使用CSI镜像,需要按照以下方式中的一种提前将CSI镜像导入到集群中:

  • 使用Docker工具,将CSI镜像上传至镜像仓库(推荐)。
  • 手动将CSI镜像导入到所有需要部署华为CSI的节点。

上传镜像到镜像仓库

安装华为CSI依赖如下三个华为提供的镜像文件,请按照说明依次导入并上传下列镜像文件,镜像文件获取请参考下载华为CSI软件包

  • huawei-csi-v4.5.0-arch.tar
  • storage-backend-controller-v4.5.0-arch.tar
  • storage-backend-sidecar-v4.5.0-arch.tar
  • huawei-csi-extender-v4.5.0-arch.tar

前提条件

已准备一台已安装Docker的Linux主机,且该主机支持访问镜像仓库。

操作步骤

  1. 执行docker load -i huawei-csi-v4.5.0-arch.tar命令,将CSI镜像导入当前节点。

    docker load -i huawei-csi-v4.5.0-arch.tar 
    
  2. 执行docker tag huawei-csi:4.5.0 repo.huawei.com/huawei-csi:4.5.0命令,添加镜像仓库地址到镜像标签。其中repo.huawei.com表示镜像仓库的地址。

    docker tag huawei-csi:4.5.0 repo.huawei.com/huawei-csi:4.5.0
    
  3. 执行docker push repo.huawei.com/huawei-csi:4.5.0命令,将CSI镜像上传到镜像仓库。其中repo.huawei.com表示镜像仓库的地址。

    docker push repo.huawei.com/huawei-csi:4.5.0
    

  • 也可以使用containerd来进行镜像的导入和上传。
  • CCE / CCE Agile平台请参考该平台用户手册完成镜像导入和上传。

上传镜像到本地节点

若镜像已上传至镜像仓库,则跳过本章节。

前提条件

  • 该节点已获取对应的华为CSI镜像文件,镜像文件获取请参考下载华为CSI软件包
  • 该节点已经安装Docker或其他容器引擎。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录需要导入镜像的节点。

  2. 将Kubernetes CSI组件包中的"image"目录拷贝到当前节点的任意目录下。

  3. 执行cd image命令,进入到image的工作目录。工具路径请参见表 软件包组件描述

  4. 执行命令依次将image目录下的所有华为CSI镜像导入至本地节点,其中 name 参数是镜像tar包的名字。

    使用Docker容器引擎执行:

    docker load -i <name>.tar
    

    使用containerd容器引擎执行:

    ctr -n k8s.io image import <name>.tar
    

    使用Podman容器引擎执行:

    podman load -i <name>.tar
    


    当节点主机安装的是其他容器引擎时,请使用对应容器引擎的导入镜像命令。

5.1.3 - 检查华为存储上的用户配置

当华为存储接入容器平台后,华为CSI需要在华为存储上根据业务要求,管理存储资源,如创建卷、映射卷等操作。此时,华为CSI需要使用华为存储上已经创建的用户和华为存储进行通信。针对不同存储设备所需要的用户信息如下表所示。

表 1 存储对接CSI时使用的用户要求

存储类型

用户类型

角色

级别

类型

OceanStor V5

系统用户

管理员

管理员

本地用户

租户用户

租户管理员

管理员

本地用户

OceanStor Dorado V3

系统用户

管理员

管理员

本地用户

OceanStor 6.1.3, 6.1.5, 6.1.6, 6.1.7, 6.1.8

系统用户

管理员/自定义角色1

N/A

本地用户

OceanStor Dorado 6.1.0, 6.1.2, 6.1.3, 6.1.5, 6.1.6, 6.1.7, 6.1.8

系统用户

管理员/自定义角色1

N/A

本地用户

租户用户

租户管理员

N/A

本地用户

OceanStor Pacific系列

系统用户

管理员

N/A

本地用户

  • 注释1 使用自定义角色,需要给角色配置权限,最小权限请参考配置自定义权限章节配置。


不推荐使用“超级管理员”角色下的用户。

5.1.4 - 检查卷快照依赖组件

本章节介绍如何检查集群中卷快照依赖组件情况。


由于Kubernetes v1.17.0之前不支持快照功能,如果部署快照CRD可能导致集群出现问题,因此在低于Kubernetes v1.17.0版本上部署华为CSI,请务必按照Kubernetes低于v1.17.0章节检查。

Kubernetes低于v1.17.0

Kubernetes低于v1.17.0时,部署快照时将会导致集群出现问题,请按照以下步骤删除快照CRD安装文件。

  1. 执行以下命令查看Kubernetes版本。如下示例中,Kubernetes版本为v1.16.0。

    kubectl get node
    

    命令结果示例如下:

    NAME          STATUS       ROLES     AGE    VERSION
    test-master   Ready        master    311d   v1.16.0
    test-node     Ready        <none>    311d   v1.16.0
    
  2. 进入/helm/esdk/crds/snapshot-crds目录,执行以下命令,删除快照CRD安装文件。组件包路径请参考表 软件包组件描述

    rm -rf ./huawei-csi-snapshot-crd-v1.yaml
    

5.1.5 - 检查主机多路径配置

当您计划在容器环境中使用FC/iSCSI/NVMe over RoCE/NVMe over FC协议对华为存储进行访问时,推荐您使用主机多路径软件增强主机和存储的链路冗余和性能。如果您不准备使用多路径软件,请跳过本章节。

华为CSI软件支持对接的操作系统和多路径软件请参考表 支持的主机操作系统及多路径软件版本

  • 如果您准备使用FC/iSCSI协议对接华为存储时,推荐使用操作系统自带的原生DM-Multipath。
  • 如果您准备使用NVMe over RoCE/NVMe over FC协议对接华为存储时,推荐使用华为自研的UltraPath-NVMe。
  • 如果您使用SCSI协议对接华为存储时,请关闭操作系统自带的DM-Multipath。

前提条件

主机多路径软件已经被正确的安装在主机上。

  • 如果您使用的是操作系统自带的原生DM-Multipath,请咨询您的主机或操作系统提供商获取安装所需的资料和软件包。
  • 如果您使用的是华为自研的UltraPath或者UltraPath-NVMe,请联系华为工程师获取UltraPath或者UltraPath-NVMe的资料和软件包。软件包版本请参考表 软件包组件描述

操作步骤

  1. 如果您使用iSCSI/FC协议对接华为企业存储,请参考OceanStor Dorado & OceanStor在Red Hat下的主机连通性指南,对主机多路径进行配置和检查。

  2. 如果您使用NVMe over RoCE/NVMe over FC协议对接华为企业存储,请参考OceanStor Dorado & OceanStor在Red Hat下的主机连通性指南,对主机多路径进行配置和检查。

  3. 如果您使用iSCSI协议对接华为分布式存储,请参考 《FusionStorage 8.0.1 块存储基础业务配置指南》中的“应用服务器配置多路径”章节,对主机多路径进行配置和检查。

  4. 如果您使用了操作系统原生多路径时,需要检查/etc/multipath.conf文件,检查文件是否存在如下配置:

    defaults {
            user_friendly_names yes
            find_multipaths no
    }
    

    如果配置不存在,请在/etc/multipath.conf文件开始处增加该配置项。

    user_friendly_names 和find_multipaths 的参数作用请参考:dm_multipath/config_file_defaults

5.1.6 - 检查主机依赖软件状态

本章节介绍如何检查集群中工作节点上主机依赖软件状态是否正常。本例中主机操作系统为CentOS 7.9 x86_64。

  • 检查iSCSI客户端状态。

    systemctl status iscsi iscsid 
    
  • 检查NFS客户端状态。

    systemctl status rpcbind 
    
  • 检查DM-Multipath多路径软件状态。

    systemctl status multipathd.socket multipathd
    
  • 检查UltraPath多路径软件状态。

    systemctl status nxup
    
  • 检查UltraPath-NVMe多路径软件状态。

    systemctl status upudev upService_plus
    

5.1.7 - 检查CSI依赖的镜像

华为CSI安装过程中需要依赖下表中的镜像,若集群中的所有worker节点已连接互联网且能够在线拉取镜像,则可跳过本章节。若集群中的节点无法连接互联网,则请根据使用的Kubernetes版本,下载对应的镜像文件并上传到镜像仓库中或者导入Kubernetes集群的所有worker节点中。

huawei-csi-controller服务依赖的sidecar镜像:livenessprobe、csi-provisioner、csi-attacher、csi-resizer、csi-snapshotter、snapshot-controller、storage-backend-controller、storage-backend-sidecar、huawei-csi-driver和huawei-csi-extender。huawei-csi-node服务依赖的sidecar镜像:livenessprobe、csi-node-driver-registrar和huawei-csi-driver。

关于每个镜像的功能和详情,请参考下表。

表 1 Huawei CSI依赖的镜像

容器名称

容器镜像

K8s版本要求

功能描述

livenessprobe

k8s.gcr.io/sig-storage/livenessprobe:v2.5.0

v1.16+

Kubernetes社区提供,提供用于监控CSI的健康状态,并上报给Kubernetes,使Kubernetes能够自动检测CSI程序的问题并重启Pod尝试修改该问题。

csi-resizer

k8s.gcr.io/sig-storage/csi-resizer:v1.4.0

v1.16+

Kubernetes社区提供,在扩容PVC时,调用CSI给PVC提供更多的存储容量空间。

csi-node-driver-registrar

k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0

v1.16+

Kubernetes社区提供,用于获取CSI信息,并通过kubelet的插件注册机制将节点注册到kubelet中,从而Kubernetes能够感知该节点与华为存储的对接。

csi-snapshotter

k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.1

v1.17+

Kubernetes社区提供,在创建/删除VolumeSnapshot时,调用CSI在存储侧完成快照的创建和删除。

snapshot-controller

k8s.gcr.io/sig-storage/snapshot-controller:v4.2.1

v1.17+

Kubernetes社区提供,在创建/删除VolumeSnapshot时,监听Kubernetes API中关于VolumeSnapshot和VolumeSnapshotContent的对象,并触发csi-snapshotter在存储上完成快照的创建。

csi-provisioner

k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0

v1.17+

Kubernetes社区提供,用于完成PVC创建/删除。

  • 在创建PVC时,调用huawei-csi-controller服务在存储上创建LUN/文件系统作为PV。
  • 在删除PVC时,调用huawei-csi-controller服务在存储上删除该PV对应的LUN/文件系统。

quay.io/k8scsi/csi-provisioner:v1.4.0

v1.16.x

csi-attacher

k8s.gcr.io/sig-storage/csi-attacher:v3.4.0

v1.17+

在创建/删除Pod时,调用huawei-csi-controller服务执行Publish/Unpublish Volume操作。

quay.io/k8scsi/csi-attacher:v1.2.1

v.1.16.x

storage-backend-controller

storage-backend-controller:4.5.0

v1.16+

华为CSI软件包提供、用于管理storageBackendClaim资源。

storage-backend-sidecar

storage-backend-sidecar:4.5.0

v1.16+

华为CSI软件包提供、用于管理storageBackendContent资源。

huawei-csi-driver

huawei-csi:4.5.0

v1.16+

华为CSI软件包提供、用于提供华为CSI支持的所有特性。

huawei-csi-extender

huawei-csi-extender:4.5.0

v1.16+

华为CSI软件包提供、用于提供华为CSI的扩展特性。

集群若未连接互联网,需要手动下载容器镜像并上传到集群中,具体操作请参考下载容器镜像

5.2 - 安装华为CSI

本章节介绍如何安装华为CSI。

当前版本华为CSI添加了资源请求和限制,具体详情请参考华为CSI资源管理

前提条件

  • 已完成安装前准备
  • 集群的所有worker节点与待接入的存储设备的业务组网通信正常,iSCSI场景下允许使用ping命令进行连通性校验。
  • 集群的所有worker节点已安装对应协议所需要的软件客户端,如iSCSI客户端、NFS客户端等。

5.2.1 - 使用Helm安装华为CSI

Helm安装说明

本章节介绍如何使用Helm 3安装部署华为CSI。

  • 华为CSI的安装支持root用户和非root用户。使用非root用户安装华为CSI时,需要保证当前用户能够访问Kubernetes集群的API Server,配置非root用户访问Kubernetes集群请参考配置非root用户访问Kubernetes集群
  • 华为CSI必须在root用户权限下运行。

Helm是Kubernetes生态系统中的一个软件包管理工具,类似Ubuntu的APT、CentOS的YUM、或Python的pip一样,专门负责管理Kubernetes的应用资源。

使用Helm可以对Kubernetes应用进行统一打包、分发、安装、升级以及回退等操作。

Helm在安装huawei-csi-controller时,将在指定命名空间的Deployment类型的工作负载中部署以下组件:

  • huawei-csi-driver:华为CSI驱动。
  • storage-backend-controller:华为后端管理控制器,管理storageBackendClaim资源。
  • storage-backend-sidecar:用于管理storageBackendContent资源。
  • Kubernetes External Provisioner:用于提供/删除卷。
  • Kubernetes External Attacher:用于挂载/解挂载卷。
  • Kubernetes External Resizer:用于扩容卷。
  • Kubernetes External liveness-probe: 用来判断Pod健康状态。
  • (可选)huawei-csi-extender:华为CSI扩展。
  • (可选)Kubernetes External Snapshotter:提供快照支持(作为CRD安装)。
  • (可选)Kubernetes External Snapshot Controller :用于卷快照控制。

Helm在安装huawei-csi-node时,将在指定命名空间的DaemonSet类型的工作负载中部署以下组件:

  • huawei-csi-driver:华为CSI驱动。
  • Kubernetes Node Registrar:处理驱动程序注册。
  • liveness-probe: 用来判断Pod健康状态。

5.2.1.1 - Kubernetes、OpenShift、Tanzu安装华为CSI

安装步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录集群的任意master节点。

  2. 将Kubernetes CSI组件包中的"helm"目录拷贝到master节点的任意目录下。Helm工具路径请参见表 软件包组件描述

  3. 进入到helm/esdk的工作目录下。

    cd helm/esdk
    
  4. 准备values.yaml文件,华为CSI已经在软件包的helm/esdk目录下提供了values.yaml模板文件,您也可以根据Helm values.yaml参数说明修改参数对华为CSI进行定制。

  5. 安装前配置:

  6. 执行命令,更新存储后端CRD

    kubectl apply -f ./crds/backend/
    
  7. (可选) 请务必按照检查卷快照依赖组件章节检查快照依赖组件,确认无误后执行执行命令更新快照CRD,如果controller.snapshot.enabled参数设置为false或Kubernetes版本低于v1.17,可跳过本步骤,详情请参考表 controller配置项说明

    kubectl apply -f ./crds/snapshot-crds/ --validate=false
    
  8. 执行如下命令安装华为CSI。其中,helm-huawei-csi为自定义的Helm Chart名称,./表示使用当前目录下的Helm工程,huawei-csi为自定义的Helm Chart命名空间。

    helm install helm-huawei-csi ./ -n huawei-csi --create-namespace
    

    命令执行结果如下:

    NAME: helm-huawei-csi
    LAST DEPLOYED: Wed Jun  8 11:50:28 2022
    NAMESPACE: huawei-csi
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    
  9. 完成huawei-csi服务部署后,可执行如下命令检查服务是否启动:

    kubectl get pod -n huawei-csi
    

    命令结果示例如下,Pod状态为“Running“则安装成功。

    NAME                                     READY   STATUS    RESTARTS   AGE
    huawei-csi-controller-6dfcc4b79f-9vjtq   9/9     Running   0          24m
    huawei-csi-controller-6dfcc4b79f-csphc   9/9     Running   0          24m
    huawei-csi-node-g6f4k                    3/3     Running   0          20m
    huawei-csi-node-tqs87                    3/3     Running   0          20m
    

OpenShift平台安装配置

OpenShift平台请根据以下命令创建SecurityContextConstraints资源。

  1. 执行命令,编辑helm_scc.yaml文件。

    vi helm_scc.yaml
    
  2. 修改helm_scc.yaml文件。其中,下列回显中huawei-csi是指创建的命名空间,请根据实际情况填写。

    apiVersion: security.openshift.io/v1
    kind: SecurityContextConstraints
    metadata:
      name: helm-scc
    allowHostDirVolumePlugin: true
    allowHostIPC: true
    allowHostNetwork: true
    allowHostPID: true
    allowHostPorts: true
    allowPrivilegeEscalation: true
    allowPrivilegedContainer: true
    
    defaultAddCapabilities:
    - SYS_ADMIN
    runAsUser:
      type: RunAsAny
    seLinuxContext:
      type: RunAsAny
    fsGroup:
      type: RunAsAny
    users:
    - system:serviceaccount:huawei-csi:huawei-csi-controller
    - system:serviceaccount:huawei-csi:huawei-csi-node
    
  3. 执行命令,创建SecurityContextConstraints。

    oc create -f helm_scc.yaml
    

Tanzu平台安装配置

Tanzu平台请执行以下命令配置kubelet安装目录。

  1. 进入到安装包的helm/esdk目录下,执行命令打开配置文件,修改后保存。安装包目录请参见表 软件包组件描述

    vi values.yaml
    
  2. 修改kubeletConfigDir参数如下:

    # Specify kubelet config dir path.
    # kubernetes and openshift is usually /var/lib/kubelet
    # Tanzu is usually /var/vcap/data/kubelet
    # CCE is usually /mnt/paas/kubernetes/kubelet
    kubeletConfigDir: /var/vcap/data/kubelet
    

Tanzu平台TKGI 1.16版本及以下请执行以下命令配置RBAC权限

  1. 执行命令, 创建rbac.yaml文件。

    vi rbac.yaml
    
  2. 粘贴如下内容至rbac.yaml,保存并退出:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: huawei-csi-psp-role
    rules:
    - apiGroups: ['policy']
      resources: ['podsecuritypolicies']
      verbs: ['use']
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: huawei-csi-psp-role-cfg
    roleRef:
      kind: ClusterRole
      name: huawei-csi-psp-role
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: Group
      apiGroup: rbac.authorization.k8s.io
      name: system:serviceaccounts:huawei-csi
    - kind: Group
      apiGroup: rbac.authorization.k8s.io
      name: system:serviceaccounts:default
    
  3. 执行命令,创建RBAC权限。

    kubectl create -f rbac.yaml
    

5.2.1.2 - CCE和CCE Agile平台安装华为CSI

本章节介绍如何在CCE / CCE Agile平台安装华为CSI。

制作Helm安装包

CCE和CCE Agile平台无法直接通过Helm安装华为CSI,需要手动制作Helm安装包后上传至平台模板市场进行安装。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录已部署Helm的任意节点。

  2. 将华为CSI组件包中的"helm"目录拷贝到节点的任意目录下。Helm工具路径请参见表 软件包组件描述

  3. 进入到helm的工作目录下。

    cd helm/
    
  4. 修改helm/esdk/values.yaml文件中kubeletConfigDir和csiDriver.driverName参数。

    vi ./esdk/values.yaml
    

    修改如下参数:

    # Specify kubelet config dir path.
    # kubernetes and openshift is usually /var/lib/kubelet
    # Tanzu is usually /var/vcap/data/kubelet
    # CCE is usually /mnt/paas/kubernetes/kubelet
    kubeletConfigDir: /mnt/paas/kubernetes/kubelet
    
    # The CSI driver parameter configuration
    csiDriver:
      # Driver name, it is strongly recommended not to modify this parameter
      # The CCE platform needs to modify this parameter, e.g. csi.oceanstor.com
      driverName: csi.oceanstor.com
    
  5. 执行命令制作Helm安装包,该命令会将安装包生成到当前路径下。

    helm package ./esdk/ -d ./
    

安装华为CSI

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录已部署CCE Agile平台master的任意节点。

  2. 执行命令创建部署华为CSI的命名空间,huawei-csi为自定义的命名空间。

    kubectl create namespace huawei-csi
    
  3. 导出Helm安装包,具体请参考制作Helm安装包

  4. 在主页单击“模板市场> 我的模板>上传模板”,进入上传模板对话框。将导出的Helm安装包导入CCE Agile平台。

  5. 安装包上传完毕,在主页单击“模板市场>我的模板”,进入我的模板页面,单击“安装>提交”。其中模板实例名称可自定义填写。

  6. 在主页单击“模板市场>模板实例”,选择安装时指定的项目(例如样例中的项目是“default”)。安装成功后执行状态将回显为“安装成功”。

5.2.1.3 - Helm values.yaml参数说明

在使用Helm安装CSI时,需要您根据部署时需要使用的特性准备Helm工程的values.yaml文件。华为CSI已经在软件包的helm/esdk目录下提供了values.yaml模板文件。

本章节将详细说明values.yaml中的配置项以及典型场景下的后端配置示例。

images参数配置说明

values.yaml中的images配置项主要配置华为CSI运行时依赖的组件镜像信息。需要配置的参数如下:

表 1 images配置项说明

参数

描述

必选参数

默认值

images.huaweiCSIService

huawei-csi镜像。

huawei-csi:4.5.0

images.storageBackendSidecar

华为后端管理sidecar镜像。

storage-backend-sidecar:4.5.0

images.storageBackendController

华为后端管理控制器镜像。

storage-backend-controller:4.5.0

images.huaweiCSIExtender

huawei-csi-extender镜像

huawei-csi-extender:4.5.0

images.sidecar.livenessProbe

livenessprobe sidecar镜像。

k8s.gcr.io/sig-storage/livenessprobe:v2.5.0

images.sidecar.provisioner

csi-provisioner sidecar镜像。

k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0

images.sidecar.attacher

csi-attacher sidecar镜像。

k8s.gcr.io/sig-storage/csi-attacher:v3.4.0

images.sidecar.resizer

csi-resizer sidecar镜像。

k8s.gcr.io/sig-storage/csi-resizer:v1.4.0

images.sidecar.snapshotter

csi-snapshotter sidecar镜像。

k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.1

images.sidecar.snapshotController

snapshot-controller sidecar镜像。

k8s.gcr.io/sig-storage/snapshot-controller:v4.2.1

images.sidecar.registrar

csi-node-driver-registrar sidecar镜像。

k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0

  • huaweiCSIService、storageBackendSidecar、storageBackendController、huaweiCSIExtender参数的值,请参考上传华为CSI镜像章节的说明,使用最终生成镜像的名称和版本。
  • 其他sidecar镜像参数,请参考检查CSI依赖的镜像章节的说明,使用最终上传的镜像的名称和版本。

controller参数配置说明

controller配置项用于配置huawei-csi-controller组件的相关配置。

表 2 controller配置项说明

参数

描述

必选参数

默认值

备注

controller.controllerCount

huawei-csi-controller组件的副本数

1

-

controller.volumeNamePrefix

PV名称的前缀,默认值为pvc,即创建的PV名称为:pvc-<uuid>。前缀必须满足DNS 子域名的命名规则,且PV名称总长度不得超过253个字符。

pvc

对应的provisioner参数名称为:--volume-name-prefix。

建议前缀不超过20个字符。

详细配置请参考配置PV名称前缀

  • 对接后端是OceanStor V5 SAN时,建议前缀不超过5个字符。
  • 对接后端是OceanStor V5 NAS存储时,前缀只能包含小写字母、'-',以及数字。
  • 对接后端是OceanStor Dorado和OceanStor存储时,前缀只能包含小写字母、'-',以及数字。
  • 对接后端是OceanStor Pacific系列存储时,前缀只能包含字母、数字、“_”、“-”和“.”,且总长度限制为58字符。
  • 对接后端是FusionStorage Block时,前缀只能包含字母、数字、“_”和“-”,且总长度限制为58字符。

controller.webhookPort

webhook服务使用的端口。

4433

如果存在端口冲突可修改为其他未占用的端口。

controller.snapshot.enabled

是否开启快照特性。

true

如果要使用快照相关功能,请开启该特性。

要求Kubernetes版本高于v1.17。

controller.resizer.enabled

是否开启扩容特性。

true

要求Kubernetes版本高于v1.16。

controller.nodeSelector

huawei-csi-controller的节点选择器。配置后huawei-csi-controller仅会调度到存在该标签的节点上。

-

节点选择器的详细说明请参考:将 Pod 分配给节点

controller.tolerations

huawei-csi-controller的污点容忍。配置后huawei-csi-controller能够容忍节点上存在该污点。

-

污点和容忍度的详细说明请参考:污点和容忍度

controller.livenessProbePort

huawei-csi-controller的存活性探针端口,用于健康检查。

9808

如果存在端口冲突可修改为其他未占用的端口

controller.csiExtender.volumeModify.enabled

是否开启PVC变更特性。

false

如果要PVC变更相关功能,请开启该特性。

controller.csiExtender.volumeModify.retryBaseDelay

PVC变更创建任务失败时的最小重试间隔。

5s

建议使用默认值。

controller.csiExtender.volumeModify.retryMaxDelay

PVC变更创建任务失败时的最大重试间隔。

5m

建议使用默认值。

controller.csiExtender.volumeModify.reconcileDelay

调协VolumeModifyClaim对象的间隔。

1s

建议使用默认值。

当controller.snapshot.enabled参数配置为true时,需要安装“helm/crd/snapshot-crds”目录下的卷快照CRD资源。

node参数配置说明

node配置项用于配置huawei-csi-node组件的相关配置。

表 3 node配置项说明

参数

描述

必选参数

默认值

备注

node.maxVolumesPerNode

节点可使用的华为CSI发放卷的最大数量。不定义或者配置为0时则认为不限制。

如果创建Pod时,指定 nodeName,则会忽略该配置。

100

详细说明请参考:Volume Limits

node.nodeSelector

huawei-csi-node的节点选择器。配置后huawei-csi-node仅会调度到存在该标签的节点上。

-

节点选择器的详细说明请参考:将 Pod 分配给节点

node.tolerations

huawei-csi-node的污点容忍。配置后huawei-csi-node能够容忍节点上存在该污点。

- key: "node.kubernetes.io/memory-pressure"
  operator: "Exists"
  effect: "NoExecute"
- key: "node.kubernetes.io/disk-pressure"
  operator: "Exists"
  effect: "NoExecute"
- key: "node.kubernetes.io/network-unavailable"
  operator: "Exists"
  effect: "NoExecute"

污点和容忍度的详细说明请参考:污点和容忍度

node.livenessProbePort

huawei-csi-node的存活性探针端口,用于健康检查。

9800

如果存在端口冲突可修改为其他未占用的端口

node.kubeletVolumeDevicesDirName

kubelet挂载块设备时的目录名称。

volumeDevices

当一个块设备被成功挂载之后,挂载路径的目录结构应该如下所示:

/var/lib/kubelet/plugins/kubernetes.io/csi/{kubeletVolumeDevicesDirName}/publish/{specName}/{podUID}

csiDriver参数配置说明

csiDriver配置项包括了华为CSI运行时的基本配置,如华为驱动名称、多路径类型等配置信息。

表 4 csiDriver配置项说明

参数

描述

必选参数

默认值

备注

csiDriver.driverName

注册的驱动名称。

csi.huawei.com

  • 直接使用默认值。
  • 对于CCE Agile平台,需要修改该字段,例如:csi.oceanstor.com。

csiDriver.endpoint

通信端点。

/csi/csi.sock

直接使用默认值。

csiDriver.connectorThreads

最大并发扫盘/卸盘数。参数格式为整型,支持范围为1~10。

4

该值设置越大,同一时间单个节点中的针对多路径的扫盘、卸盘并发操作就越多。在使用DM-Multipath时,并发数过大可能会导致未知问题,影响整体时间。

csiDriver.volumeUseMultipath

是否使用多路径软件。参数格式为布尔值。

true

强烈建议开启多路径软件,以增强存储链路的冗余度和性能。

csiDriver.scsiMultipathType

存储协议为fc/iscsi时,使用的多路径软件。支持配置如下参数:

  • DM-multipath
  • HW-UltraPath
  • HW-UltraPath-NVMe

当volumeUseMultipath为true时必填。

DM-multipath

建议使用DM-multipath取值。

csiDriver.nvmeMultipathType

存储协议为roce/fc-nvme时,使用的多路径软件。仅支持配置HW-UltraPath-NVMe。

当volumeUseMultipath为true时必填。

HW-UltraPath-NVMe

-

csiDriver.scanVolumeTimeout

在主机上使用DM-Multipath多路径时,等待多路径聚合的超时时间,支持范围为1~600,单位秒。

3

-

csiDriver.execCommandTimeout

在主机上执行命令的超时时间

30

CSI插件在挂载,扩容盘符等场景下,需要运行一些主机命令,例如使用mount命令挂载文件系统。该配置用于控制执行单条命令的超时时间。

csiDriver.allPathOnline

是否检查DM-Multipath软件聚合的路径数等于实际在线的路径数,支持配置如下参数:

  • true:DM-Multipath软件聚合的路径数等于实际在线的路径数才满足盘符挂载条件。
  • false:默认不检查DM-Multipath软件聚合的路径数量,只要聚合出虚拟盘符,即满足盘符挂载条件。

当csiDriver.scsiMultipathType为DM-multipath时必填。

false

-

csiDriver.backendUpdateInterval

后端能力的更新时间间隔,支持范围60~600,单位秒。

60

-

csiDriver.controllerLogging.module

controller日志记录类型。支持配置如下参数:

  • file
  • console

file

使用file选项时,日志将被保留在节点指定的目录下,当CSI所在的Pod被销毁时,日志仍然被保留。

使用console选项时,日志将被保留在CSI所在Pod的临时空间中,当CSI所在的Pod被销毁时,日志也随之被销毁。

csiDriver.controllerLogging.level

controller日志输出级别。支持配置如下参数:

  • debug
  • info
  • warning
  • error
  • fatal

info

-

csiDriver.controllerLogging.fileDir

controller日志在file输出模式下的日志目录。

/var/log/huawei

请确保该目录下有足够的空间保留日志。空间大小建议不小于200 MB。

csiDriver.controllerLogging.fileSize

controller日志在file输出模式下单个日志文件大小。

20M

-

csiDriver.controllerLogging.maxBackups

controller日志在file输出模式下日志文件备份上限。

9

-

csiDriver.nodeLogging.module

node日志记录类型。支持配置如下参数:

  • file
  • console

file

使用file选项时,日志将被保留在节点指定的目录下,当CSI所在的Pod被销毁时,日志仍然被保留。

使用console选项时,日志将被保留在CSI所在Pod的临时空间中,当CSI所在的Pod被销毁时,日志也随之被销毁。

csiDriver.nodeLogging.level

node日志输出级别。支持配置如下参数:

  • debug
  • info
  • warning
  • error
  • fatal

info

-

csiDriver.nodeLogging.fileDir

node日志在file输出模式下的日志目录。

/var/log/huawei

请确保该目录下有足够的空间保留日志。空间大小建议不小于200 MB。

csiDriver.nodeLogging.fileSize

node日志在file输出模式下单个日志文件大小。

20M

-

csiDriver.nodeLogging.maxBackups

node日志在file输出模式下日志文件备份上限。

9

-


如果您的容器环境已经部署了华为CSI,请确保csiDriver.driverName的设置和之前部署时的配置保持一致。否则会导致系统中已存在的有华为CSI发放的卷/快照无法被新部署的华为CSI管理。

其他参数配置说明

其他配置项包括了CSI插件某些特性的开关或者镜像获取策略。

表 5 其他配置项说明

参数

描述

必选参数

默认值

备注

kubernetes.namespace

华为CSI运行时所在Kubernetes命名空间,支持用户自定义。名称必须由小写字母、数字和“-”组成,例如:my-name、123-abc。

huawei-csi

-

kubeletConfigDir

kubelet工作目录。

/var/lib/kubelet

  • 直接使用默认值。
  • 对于Tanzu平台,需要修改该字段为/var/vcap/data/kubelet。
  • 对于CCE Agile平台,需要修改该字段为/mnt/paas/kubernetes/kubelet。

sidecarImagePullPolicy

sidecar镜像的拉取策略。

IfNotPresent

-

huaweiImagePullPolicy

huawei-csi镜像的拉取策略。

IfNotPresent

-

CSIDriverObject.isCreate

是否创建CSIDriver对象

false

CSIDriver特性在Kubernetes v1.18成为GA版本,因此要求Kubernetes版本高于v1.18,当Kubernetes版本低于 v1.18时,请设置该参数为false。

CSIDriverObject.attachRequired

CSI插件是否跳过attach操作。支持配置如下参数:

  • true:需要attach操作。
  • false:跳过attach操作。

true

参数attachRequired在Kubernetes v1.18支持配置。

如果CSIDriverObject.isCreate为true并且attachRequired参数设置为false时,huawei-csi插件将不会部署csi-attacher这个sidecar。

  • 使用NAS存储时支持配置为false。
  • 使用SAN存储时,请配置为true。

CSIDriverObject.fsGroupPolicy

基础卷是否支持在装载之前更改卷的所有权和权限。支持配置如下参数:

  • "ReadWriteOnceWithFSType":仅当定义了fsType并且卷的accessModes包含ReadWriteOnce时,才支持卷所有权和权限更改。
  • "File":Kubernetes可以使用fsGroup更改卷的权限和所有权,以匹配Pod安全策略中用户请求的fsGroup,而不管fsGroup或accessModes如何。
  • "None":将在不进行修改的情况下装载卷。
  • "null":将不设置fsGroupPolicy参数

null

参数fsGroupPolicy在Kubernetes v1.20支持配置,并且当CSIDriverObject.isCreate为true时该参数生效。

该特性在Kubernetes v1.20中为Beta版本,在Kubernetes v1.23成为GA版本,因此要求Kubernetes版本高于v1.20。

leaderElection.leaseDuration

领导者持续时间。

8s

仅多controller场景生效。

leaderElection.renewDeadline

领导者重新选举时间。

6s

仅多controller场景生效。

leaderElection.retryPeriod

领导者选举重试时间。

2s

仅多controller场景生效。


请确保此kubernetes.namespace填入的命名空间在Kubernetes上已经存在,如果不存在请使用如下命令创建对应的命名空间。本例中,华为CSI运行的命名空间为“huawei-csi”。

kubectl create namespace huawei-csi

5.2.2 - 手动安装华为CSI

本章节介绍如何手动安装华为CSI。

手动安装华为CSI当前仅支持Kubernetes平台。

安装步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录集群的任意master节点。

  2. 将Kubernetes CSI组件包中的"manual"目录拷贝到master节点的任意目录下。

  3. 执行命令创建一个命名空间。

    kubectl create ns huawei-csi
    
  4. 进入到manual/esdk的工作目录下。具体路径请参见表 软件包组件描述

    cd manual/esdk
    
  5. 执行命令,更新存储后端CRD

    kubectl apply -f ./crds/backend/
    
  6. (可选) 请务必按照检查卷快照依赖组件章节检查快照依赖组件,确认无误后执行执行命令更新快照CRD,如果Kubernetes版本低于v1.17,跳过本步骤。

    kubectl apply -f ./crds/snapshot-crds/ --validate=false
    
  7. (可选) 执行命令安装CSIDriver。如果不使用CSIDriver特性,可跳过本步骤,详情请参考CSIDriver特性。

    kubectl apply -f ./deploy/csidriver.yaml 
    
  8. 执行命令安装huawei-csi-controller服务。如果Kubernetes版本低于v1.17,删除名称为csi-snapshotter和snapshot-controller的容器,并根据检查CSI依赖的镜像中的版本要求,修改其它容器镜像版本。

    kubectl apply -f ./deploy/huawei-csi-controller.yaml
    
  9. 执行命令安装huawei-csi-node服务。

    kubectl apply -f ./deploy/huawei-csi-node.yaml 
    
  10. 执行命令检查服务是否启动。

    kubectl get pod -n huawei-csi
    

    回显示例如下,Pod状态为“Running“则安装成功。

    NAME                                     READY   STATUS    RESTARTS   AGE
    huawei-csi-controller-68745d489c-v5xkj   9/9     Running   0          13m
    huawei-csi-node-4hbqp                    3/3     Running   0          13m
    huawei-csi-node-f7dkf                    3/3     Running   0          13m
    huawei-csi-node-xrntc                    3/3     Running   0          13m
    

多副本controller部署场景下可以通过修改 ./deploy/huawei-csi-controller.yaml 文件中Deployment资源的spec.replica字段来指定副本个数,修改完成后,执行以下命令生效:

kubectl apply -f ./deploy/huawei-csi-controller.yaml

5.3 - 卸载华为CSI

本章节介绍如何卸载华为CSI。根据您安装时的方式,请使用不同的方式进行卸载。


如果您不是出于升级的目的卸载华为CSI,请确保卸载华为CSI前已经在您的容器平台中将华为CSI发放的资源(PV、PVC、快照、存储后端等)全部清理。否则一旦您卸载华为CSI后,这些资源将无法被自动调度、管理或者清理。

5.3.1 - Helm卸载华为CSI

5.3.1.1 - Kubernetes、OpenShift、Tanzu卸载华为CSI

本章节介绍如何在Kubernetes、OpenShift、Tanzu平台卸载华为CSI。

操作步骤

  1. 卸载huawei-csi-host-info对象使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令卸载华为CSI,helm-huawei-csi 是自定义的Helm Chart名称,huawei-csi 是该Helm Chart所在的命名空间。该卸载命令将会卸载华为CSI的huawei-csi-controller、huawei-csi-node和RBAC资源。

    helm uninstall helm-huawei-csi -n huawei-csi
    

    卸载命令执行后,还需要检查卸载是否成功。其中,huawei-csi 为chart所在的命名空间。

    helm list -n huawei-csi
    

    命令结果示例如下,如果回显为空,则表示服务卸载成功。

    NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION
    
  3. 卸载huawei-csi-host-info对象,请参考卸载huawei-csi-host-info对象进行操作。

  4. 卸载webhook资源,请参考卸载Webhook资源进行操作。

  5. (可选)卸载快照依赖组件服务,请参考卸载Snapshot依赖组件服务进行操作。

  6. (可选)卸载Lease资源,请参考卸载Lease资源进行操作。

5.3.1.2 - CCE和CCE Agile卸载华为CSI

本章节介绍如何在CCE / CCE Agile平台卸载华为CSI,以CCE Agile v22.3.2为例。

操作步骤

  1. 登录CCE Agile平台。

  2. 在主页单击“模板市场> 模板实例 ”,进入模板实例页面。

  3. 选择华为CSI模板实例,单击“卸载”,在弹出的提示框中单击“确定”。

  4. 卸载huawei-csi-host-info对象,请参考卸载huawei-csi-host-info对象进行操作。

  5. 卸载webhook资源,请参考卸载Webhook资源进行操作。

  6. (可选)卸载快照依赖组件服务,请参考卸载Snapshot依赖组件服务进行操作。

5.3.1.3 - 卸载CSI依赖组件服务

本章节介绍如何卸载CSI依赖组件服务。

卸载huawei-csi-host-info对象

名称为huawei-csi-host-info的Secret对象中保存着集群中各个节点的启动器信息,例如iSCSI启动器。使用helm uninstall命令时不会卸载该资源,若需卸载该资源,请参考以下步骤:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令卸载Secret对象,其中huawei-csi-host-info是Secret对象的名称,huawei-csi是Secret对象所在的命名空间。

    kubectl delete secret huawei-csi-host-info -n huawei-csi
    
  3. 执行以下命令检查Secret对象是否卸载成功。

    kubectl get secret huawei-csi-host-info -n huawei-csi 
    

    命令结果示例如下,如果命令回显提示“NotFound”表示huawei-csi-host-info对象已成功卸载。

    Error from server (NotFound): secrets "huawei-csi-host-info" not found
    

卸载Webhook资源

名称为storage-backend-controller.xuanwu.huawei.io的webhook资源用于校验Backend的秘钥信息和与存储的连通性,使用helm uninstall命令时不会卸载该资源,若需卸载该资源,请参考以下步骤:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查询webhook依赖组件服务。

    kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io storage-backend-controller.xuanwu.huawei.io
    

    命令结果如下。

    NAME                                          WEBHOOKS   AGE
    storage-backend-controller.xuanwu.huawei.io   1          12d
    
  3. 执行以下命令,卸载webhook依赖组件服务。

    kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io storage-backend-controller.xuanwu.huawei.io
    
  4. 执行以下命令,检查服务是否已成功卸载。如果结果为空,表示已成功卸载。

    kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io storage-backend-controller.xuanwu.huawei.io
    

卸载Snapshot依赖组件服务

  • 请勿在存在快照时卸载Snapshot依赖组件服务,否则Kubernetes会自动删除所有的用户快照且无法恢复,请谨慎操作。详细说明请参见删除 CustomResourceDefinition
  • 请勿在CSI升级时卸载Snapshot依赖组件服务。

场景说明

  • 当前华为CSI使用了快照特性。
  • 当前Kubernetes集群仅存在华为CSI,且不再使用华为CSI。
  • 在卸载前请确保在Kubernetes集群中已经没有华为CSI管理的VolumeSnapshot资源。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,卸载Snapshot依赖组件服务。

    kubectl delete crd volumesnapshotclasses.snapshot.storage.k8s.io volumesnapshotcontents.snapshot.storage.k8s.io volumesnapshots.snapshot.storage.k8s.io
    
  3. 执行以下命令,检查服务是否已成功卸载。如果结果为空,表示已成功卸载。

    kubectl get crd | grep snapshot.storage.k8s.io
    

卸载Lease资源

values.yaml文件中controller.controllerCount配置项的值大于1时,huawei-csi-controller将使用多副本部署,huawei-csi-controller服务的多副本使用Kubernetes的LeaderElection机制实现,该机制会创建Lease对象用于保存当前Holder信息。使用helm uninstall命令时不会卸载该资源,若需卸载该资源,请参考以下步骤,若controller.controllerCount配置项的值等于1是时,可跳过本步骤。配置项描述可参考表 controller配置项说明

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查询Lease信息。

    kubectl get lease -n huawei-csi
    

    命令结果示例如下。

    NAME                                         HOLDER    AGE
    csi-huawei-com                               node-1    24d
    external-attacher-leader-csi-huawei-com      node-1    24d
    external-resizer-csi-huawei-com              node-1    24d
    external-snapshotter-leader-csi-huawei-com   node-1    24d
    snapshot-controller-leader                   node-1    24d
    storage-backend-controller                   node-1    24d
    huawei-csi-extender                          node-1    24d
    
  3. 执行以下命令,卸载Lease资源。

    kubectl delete lease -n huawei-csi csi-huawei-com external-attacher-leader-csi-huawei-com external-resizer-csi-huawei-com external-snapshotter-leader-csi-
    
  4. 执行以下命令,检查是否已成功卸载。

    kubectl get lease -n huawei-csi
    

    命令结果示例如下,如果结果为空,表示已成功卸载。

    No resources found in huawei-csi namespace.
    

5.3.2 - 手动卸载华为CSI

本章节介绍如何手动卸载华为CSI。


如果您不是出于升级的目的卸载华为CSI,请确保卸载华为CSI前已经在您的容器平台中将华为CSI发放的资源(PV、PVC、快照、存储后端等)全部清理。否则一旦您卸载华为CSI后,这些资源将无法被自动调度、管理或者清理。

卸载huawei-csi-node服务

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令卸载 huawei-csi-node 服务,huawei-csi 替换为华为CSI所在的命名空间。

    kubectl delete daemonset huawei-csi-node -n huawei-csi
    
  3. 执行以下命令检查服务是否已成功卸载(如果提示NotFound错误,表示已成功卸载)。

    kubectl get daemonset huawei-csi-node -n huawei-csi
    

卸载huawei-csi-controller服务

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令卸载 huawei-csi-controller 服务,huawei-csi 替换为华为CSI所在的命名空间。

    kubectl delete deployment huawei-csi-controller -n huawei-csi
    
  3. 执行以下命令检查服务是否已成功卸载(如果提示NotFound错误,表示已成功卸载)。

    kubectl get deployment huawei-csi-controller -n huawei-csi
    

卸载csidriver对象

如果安装时未使用CSIDriver特性,可跳过本步骤。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令卸载csidriver对象。

    kubectl delete csidriver csi.huawei.com
    
  3. 执行以下命令检查服务是否已成功卸载(如果提示NotFound错误,表示已成功卸载)。

    kubectl get csidriver csi.huawei.com
    

删除RBAC权限

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 删除RBAC权限。

    kubectl -n huawei-csi -l provisioner=csi.huawei.com delete ServiceAccount,Service,role,rolebinding,ClusterRole,ClusterRoleBinding
    

其它资源卸载

  1. 卸载huawei-csi-host-info对象,请参考卸载huawei-csi-host-info对象进行操作。
  2. 卸载webhook资源,请参考卸载Webhook资源进行操作。
  3. (可选)卸载快照依赖组件服务,请参考卸载Snapshot依赖组件服务进行操作。
  4. (可选)卸载Lease资源,请参考卸载Lease资源进行操作。

5.4 - 升级/回退华为CSI

本章节介绍如何升级/回退华为CSI。

当前版本华为CSI添加了资源请求和限制,具体详情请参考华为CSI资源管理

5.4.1 - 使用Helm升级/回退华为CSI

如果您从2.x版本升级至4.5.0版本,请参考旧版本用户指南卸载CSI,然后参考使用Helm安装华为CSI章节安装华为CSI。

如果您从2.x或3.x版本升级至4.5.0版本,请参考从2.x或3.x升级至4.x版本章节升级华为CSI。

如果您从4.x版本升级至4.5.0版本,请参考Kubernetes、OpenShift、Tanzu升级华为CSI章节升级华为CSI。

5.4.1.1 - 升级华为CSI

本章节介绍如何升级华为CSI。

升级/回退过程中,已经存在的PVC/快照/Pod等资源会正常运行,不会影响您的业务访问。

  • 部分2.x版本CSI已经下架,若升级失败,可能无法回退到已下架版本的CSI。
  • 从2.x或3.x版本或4.x版本升级至4.5.0版本,可能存在旧版本已发放Pod重新挂载时失败的问题,具体请参考从2.x或3.x升级至4.x版本
  • 在升级/回退过程中,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。
  • 在升级/回退过程中,请勿卸载Snapshot依赖组件服务。

5.4.1.1.1 - 从2.x或3.x升级至4.x版本


在CSI 2.x或3.x 版本中,使用块存储时,与存储建立映射的操作是在huawei-csi-node服务进行的,所以huawei-csi-node服务需要和存储管理网络通信。又由于huawei-csi-node服务是以DaemonSet部署的,在集群中每个节点都会部署一个huawei-csi-node服务,这样部署模型导致了在大规模集群下,每个huawei-csi-node服务都会向存储发起请求,可能导致存储连接数被占满,使得huawei-csi-node不能提供正常服务。 在CSI 4.x版本优化了该部署模型,将与存储建立映射操作迁移至huawei-csi-controller服务,huawei-csi-node服务不再需要和存储管理网络通信,降低了华为CSI依赖的组网复杂度,同时huawei-csi-controller服务以Deployment形式部署,副本数根据客户可靠性要求设置,一般情况下,副本数为1~3。所以极大的减少了华为CSI与存储的连接数量,使得华为CSI服务能够接入大规模集群。 该架构变化可能会导致一个问题:升级后,使用2.x或3.x发放的工作负载,升级CSI至4.x版本之后,如果产生了一次新的挂载流程,并且CO(Container Orchestration system)未调用华为CSI提供的huawei-csi-controller服务,会导致挂载失败。问题请参考创建Pod失败,Events日志显示“publishInfo doesn’t exist”

备份存储后端配置

如果您已按照以上须知评估风险后,确认需要从2.x或3.x版本的CSI升级至4.5.0版本,请按照以下操作步骤备份存储后端配置:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令备份后端信息到configmap.json文件中。OpenShift平台使用oc替换kubectl命令。

    kubectl get cm huawei-csi-configmap -n huawei-csi -o json > configmap.json
    

升级华为CSI

请按照升级华为CSI中的步骤进行升级。

配置存储后端

请将备份存储后端配置中备份的后端信息,按照管理存储后端章节的说明配置存储后端,存储后端配置成功后,请务必按照以上须知所述的风险处理方法进行操作,避免Pod在漂移过程中出现问题。

5.4.1.1.2 - Kubernetes、OpenShift、Tanzu升级华为CSI

前提条件

  • 旧版本华为CSI使用Helm安装。
  • 新版本华为CSI镜像已制作完成,并且按照上传华为CSI镜像章节说明,上传到镜像仓库或者导入到所有节点。

升级华为CSI

如果您旧版本CSI使用Helm部署,请按照以下操作步骤升级华为CSI。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 将目标版本CSI组件包拷贝到master节点的任意目录下。

  3. 进入到helm/esdk的工作目录下,目录路径请参见表 软件包组件描述

    cd helm/esdk
    
  4. 执行kubectl apply -f ./crds/backend/命令,更新存储后端CRD

    kubectl apply -f ./crds/backend/
    
  5. (可选) 请务必按照检查卷快照依赖组件章节检查快照依赖组件,确认无误后执行执行kubectl apply -f ./crds/snapshot-crds/ –validate=false命令更新快照CRD,如果controller.snapshot.enabled参数设置为false或Kubernetes版本低于v1.17,可跳过本步骤,详情请参考表 controller配置项说明

    kubectl apply -f ./crds/snapshot-crds/ --validate=false
    
  6. 执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。

    helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
    
  7. 执行vi update-values.yaml命令打开6中获取的文件,修改images配置项,更新镜像至最新版本。需要修改的参数请参考表 images配置项

    表 1 images配置项

    参数

    描述

    修改为

    images.huaweiCSIService

    huawei-csi镜像。

    huawei-csi:4.5.0

    images.storageBackendSidecar

    华为后端管理storageBackendContent资源的镜像

    storage-backend-sidecar:4.5.0

    images.storageBackendController

    华为后端管理storageBackendClaim资源的镜像。

    storage-backend-controller:4.5.0

    images.huaweiCSIExtender

    huawei-csi-extender镜像

    huawei-csi-extender:4.5.0

    images.sidecar.livenessProbe

    livenessprobe sidecar镜像。

    k8s.gcr.io/sig-storage/livenessprobe:v2.5.0

    images.sidecar.provisioner

    csi-provisioner sidecar镜像。

    k8s.gcr.io/sig-storage/csi-provisioner:v3.0.0

    images.sidecar.attacher

    csi-attacher sidecar镜像。

    k8s.gcr.io/sig-storage/csi-attacher:v3.4.0

    images.sidecar.resizer

    csi-resizer sidecar镜像。

    k8s.gcr.io/sig-storage/csi-resizer:v1.4.0

    images.sidecar.snapshotter

    csi-snapshotter sidecar镜像。

    k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.1

    images.sidecar.snapshotController

    snapshot-controller sidecar镜像。

    k8s.gcr.io/sig-storage/snapshot-controller:v4.2.1

    images.sidecar.registrar

    csi-node-driver-registrar sidecar镜像。

    k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0

  8. (可选)在升级过程中如需自定义更新配置项信息或者需要新增配置信息,可参考Helm values.yaml参数说明修改update-values.yaml文件中配置信息。

    升级时,如果update-values.yaml与values.yaml配置文件中存在相同配置项,update-values.yaml中的配置将会优先生效。

  9. 执行以下命令,升级华为CSI。其中helm-huawei-csi为指定的Helm Chart名称,huawei-csi为指定的Helm Chart命名空间,update-values.yaml为步骤6中获取的文件。

    helm upgrade helm-huawei-csi ./ -n huawei-csi -f ./values.yaml -f ./update-values.yaml
    
  10. 完成huawei-csi服务部署后,执行命令检查服务是否启动。

    kubectl get pod -n huawei-csi
    

    命令结果示例如下,Pod状态为“Running“表明服务启动成功。

    NAME                                     READY   STATUS    RESTARTS   AGE
    huawei-csi-controller-6dfcc4b79f-9vjtq   9/9     Running   0          24m
    huawei-csi-controller-6dfcc4b79f-csphc   9/9     Running   0          24m
    huawei-csi-node-g6f4k                    3/3     Running   0          20m
    huawei-csi-node-tqs87                    3/3     Running   0          20m
    

5.4.1.1.3 - CCE和CCE Agile升级华为CSI

前提条件

已下载新版本CSI的软件包。

操作步骤

  1. 参考CCE和CCE Agile卸载华为CSI卸载CSI。
  2. 参考CCE和CCE Agile平台安装华为CSI安装新版本的CSI。

5.4.1.2 - 回退华为CSI

如果您从2.x和3.x版本的CSI升级至4.5.0版本失败,需要回退时,请参考Helm卸载华为CSI卸载CSI,然后下载安装升级之前版本的CSI。

  • 在升级/回退过程中,已经存在的PVC/快照/Pod等资源会正常运行,不会影响您的业务访问。
  • 在升级/回退过程中,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。
  • 在升级/回退过程中,请勿卸载Snapshot依赖组件服务。

5.4.1.2.1 - Kubernetes、OpenShift、Tanzu回退华为CSI

前提条件

  • 已使用Helm 3完成CSI的更新。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 进入到helm/esdk的工作目录下,目录路径请参见表 软件包组件描述

    cd helm/esdk
    
  3. 执行命令,查看Helm部署CSI服务的历史版本。

    helm history helm-huawei-csi -n huawei-csi 
    

    命令结果示例如下。

    REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION     
    1       	Mon Jan  8 04:15:40 2024	superseded	esdk-4.4.0	4.4.0      	Install complete
    2       	Mon Jan  8 04:16:12 2024	deployed  	esdk-4.5.0	4.5.0      	Upgrade complete
    
  4. 执行命令,回退CSI服务到指定版本。

    其中,revision-number为3查询到的版本号。例如版本为:1。

    helm rollback helm-huawei-csi -n huawei-csi 1
    

    命令结果示例如下,回显中有Rollback was a success,则表示回退CSI服务到指定版本成功。

    Rollback was a success! Happy Helming!
    

5.4.1.2.2 - CCE和CCE Agile回退华为CSI

  • 在升级/回退过程中,已经存在的PVC/快照/Pod等资源会正常运行,不会影响您的业务访问。
  • 在升级/回退过程中,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。
  • 在升级/回退过程中,请勿卸载Snapshot依赖组件服务。

前提条件

已下载原版本CSI的软件包。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
  2. 参考操作步骤卸载CSI。
  3. 参考CCE和CCE Agile平台安装华为CSI重新安装原版本的CSI。

5.4.2 - 手动升级/回退

5.4.2.1 - 升级华为CSI

本章节介绍如何手动升级华为CSI。

升级/回退过程中,已经存在的PVC/快照/Pod等资源会正常运行,不会影响您的业务访问。

  • 部分2.x版本CSI已经下架,若升级失败,可能无法回退到已下架版本的CSI。
  • 在升级/回退过程中,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。
  • 在升级/回退过程中,请勿卸载Snapshot依赖组件服务。

2.x和3.x版本的CSI升级至4.5.0版本

如果您从2.x和3.x版本的CSI升级至4.5.0版本,请按照以下操作步骤升级:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行命令备份后端信息到configmap.json文件中。OpenShift平台使用oc替换kubectl命令。

    kubectl get cm huawei-csi-configmap -n huawei-csi -o json > configmap.json
    
  3. 参考手动卸载华为CSI卸载CSI。

  4. 参考手动安装华为CSI安装当前版本的CSI。

  5. 2中备份的后端信息,按照管理存储后端章节的说明安装。

从4.x版本的CSI升级至4.5.0版本。

如果您从4.x版本的CSI升级至4.5.0版本,请按照以下操作步骤升级:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
  2. 参考手动卸载华为CSI卸载CSI。
  3. 参考手动安装华为CSI安装当前版本的CSI。

5.4.2.2 - 回退华为CSI

请参考手动卸载华为CSI卸载CSI,然后下载安装升级之前版本的CSI。

  • 在升级/回退过程中,已经存在的PVC/快照/Pod等资源会正常运行,不会影响您的业务访问。
  • 在升级/回退过程中,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。
  • 在升级/回退过程中,请勿卸载Snapshot依赖组件服务。

前提条件

已下载原版本CSI的软件包。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
  2. 参考手动卸载华为CSI卸载CSI。
  3. 参考手动安装华为CSI重新安装原版本的CSI。

6 - 存储后端管理

后端是华为存储资源的抽象概念,每台华为存储设备可以通过租户/存储池/协议等特性抽象出多个后端资源,每个后端独立存在,其中定义了为Kubernetes集群供应持久卷时所需要的华为存储信息。

本章节用于描述使用oceanctl工具管理存储后端,包括后端的创建/查询/更新/删除操作

oceanctl工具说明

  • 获取oceanctl工具,将oceanctl工具拷贝到环境目录下,例如(/usr/local/bin),且赋予可执行权限,oceanctl工具位于软件包/bin/oceanctl。
  • oceanctl工具依赖kubectl(Kubernetes平台)或oc(OpenShift平台)命令,因此需要在可执行kubectl或oc命令的节点运行。
  • 默认情况下,执行oceanctl命令的用户需要有/var/log目录的读写权限。如果没有该目录权限,可通过“–log-dir=/path/to/custom”指定有权限目录作为日志文件目录。
  • oceanctl创建后端的命名空间默认为huawei-csi。
  • oceanctl命令详细说明请参考oceanctl命令说明

6.1 - 管理存储后端

本章节介绍如何创建存储后端,当前支持根据配置的后端yaml文件和导出的configmap.json文件两种方式创建后端。

如果通过新增后端yaml文件创建后端,请参考典型场景存储后端配置文件示例章节配置后端文件。

如果已存在导出的configmap.json文件,请参考创建存储后端章节创建存储后端。

6.1.1 - 创建存储后端

  1. 使用oceanctl创建存储后端时,输入的账号和秘钥信息保存在Secret对象中,建议客户容器平台根据供应商或者K8s社区的建议自行对Secret进行加密。K8s社区对Secret加密可参考启用静态加密
  2. 通过json文件创建后端时,旧版本的backend名称中可能存在大写字母或"_“字符。如果出现这种情况,旧的名称将会被重映射为一个新的名称,映射过程自动发生,不会影响原有功能。例如“ABC_123”将会被映射为“abc-123-fd68e”,具体映射规则如下:
  • 大写字母转换成小写字母。
  • “_“字符转换成“-”字符。
  • 末尾追加5位Hash码。
  1. 当存储后端对接租户时,在存储后端创建完成后,不允许修改租户名称。

创建后端步骤

  1. 参考典型场景存储后端配置文件示例章节准备后端配置文件,如backend.yaml,若需创建多个后端,请使用’”—“分隔。

    storage: "oceanstor-san"
    name: "backend-1"
    namespace: "huawei-csi"
    urls:
      - "https://192.168.129.157:8088"
    pools:
      - "StoragePool001"
    parameters:
      protocol: "roce"
      portals:
        - "10.10.30.20"
        - "10.10.30.21"
    maxClientThreads: "30"
    ---
    storage: "oceanstor-san"
    name: "backend-2"
    namespace: "huawei-csi"
    urls:
      - "https://192.168.129.158:8088"
    pools:
      - "StoragePool001"
    parameters:
      protocol: "roce"
      portals:
        - "10.10.30.20"
        - "10.10.30.21"
    maxClientThreads: "30"
    
  2. 执行以下命令创建存储后端。

    oceanctl create backend -f /path/to/backend.yaml -i yaml
    

    命令结果如下:

    NUMBER  CONFIGURED    NAME        STORAGE              URLS                
    1       false         backend-1   oceanstor-san        https://192.168.129.157:8088 
    2       false         backend-2   oceanstor-san        https://192.168.129.158:8088 
    Please enter the backend number to configure (Enter 'exit' to exit):
    
  3. 输入待创建后端序号,并输入账号密码。

    Please enter the backend number to configure (Enter 'exit' to exit):1
    Please enter this backend user name:admin
    Please enter this backend password:
    
    Backend backend-1 is configured
    NUMBER  CONFIGURED    NAME         STORAGE              URLS               
    1       true          backend-1    oceanstor-san        https://192.168.129.157:8088 
    2       false         backend-2    oceanstor-san        https://192.168.129.158:8088 
    Please enter the backend number to configure (Enter 'exit' to exit):
    
  4. 检查存储后端创建结果。

    oceanctl get backend
    

    命令结果示例如下,后端状态为“Bound“则创建成功:

    NAMESPACE     NAME         PROTOCOL    STORAGETYPE      SN                    STATUS  ONLINE  URL                 
    huawei-csi    backend-1    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.157:8088   
    huawei-csi    backend-2    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.158:8088   
    

6.1.1.1 - 典型场景存储后端配置文件示例

典型场景的backend配置请参考下列示例,详细的参数配置请参考存储后端配置项说明

配置iSCSI协议类型的存储后端

如果要使用iSCSI协议类型,请确保在安装华为CSI前,主机上已安装iSCSI客户端,可通过检查主机依赖软件状态章节检查。如未安装iSCSI客户端,请在安装iSCSI客户端之后重启huawei-csi-node服务,重启期间,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。参考命令如下:

kubectl delete pods -n huawei-csi -l app=huawei-csi-node

企业存储配置iSCSI协议类型的后端配置文件示例如下:

storage: "oceanstor-san"
name: "dorado-iscsi-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "iscsi"
  portals:
    - "192.168.128.120"                
    - "192.168.128.121"
maxClientThreads: "30"

分布式存储配置iSCSI协议类型的后端配置文件示例如下:

storage: "fusionstorage-san"
name: "pacific-iscsi-125"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.125:8088"
  - "https://192.168.129.126:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "iscsi"
  portals:
    - "192.168.128.122"
    - "192.168.128.123"
maxClientThreads: "30"

配置FC协议类型的存储后端

如果要使用FC协议类型,请确保在安装华为CSI前,主机和存储的FC网络已联通,如未FC网络未打通,请在打通FC网络之后重启huawei-csi-node服务,重启期间,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。参考命令如下:

kubectl delete pods -n huawei-csi -l app=huawei-csi-node

企业存储配置FC协议类型的后端配置文件示例如下:

storage: "oceanstor-san"
name: "fc-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "fc"
maxClientThreads: "30"

配置NVMe over RoCE协议类型的存储后端

如果要使用NVMe over RoCE协议类型,请确保在安装华为CSI前,主机和存储的NVMe over RoCE网络已联通,如未NVMe over RoCE网络未打通,请在打通NVMe over RoCE网络之后重启huawei-csi-node服务,重启期间,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。参考命令如下:

kubectl delete pods -n huawei-csi -l app=huawei-csi-node

企业存储配置NVMe over RoCE协议类型的后端配置文件示例如下:

storage: "oceanstor-san"
name: "roce-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "roce"
  portals:
    - "192.168.128.120"        
    - "192.168.128.121"
maxClientThreads: "30"

配置NVMe over FC协议类型的存储后端

企业存储配置NVMe over FC协议类型的后端配置文件示例如下:

storage: "oceanstor-san"
name: "fc-nvme-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "fc-nvme"
maxClientThreads: "30"

配置NFS协议类型的存储后端

企业存储配置NFS协议类型的后端配置文件示例如下:

storage: "oceanstor-nas"
name: "nfs-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "nfs"
  portals:        
    - "192.168.128.155"
maxClientThreads: "30"

分布式存储配置NFS协议类型的后端配置文件示例如下:

storage: "fusionstorage-nas"
name: "nfs-126"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.125:8088"
  - "https://192.168.129.126:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "nfs"
  portals:
    - "192.168.128.123"
maxClientThreads: "30"

配置SCSI协议类型的存储后端

分布式存储配置SCSI协议类型的后端配置文件示例如下:

storage: "fusionstorage-san"
name: "scsi-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "scsi"
  portals:
    - {"hostname01": "192.168.125.21","hostname02": "192.168.125.22"}
maxClientThreads: "30"

配置DPC协议类型的存储后端

分布式存储配置DPC协议类型的后端配置文件示例如下:

storage: "fusionstorage-nas"
name: "dpc-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:      
  protocol: "dpc"
maxClientThreads: "30"

配置Dtree类型的存储后端

企业存储配置Dtree类型后端配置文件示例如下:

storage: "oceanstor-dtree"
name: "nfs-dtree"
namespace: "huawei-csi"
urls:
- "https://192.168.129.155:8088"
parameters:
  protocol: "nfs"
  parentname: "parent-filesystem"  
  portals:
    - "192.168.128.155"
maxClientThreads: "30"

配置双活类型的存储后端

  • 配置NAS双活前,需要在两台存储设备之间配置双活关系,包含远端设备、双活域等,仅支持文件系统双活域工作模式为双活AA模式,配置操作请参考对应存储型号的产品文档。
  • 对接NAS双活后端的账号必须为存储租户的租户管理员账号。
  • 除NAS双活后端外,其他后端的管理URL不能配置为在已建立双活关系的租户的逻辑管理端口的URL。
  • 使用双活类型的存储后端时,请勿发放普通文件系统。否则,在逻辑端口漂移场景下,有业务中断的风险。

CSI支持在对接OceanStor或OceanStor Dorado,并在存储侧发放NFS类型的双活卷时。需要配置互为双活的存储后端,具体操作为分别创建两个配置文件,逐一创建后端。

本示例展示了如何为华为OceanStor或OceanStor Dorado存储配置双活类型的后端。首先创建本端的存储后端配置文件nfs-hypermetro-155.yaml:

storage: "oceanstor-nas"
name: "nfs-hypermetro-155"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
metrovStorePairID: "f09838237b93c000"
metroBackend: "nfs-hypermetro-157"
parameters:
  protocol: "nfs"
  portals:
    - "192.168.129.155"
maxClientThreads: "30"

创建本端后端完成后,创建远端的存储后端配置文件nfs-hypermetro-157.yaml:

storage: "oceanstor-nas"
name: "nfs-hypermetro-157"
namespace: "huawei-csi"
urls:
  - "https://192.168.129.157:8088"
  - "https://192.168.129.158:8088"
pools:
  - "StoragePool001"
metrovStorePairID: "f09838237b93c000"
metroBackend: "nfs-hypermetro-155"
parameters:
  protocol: "nfs"
  portals:
    - "192.168.129.157"
maxClientThreads: "30"

6.1.1.2 - 存储后端配置项说明

后端配置文件样例模板为/examples/backend/backend.yaml,该文件为一个示例文件,具体配置项如下表所示:

表 1 backend配置项说明

参数

描述

必选参数

默认值

备注

storage

存储服务类型。

  • 企业存储提供SAN存储时填写oceanstor-san。
  • 企业存储提供NAS存储时填写oceanstor-nas。
  • 企业存储提供Dtree类型的NAS存储时填写oceanstor-dtree。
  • 分布式存储提供SAN存储时填写fusionstorage-san。
  • 分布式存储提供NAS存储时填写fusionstorage-nas。

oceanstor-nas

一个后端只允许提供一种存储服务。如果单套华为存储系统可以同时提供SAN和NAS的存储服务时,可以配置创建多个后端,每个后端使用不同的存储服务类型。

name

存储后端名称。支持小写字母、数字和特殊字符"-",且需要以字母或数字开头,最多63个字符。

-

请保证存储后端名称唯一。

namespace

命名空间。

-

存储后端必须与华为CSI在相同的命名空间中。

vstoreName

存储侧的租户名称。当对接后端是OceanStor V5存储,需要在指定租户下发放资源时,需要指定该参数。

条件必选

-

仅对接后端是OceanStor V5且需要支持租户时,需要指定该参数。

accountName

存储侧的账户名称。当对接资源是OceanStor Pacific NAS存储,需要在指定账户下发放NAS资源时,需要指定该参数。

条件必选

-

仅对接后端是OceanStor Pacific NAS存储且需要支持账号时,需要指定该参数。

urls

存储设备的管理URL。参数格式为列表。支持按照域名或者IP+端口的方式进行配置。仅支持IPv4。

-

当对接后端是OceanStor或OceanStor Dorado存储,需要在指定租户下发放资源时,该参数配置为指定租户的逻辑管理端口URL。

pools

存储设备的存储池。参数格式为列表。

条件必选

-

storage为oceanstor-dtree时, 可以不填。

parameters.protocol

存储协议。参数格式为字符串。

  • iscsi
  • fc
  • roce
  • fc-nvme
  • nfs
  • dpc
  • scsi

-

  • 使用iscsi时,请确保对接的计算节点已安装iSCSI客户端。
  • 使用nfs时,请确保对接的计算节点已安装NFS客户端工具。
  • 使用fc-nvme/roce时,请确保对接的计算节点已安装nvme-cli工具,工具版本仅支持1.x且版本不低于1.9。
  • 使用dpc时,请确保对接的计算节点已安装DPC客户端,并已在待接入存储上添加为DPC计算节点。
  • 使用scsi时,请确保对接的计算节点已安装分布式存储VBS客户端。

parameters.portals

业务访问端口。节点会使用该端口对存储资源进行读写访问。参数格式为一个列表

iscsi,roce协议支持配置多个端口,nfs协议仅支持配置一个端口,fc、fc-nvme、dpc协议无需配置业务端口,scsi协议的端口形式为字典格式,key为主机名称,value为IP地址,仅支持IPv4。

条件必选

-

  • 使用租户/账户对接后端时,此时portals必须配置为租户/账户所拥有的逻辑端口信息。
  • 如果使用nfs协议,支持填写为域名地址。

parameters.ALUA

存储后端ALUA参数配置。当工作节点使用操作系统原生多路径,且启用了ALUA时,需要进行配置。

条件必选

-

如果主机多路径配置启用了ALUA,请确保后端ALUA配置和主机的ALUA配置一致。

ALUA详细配置请参考通过Helm配置ALUA特性

parameters.parentname

当前存储上的某一个文件系统名称,在此文件系统下创建Dtree。

storage为oceanstor-dtree时必选。

条件必选

-

请到DeviceManager文件系统界面查询。

metrovStorePairID

双活租户Pair ID。

当需要创建PV在存储侧支持NAS双活特性时,该字段必填。此时需要填入待创建的PV所归属的存储侧双活租户Pair ID。

条件必选

-

双活租户Pair ID请到DeviceManager界面查询。

metroBackend

双活对端的后端名称。参数格式为字符串。

当需要创建PV在存储侧支持NAS双活特性时,该字段必填。此时需要填入准备和当前后端组成双活的另一个后端名称。

条件必选

-

组对的两个后端都必须将对方名称填入。这两个后端组成双活关系后,不允许再和其他后端组成双活关系。

supportedTopologies

存储拓扑感知配置。参数格式为列表类型的JSON。

条件必选

-

如果启用存储拓扑感知,需要配置该参数。具体请参考通过Helm配置存储拓扑感知

maxClientThreads

同时连接到存储后端的最大连接数。

30

如果不配置该参数,则默认最大连接数为30。

6.1.2 - 查询存储后端

请参考查询存储后端节,使用oceanctl命令查询存储后端信息。

6.1.3 - 更新存储后端

  • 当前使用oceanctl更新存储后端信息时,仅支持更新存储后端密码。
  • 若在存储侧更新了后端的账号密码,CSI插件会因登录失败而重试,可能会导致账号被锁定。如果账号被锁定,请参考存储侧更新密码后账户被锁定章节修改。

6.1.3.1 - oceanctl更新存储后端密码

更新后端示例

  1. 执行以下命令获取更新存储后端帮助。

    oceanctl update backend -h
    

    命令结果如下:

    Update a backend for Ocean Storage in Kubernetes
    
    Usage:
      oceanctl update backend <name> [flags]
    
    Examples:
      # Update backend account information in default(huawei-csi) namespace
      oceanctl update backend <name>  --password
    
      # Update backend account information in specified namespace
      oceanctl update backend <name> -n namespace --password
    
    Flags:
      -h, --help               help for backend
      -n, --namespace string   namespace of resources
          --password           Update account password
    
  2. 执行以下命令更新存储后端信息。

    oceanctl update backend backend-1 --password
    

    根据提示输入新的用户名和密码:

    Please enter this backend user name:admin
    Please enter this backend password:
    
    backend/backend-1 updated
    

6.1.3.2 - 手动更新存储后端

  • PVC发放需要基于已配置的存储后端,因此当存储后端已经发放PVC时,请勿随便修改存储后端。
  • 名称是存储后端的唯一标识,已发放PVC的存储后端不允许修改名称。
  • 存储后端修改后,新增配置仅作用于新发放的卷。
  • 存储后端修改期间,请勿执行卷管理操作。

操作步骤

  1. 参考删除存储后端章节,删除待修改存储后端。
  2. 参考创建存储后端章节,创建同名存储后端,存储后端名称不可变更。

6.1.4 - 删除存储后端


正在执行卷管理操作期间,请勿删除存储后端。

删除后端示例

  1. 执行以下命令获取存储后端。

    oceanctl get backend 
    

    命令结果示例如下:

    NAMESPACE     NAME         PROTOCOL    STORAGETYPE      SN                    STATUS  ONLINE  URL                 
    huawei-csi    backend-1    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.157:8088   
    huawei-csi    backend-2    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.158:8088  
    
  2. 执行以下命令删除指定存储后端。

    oceanctl delete backend backend-1
    
  3. 执行以下命令检查删除结果。

    oceanctl get backend backend-1
    

    命令结果示例如下,如果回显为“not found”则删除成功。

    Error from server (NotFound): backend "backend-1" not found
    

6.2 - 新增证书到存储后端(可选)

本章节介绍如何创建证书到存储后端,如果有对服务登录存储添加证书校验的需要,可以参考本章节新增证书,当前支持根据crt文件或者pem文件创建证书到存储后端。


创建证书到存储后端前,须提前将准备好的证书导入存储阵列。

6.2.1 - 创建证书到存储后端

前提条件

完成证书制作。以OceanStor Dorado为例,证书制作过程请参考:点此前往

创建证书示例

  1. 提前准备好证书文件,如cert.crt。

  2. 执行以下命令获取存储后端。

    oceanctl get backend  
    

    命令结果示例如下。

    NAMESPACE     NAME         PROTOCOL    STORAGETYPE      SN                    STATUS  ONLINE  URL                 
    huawei-csi    backend-1    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.157:8088   
    huawei-csi    backend-2    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.158:8088  
    
  3. 执行以下命令为指定存储后端创建证书。

    oceanctl create cert cert-1 -b backend-1 -f /path/to/cert.crt
    
  4. 检查证书创建结果。

    oceanctl get cert -b backend-1
    

    命令结果示例如下。

    NAMESPACE    NAME    BOUNDBACKEND   
    huawei-csi   cert-1  backend-1 
    

6.2.2 - 查询存储后端证书

请根据查询存储后端证书所示命令对存储后端证书进行查询。

6.2.3 - 更新存储后端证书

更新证书前请准备好新的证书文件,并参考本章节更新存储后端证书。如果不再使用证书,请参考删除存储后端证书章节移除存储后端上的证书。

更新证书步骤

  1. 执行以下命令获取存储后端。

    oceanctl get backend 
    

    命令结果示例如下。

    NAMESPACE     NAME         PROTOCOL    STORAGETYPE      SN                    STATUS  ONLINE  URL                 
    huawei-csi    backend-1    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.157:8088   
    huawei-csi    backend-2    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.158:8088  
    
  2. 执行以下命令查看指定存储后端是否存在证书。

    oceanctl get cert -b backend-1
    

    命令结果示例如下。

    NAMESPACE   NAME    BOUNDBACKEND    
    huawei-csi  cert-1  backend-1  
    
  3. 执行以下命令更新指定存储后端的证书。

    oceanctl update cert -b backend-1 -f /path/to/cert.crt
    

6.2.4 - 删除存储后端证书

删除证书步骤

  1. 执行以下命令获取存储后端。

    oceanctl get backend  
    

    命令结果示例如下。

    NAMESPACE     NAME         PROTOCOL    STORAGETYPE      SN                    STATUS  ONLINE  URL                 
    huawei-csi    backend-1    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.157:8088   
    huawei-csi    backend-2    roce        oceanstor-san    xxxxxxxxxxxxxxxxxxxx  Bound   true    https://192.168.129.158:8088  
    
  2. 执行以下命令获取指定存储后端的证书。

    oceanctl get cert -b backend-1
    

    命令结果示例如下。

    NAMESPACE   NAME    BOUNDBACKEND    
    huawei-csi  cert-1  backend-1  
    
  3. 执行以下命令删除指定存储后端的证书。

    oceanctl delete cert -b backend-1
    
  4. 检查删除结果。

    oceanctl get cert -b backend-1
    

    命令结果示例如下,如果回显为“no cert found”则删除成功。

    Error from server (NotFound): no cert found on backend backend-1 in huawei-csi namespace
    

6.3 - oceanctl命令说明

帮助说明

  • 获取oceanctl帮助说明。

    oceanctl --help
    
  • 查看oceanctl版本号。

    oceanctl version
    
  • 指定自定义日志文件目录,以查看oceanctl版本号为例。

    oceanctl version --log-dir=/path/to/custom
    

创建存储后端

  • 执行以下命令获取创建后端帮助。

    oceanctl create backend -h
    
  • 执行以下命令根据指定的yaml文件创建存储后端。

    oceanctl create backend -f /path/to/backend.yaml -i yaml
    
  • 执行以下命令根据指定的json文件创建存储后端,json文件仅支持通过json格式导出huawei-csi-configmap文件。

    oceanctl create backend -f /path/to/configmap.json -i json
    
  • 执行以下命令在指定命名空间创建一个存储后端。

    oceanctl create backend -f /path/to/backend.yaml -i yaml -n <namespace>
    
  • 执行以下命令创建存储后端,并忽略存储后端名称校验,例如大写和字符“_”,非必要请勿使用该命令。

    oceanctl create backend -f /path/to/backend.yaml -i yaml --not-validate-name
    
  • 执行以下命令创建存储后端,并指定provisioner,其中“csi.oceanstor.com”是安装时指定的驱动名称,详情可以参考4

    仅在CCE / CCE Agile平台创建后端时使用该命令。

    oceanctl create backend -f /path/to/backend.yaml  -i yaml --provisioner=csi.oceanstor.com
    

查询存储后端

  • 执行以下命令获取查询后端帮助。

    oceanctl get backend -h
    
  • 执行以下命令查询默认命名空间下单个存储后端。

    oceanctl get backend <backend-name>
    
  • 执行以下命令查询指定命名空间下所有存储后端。

    oceanctl get backend -n <namespace>
    
  • 执行以下命令格式化输出,当前支持json,yaml和wide。

    oceanctl get backend <backend-name> -o json
    

更新存储后端

  • 执行以下命令获取更新后端帮助。

    oceanctl update backend -h
    
  • 执行以下命令更新默认命名空间下指定存储后端信息。

    oceanctl update backend <backend-name> --password
    
  • 执行以下命令更新指定命名空间存储后端信息。

    oceanctl update backend <backend-name> -n <namespace> --password
    

删除存储后端

  • 执行以下命令获取删除后端帮助。

    oceanctl delete backend -h
    
  • 执行以下命令删除默认命名空间下指定存储后端。

    oceanctl delete backend <backend-name> 
    
  • 执行以下命令删除默认命名空间下所有存储后端。

    oceanctl delete backend  --all
    
  • 执行以下命令删除指定命名空间下存储后端。

    oceanctl delete backend <backend-name...> -n <namespace>
    

创建存储后端证书

  • 执行以下命令获取查询证书帮助。

    oceanctl create cert -h
    
  • 执行以下命令根据指定的crt证书文件为默认命名空间单个存储后端创建证书。

    oceanctl create cert <name> -f /path/to/cert.crt -b <backend-name> 
    
  • 执行以下命令根据指定的crt证书文件为指定命名空间单个存储后端创建证书。

    oceanctl create cert <name> -f /path/to/cert.crt -b <backend-name> -n <namespace>
    
  • 执行以下命令根据指定的pem证书文件为指定命名空间单个存储后端创建证书。

    oceanctl create cert <name> -f /path/to/cert.pem -b <backend-name> -n <namespace>
    

查询存储后端证书

  • 执行以下命令获取查询证书帮助。

    oceanctl get cert -h
    
  • 执行以下命令查询默认命名空间指定存储后端的证书。

    oceanctl get cert -b <backend-name>
    
  • 执行以下命令查询指定命名空间下指定存储后端的证书。

    oceanctl get cert -b <backend-name> -n <namespace>
    

更新存储后端证书

  • 执行以下命令获取更新证书帮助。

    oceanctl update cert -h
    
  • 执行以下命令根据指定的crt证书文件为默认命名空间指定存储后端更新证书。

    oceanctl update cert -b <backend-name> -f /path/to/cert.crt
    
  • 执行以下命令根据指定的crt证书文件为指定命名空间指定存储后端更新证书。

    oceanctl update cert -b <backend-name> -n <namespace> -f /path/to/cert.crt
    
  • 执行以下命令根据指定的pem证书文件为指定命名空间指定存储后端更新证书。

    oceanctl update cert -b <backend-name> -n <namespace> -f /path/to/cert.pem
    

删除存储后端证书

  • 执行以下命令获取删除证书帮助。

    oceanctl delete cert -h
    
  • 执行以下命令删除默认命名空间指定存储后端的证书。

    oceanctl delete cert -b <backend-name> 
    
  • 执行以下命令删除指定命名空间指定存储后端的证书。

    oceanctl delete cert -b <backend-name> -n <namespace>
    

7 - 使用华为CSI

本章节主要介绍如何使用华为CSI对PV、快照的生命周期进行管理。

  • 使用华为CSI进行卷管理操作期间,请勿删除存储后端。
  • 在映射block卷时,华为CSI会自动创建创建主机、主机组、LUN组等这些卷映射需要的关联对象,以及映射视图。如果手动在存储上创建了这些对象,会影响华为CSI的映射逻辑,请确保在使用华为CSI映射卷前删除这些对象。

7.1 - PVC管理

根据业务的需求,容器中的文件需要在磁盘上进行持久化。当容器被重建或者重新分配至新的节点时,可以继续使用这些持久化数据。

为了可以将数据持久化到存储设备上,您需要在发放容器时使用持久卷(PersistentVolume,PV)以及持久卷申领(PersistentVolumeClaim,PVC)

  • PV:是Kubernetes集群中的一块存储,可以由管理员事先制备, 或者使用存储类(StorageClass)来动态制备。
  • PVC:是用户对存储的请求。PVC会耗用 PV 资源。PVC可以请求特定的大小和访问模式 (例如,可以要求 PV能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。

本章将介绍如何使用华为CSI对PV/PVC进行创建、扩容、克隆以及从快照创建PVC。

7.1.1 - 创建PVC

华为CSI支持在华为存储上创建存储资源(LUN/文件系统),并根据用户的设置供给容器使用。具体支持的特性请参考表 华为企业存储支持的特性及约束或者表 华为分布式存储支持的特性及约束

创建PVC的方式分为动态卷供应和静态卷供应。

  • 动态卷供应不需要事先创建PV,华为CSI会根据StorageClass自动在存储设备上创建PV所需要的资源。并且可以在创建PVC时同时创建PV。
  • 静态卷供应需要管理员事先在存储设备上创建好所需要的资源,通过创建PV的方式使用已存在的资源。并且可以在创建PVC时指定关联的PV。

7.1.1.1 - 动态卷供应

动态卷供应(Dynamic Volume Provisioning)允许按需创建存储卷。动态卷供应依赖StorageClass对象。 集群管理员可以根据需要定义多个StorageClass对象,在声明PV或者PVC时,指定满足业务要求的StorageClass。华为CSI在从华为存储设备上申请资源时,会根据StorageClass的预置定义,创建满足业务要求的存储资源。

为了完成动态卷供应,需要完成如下两步:

  • 配置StorageClass
  • 配置PVC

配置StorageClass

  1. 根据业务需要,参考动态卷供应典型场景StorageClass配置示例动态卷供应StorageClass参数说明,创建StorageClass配置文件,如本例从的mysc.yaml文件。

  2. 执行命令,使用配置文件创建StorageClass。

    kubectl apply -f mysc.yaml
    
  3. 执行命令,查看已创建的StorageClass信息。

    kubectl get sc mysc
    

    命令结果示例如下:

    NAME   PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    mysc   csi.huawei.com   Delete          Immediate           true                   8s
    

配置PVC

  1. 根据业务需要,参考本节描述和PVC配置文件示例,修改具体参数,生成本次需要创建的PVC配置文件,如本例中mypvc.yaml文件。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: mypvc
    spec:
      accessModes:
        - ReadWriteOnce
      volumeMode: Filesystem
      storageClassName: mysc
      resources:
        requests:
          storage: 100Gi
    
  2. 执行命令,使用配置文件创建PVC。

    kubectl create -f mypvc.yaml
    
  3. 等待一段时间后,执行以下命令,查看已经创建的PVC信息。

    kubectl get pvc mypvc
    

    命令结果示例如下,如果PVC的状态是“Bound”时,则说明该PVC已经创建成功,后续可以被Pod使用。

    NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mypvc       Bound    pvc-840054d3-1d5b-4153-b73f-826f980abf9e   100Gi      RWO            mysc           12s
    

    • 完成创建PVC操作后,如果长时间后(如一分钟后)PVC的状态是Pending,请参考创建PVC时, PVC的状态为Pending
    • 建议每批次最多批量创建/删除100个PVC。

使用PVC

在完成PVC创建后,就可以使用PVC来创建Pod。如下示例是一个简单的使用PVC示例,在该示例中,创建的Pod使用了刚刚创建的 mypvc

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers: 
      - image: nginx:alpine
        name: container-0 
        volumeMounts: 
        - mountPath: /tmp
          name: pvc-mypvc 
      restartPolicy: Always 
      volumes: 
      - name: pvc-mypvc 
        persistentVolumeClaim: 
          claimName:  mypvc  # name of PVC

7.1.1.1.1 - 动态卷供应典型场景StorageClass配置示例

存储类(StorageClass)为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到一组不同的能力定义。Kubernetes集群用户可基于StorageClass进行动态卷制备。

使用SAN存储时可参考示例文件/examples/sc-lun.yaml,使用NAS存储时可参考示例文件/examples/sc-fs.yaml。

典型场景下StorageClass配置请参考如下示例:

StorageClass中设置后端和存储池

如果在一个Kubernetes集群中配置了多个华为后端,或者一个华为后端提供多个存储池,建议在StorageClass中配置指定的后端和存储池信息,避免华为CSI随机选择后端和存储池,导致卷所在的存储不符合规划。

SAN存储设置后端和存储池可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
allowVolumeExpansion: true
parameters:
  backend: "san-181" # 存储后端名称
  pool: "pool001" # 存储池名称
  volumeType: lun
  allocType: thin

NAS存储设置后端和存储池可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
allowVolumeExpansion: true
parameters:
  backend: "san-181" # 存储后端名称
  pool: "pool001" # 存储池名称
  volumeType: fs
  allocType: thin
  authClient: "*"

StorageClass中设置NFS访问方式

容器使用NFS文件系统作为存储资源时,可以参考如下配置示例。该示例中,NFS挂载时指定版本为4.1。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: nfs-nas-181
  pool: pool001
  volumeType: fs
  allocType: thin
  authClient: "192.168.0.10;192.168.0.0/24;myserver1.test"
mountOptions:
  - nfsvers=4.1 # NFS挂载时指定版本为4.1

StorageClass中设置Dtree类型

容器使用Dtree作为存储资源时,可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: nfs-dtree
  volumeType: dtree # 卷类型配置为 dtree
  allocType: thin
  authClient: "*" 
mountOptions:
  - nfsvers=4.1

StorageClass中设置本地文件系统访问方式

容器使用企业存储或者分布式存储的LUN作为存储资源时,且需要格式化文件系统为本地文件系统时,可以参考如下示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: iscsi-lun-181
  pool: pool001
  volumeType: lun
  allocType: thin
  fsType: xfs

StorageClass中设置DPC访问方式

当容器使用OceanStor Pacific系列存储,且存储支持DPC协议访问时,可以在StorageClass中配置DPC访问的挂载参数。本例中设置挂载时使用“acl”做鉴权参数,使用“cnflush”为设置异步刷盘模式。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: nfs-dpc-101
  pool: pool001
  volumeType: fs
  allocType: thin
  authClient: "*"
mountOptions:
  - acl # 鉴权参数
  - cnflush # 设置异步刷盘模式

StorageClass中设置应用类型

当容器使用OceanStor Dorado存储的LUN作为存储时,如果使用存储默认的应用类型无法满足某些业务的I/O模型要求(如容器对外提供数据库OLAP服务),可以在StorageClass中配置应用类型,提升存储性能。具体需要使用的应用类型请参考对应存储产品的产品文档说明。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: iscsi-lun-181
  pool: pool001
  volumeType: lun
  allocType: thin
  fsType: xfs
  applicationType: Oracle_OLAP # 配置应用类型

StorageClass中设置软配额

当容器使用OceanStor Pacific系列存储的文件系统作为存储时,可以在StorageClass中配置软配额信息,可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: nfs-pacific-101
  pool: pool001
  volumeType: fs
  allocType: thin
  authClient: "*"
  storageQuota: '{"spaceQuota": "softQuota", "gracePeriod": 100}' # 配置软配额
mountOptions:
  - nfsvers=3

StorageClass中设置QoS

容器使用企业存储或者分布式存储作为存储资源时,可以为容器使用的存储资源设置QoS,从而保证这些容器对存储读写满足一定的服务等级。

不同型号或版本的存储支持的QoS设置不同,请参考表 支持的QoS配置找到对应存储的配置项。本示例中的后端是OceanStor Dorado存储,其他存储可以参考本例设置。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: iscsi-qos-181
  pool: pool001
  volumeType: lun
  allocType: thin
  fsType: xfs
  qos: '{"IOTYPE": 2, "MINIOPS": 1000}' # 配置QoS

  • OceanStor V5 租户用户不支持配置QoS策略。
  • 配置QoS后只能在新建的PVC上生效;对于同名StorageClass已经发放的PVC,不能自动添加QoS

StorageClass中设置双活

容器使用NFS双活文件系统作为存储资源时,可以参考如下配置示例。该示例中,使用的后端是支持双活的后端,且配置“hyperMetro”参数为“true”。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: nfs-hypermetro-dorado-181
  pool: pool001
  volumeType: fs
  hyperMetro: "true" # 发放双活卷
  allocType: thin
  authClient: "*"

  • 发放NAS双活卷前,需要在两台存储设备之间配置双活关系,包含远端设备、双活域等,仅支持文件系统双活域工作模式为双活AA模式,配置操作请参考对应存储型号的产品文档。
  • 若存储发生故障,逻辑管理端口可能产生漂移,在漂移状态下删除NAS双活卷后,需手动清理对应的存储资源。

StorageClass中设置挂载目录权限

当需要修改容器内挂载目录的权限时,可以在StorageClass中配置目录权限信息,可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
allowVolumeExpansion: true
parameters:
  volumeType: fs
  allocType: thin
  authClient: "*"
  fsPermission: "777"
  rootSquash: "no_root_squash"  # 该参数仅支持NAS存储
  allSquash: "no_all_squash"   # 该参数仅支持NAS存储

完成StorageClass配置后,进行如下步骤创建StorageClass。

  1. 执行以下命令,基于该yaml文件创建StorageClass。

    kubectl create -f mysc.yaml
    
  2. 执行以下命令,查看当前已经创建的StorageClass信息。

    kubectl get sc
    

    命令结果示例如下。

    NAME   PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    mysc   csi.huawei.com   Delete          Immediate           false                  34s
    

    创建StorageClass后,就可以使用该StorageClass进行创建PV或者PVC。


在StorageClass的使用中请注意如下事项:

  • 针对StorageClass进行的修改将不会在已经创建的PV上生效。您需要删除这些PV,并重新使用修改后的StorageClass创建才能应用修改的参数。

CCE / CCE Agile平台中配置StorageClass

在CCE / CCE Agile平台中创建NAS类型StorageClass,可以参考如下配置示例。其中provisioner保持和values.yaml文件中driverName一致。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
  annotations:
    storageclass.kubernetes.io/storageType: file 
provisioner: csi.oceanstor.com  
allowVolumeExpansion: true
parameters:
  volumeType: fs
  allocType: thin
  authClient: "*"

在CCE / CCE Agile平台中创建Block类型StorageClass,可以参考如下配置示例。其中provisioner保持和values.yaml文件中driverName一致。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
  annotations:
    storageclass.kubernetes.io/storageType: block 
provisioner: csi.oceanstor.com
allowVolumeExpansion: true
parameters:
  volumeType: lun
  allocType: thin

7.1.1.1.2 - 动态卷供应StorageClass参数说明

表 1 StorageClass配置参数说明

参数

说明

必选参数

默认值

备注

metadata.name

自定义的StorageClass对象名称。

-

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。

provisioner

制备器名称。

csi.huawei.com

该字段需要指定为安装华为CSI时设置的驱动名称。

取值和values.yaml文件中driverName一致。

reclaimPolicy

回收策略。支持如下类型:

  • Delete:自动回收资源。
  • Retain:手动回收资源

Delete

  • Delete:删除PV/PVC时会关联删除存储上的资源。
  • Retain:删除PV/PVC时不会删除存储上的资源。

allowVolumeExpansion

是否允许卷扩展。参数设置为true 时,使用该StorageClass的PV可以进行扩容操作。

false

此功能仅可用于扩容PV,不能用于缩容PV。

扩容PV功能在Kubernetes 1.14 (alpha)后才支持

parameters.backend

待创建资源所在的后端名称。

-

如果不设置,华为CSI随机选择一个满足容量要求的后端创建资源。

建议指定后端,确保创建的资源在预期的后端上。

parameters.pool

待创建资源所在的存储资源池名称。如果设置,则必须设置parameters.backend。

-

如果不设置,华为CSI会在所选后端上随机选择一个满足容量要求的存储池创建资源。建议指定存储池,确保创建的资源在预期的存储池上。

parameters.volumeType

待创建卷类型。支持如下类型:

  • lun:存储侧发放的资源是LUN。
  • fs:存储侧发放的资源是文件系统。
  • dtree:存储侧发放的资源是Dtree类型的卷

-

  • 使用NAS存储时,必须配置为fs。
  • 使用SAN存储时,必须配置为lun。
  • 使用Dtree类型的NAS存储时,必须配置为dtree

parameters.allocType

待创建卷的分配类型。支持如下类型:

  • thin:创建时不会分配所有需要的空间,而是根据使用情况动态分配。
  • thick:创建时分配所有需要的空间。

-

传空相当于传thin,创建时不会分配所有需要的空间,而是根据使用情况动态分配。

OceanStor Dorado/OceanStor Dorado V3 不支持thick

parameters.fsType

主机文件系统类型。支持类型为:

  • ext2
  • ext3
  • ext4
  • xfs

ext4

仅当StorageClass的volumeType设置为“lun”,且PVC的volumeMode配置为“Filesystem”时生效。

parameters.authClient

可访问该卷的NFS客户端IP地址信息,在指定volumeType为“fs”时必选。

支持输入客户端主机名称(建议使用全称域名)、客户端IP地址、客户端IP地址段。

条件必选

-

可以使用“*”表示任意客户端。当您不确定访问客户端IP信息时,建议使用“*”防止客户端访问被存储拒绝。

当使用客户端主机名称时建议使用全称域名。

IP地址支持IPv4、IPv6地址或两者的混合IP地址。

可以同时输入多个主机名称、IP地址或IP地址段,以英文分号,空格或按回车键隔开。如示例:"192.168.0.10;192.168.0.0/24;myserver1.test"

parameters.cloneSpeed

克隆速度。支持配置为1~4。

3

4速度最快。配置克隆PVC或从快照创建PVC时生效,参考克隆PVC从快照创建PVC

parameters.applicationType

后端为OceanStor Dorado存储时,指定创建LUN/NAS时的应用类型名称。

-

  • “volumeType”为“lun”时,在DeviceManager管理界面,选择“服务 > 块服务 > LUN组 > LUN > 创建 > 应用类型”,获取应用类型名称。
  • “volumeType”为“fs”时,在DeviceManager管理界面,选择“服务 > 文件服务 > 文件系统 > 创建 > 应用类型”,获取应用类型名称。

parameters.qos

PV在存储侧的LUN/NAS的QoS设置。

配置项值是字典格式的JSON字符串(字符串两边由单引号修饰,字典key由双引号修饰)。如:'{"maxMBPS": 999, "maxIOPS": 999}'

-

支持的QoS配置请参考表2说明。

parameters.storageQuota

PV在存储侧配额设置。仅在对接OceanStor Pacific系列存储使用NAS时生效。

配置项值是字典格式的JSON字符串(字符串两边由单引号修饰,字典key由双引号修饰)。如:'{"spaceQuota": "softQuota", "gracePeriod": 100}'

-

支持的配额配置请参考表3说明。

parameters.hyperMetro

是否创建双活卷。当使用的后端是双活类型的后端需要配置。

  • "true":创建的卷为双活卷。对接存储后端为双活后端时,该值必须为true。
  • "false":创建的卷为普通卷。

条件必选

false

当使用的后端是双活类型的后端,且需要发放双活卷时,设置该参数为"true",若设置为"false",在后端对接的逻辑管理端口漂移的场景下,有业务中断的风险。

parameters.metroPairSyncSpeed

双活Pair同步速率。支持配置为1~4。

可选值:

  • 1:低
  • 2:中
  • 3:高
  • 4:最高

-

配置创建双活卷时生效。

注意:

  • 未配置该参数时,双活Pair存储速率由存储决定。
  • 最高速率同步时可能导致主机时延增大。

parameters.fsPermission

挂载到容器内的目录权限。

-

配置格式参考Linux权限设置,如“777”、“755”等。

支持所有的SAN存储,NAS存储仅支持OceanStor Dorado 、OceanStor、OceanStor Pacific 8.1.2及之后版本的存储设备。

parameters.rootSquash

用于设置是否允许客户端的root权限。

可选值:

  • root_squash:表示不允许客户端以root用户访问,客户端使用root用户访问时映射为匿名用户。
  • no_root_squash:表示允许客户端以root用户访问,保留root用户的权限。

-

仅支持NAS存储。

parameters.allSquash

用于设置是否保留共享目录的UID和GID。

可选值:

  • all_squash:表示共享目录的UID和GID映射为匿名用户。
  • no_all_squash:表示保留共享目录的UID和GID。

-

仅支持NAS存储。

parameters.accesskrb5

用于配置krb5安全协议。

  • read_only:只读
  • read_write:读写
  • none:无权限

-

挂载时,可以在mountOptions中指定参数sec。

parameters.accesskrb5i

用于配置krb5i安全协议。

  • read_only:只读
  • read_write:读写
  • none:无权限

-

挂载时,可以在mountOptions中指定参数sec。

parameters.accesskrb5p

用于配置krb5p安全协议。

  • read_only:只读
  • read_write:读写
  • none:无权限

-

挂载时,可以在mountOptions中指定参数sec。

parameters.snapshotDirectoryVisibility

用于设置快照目录是否可见。

可选值:

  • visible:表示快照目录可见。
  • invisible:表示快照目录不可见。

-

仅支持NAS存储。

parameters.reservedSnapshotSpaceRatio

用于配置快照预留空间。

参数类型:字符串

取值范围:"0"~"50"

-

支持OceanStor Dorado 6.1.5+、OceanStor 6.1.5+的NAS存储。

parameters.description

用于配置创建的文件系统/LUN的描述信息。

参数类型:字符串

长度限制:0-255

-

仅支持企业存储文件系统及LUN。

mountOptions.nfsvers

主机侧NFS挂载选项。支持如下挂载选项:

nfsvers:挂载NFS时的协议版本。支持配置的参数值为“3”,“4”,“4.0”,“4.1”和”4.2”。

-

在主机执行mount命令时-o参数后的可选选项。列表格式。

指定NFS版本挂载时,当前支持NFS 3/4.0/4.1/4.2协议(需存储设备支持且开启)。当配置参数为nfsvers=4时,因为操作系统配置的不同,实际挂载可能为NFS 4的最高版本协议,如4.2,当需要使用4.0协议时,建议配置nfsvers=4.0。

mountOptions.acl

DPC命名空间支持ACL功能。DPC客户端支持POSIX ACL、NFSv4 ACL、NT ACL的鉴权行为。

-

acl、aclonlyposix、cnflush、cflush参数描述仅供参考,详细参数说明请参考《OceanStor Pacific系列 产品文档》 > 配置 > 文件服务基础业务配置指南 > 配置基础业务(DPC场景) > 客户端访问DPC共享 > 步骤2。

mountOptions.aclonlyposix

DPC命名空间支持POSIX ACL功能,DPC客户端支持POSIX ACL的鉴权行为。

支持POSIX ACL的协议有:DPC、NFSv3、HDFS。如使用NFSv4 ACL或NT ACL,会导致DPC客户端无法识别该类型的ACL,从而导致该类型的ACL不会生效。

-

aclonlyposix与acl参数同时使用时,仅acl参数生效,即命名空间支持ACL功能。

mountOptions.cnflush

异步刷盘模式,即关闭命名空间下的文件时不会立即刷盘。

-

异步刷盘模式,当文件关闭时不会同步将Cache的数据持久化到存储介质中,而是通过Cache异步刷盘的方式将数据写入存储介质,Cache的后台刷盘将在写业务完成后根据刷盘周期定时刷盘。在多客户端场景下,对同一文件进行并行操作,文件Size的更新会受刷盘周期的影响,即当刷盘动作完成后才会更新文件的Size,更新通常会在数秒内完成。同步I/O不受刷盘周期影响。

mountOptions.cflush

同步刷盘模式,即关闭命名空间下的文件时立即刷盘。

-

默认使用同步刷盘模式。

mountOptions.sec

用于指定Kerberos 5协议挂载NFS文件系统。

-

  • 使用Kerberos 5协议时,请配置krb5。
  • 使用Kerberos 5i协议时,请配置krb5i。
  • 使用Kerberos 5p协议时,请配置krb5p。
  • Kerberos仅支持NFSv4.0或NFSv4.1

mountOptions.proto

指定NFS挂载时使用的传输协议。

支持配置参数值为:“rdma”。

-

  • 确保存储系统已启用NFS over RDMA。
  • 支持OceanStor Dorado 6.1.7及以上的NAS存储。

mountOptions.port

指定NFS挂载时使用的协议端口

条件必选

-

传输协议方式使用“rdma”时,请设置为:20049。

mountOptions.discard

挂载文件系统时自动触发Trim/Discard操作。该操作会通知块设备释放未使用的块

-

支持xfs、ext4文件系统。

表 2 支持的QoS配置

存储类型

参数名

参数描述

备注

OceanStor V5

IOTYPE

控制读写类型。

可选参数(未明确指定将使用后端存储默认值,具体参考相关存储资料)。

有效值如下:

  • 0:读I/O
  • 1:写I/O
  • 2:读写I/O

MAXBANDWIDTH

最大带宽限制策略。

单位MB/s,有效值为>0的整数。

MINBANDWIDTH

最小带宽保护策略。

单位MB/s,有效值为>0的整数。

MAXIOPS

最大IOPS限制策略。

有效值为>0的整数。

MINIOPS

最小IOPS保护策略。

有效值为>0的整数。

LATENCY

最大时延保护策略。

单位ms,有效值为>0的整数。

OceanStor Dorado V3

IOTYPE

控制读写类型。

有效值如下:

  • 2:读写I/O

MAXBANDWIDTH

最大带宽限制策略。

单位MB/s,整数, 范围1~999999999。

MAXIOPS

最大IOPS限制策略。

类型为整数, 范围100~999999999。

OceanStor Dorado/OceanStor

IOTYPE

控制读写类型。

有效值如下:

  • 2:读写I/O

MAXBANDWIDTH

最大带宽限制策略。

单位MB/s,类型为整数, 范围1~999999999。

MINBANDWIDTH

最小带宽保护策略。

单位MB/s,类型为整数, 范围1~999999999。

MAXIOPS

最大IOPS限制策略。

类型为整数, 范围100~999999999。

MINIOPS

最小IOPS保护策略。

类型为整数, 范围100~999999999。

LATENCY

最大时延保护策略。

单位ms,仅支持配置0.5或1.5。

FusionStorage/OceanStor Pacific系列

maxMBPS

最大带宽限制策略。

必填。有效值为大于0的整数,单位MB/s。最大值请参考存储设备实际限制,如OceanStor Pacific NAS最大值为1073741824。

maxIOPS

最大IOPS限制策略。

必填。有效值为大于0的整数。最大值请参考存储设备实际限制,如OceanStor Pacific NAS最大值为1073741824000。

表 3 支持的配额配置

参数名

参数描述

备注

spaceQuota

文件配额类型。

必选。仅支持配置“softQuota”或者“hardQuota”

gracePeriod

配置软配额时,允许的超限天数。

条件可选,当“spaceQuota”配置为“softQuota”时可选。

类型为整数,支持范围为0~4294967294。

7.1.1.1.3 - 动态卷供应PVC参数说明

在完成配置StorageClass以后,就可以用该StorageClass来配置PVC。PVC的配置模板请参考华为CSI软件包中的examples目录下的pvc*.yaml文件示例。

表 1 pvc*.yaml文件示例参数说明

参数

说明

必选参数

默认值

备注

metadata.name

自定义的PVC对象名称。

-

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。

spec.volumeMode

卷模式。可选参数。 当使用LUN类型的卷时,支持配置以下类型:

  • Filesystem:本地文件系统。
  • Block:裸设备。

Filesystem

该参数在挂载PV时生效,默认为Filesystem。

  • Filesystem表示在容器通过一个本地文件系统访问PV,本地文件系统类型为指定StorageClass中的fsType字段指定, Dtree类型存储也使用此参数进行描述。
  • Block表示使用裸卷的方式访问访问PV。

spec.storageClassName

StorageClass对象名称。

-

业务需要的StorageClass对象名称。

spec.resources.requests.storage

指定待创建卷大小,格式为***Gi,单位为GiB。需要满足大小为512字节的整数倍。

10Gi

PVC容量的规格取决于存储规格限制和主机规格限制。以OceanStor Dorado 6.1.2/OceanStor Pacific系列 8.1.0对接CentOS 7为例,当使用的是ext4文件系统时,容量限制见表 ext4容量的规格;当使用的是XFS文件系统时,容量限制见表 XFS容量的规格。如果使用的是NFS或者裸设备,容量需满足使用的华为存储设备型号和版本所要求的规格约束。

如果PVC容量不在规格范围内,可能会由于存储规格限制或主机文件系统规格限制导致创建PVC或Pod失败。

spec.accessModes

指定卷访问模式。

  • RWO(ReadWriteOnce):卷可以被一个节点以读写方式挂载。 该模式也允许运行在同一节点上的多个 Pod 访问卷。
  • ROX(ReadOnlyMany):卷可以被多个节点以只读方式挂载。
  • RWX(ReadWriteMany):卷可以被多个节点以读写方式挂载。
  • RWOP(ReadWriteOncePod):卷只能被单个 Pod 以读写方式挂载。该特性需要 Kubernetes 1.22 以上版本。

ReadWriteOnce

  • RWO/ROX/RWOP:所有类型卷均支持,RWOPKubernetes 1.22版本以上支持。请参考开启ReadWriteOncePod功能门章节,检查您的Kubernetes集群是否开启该特性。
  • RWX支持情况如下:

表 2 ext4容量的规格

存储类型

存储规格限制

ext4规格限制

CSI规格限制

OceanStor Dorado 6.1.2

512Ki~256Ti

50Ti

512Ki~50Ti

OceanStor Pacific系列 8.1.0

64Mi~512Ti

50Ti

64Mi~50Ti

表 3 XFS容量的规格

存储类型

存储规格限制

XFS规格限制

CSI规格限制

OceanStor Dorado 6.1.2

512Ki~256Ti

500Ti

512Ki~500Ti

OceanStor Pacific系列 8.1.0

64Mi~512Ti

500Ti

64Mi~500Ti

7.1.1.2 - 纳管卷供应

纳管卷供应(Manage Volume Provisioning)允许管理员使用已经在存储侧创建的资源做为PV,并能够支持动态卷的特性,例如:扩容,快照,克隆等,属于华为CSI自定义能力。使用该特性可满足如下场景:

  • 容器化应用的改造场景,需要使用已有的存储卷。
  • 重建Kubernetes集群。
  • 容灾场景下,对存储数据进行迁移。

在多Kubernetes集群场景下,使用纳管卷特性对同一存储资源进行管理时,在任一集群中对该资源对应的PVC进行管理操作后,不会同步到其他集群中。 例如:在某一集群中对PVC进行扩容时,其他集群对应的PVC不会自动扩容,需要在其他集群中手动根据扩容PVC中的扩容命令进行扩容。

前提条件

  • 已在CSI中注册需要纳管卷所在存储。
  • 已登录存储设备获取需要纳管卷的名称和容量。

配置StorageClass

  1. 根据业务需要,参考动态卷供应典型场景StorageClass配置示例动态卷供应StorageClass参数说明,创建StorageClass配置文件,如本例从的mysc.yaml文件。

  2. 执行命令,使用配置文件创建StorageClass。

    kubectl apply -f mysc.yaml
    
  3. 执行命令,查看已创建的StorageClass信息。

    kubectl get sc mysc
    

    命令结果示例如下:

    NAME   PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    mysc   csi.huawei.com   Delete          Immediate           true                   8s
    

配置PVC

  1. 根据业务需要,参考本节描述和PVC配置文件示例,修改具体参数,生成本次需要创建的PVC配置文件,如本例中mypvc.yaml文件。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: mypvc
      annotations:
        csi.huawei.com/manageVolumeName: "*"  # 存储资源名称
        csi.huawei.com/manageBackendName: "*" # 存储后端名称
      labels:
        provisioner: csi.huawei.com
    spec:
      accessModes:
        - ReadWriteOnce
      volumeMode: Filesystem
      storageClassName: mysc
      resources:
        requests:
          storage: 100Gi
    
  2. 执行命令,使用配置文件创建PVC。

    kubectl create -f mypvc.yaml
    
  3. 等待一段时间后,执行以下命令,查看已经创建的PVC信息。

    kubectl get pvc mypvc
    

    命令结果示例如下。如果PVC的状态是“Bound”时,则说明该PVC已经创建成功,后续可以被Pod使用。

    NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mypvc       Bound    pvc-840054d3-1d5b-4153-b73f-826f980abf9e   100Gi      RWO            mysc           12s
    

    • 完成创建PVC操作后,如果长时间后(如一分钟后)PVC的状态是Pending,请参考创建PVC时, PVC的状态为Pending
    • 建议每批次最多批量创建/删除100个PVC。

使用PVC

与动态卷供应使用PVC方式相同。

7.1.1.2.1 - 纳管卷供应典型场景StorageClass配置示例

纳管卷供应典型场景下StorageClass配置请参考如下示例:

StorageClass中设置后端和存储池

如果在一个Kubernetes集群中配置了多个华为后端,或者一个华为后端提供多个存储池,建议在StorageClass中配置指定的后端和存储池信息,避免华为CSI随机选择后端和存储池,导致卷所在的存储不符合规划。

SAN存储设置后端和存储池可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
allowVolumeExpansion: true
parameters:
  backend: "iscsi-san-181"
  pool: "pool001"
  volumeType: lun
  allocType: thin

NAS存储设置后端和存储池可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
allowVolumeExpansion: true
parameters:
  backend: "iscsi-nas-181"
  pool: "pool001"
  volumeType: fs
  allocType: thin
  authClient: "*"

StorageClass中设置NFS访问方式

容器使用NFS文件系统作为存储资源时,可以参考如下配置示例。该示例中,NFS挂载时指定版本为4.1。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: nfs-nas-181
  pool: pool001
  volumeType: fs
  allocType: thin
mountOptions:
  - nfsvers=4.1 # NFS挂载时指定版本为4.1

StorageClass中设置本地文件系统访问方式

容器使用企业存储或者分布式存储的LUN作为存储资源时,且需要格式化文件系统为本地文件系统时,可以参考如下示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: iscsi-lun-181
  pool: pool001
  volumeType: lun
  allocType: thin
  fsType: xfs

StorageClass中设置DPC访问方式

当容器使用OceanStor Pacific系列存储,且存储支持DPC协议访问时,可以在StorageClass中配置DPC访问的挂载参数。本例中设置挂载时使用“acl”做鉴权参数,使用“cnflush”为设置异步刷盘模式。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
parameters:
  backend: nfs-dpc-101
  pool: pool001
  volumeType: fs
  allocType: thin
  authClient: "*"
mountOptions:
  - acl # 鉴权参数
  - cnflush # 设置异步刷盘模式

StorageClass中设置挂载目录权限

当需要修改容器内挂载目录的权限时,可以在StorageClass中配置目录权限信息,可以参考如下配置示例。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: mysc
provisioner: csi.huawei.com
allowVolumeExpansion: true
parameters:
  volumeType: fs
  allocType: thin
  authClient: "*"
  fsPermission: "777" # 设置目录权限

完成StorageClass配置后,进行如下步骤创建StorageClass。

  1. 执行以下命令,基于该yaml文件创建StorageClass。

    kubectl create -f mysc.yaml
    
  2. 执行以下命令,查看当前已经创建的StorageClass信息。

    kubectl get sc
    

    命令结果示例如下。

    NAME   PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    mysc   csi.huawei.com   Delete          Immediate           false                  34s
    

    创建StorageClass后,就可以使用该StorageClass进行创建PV或者PVC。


在纳管卷供应场景下,StorageClass的使用中请注意如下事项:

  • 针对StorageClass进行的修改将不会在已经创建的PV上生效。您需要删除这些PV,并重新使用修改后的StorageClass创建才能应用修改的参数。

7.1.1.2.2 - 纳管卷供应StorageClass参数说明

存储类(StorageClass)为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到一组不同的能力定义。Kubernetes集群用户可基于StorageClass进行动态卷制备。

StorageClass支持配置如下参数信息。

使用SAN存储时可参考示例文件/examples/sc-lun.yaml,使用NAS存储时可参考示例文件/examples/sc-fs.yaml。

表 1 StorageClass配置参数说明

参数

说明

必选参数

默认值

备注

metadata.name

自定义的StorageClass对象名称。

-

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。

provisioner

制备器名称。

csi.huawei.com

该字段需要指定为安装华为CSI时设置的驱动名。

取值和values.yaml文件中driverName一致。

reclaimPolicy

回收策略。支持如下类型:

  • Delete:自动回收资源。
  • Retain:手动回收资源

-

  • Delete:删除PV/PVC时会关联删除存储上的资源。
  • Retain:删除PV/PVC时不会删除存储上的资源。

allowVolumeExpansion

是否允许卷扩展。参数设置为true 时,使用该StorageClass的PV可以进行扩容操作。

false

此功能仅可用于扩容PV,不能用于缩容PV。

扩容PV功能在Kubernetes 1.14 (alpha)后才支持

parameters.backend

待创建资源所在的后端名称。

-

如果不设置,华为CSI随机选择一个满足容量要求的后端创建资源。

建议指定后端,确保创建的资源在预期的后端上。

parameters.volumeType

待创建卷类型。支持如下类型:

  • lun:存储侧发放的资源是LUN。
  • fs:存储侧发放的资源是文件系统。

-

  • 使用NAS存储时,必须配置为fs。
  • 使用SAN存储时,必须配置为lun。

parameters.fsType

主机文件系统类型。支持类型为:

  • ext2
  • ext3
  • ext4
  • xfs

ext4

仅当StorageClass的volumeType设置为“lun”,且PVC的volumeMode配置为“Filesystem”时生效。

parameters.applicationType

后端为OceanStor Dorado存储时,指定创建LUN/NAS时的应用类型名称。

说明:

若卷纳管前已配置应用类型,applicationType必须与已配置的应用类型保持一致。

-

  • “volumeType”为“lun”时,在DeviceManager管理界面,选择“服务 > 块服务 > LUN组 > LUN > 创建 > 应用类型”,获取应用类型名称。
  • “volumeType”为“fs”时,在DeviceManager管理界面,选择“服务 > 文件服务 > 文件系统 > 创建 > 应用类型”,获取应用类型名称。

parameters.fsPermission

挂载到容器内的目录权限。

-

配置格式参考Linux权限设置,如“777”、“755”等。

当volumeType为lun时,支持配置该字段。

mountOptions.nfsvers

主机侧NFS挂载选项。支持如下挂载选项:

nfsvers:挂载NFS时的协议版本。支持配置的参数值为“3”,“4”,“4.0”,“4.1”和”4.2”。

-

在主机执行mount命令时-o参数后的可选选项。列表格式。

指定NFS版本挂载时,当前支持NFS 3/4.0/4.1/4.2协议(需存储设备支持且开启)。当配置参数为nfsvers=4时,因为操作系统配置的不同,实际挂载可能为NFS 4的最高版本协议,如4.2,当需要使用4.0协议时,建议配置nfsver:ws=4.0。

mountOptions.acl

DPC命名空间支持ACL功能。DPC客户端支持POSIX ACL、NFSv4 ACL、NT ACL的鉴权行为。

-

acl、aclonlyposix、cnflush、cflush参数描述仅供参考,详细参数说明请参考《OceanStor Pacific系列 产品文档》 > 配置 > 文件服务基础业务配置指南 > 配置基础业务(DPC场景) > 客户端访问DPC共享 > 步骤2。

mountOptions.aclonlyposix

DPC命名空间支持POSIX ACL功能,DPC客户端支持POSIX ACL的鉴权行为。

支持POSIX ACL的协议有:DPC、NFSv3、HDFS。如使用NFSv4 ACL或NT ACL,会导致DPC客户端无法识别该类型的ACL,从而导致该类型的ACL不会生效。

-

aclonlyposix与acl参数同时使用时,仅acl参数生效,即命名空间支持ACL功能。

mountOptions.cnflush

异步刷盘模式,即关闭命名空间下的文件时不会立即刷盘。

-

异步刷盘模式,当文件关闭时不会同步将Cache的数据持久化到存储介质中,而是通过Cache异步刷盘的方式将数据写入存储介质,Cache的后台刷盘将在写业务完成后根据刷盘周期定时刷盘。在多客户端场景下,对同一文件进行并行操作,文件Size的更新会受刷盘周期的影响,即当刷盘动作完成后才会更新文件的Size,更新通常会在数秒内完成。同步I/O不受刷盘周期影响。

mountOptions.cflush

同步刷盘模式,即关闭命名空间下的文件时立即刷盘。

-

默认使用同步刷盘模式。

mountOptions.sec

用于指定Kerberos 5协议挂载NFS文件系统。

-

  • 使用Kerberos 5协议时,请配置krb5。
  • 使用Kerberos 5i协议时,请配置krb5i。
  • 使用Kerberos 5p协议时,请配置krb5p。
  • Kerberos仅支持NFSv4.0或NFSv4.1

mountOptions.proto

指定NFS挂载时使用的传输协议。

支持配置参数值为:“rdma”。

-

  • 确保存储系统已启用NFS over RDMA。
  • 支持OceanStor Dorado 6.1.7及以上的NAS存储

mountOptions.port

指定NFS挂载时使用的协议端口

条件必选

-

传输协议方式使用“rdma”时,请设置为:20049。

mountOptions.discard

挂载文件系统时自动触发Trim/Discard操作。该操作会通知块设备释放未使用的块

-

支持xfs、ext4文件系统。

7.1.1.2.3 - 纳管卷供应PVC参数说明

在完成配置StorageClass以后,就可以用该StorageClass来配置PVC。PVC的配置模板请参考华为CSI软件包中的examples目录下的pvc-manager.yaml文件示例。

表 1 pvc-manager.yaml文件示例参数说明

参数

说明

必选参数

默认值

备注

metadata.annotations

PVC对象的注释。配置以下参数:

  • 驱动名称/manageVolumeName:卷在存储侧的名称。
  • 驱动名称/manageBackendName:卷所属后端的名称。

csi.huawei.com/manageVolumeName: * csi.huawei.com/manageBackendName: *

  • 驱动名称获取请参考表4
  • 驱动名称/manageVolumeName:为存储上已有卷的名称,除英文字符外,其他国家字符不支持。
  • 驱动名称/manageBackendName:CSI中存储后端的名称。

可执行oceanctl get backend -n huawei-csi命令获取后端名称。

metadata.labels

PVC对象的标签。

-

格式:provisioner: 安装时指定的驱动名称。

例如 provisioner: csi.huawei.com。

该参数在创建PVC时生效,用于监听PVC资源,获取metadata.annotations信息。

metadata.name

自定义的PVC对象名称。

-

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。

spec.volumeMode

卷模式。可选参数。 当使用LUN类型的卷时,支持配置以下类型:

  • Filesystem:本地文件系统。
  • Block:裸设备。
说明:

该参数在挂载PV时生效,需要与纳管卷的使用方式保持一致。

  • 如果卷纳管之前是以裸卷方式使用,volumeMode必须配置为Block。
  • 如果卷纳管之前是以ext2/ext3/ext4方式使用,volumeMode必须配置为Filesystem,且StorageClass中fsType必须指定为ext2/ext3/ext4。
  • 如果卷纳管之前是以XFS方式使用,volumeMode必须配置为Filesystem,且StorageClass中fsType必须指定为xfs。

Filesystem

该参数在挂载PV时生效。

  • Filesystem表示在容器通过一个本地文件系统访问PV,本地文件系统类型为指定StorageClass中的fsType字段指定。
  • Block表示使用裸卷的方式访问访问PV。

spec.storageClassName

StorageClass对象名称。

-

StorageClass的配置需要与纳管卷的配置保持一致。

spec.resources.requests.storage

指定待创建卷大小,格式为***Gi,单位为GiB。需要满足大小为512字节的整数倍。

-

PVC容量的规格取决于存储规格限制和主机规格限制。以OceanStor Dorado 6.1.2/OceanStor Pacific系列 8.1.0对接CentOS 7为例,当使用的是ext4文件系统时,容量限制见表2;当使用的是XFS文件系统时,容量限制见表3。如果使用的是NFS或者裸设备,容量需满足使用的华为存储设备型号和版本所要求的规格约束。

如果PVC容量不在规格范围内,可能会由于存储规格限制或主机文件系统规格限制导致创建PVC或Pod失败。

spec.accessModes

指定卷访问模式。

  • RWO(ReadWriteOnce):卷可以被一个节点以读写方式挂载。 该模式也允许运行在同一节点上的多个 Pod 访问卷。
  • ROX(ReadOnlyMany):卷可以被多个节点以只读方式挂载。
  • RWX(ReadWriteMany):卷可以被多个节点以读写方式挂载。
  • RWOP(ReadWriteOncePod):卷只能被单个 Pod 以读写方式挂载。该特性需要 Kubernetes 1.22 以上版本。

ReadWriteOnce

  • RWO/ROX/RWOP:所有类型卷均支持,RWOPKubernetes 1.22版本以上支持。请参考开启ReadWriteOncePod功能门章节,检查您的Kubernetes集群是否开启该特性。
  • RWX支持情况如下:

表 2 ext4容量的规格

存储类型

存储规格限制

ext4规格限制

CSI规格限制

OceanStor Dorado 6.1.2

512Ki~256Ti

50Ti

512Ki~50Ti

OceanStor Pacific系列 8.1.0

64Mi~512Ti

50Ti

64Mi~50Ti

表 3 XFS容量的规格

存储类型

存储规格限制

XFS规格限制

CSI规格限制

OceanStor Dorado 6.1.2

512Ki~256Ti

500Ti

512Ki~500Ti

OceanStor Pacific系列 8.1.0

64Mi~512Ti

500Ti

64Mi~500Ti

7.1.1.3 - 静态卷供应

静态卷供应(Static Volume Provisioning)允许管理员使用已经在存储侧创建的资源做为PV,供集群中的容器使用。

为了完成静态卷供应,需要完成如下两步:

  • 配置PV
  • 配置PVC

前提条件

存储侧已经存在待创建PV所需要的存储资源,如LUN或者文件系统。如果存储资源是文件系统,还需要创建文件系统的共享和客户端信息。

配置PV

  1. 准备PV配置文件mypv.yaml,示例如下,其他配置参数请参考静态卷供应PV参数说明

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: mypv
    spec:
      volumeMode: Filesystem
      storageClassName: "" # 必须配置为""
      accessModes:
        - ReadWriteOnce
      csi:
        driver: csi.huawei.com # csi驱动名称
        volumeHandle: iscsi-dorado-181.lun0001 # 卷名称
        fsType: xfs # 文件系统类型
      capacity:
        storage: 100Gi
    

    静态卷供应的配置文件中,storageClassName参数必须配置为‘“”’,如果不配置,Kubernetes会使用系统默认的StorageClass。

  2. 执行以下命令,基于准备好的yaml文件创建PV。

    kubectl create -f mypv.yaml
    
  3. 等待一段时间后,执行以下命令,查看已经创建的PV信息。

    kubectl get pv
    

    命令结果示例如下,当PV状态为“Available”时,表明PV创建成功。

    NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
    mypv       100Gi      RWO            Retain           Available                                               4s
    

配置PVC

当PV以静态卷供应的方式创建完成后,可以基于该PV创建PVC,从而供容器使用。

  1. 首先准备PVC配置文件。如下示例是一个使用静态卷供应的PVC配置文件。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: mypvc
    spec:
      storageClassName: ""
      accessModes:
        - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 100Gi
      volumeName: mypv # 对应PV名称
    
  2. 执行以下命令,基于已配置的yaml文件创建PVC。

    kubectl create -f mypvc.yaml
    
  3. 等待一段时间后,执行以下命令,查看已经创建的PVC信息。

    kubectl get pvc
    

    命令结果示例如下,当PVC状态为“Bound“时,表明PVC创建成功。

    NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mypvc       Bound    pvc-840054d3-1d5b-4153-b73f-826f980abf9e   100Gi      RWO                           12s
    

    • 完成创建PVC操作后,如果长时间后(如一分钟后)PVC的状态是Pending,请参考创建PVC时, PVC的状态为Pending
    • 建议每批次最多批量创建/删除100个PVC。

使用PVC

与动态卷供应使用PVC方式相同。

7.1.1.3.1 - 静态卷供应PV参数说明

表 1 静态卷供应参数

参数

说明

必选参数

默认值

备注

metadata.name

自定义的PV对象名称。

-

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。

spec.volumeMode

卷模式。可选参数。 当使用LUN类型的卷时,支持配置以下类型:

  • Filesystem:本地文件系统。
  • Block:裸设备。

Filesystem

该参数在挂载PV时生效,默认为Filesystem。

  • Filesystem表示在容器通过一个本地文件系统访问PV,本地文件系统类型为指定StorageClass中的fsType字段指定。
  • Block表示使用裸卷的方式访问访问PV。

spec.storageClassName

StorageClass对象名称。必选参数。

-

此处须设置为空字符串(即输入"")。

spec.accessModes

指定卷访问模式。

  • RWO(ReadWriteOnce):卷可以被一个节点以读写方式挂载。 该模式也允许运行在同一节点上的多个 Pod 访问卷。
  • ROX(ReadOnlyMany):卷可以被多个节点以只读方式挂载。
  • RWX(ReadWriteMany):卷可以被多个节点以读写方式挂载。
  • RWOP(ReadWriteOncePod):卷只能被单个 Pod 以读写方式挂载。该特性需要 Kubernetes 1.22 以上版本。

ReadWriteOnce

  • RWO/ROX/RWOP:所有类型卷均支持,RWOPKubernetes 1.22版本以上支持。请参考开启ReadWriteOncePod功能门章节,检查您的Kubernetes集群是否开启该特性。
  • RWX支持情况如下:

spec.csi.driver

CSI驱动名称。

csi.huawei.com

该字段需要指定为安装华为CSI时设置的驱动名称。

spec.csi.volumeHandle

存储资源的唯一标志。必选参数。

格式为:<backendName>.<volume-name>

-

该参数值由以下两部分构成:

  • <backendName>:该卷所在的后端名称,可使用如下命令获取配置的后端信息:

    oceanctl get backend

  • <volume-name>:存储上资源(LUN/文件系统)的名称,可通过DeviceManager查看。

spec.csi.fsType

指定主机文件系统类型。可选参数。支持类型为:

  • ext2
  • ext3
  • ext4
  • xfs

-

如果不设置,默认为ext4。仅当volumeMode配置为“Filesystem”时生效。

spec.capacity.storage

指定卷大小。

100Gi

请确保与存储上对应资源的容量保持一致。Kubernetes并不会调用CSI检查此字段值的正确性,所以在PV容量与存储上对应资源的容量不一致也能被成功创建。

spec.mountOptions.nfsvers

主机侧NFS挂载选项。支持如下挂载选项:

nfsvers:挂载NFS时的协议版本。支持配置的参数值为“3”,“4”,“4.0”,“4.1”和“4.2”。

-

在主机执行mount命令时-o参数后的可选选项。列表格式。

指定NFS版本挂载时,当前支持NFS 3/4.0/4.1/4.2协议(需存储设备支持且开启)。当配置参数为nfsvers=4时,因为操作系统配置的不同,实际挂载可能为NFS 4的最高版本协议,如4.2,当需要使用4.0协议时,建议配置nfsvers=4.0。

spec.mountOptions.acl

DPC命名空间支持ACL功能。DPC客户端支持POSIX ACL、NFSv4 ACL、NT ACL的鉴权行为。

-

acl、aclonlyposix、cnflush、cflush参数描述仅供参考,详细参数说明请参考《OceanStor Pacific系列 产品文档》 > 配置 > 文件服务基础业务配置指南 > 配置基础业务(DPC场景) > 客户端访问DPC共享 > 步骤2。

spec.mountOptions.aclonlyposix

DPC命名空间支持POSIX ACL功能,DPC客户端支持POSIX ACL的鉴权行为。

支持POSIX ACL的协议有:DPC、NFSv3、HDFS。如使用NFSv4 ACL或NT ACL,会导致DPC客户端无法识别该类型的ACL,从而导致该类型的ACL不会生效。

-

aclonlyposix与acl参数同时使用时,仅acl参数生效,即命名空间支持ACL功能。

spec.mountOptions.cnflush

异步刷盘模式,即关闭命名空间下的文件时不会立即刷盘。

-

异步刷盘模式,当文件关闭时不会同步将Cache的数据持久化到存储介质中,而是通过Cache异步刷盘的方式将数据写入存储介质,Cache的后台刷盘将在写业务完成后根据刷盘周期定时刷盘。在多客户端场景下,对同一文件进行并行操作,文件Size的更新会受刷盘周期的影响,即当刷盘动作完成后才会更新文件的Size,更新通常会在数秒内完成。同步I/O不受刷盘周期影响。

spec.mountOptions.cflush

同步刷盘模式,即关闭命名空间下的文件时立即刷盘。

-

默认使用同步刷盘模式。

7.1.1.3.2 - 静态卷供应PVC参数说明

表 1 PVC参数说明

参数

说明

必选参数

默认值

备注

metadata.name

自定义的PVC对象名称。

-

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。

spec.accessModes

指定卷访问模式。

  • RWO(ReadWriteOnce):卷可以被一个节点以读写方式挂载。 该模式也允许运行在同一节点上的多个 Pod 访问卷。
  • ROX(ReadOnlyMany):卷可以被多个节点以只读方式挂载。
  • RWX(ReadWriteMany):卷可以被多个节点以读写方式挂载。
  • RWOP(ReadWriteOncePod):卷只能被单个 Pod 以读写方式挂载。该特性需要 Kubernetes 1.22 以上版本。

ReadWriteOnce

  • RWO/ROX/RWOP:所有类型卷均支持,RWOP需Kubernetes 1.22版本以上支持。请参考开启ReadWriteOncePod功能门章节,检查您的Kubernetes集群是否开启该特性。
  • RWX支持情况如下:

spec.volumeMode

卷模式。

Filesystem

可选, 支持Filesystem或Block, 默认为Filesystem。该参数在创建Pod时生效,其中Filesystem表示在PVC上创建一个文件系统访问存储, Block表示使用裸卷的方式访问存储。

spec.resources.requests.storage

指定待创建卷大小。

-

指定待创建卷大小,格式为***Gi,单位为GiB。

PVC容量的规格取决于存储规格限制和主机规格限制。以OceanStor Dorado 6.1.2/OceanStor Pacific系列 8.1.0对接CentOS 7为例,当使用的是ext4文件系统时,容量限制见表 ext4容量的规格;当使用的是XFS文件系统时,容量限制见表 XFS容量的规格。如果使用的是NFS或者裸设备,容量需满足使用的华为存储设备型号和版本所要求的规格约束。

如果PVC容量不在规格范围内,可能会由于存储规格限制或主机文件系统规格限制导致创建PVC或Pod失败。

在通过静态PV创建PVC时,若PVC容量小于绑定PV容量,最终PVC容量大小为绑定PV容量,若PVC容量大于绑定PV容量,PVC将无法被创建。

spec.volumeName

PV对象名称。

-

静态创建PVC时必选。

spec.storageClassName

StorageClass对象名称。

-

创建PVC时传空字符串,不设置该参数会使用默认的StorageClass对象名称。

7.1.2 - 扩容PVC

当容器使用的PVC容量不足时,需要对该PVC进行扩容操作。

前提条件

操作步骤

  1. 执行命令,查询StorageClass是否支持扩容。其中,mysc 为需要查看的StorageClass名称。

    kubectl get sc mysc
    

    命令结果示例如下:

    NAME              PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    mysc              csi.huawei.com   Delete          Immediate           true                  172m
    

    如果ALLOWVOLUMEEXPANSION的值为true,表示当前StorageClass已经支持扩容,请跳转至步骤3

  2. 执行以下命令,将“allowVolumeExpansion“的值修改为“true“。其中,mysc 为需要修改的StorageClass名称。

    kubectl patch sc mysc --patch '{"allowVolumeExpansion":true}'
    
  3. 执行命令,查询PVC的StorageClass名称。其中,mypvc 为需要扩容的PVC名称。

    kubectl get pvc mypvc
    

    命令结果示例如下:

    NAME               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
    mypvc              Bound    pvc-3383be36-537c-4cb1-8f32-a415fa6ba384   2Gi        RW0            mysc              145m
    
  4. 执行以下命令进行扩容。

    kubectl patch pvc mypvc -p '{"spec":{"resources":{"requests":{"storage":"120Gi"}}}}'
    

    其中,"mypvc“是需要扩容的PVC名称,“120Gi”是扩容后的容量大小。请根据实际情况进行替换。

    • PVC容量的规格取决于存储规格限制和主机规格限制。以OceanStor Dorado 6.1.2/OceanStor Pacific系列 8.1.0对接CentOS 7为例,当使用的是ext4文件系统时,容量限制见表 ext4容量的规格;当使用的是XFS文件系统时,容量限制见表 XFS容量的规格。如果使用的是NFS或者裸设备,容量需满足使用的华为存储设备型号和版本所要求的规格约束。
    • 如果PVC容量不在规格范围内,可能会由于存储规格限制或主机文件系统规格限制导致创建PVC或Pod失败。
    • 如果扩容的目标容量超过存储池容量导致扩容失败,请参考PVC扩容的目标容量超过存储池容量导致扩容失败
  5. 执行命令,检查容量修改是否生效。

    kubectl get pvc
    

    命令结果示例如下,如果CAPACITY字段已变更为指定容量,说明扩容成功。

    NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mypvc       Bound    pvc-3383be36-537c-4cb1-8f32-a415fa6ba384   120Gi       RWO            mysc           24s
    

7.1.3 - 克隆PVC

本章节描述如何克隆PVC。

在克隆PVC时,需要指定数据源。如下示例是一个简单的克隆PVC示例,在该示例中,使用“mypvc”作为数据源,新创建了一个名叫“myclone”的PVC。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclone
spec:
  storageClassName: mysc
  dataSource:
    name: mypvc
    kind: PersistentVolumeClaim
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

  • 指定的storageClassName必须和dataSource中的源卷的StorageClass需一致。
  • 克隆卷的容量必须不小于源卷容量,建议和源卷容量保持一致。

前提条件

系统中已经存在源PVC,且源PVC所在的backend存在支持克隆。支持克隆的存储请参考表 华为企业存储支持的特性及约束表 华为分布式存储支持的特性及约束,支持克隆的Kubernetes版本请参考Kubernetes特性矩阵

操作步骤

  1. 执行以下命令,基于克隆卷的配置文件创建PVC。

    kubectl create -f myclone.yaml
    

7.1.4 - 从快照创建PVC

本章节描述如何从快照创建PVC。

在创建这个PVC时,需要指定数据源。如下示例是一个简单的从快照创建PVC示例,在该示例中,使用快照“mysnapshot”作为数据源,新创建了一个名叫“myrestore”的PVC。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myrestore
spec:
  storageClassName: mysc
  dataSource:
    name: mysnapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi

  • 指定的storageClassName必须和dataSource中的快照源卷的StorageClass需一致。
  • 克隆卷的容量必须不小于快照容量,建议和快照容量保持一致。

前提条件

系统中已经存在快照,且快照所在的backend存在支持克隆。支持快照创建PVC的存储请参考表 华为企业存储支持的特性及约束表 华为分布式存储支持的特性及约束,支持快照创建PVC的Kubernetes版本请参考Kubernetes特性矩阵

操作步骤

  1. 执行以下命令,基于从快照创建卷的配置文件创建PVC。

    kubectl create -f myrestore.yaml
    

7.2 - 创建VolumeSnapshot

在Kubernetes中,卷快照(VolumeSnapshot)是一个存储系统上卷的快照。VolumeSnapshot能力为Kubernetes用户提供了一种标准的方式来在指定时间点复制卷的内容,并且不需要创建全新的卷。 例如,这一功能使得数据库管理员能够在执行编辑或删除之类的修改之前对数据库执行备份。

本章将介绍如何使用华为CSI创建VolumeSnapshot。为了完成创建VolumeSnapshot,需要完成如下三步:

  • 检查卷快照依赖组件信息
  • 配置VolumeSnapshotClass
  • 配置VolumeSnapshot

7.2.1 - 检查卷快照依赖组件信息

如果您需要在容器环境中使用卷快照以及卷快照关联的特性,请通过检查卷快照依赖组件检查您的环境是否部署了卷快照依赖组件以及卷快照api-versions信息。

7.2.2 - 配置VolumeSnapshotClass

卷快照类(VolumeSnapshotClass)提供了一种在配置VolumeSnapshot时描述存储“类”的方法。每个VolumeSnapshotClass都包含“driver”、“deletionPolicy” 和“parameters”字段, 在需要动态配置属于该类的VolumeSnapshot时使用。

VolumeSnapshotClass对象的名称很重要,是用户可以请求特定类的方式。 管理员在首次创建VolumeSnapshotClass对象时设置类的名称和其他参数, 对象一旦创建就无法更新。

华为CSI使用的VolumeSnapshotClass示例如下:

  • 如果您的环境中api-versions支持v1,请使用以下示例:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: mysnapclass
    driver: csi.huawei.com
    deletionPolicy: Delete
    
  • 如果您的环境中api-versions支持v1beta1,请使用以下示例:

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshotClass
    metadata:
      name: mysnapclass
    driver: csi.huawei.com
    deletionPolicy: Delete
    
  • 如果您的环境中api-versions同时支持v1和v1beta1,我们推荐您使用v1版本。

实际参数可以参考表 VolumeSnapshotClass参数说明中的说明修改。由于当前华为CSI还不支持在VolumeSnapshotClass中设置自定义参数(parameters),因此建议只创建一个VolumeSnapshotClass,供所有快照使用。

表 1 VolumeSnapshotClass参数说明

参数

说明

备注

metadata.name

自定义的VolumeSnapshotClass对象名称。

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。

driver

driver标识。必填参数。

该字段需要指定为安装华为CSI时设置的驱动名。默认的驱动名为“csi.huawei.com”。

deletionPolicy

快照删除策略。必填参数。可选值为:

  • Delete
  • Retain
  • 如果删除策略是 Delete,那么存储设备上的快照会和VolumeSnapshotContent对象一起删除
  • 如果删除策略是Retain,那么存储设备上的快照和VolumeSnapshotContent对象都会被保留。

前提条件

华为CSI支持快照且运行所依赖的卷快照组件CRD已经安装。具体CRD信息请参考检查卷快照依赖组件章节说明,支持创建VolumeSnapshot的Kubernetes版本请参考表 Kubernetes版本与支持的特性

操作步骤

  1. 执行以下命令,使用已经创建的VolumeSnapshotClass配置文件创建VolumeSnapshotClass。

    kubectl create -f mysnapclass.yaml
    
  2. 执行以下命令,查看已创建的VolumeSnapshotClass信息。

    kubectl get volumesnapshotclass
    

    命令结果示例如下:

    NAME          DRIVER           DELETIONPOLICY   AGE
    mysnapclass   csi.huawei.com   Delete           25s
    

7.2.3 - 配置VolumeSnapshot

VolumeSnapshot可以通过两种方式进行制备:预制备或动态制备。华为CSI当前仅支持动态制备。本章节将说明如何使用华为CSI动态制备VolumeSnapshot。

VolumeSnapshot的配置文件示例如下:

  • 如果您的环境中api-versions支持v1,请使用以下示例:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: mysnapshot
    spec:
      volumeSnapshotClassName: mysnapclass
      source:
        persistentVolumeClaimName: mypvc
    
  • 如果您的环境中api-versions支持v1beta1,请使用以下示例:

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshot
    metadata:
      name: mysnapshot
    spec:
      volumeSnapshotClassName: mysnapclass
      source:
        persistentVolumeClaimName: mypvc
    
  • VolumeSnapshot中api-versions信息,请和创建VolumeSnapshotClass使用的版本保持一致。

实际参数可以参考表 VolumeSnapshot参数说明中的说明修改。

表 1 VolumeSnapshot参数说明

参数

说明

备注

metadata.name

自定义的VolumeSnapshot对象名称。

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。

spec.volumeSnapshotClassName

VolumeSnapshotClass对象名称。

--

spec.source.persistentVolumeClaimName

源PVC对象名称。

快照源PVC对应的名称

前提条件

操作步骤

  1. 执行以下命令,使用已经创建的VolumeSnapshot配置文件创建VolumeSnapshot。

    kubectl create -f mysnapshot.yaml
    
  2. 执行以下命令,查看已创建的VolumeSnapshot信息。

    kubectl get volumesnapshot
    

    命令结果示例如下:

    NAME         READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS   SNAPSHOTCONTENT                                    CREATIONTIME   AGE
    mysnapshot   true         mypvc                               100Gi         mysnapclass     snapcontent-1009af0a-24c2-4435-861c-516224503f2d   <invalid>      78s
    

8 - 高级特性

8.1 - 配置ALUA特性

ALUA(Asymmetric Logical Unit Access,非对称逻辑单元访问),是一种多目标器端口访问模型。在多路径状态下,ALUA标准提供了一种将卷的Active/Passive模型呈现给主机的方式。同时还提供了端口的可访问状态切换接口,可用来实现卷工作控制器切换等。例如,卷在一个控制器故障时,可以将该控制器的端口置为Unavailable,支持ALUA的主机多路径软件收到该状态后,会将I/O切换到另一端控制器。

8.1.1 - 通过Helm配置ALUA特性

8.1.1.1 - 配置华为企业存储后端的ALUA参数

华为企业存储针对ALUA的配置请参考产品对应的主机连通性指南文档说明。

针对不同的操作系统,ALUA配置可能有所不同。进入华为技术支持,在搜索输入框中输入“主机连通性指南”,单击搜索。在搜索结果中,选择对应操作系统的主机连通性指南。结合实际需要根据指南的说明进行ALUA配置。华为CSI将在华为存储上对该主机的启动器应用您设置的配置项。

已经发放的Pod的节点不会主动更改ALUA信息,需要通过在该节点重新发放Pod才会变更主机ALUA配置。

OceanStor V5系列和OceanStor Dorado V3系列存储后端的ALUA参数

华为CSI支持的OceanStor V5系列和OceanStor Dorado V3系列存储的ALUA参数见表 华为CSI支持的OceanStor V5系列和OceanStor Dorado V3系列存储的ALUA参数说明

表 1 华为CSI支持的OceanStor V5系列和OceanStor Dorado V3系列存储的ALUA参数说明

参数名

参数描述

备注

HostName

主机名规则。必填,可使用正则表达式。

主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》

当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则

MULTIPATHTYPE

多路径类型。必填,取值为:

  • 0:不使用第三方多路径
  • 1:使用第三方多路径

--

FAILOVERMODE

启动器的切换模式。条件必选,取值为:

  • 0:旧版本ALUA
  • 1:通用ALUA
  • 2:不使用ALUA
  • 3:特殊模式ALUA

当使用第三方多路径时该参数才需要指定。请参考连通性指南的说明,配置启动器的切换模式。

SPECIALMODETYPE

启动器的特殊模式类型。条件必选,取值为:

  • 0:特殊模式0
  • 1:特殊模式1
  • 2:特殊模式2
  • 3:特殊模式3

当启动器的切换模式为“特殊模式ALUA”时该参数才需要指定。请参考连通性指南的说明,配置启动器的特殊模式类型。

PATHTYPE

启动器的路径类型。条件必选,取值为:

  • 0:优选路径
  • 1:非优选路径

当使用第三方多路径时该参数才需要指定。请参考连通性指南的说明,配置启动器的路径类型。

以OceanStor 18500 V5存储对接Red Hat操作系统为例,主机连通性指南见《华为SAN存储在Red Hat系统下的主机连通性指南》

如下ALUA设置示例,是非双活存储场景下,OceanStor 18500 V5存储的Red Hat操作系统的连通性指南的推荐设置。本例中假设Kubernetes集群中计算节点“myhost01”的操作系统是RHEL 5.x,其他计算节点操作系统均为RHEL 7.x。根据推荐,RHEL 5.x的切换模式应该为“不使用ALUA”,RHEL 7.x的切换模式应该为“通用ALUA”。

storage: oceanstor-san
name: oceanstor-iscsi-155
urls:
  - https://192.168.129.155:8088
  - https://192.168.129.156:8088
pools:
  - StoragePool001
parameters:
  protocol: iscsi
  portals:
    - 192.168.128.120
    - 192.168.128.121
  ALUA:
    ^myhost01$:
      MULTIPATHTYPE: 1
      FAILOVERMODE: 2
      PATHTYPE: 0
    "*":
      MULTIPATHTYPE: 1
      FAILOVERMODE: 1
      PATHTYPE: 0

OceanStor和OceanStor Dorado系列存储后端的ALUA参数

华为CSI支持的OceanStor和OceanStor Dorado系列存储的ALUA参数见表 OceanStor和OceanStor Dorado系列存储的ALUA参数说明

OceanStor和OceanStor Dorado系列存储在默认情况下启动器主机访问模式即为“均衡模式”,因此不建议对OceanStor和OceanStor Dorado系列存储配置ALUA参数。

表 2 OceanStor和OceanStor Dorado系列存储的ALUA参数说明

参数名

参数描述

备注

HostName

主机名规则。必填,可使用正则表达式。

主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》

当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则

accessMode

主机访问模式。必填,取值为:

  • 0:均衡模式
  • 1:非对称模式

非双活场景下建议使用均衡模式。当前华为CSI未支持SAN双活场景,请谨慎使用非对称模式。

hyperMetroPathOptimized

双活场景下,主机在当前阵列的路径是否优选。取值为:

  • 1:是
  • 0:否

当主机访问模式设置为非对称模式时,才需要配置该参数。

当前华为CSI未支持SAN双活场景,请谨慎使用非对称模式。

以OceanStor Dorado 18500存储对接Red Hat操作系统为例,主机连通性指南见《OceanStor Dorado & OceanStor在Red Hat下的主机连通性指南》

如下ALUA设置示例,是非双活存储场景下,OceanStor Dorado 18500存储的Red Hat操作系统的连通性指南的推荐设置。

storage: "oceanstor-san"
name: "dorado-iscsi-155"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "iscsi"
  portals:
    - "192.168.128.120"
    - "192.168.128.121"
  ALUA:
    "*":
      accessMode: 0

ALUA配置项匹配主机名的规则

  • 如果设置的主机名规则精确匹配的业务节点主机名,则使用该主机名规则对应的ALUA配置项。

    如配置项1中主机名规则为“*”,配置项2中的主机名规则为“^myhost01$”。当计算节点的主机名是“myhost01”时,精确匹配配置项2,华为CSI将使用配置项2中的配置应用到存储侧。

  • 如果设置的主机名规则无法精确匹配的业务节点主机名,则直接使用正则匹配到的第一条ALUA配置项。

    如配置项1中主机名规则为“myhost0[0-9]”,配置项2中的主机名规则为“myhost0[5-9]”,配置项1的优先级高于配置项2。当计算节点的主机名是“myhost06”时,两个配置项均可以匹配,此时华为CSI将使用配置项1中的配置应用到存储侧。

8.1.1.2 - 配置分布式存储后端的ALUA参数

华为分布式存储针对ALUA的配置请参考产品对应的主机连通性指南文档说明。

针对不同的操作系统,ALUA配置可能有所不同。进入华为技术支持,在搜索输入框中输入“主机连通性指南”,单击搜索。在搜索结果中,选择对应操作系统的主机连通性指南。结合实际需要根据指南的说明进行ALUA配置。华为CSI将在华为存储上对该主机的启动器应用您设置的配置项。

已经发放的Pod的节点不会主动更改ALUA信息,需要通过在该节点重新发放Pod才会变更主机ALUA配置。 分布式存储非双活场景,存储系统自身为Active/Active模式,选择“启用ALUA”没有实际意义,建议选择存储默认的“禁用ALUA”。因此不建议对分布式存储配置ALUA参数。

华为CSI支持的分布式存储的ALUA参数见表 分布式存储ALUA参数说明

表 1 分布式存储ALUA参数说明

参数名

参数描述

备注

HostName

HostName的值为worker节点的主机名,如HostName1、HostName2。

主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》

当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则

switchoverMode

切换模式。必选,取值为:

  • Disable_alua:禁用ALUA
  • Enable_alua:启用ALUA

非双活场景,存储系统自身为Active/Active模式,选择“启用ALUA”没有实际意义,建议选择“禁用ALUA”。当前华为CSI未支持SAN双活场景,请谨慎启用ALUA。

pathType

路径类型。条件必选,取值为:

  • optimal_path:优选路径
  • non_optimal_path:非优选路径

切换模式为启动ALUA时需要设置该选项。

ALUA配置项匹配主机名的规则

  • 如果设置的主机名规则精确匹配的业务节点主机名,则使用该主机名规则对应的ALUA配置项。

    如配置项1中主机名规则为“*”,配置项2中的主机名规则为“^myhost01$”。当计算节点的主机名是“myhost01”时,精确匹配配置项2,华为CSI将使用配置项2中的配置应用到存储侧。

  • 如果设置的主机名规则无法精确匹配的业务节点主机名,则直接使用正则匹配到的第一条ALUA配置项。

    如配置项1中主机名规则为“myhost0[0-9]”,配置项2中的主机名规则为“myhost0[5-9]”,配置项1的优先级高于配置项2。当计算节点的主机名是“myhost06”时,两个配置项均可以匹配,此时华为CSI将使用配置项1中的配置应用到存储侧。

8.2 - 配置存储拓扑感知

在Kubernetes集群中,可以根据节点的拓扑标签以及存储后端支持的拓扑能力调度和发放资源。

前提条件

需要在集群中的worker节点完成拓扑的标签配置,标签配置方法如下:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查看当前集群中的worker节点信息。

    kubectl get node
    

    命令结果示例如下:

    NAME     STATUS   ROLES                      AGE   VERSION
    node01   Ready    controlplane,etcd,worker   42d   v1.22.3
    node02   Ready    worker                     42d   v1.22.3
    node03   Ready    worker                     42d   v1.22.3
    
  3. 执行以下命令,给worker节点配置拓扑标签。其中 nodename 为worker节点名称, keyvalue 参数说明请参考表 参数说明

    kubectl label node <nodename> <key>=<value>
    

    表 1 参数说明

    参数名

    参数描述

    备注

    <key>

    拓扑标签的唯一标识。

    可支持配置:zone,region,protocol.<protocol>

    其中<protocol>可支持配置iscsi, nfs, fc, roce。

    <value>

    拓扑标签的参数值。

    “key”如果是“zone”“region”“value”值为自定义参数。

    “key”如果是protocol.<protocol>“value”值固定为“csi.huawei.com”

    • 拓扑标签必须以topology.kubernetes.io开头。拓扑标签示例:
    • 示例1:topology.kubernetes.io/region=China-west
    • 示例2:topology.kubernetes.io/zone=ChengDu
    • 示例3:topology.kubernetes.io/protocol.iscsi=csi.huawei.com
    • 示例4:topology.kubernetes.io/protocol.fc=csi.huawei.com
    • 同一节点上拓扑标签中同一个key只能支持一个value值。
    • 如果同一节点上拓扑标签中同时配置多个protocol,配置StorageClass时,StorageClass只需要满足其中一个protocol即可。
    • 如果同一节点上拓扑标签中同时配置region和zone,配置StorageClass时,StorageClass需要满足全部筛选条件。
  4. 执行命令, 查看当前集群中所有worker节点的标签信息。

    kubectl get nodes -o=jsonpath='{range .items[*]}[{.metadata.name}, {.metadata.labels}]{"\n"}{end}' | grep --color "topology.kubernetes.io"
    

    命令结果示例如下:

    [node01,"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node01","kubernetes.io/os":"linux","node-role.kubernetes.io/controlplane":"true","node-role.kubernetes.io/etcd":"true","node-role.kubernetes.io/worker":"true","topology.kubernetes.io/zone":"ChengDu"}]
    

8.2.1 - 通过Helm配置存储拓扑感知

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 进入Helm工程的目录下,如果无法找到之前的Helm工程,则将组件包中的helm目录拷贝到master节点的任意目录下,组件包路径请参考表 软件包组件描述

  3. 进入后端服务配置目录/examples/backend/下,备份backend.yaml文件

    cp backend.yaml backend.yaml.bak
    
  4. 执行vi backend.yaml命令打开文件,按需求配置拓扑感知,示例如下所示。修改完成后,按Esc,并输入 :wq!,保存修改。

    storage: "oceanstor-san"
    name: "dorado-iscsi-155"
    namespace: "huawei-csi"
    urls:
      - "https://192.168.129.155:8088"
    pools:
      - "StoragePool001"
    parameters:
      protocol: "iscsi"
      portals:
        - "10.10.30.20"
        - "10.10.30.21"
    supportedTopologies:
      - { "topology.kubernetes.io/region": "China-west", "topology.kubernetes.io/zone": "ChengDu" }
      - { "topology.kubernetes.io/region": "China-south","topology.kubernetes.io/zone": "ShenZhen" }
    maxClientThreads: "30"
    
  5. 执行以下命令删除待修改存储后端,其中“dorado-iscsi-155”为存储后端名称。

    oceanctl delete backend dorado-iscsi-155 -n huawei-csi
    
  6. 执行以下命令创建存储后端。

    oceanctl create backend -f ../examples/backend/backend.yaml -i yaml
    

    根据命令提示输入存储用户名和密码。

    Please enter this backend user name:admin
    Please enter this backend password:
    
  7. 执行vi StorageClass.yaml命令,修改yaml文件。按IInsert进入编辑状态,在yaml文件下增加相关参数,详细参数说明请参见表 参数说明。修改完成后,按Esc,并输入 :wq! ,保存修改。

    在StorageClass.yaml文件中添加以下配置项。拓扑

    • 示例1: 在StorageClass中配置zone和region信息

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: example-storageclass
      provisioner: csi.huawei.com
      parameters:
        volumeType: lun
        allocType: thin
      volumeBindingMode: WaitForFirstConsumer
      allowedTopologies:
      - matchLabelExpressions:
        - key: topology.kubernetes.io/zone
          values:
          - ChengDu
        - key: topology.kubernetes.io/region
          values:
          - China-west
      
    • 示例2: 在StorageClass中配置协议信息

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: protocol-example-storageclass
      provisioner: csi.huawei.com
      parameters:
        volumeType: lun
        allocType: thin
      volumeBindingMode: WaitForFirstConsumer
      allowedTopologies:
      - matchLabelExpressions:
        - key: topology.kubernetes.io/protocol.iscsi
          values:
          - csi.huawei.com
      

    表 1 参数说明

    参数名

    参数描述

    备注

    volumeBindingMode

    PersistentVolume绑定方式,用于控制何时进行PersistentVolume动态资源调配和绑定。

    可配置“WaitForFirstConsumer”“Immediate”

    “WaitForFirstConsumer”:表示延迟PersistentVolume的绑定和调配,直到创建使用PVC的Pod。

    “Immediate”:表示创建PVC后,立即发生PersistentVolume绑定和调配。

    allowedTopologies.matchLabelExpressions

    拓扑信息标签,用于过滤CSI后端和Kubernetes节点。如果匹配失败,会导致PVC或Pod无法创建。

    配置时需要同时按照固定格式配置“key”“value”.

    “key”:可支持配置“topology.kubernetes.io/zone”“topology.kubernetes.io/region”

    topology.kubernetes.io/protocol.<protocol>, 其中<protocol>为协议类型, 例如:iscsi, fc, nfs等。

    “value”

    “key”如果是“topology.kubernetes.io/zone”“topology.kubernetes.io/region”“value”值需要和前提条件中设置的拓扑标签保持一致。

    “key”如果是topology.kubernetes.io/protocol.<protocol>“value”值固定为“csi.huawei.com”

  8. 执行以下命令,基于该yaml文件创建StorageClass。

    kubectl create -f StorgeClass.yaml
    
  9. 使用该StorageClass创建具有拓扑能力的PVC,详细操作请参考动态卷供应PVC参数说明

8.3 - PVC变更

本章节介绍如何使用华为CSI完成PVC变更。

8.3.1 - 开启PVC变更特性

当前华为CSI安装时默认关闭PVC变更特性,如需要使用该特性,请按照以下步骤开启。

8.3.1.1 - 使用Helm开启PVC变更特性

前提条件

  • 已使用Helm安装华为CSI。
  • 要求华为CSI v4.5.0及以上版本。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令检查PVC变更特性是否开启。

    其中helm-huawei-csi为安装时指定的Helm Chart名称,huawei-csi为安装时指定的Helm Chart命名空间。组件包路径请参考表 软件包组件描述

    helm get values helm-huawei-csi -n huawei-csi -a | grep volumeModify -A 1
    

    命令结果示例如下:

    • 若回显内容为“enabled: true”,则表示特性开启,可跳过后续步骤。
    • 若回显内容为“enabled: false”,请按照后续步骤开启PVC变更特性。
    volumeModify:
      enabled: false
    
  3. 进入/helm/esdk目录,执行命令,配置卷变更CRD。

    # kubectl apply -f ./crds/volume-modify/
    customresourcedefinition.apiextensions.k8s.io/volumemodifyclaims.xuanwu.huawei.io configured
    customresourcedefinition.apiextensions.k8s.io/volumemodifycontents.xuanwu.huawei.io configured
    

    如回显中存在“Warning: resource customresourcedefinitions/volumemodifycontents.xuanwu.huawei.io is missing the kubectl.kubernetes.io/last-applied-configuration…”提示,可忽略该提示。该提示出现原因是由于Helm安装应用时使用的是kubectl create命令而不是kubectl apply命令。

  4. 执行以下命令,获取原有服务配置文件。

    helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
    
  5. 执行vi update-values.yaml命令打开4中获取的文件,修改以下配置。修改完成后,按Esc,并输入**:wq!**,保存修改。

    csiExtender:
      volumeModify:    
        enabled: true
    
  6. 执行以下命令更新华为CSI服务。

    helm upgrade helm-huawei-csi ./ -n huawei-csi  -f ./update-values.yaml
    
  7. 执行命令检查服务是否启动。

    kubectl get pod -n huawei-csi
    

    命令结果示例如下,其中huawei-csi为华为CSI部署命名空间。

    NAME                                     READY     STATUS    RESTARTS   AGE
    huawei-csi-controller-6dfcc4b79f-9vjtq   10/10     Running   0          24m
    huawei-csi-node-tqs87                    3/3       Running   0          20m
    

8.3.1.2 - 手动方式开启PVC变更特性

前提条件

已使用手动方式安装华为CSI。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 进入manual/esdk工作目录下,执行以下命令,配置卷变更CRD。

    kubectl apply -f ./crds/volume-modify/
    
  3. 执行以下命令。组件包路径请参考表 软件包组件描述

    kubectl apply -f ./deploy/huawei-csi-controller-extender.yaml
    
  4. 执行命令检查服务是否启动。

    kubectl get pod -n huawei-csi
    

    命令结果示例如下,其中huawei-csi为华为CSI部署命名空间。

    NAME                                     READY     STATUS    RESTARTS   AGE
    huawei-csi-controller-6dfcc4b79f-9vjtq   10/10     Running   0          24m
    huawei-csi-node-tqs87                    3/3       Running   0          24m
    

8.3.2 - 配置PVC变更

PVC变更特性使用CRD实现,当前资源说明如下。

表 1 资源说明

NAME

APIVERSION

NAMESPACED

KIND

volumemodifyclaims

xuanwu.huawei.io/v1

false

VolumeModifyClaim

volumemodifycontents

xuanwu.huawei.io/v1

false

VolumeModifyContent

  • VolumeModifyClaim资源支持创建/删除/查询,不支持更新。
  • VolumeModifyContent资源仅支持查询,用于展示单个PVC变更详情,请勿手动创建/删除/修改。
  • VolumeModifyContent资源被VolumeModifyClaim管理,请勿手动管理VolumeModifyContent资源。

8.3.2.1 - 创建PVC变更

前提条件

待变更PVC关联的存储后端已经组成双活存储后端,若未组成双活存储后端,请参考手动更新存储后端章节配置。

8.3.2.1.1 - 准备PVC变更文件

PVC变更文件说明

PVC变更文件样例模板为/examples/volumemodifyclaim.yaml,具体配置项如下表所示:

表 1 参数说明

参数

描述

必选参数

默认值

备注

apiVersion

API组,string类型

xuanwu.huawei.io/v1

固定填写xuanwu.huawei.io/v1

kind

资源的类型,string类型

VolumeModifyClaim

固定填写VolumeModifyClaim

metadata.name

集群资源对象的名称,string类型

-

名称必须满足DNS 子域名的命名规则,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以小写字母数字字符开头和结尾,最大长度不超过63个字符

spec.source.kind

数据源类型,string类型

StorageClass

仅支持设置为:StorageClass

spec.source.name

数据源名称,string类型

-

仅支持设置StorageClass名称

spec.parameters.hyperMetro

是否将普通卷变更为双活卷。当前取值仅支持"true"。

-

仅支持主站点普通存储卷变更为双活存储卷。

spec.parameters.metroPairSyncSpeed

双活Pair同步速率。支持配置为1~4。

可选值:

  • 1:低
  • 2:中
  • 3:高
  • 4:最高

-

当且仅当spec.parameters.hyperMetro为"true"时生效。

注意:

  • 未配置该参数时,双活Pair存储速率由存储决定。
  • 最高速率同步时可能导致主机时延增大。

  • spec.source.kind和spec.source.name用于指定卷变更范围,例如配置为StorageClass和对应名称时,将会变更使用目标StorageClass发放的所有的处于Bound状态的PVC。
  • 当所有关联的PVC完成变更后,华为CSI会替换原有的StorageClass,并增加VolumeModifyClaim的spec.parameters参数,使得PVC满足StorageClass定义。

典型场景配置请参考如下示例:

变更普通卷为双活卷

配置变更普通卷为双活卷示例如下:

apiVersion: xuanwu.huawei.io/v1
kind: VolumeModifyClaim
metadata:
  name: myvmc
spec:
  source:
    kind: StorageClass
    name: mysc
  parameters:
    hyperMetro: "true"

8.3.2.1.2 - 创建PVC变更资源

本章节介绍如何基于已配置的PVC变更文件创建PVC变更资源。

  • 仅支持双活AA模式。
  • 如果变更场景为普通卷变更为双活卷,则仅支持变更主站点端存储卷。
  • 创建PVC变更资源期间,请勿使用华为CSI管理PVC。
  • 不支持对同一个PVC创建多个VolumeModifyClaim资源,若存在对目标PVC的多次变更,请在单次变更完成之后再执行。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,创建PVC变更。

    kubectl create -f volumemodifyclaim.yaml 
    
  3. 参考查询PVC变更查询创建结果。

8.3.2.2 - 查询PVC变更

本章节介绍如何使用Kubectl查询PVC变更状态,当前华为CSI通过CRD提供以下API。

查询VolumeModifyClaim

使用kubectl查询VolumeModifyClaim步骤如下。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查询PVC变更。其中 vmc-name 为VolumeModifyClaim资源名称。

    kubectl get volumemodifyclaims <vmc-name> -owide
    

    命令结果示例如下:

    NAME    STATUS      READY   SOURCEKIND     SOURCENAME   STARTEDAT              COMPLETEDAT            AGE
    myvmc   Completed   1/1     StorageClass   mysc         2024-06-06T03:19:13Z   2024-06-06T03:19:16Z   2m2s
    

    表 1 回显说明

    名称

    说明

    NAME

    VolumeModifyClaim资源名称。

    STATUS

    VolumeModifyClaim资源状态,可取值如下:

    • Pending:初始状态。
    • Creating:VolumeModifyClaim完成基本校验,且服务端已经接收变更任务,但是该任务还未执行完成。
    • Completed:所有关联的PVC均完成变更。
    • Rollback:关联的PVC部分完成变更时,用户执行了删除PVC变更操作。
    • Deleting:关联的PVC全部完成变更时,用户执行了删除PVC变更操作。

    READY

    完成变更PVC数量/全部待变更PVC数量。

    SOURCEKIND

    数据源类型,例如StorageClass。

    SOURCENAME

    数据源名称,例如StorageClass名称。

    STARTEDAT

    变更开始时间,指服务端接收该任务并开始处理的时间戳。

    COMPLETEDAT

    变更完成时间,指所有关联的PVC均完成变更后的时时间戳,仅STATUS为Completed时,存在该值。

    AGE

    VolumeModifyClaim从创建至当前的存活时间。

VolumeModifyClaim支持使用kubectl查看Events信息,当VolumeModifyClaim无法满足创建要求,或者创建过程中出现错误时,服务端将记录Events信息。参考命令如下:

kubectl describe volumemodifyclaims local-to-hypermetro 

查询VolumeModifyContent

VolumeModifyContent由VolumeModifyClaim资源创建,记录了单个PVC的变更详情,使用kubectl查询VolumeModifyContent步骤如下。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行命令,查询PVC变更。其中myvmc-uid为VolumeModifyContent资源名称。

    kubectl get volumemodifycontents myvmc-uid  -owide
    

    命令结果示例如下:

    NAME         STATUS      MODIFYCLAIMNAME     SOURCEVOLUME   STARTEDAT              COMPLETEDAT            AGE
    myvmc-uid    Completed   myvmc               default/mypvc  2024-06-06T03:19:07Z   2024-06-06T03:19:09Z   36m
    

    表 2 回显说明

    名称

    说明

    NAME

    VolumeModifyContent资源名称,格式为:VolumeModifyClaim名称-关联PVC的UID。

    STATUS

    VolumeModifyContent资源状态,可取值如下:

    • Pending:初始状态。
    • Creating:VolumeModifyContent完成基本校验,且服务端已经接收变更任务,但是该任务还未执行完成。
    • Completed:关联的PVC完成变更。
    • Rollback:正在回滚PVC变更。

    MODIFYCLAIMNAME

    关联的VolumeModifyClaim名称。

    SOURCEVOLUME

    关联的PVC信息,格式为:命名空间名称/PVC名称。

    STARTEDAT

    PVC变更开始时间,指服务端接收该任务并开始处理的时间戳。

    COMPLETEDAT

    PVC变更完成时间,指所有关联的PVC均完成变更后的时时间戳,仅STATUS为Completed时,存在该值。

    AGE

    即VolumeModifyContent从创建至当前的存活时间。

VolumeModifyContent支持使用kubectl查看Events信息,当VolumeModifyContent无法满足创建要求,或者变更PVC出现错误时,服务端将记录Events信息。参考命令如下:

kubectl describe volumemodifycontents myvmc-uid

8.3.2.3 - 删除PVC变更

  • 当VolumeModifyClaim的STATUS值为Creating时,删除VolumeModifyClaim资源,将会在存储侧删除此次变更创建的资源,然后移除集群资源。在删除后,如果继续使用原有的StorageClass进行PVC管理,需要将关联的存储后端恢复为非双活存储后端。
  • 当VolumeModifyClaim的STATUS值为Pending或Completed时,删除VolumeModifyClaim资源,仅会移除集群资源,不会和存储交互,即不会在存储侧删除变更创建的资源。
  • VolumeModifyContent被VolumeModifyClaim管理,请勿手动管理VolumeModifyContent资源。
  • 若待变更PVC中已有部分PVC满足变更要求,当批量变更失败时,会移除掉所有PVC的变更,导致已满足变更条件的PVC不再满足。
  • 若待变更PVC已经在存储侧被手动管理,则可能导致变更失败。使用变更特性时,请勿手动管理存储卷。

当前章节介绍如何使用kubectl删除PVC变更,基于步骤如下。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,删除PVC变更。其中 vmc-name 为VolumeModifyClaim资源名称。

    kubectl delete volumemodifyclaims <vmc-name>
    
  3. 参考创建PVC变更资源查询删除结果。

9 - 常用操作

9.1 - 安装Helm 3

本章节指导用户如何安装Helm 3。

参考:https://helm.sh/docs/intro/install/

前提条件

确保Kubernetes集群中的master节点可以访问Internet。

操作步骤

  1. 执行以下命令,下载Helm 3的安装脚本。

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
    
  2. 执行以下命令,修改Helm 3的安装脚本权限。

    chmod 700 get_helm.sh
    
  3. 根据Helm与Kubernetes版本配套关系确认需要安装的Helm版本,配套关系请参考Helm Version Support Policy,执行以下命令,修改DESIRED_VERSION环境变量为需要安装的Helm版本,并执行安装命令。

    DESIRED_VERSION=v3.9.0 ./get_helm.sh
    
  4. 执行以下命令,查看指定版本的Helm 3是否安装成功。

    helm version
    

    命令结果示例如下,说明安装成功。

    version.BuildInfo{Version:"v3.9.0", GitCommit:"7ceeda6c585217a19a1131663d8cd1f7d641b2a7", GitTreeState:"clean", GoVersion:"go1.17.5"}
    

9.2 - 信息收集

9.2.1 - 如何获取CSI版本信息

本章节指导用户如何查看CSI版本信息。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查看huawei-csi-node所在节点信息。

    kubectl get pod -A  -owide | grep huawei-csi-node
    

    命令结果示例如下:

    NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE     IP               NODE            NOMINATED NODE   READINESS GATES
    huawei-csi    huawei-csi-node-87mss                      3/3     Running   0               6m41s   192.168.129.155      node-1          <none>           <none>
    huawei-csi    huawei-csi-node-xp8cc                      3/3     Running   0               6m41s   192.168.129.156      node-2          <none>           <none
    
  3. 使用远程访问工具(以PuTTY为例),通过节点IP地址,登录任意huawei-csi-node所在节点。

  4. 执行以下命令,查看CSI版本信息。

    cat /var/lib/kubelet/plugins/csi.huawei.com/version
    

    命令显示版本信息如下。

    4.5.0
    

9.2.2 - 如何查看华为CSI日志

查看huawei-csi-controller服务的日志

  1. 执行以下命令,获取huawei-csi-controller所在的节点

    kubectl get pod -A -o wide | grep huawei
    

    命令结果示例如下,其中IP为节点主机ip,NODE为节点主机名称。

    NAME                                    READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
    huawei-csi-controller-695b84b4d8-tg64l  9/9     Running  0          14s     <host1-ip>     <host1-name> <none>           <none>
    
  2. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群中huawei-csi-controller服务所在节点

  3. 进入日志目录。

    cd /var/log/huawei
    
  4. 执行以下命令,查看容器自定义输出日志。

    vi huawei-csi-controller
    
  5. 进入容器目录。

    cd /var/log/containers
    
  6. 执行以下命令, 查看容器标准输出日志。

    vi huawei-csi-controller-<name>_huawei-csi_huawei-csi-driver-<contrainer-id>.log
    

查看huawei-csi-node服务的日志

  1. 执行以下命令,获取huawei-csi-node所在的节点

    kubectl get pod -A -o wide | grep huawei
    

    命令结果示例如下,其中IP为节点主机ip,NODE为节点主机名称。

    NAME                     READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
    huawei-csi-node-g6f7z    3/3     Running  0          14s     <host2-ip>     <host2-name> <none>           <none>
    
  2. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群中huawei-csi-node服务所在节点

  3. 进入日志目录。

    cd /var/log/huawei
    
  4. 执行以下命令,查看容器自定义输出日志。

    vi huawei-csi-node
    
  5. 进入容器目录。

    cd /var/log/containers
    
  6. 执行以下命令, 查看容器标准输出日志。

    vi huawei-csi-node-<name>_huawei-csi_huawei-csi-driver-<contrainer-id>.log
    

9.2.3 - 日志收集

前置检查

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群内有oceanctl工具的节点。

  2. 执行以下命令,显示版本号为v4.5.0

    oceanctl version
    

    命令结果示例如下:

    Oceanctl Version: v4.5.0
    
  3. 执行oceanctl collect logs –help命令,返回信息如下。

    $ oceanctl collect logs --help
    Collect logs of one or more nodes in specified namespace in Kubernetes
    
    Usage:
      oceanctl collect logs [flags]
    
    Examples:
      # Collect logs of all nodes in specified namespace
      oceanctl collect logs -n <namespace>
    
      # Collect logs of specified node in specified namespace
      oceanctl collect logs -n <namespace> -N <node>
    
      # Collect logs of all nodes in specified namespace
      oceanctl collect logs -n <namespace> -a
    
      # Collect logs of all nodes in specified namespace with a maximum of 50 nodes collected at the same time
      oceanctl collect logs -n <namespace> -a --threads-max=50
    
      # Collect logs of specified node in specified namespace
      oceanctl collect logs -n <namespace> -N <node> -a
    
    Flags:
      -a, --all                Collect all nodes messages
      -h, --help               help for logs
      -n, --namespace string   namespace of resources
      -N, --nodename string    Specify the node for which information is to be collected.
          --threads-max int    set maximum number[1~1000] of threads for nodes to be collected. (default 50)
    
    Global Flags:
          --log-dir string   Specify the directory for printing log files. (default "/var/log/huawei")
    
  4. 执行以下命令,检查Pod是否正常启动,其中,huawei-csi为CSI安装的命名空间。

    kubectl get deployment -n huawei-csi
    

    命令结果示例如下:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    huawei-csi-controller   1/1     1            1           21h
    

使用oceanctl收集CSI命名空间下所有日志

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录前置检查章节中检查的节点。

  2. 执行oceanctl collect logs -n <namespace> -a –threads-max=<max_node_processing_num>命令,收集集群内所有CSI容器所在节点的CSI日志,其中threads-max参数指定了同时收集日志的最大节点数量,默认为50,可以根据主机性能与负载情况配置。

    oceanctl collect logs -n huawei-csi -a --threads-max=10
    
  3. 检查/tmp目录下生成的日志压缩包,可以使用unzip <zip_name> -d collect_logs解压日志压缩包,其中<zip_name>为压缩包的名字。

    # date
    Wed Sep 20 02:49:24 EDT 2023
    
    # ls
    huawei-csi-2023-09-20-02:48:22-all.zip
    

使用oceanctl收集CSI单个节点日志

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录前置检查章节中检查的节点。

  2. 执行oceanctl collect logs -n <namespace> -N <nodeName>命令,收集集群内所有CSI容器所在节点的CSI日志。

    oceanctl collect logs -n huawei-csi -N node-1
    
  3. 检查/tmp目录下生成的日志压缩包,可以使用unzip <zip_name> -d collect_logs解压日志压缩包,其中<zip_name>为压缩包的名字。

    # date
    Thu Sep 21 04:08:47 EDT 2023
    
    # ls
    huawei-csi-2023-09-21-04:05:15-node-1.zip
    

9.3 - 下载容器镜像

使用containerd下载容器镜像

  1. 执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉取的镜像及其标签。

    ctr image pull <image>:<tag>
    
  2. 执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。

    ctr image export <file>.tar <image>:<tag>
    

使用Docker下载容器镜像

  1. 执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉取的镜像及其标签。

    docker pull <image>:<tag>
    
  2. 执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。

    docker save <image>:<tag> -o <file>.tar
    

使用Podman下载容器镜像

  1. 执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉取的镜像及其标签。

    podman pull <image>:<tag>
    
  2. 执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。

    podman save <image>:<tag> -o <file>.tar 
    

9.4 - 更新huawei-csi-controller或huawei-csi-node服务

当您需要更新huawei-csi-controller或huawei-csi-node服务时,例如修改huawei-csi-controller服务的副本数时,执行此操作。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 进入/helm/esdk 目录,执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。组件包路径请参考表 软件包组件描述

    helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
    
  3. 执行 vi update-values.yaml 命令打开2中获取的文件,参考Helm values.yaml参数说明修改配置项,修改完成后,按Esc,并输入 :wq!,保存修改。

  4. 执行以下命令更新华为CSI服务。

    helm upgrade helm-huawei-csi ./ -n huawei-csi  -f ./update-values.yaml
    

9.5 - 修改日志输出模式

huawei-csi支持两种日志输出模式,分别是file和console。file指的是输出到固定的日志目录(例如:/var/log/huawei);console指的是输出到容器标准目录。用户可以根据自身需求自行设置日志输出模式,默认为file.

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 进入/helm/esdk 目录,执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。组件包路径请参考表 软件包组件描述

    helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
    
  3. 执行vi update-values.yaml命令打开2中获取的文件,修改配置项,修改完成后,按Esc,并输入 :wq!,保存修改。

    # The CSI driver parameter configuration
    csiDriver:
      # Driver name, it is strongly recommended not to modify this parameter
      # The CCE platform needs to modify this parameter, e.g. csi.oceanstor.com
      driverName: csi.huawei.com
      # Endpoint, it is strongly recommended not to modify this parameter
      endpoint: /csi/csi.sock
      # DR Endpoint, it is strongly recommended not to modify this parameter
      drEndpoint: /csi/dr-csi.sock
      # Maximum number of concurrent disk scans or detaches, support 1~10
      connectorThreads: 4
      # Flag to enable or disable volume multipath access, support [true, false]
      volumeUseMultipath: true
      # Multipath software used by fc/iscsi. support [DM-multipath, HW-UltraPath, HW-UltraPath-NVMe]
      scsiMultipathType: DM-multipath
      # Multipath software used by roce/fc-nvme. only support [HW-UltraPath-NVMe]
      nvmeMultipathType: HW-UltraPath-NVMe
      # Timeout interval for waiting for multipath aggregation when DM-multipath is used on the host. support 1~600
      scanVolumeTimeout: 3
      # Timeout interval for running command on the host. support 1~600
      execCommandTimeout: 30
      # check the number of paths for multipath aggregation
      # Allowed values:
      #   true: the number of paths aggregated by DM-multipath is equal to the number of online paths
      #   false: the number of paths aggregated by DM-multipath is not checked.
      # Default value: false
      allPathOnline: false
      # Interval for updating backend capabilities. support 60~600
      backendUpdateInterval: 60
      # Huawei-csi-controller log configuration
      controllerLogging:
        # Log record type, support [file, console]
        module: file
        # Log Level, support [debug, info, warning, error, fatal]
        level: info
        # Directory for storing logs
        fileDir: /var/log/huawei
        # Size of a single log file
        fileSize: 20M
        # Maximum number of log files that can be backed up.
        maxBackups: 9
      # Huawei-csi-node log configuration
      nodeLogging:
        # Log record type, support [file, console]
        module: file
        # Log Level, support [debug, info, warning, error, fatal]
        level: info
        # Directory for storing logs
        fileDir: /var/log/huawei
        # Size of a single log file
        fileSize: 20M
        # Maximum number of log files that can be backed up.
        maxBackups: 9
    
  4. 执行以下命令更新日志配置。

    helm upgrade helm-huawei-csi ./ -n huawei-csi  -f ./update-values.yaml
    

9.6 - 开启ReadWriteOncePod功能门

ReadWriteOnce访问模式是Kubernetes v1.22版本为PV和PVC引入的第四种访问模式。如果您使用ReadWriteOncePod访问模式的PVC创建一个Pod,Kubernetes会确保该Pod是整个集群中唯一可以读取或写入该PVC的Pod。

由于ReadWriteOncePod访问模式在当前已发布的Kubernetes v1.22/1.23/1.24版本中是alpha特性,需要先在kube-apiserver、kube-scheduler和kubelet的feature-gates中开启ReadWriteOncePod特性才能使用。

CCE / CCE Agile平台暂时不支持开启ReadWriteOncePod功能门

操作步骤

  1. 为kube-apiserver启用ReadWriteOncePod功能门。

    1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

    2. 执行vi /etc/kubernetes/manifests/kube-apiserver.yaml命令,按IInsert进入编辑状态,为 kube-apiserver容器添加参数–feature-gates=ReadWriteOncePod=true。修改完成后,按Esc,并输入 :wq!,保存修改。

      ...
      spec:
        containers:
        - command:
          - kube-apiserver
          - --feature-gates=ReadWriteOncePod=true
          ...
      

      在编辑完成后,Kubernetes会自动应用更新,不需要手动更新。

  2. 为kube-scheduler启用ReadWriteOncePod功能门。

    1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

    2. 执行vi /etc/kubernetes/manifests/kube-scheduler.yaml命令,按IInsert进入编辑状态,为kube-scheduler容器添加参数–feature-gates=ReadWriteOncePod=true。修改完成后,按Esc,并输入 :wq!,保存修改。

      spec:
        containers:
        - command:
          - kube-scheduler
          - --feature-gates=ReadWriteOncePod=true
          ...
      

      在编辑完成后,Kubernetes会自动应用更新,不需要手动更新。

  3. 为kubelet启用ReadWriteOncePod功能门。


    由于动态Kubelet配置功能在v1.22中已弃用,并且在v1.24中删除,因此集群中每个worker节点上的kubelet都需要执行以下操作。

    1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意worker节点。

    2. 执行vi /var/lib/kubelet/config.yaml命令,按IInsert进入编辑状态,为KubeletConfiguration对象的featureGates字段添加ReadWriteOncePod: true,如果没有featureGates字段请一并添加。修改完成后,按Esc,并输入 :wq!,保存修改。

      apiVersion: kubelet.config.k8s.io/v1beta1
      featureGates:
        ReadWriteOncePod: true
        ...
      

      kubelet配置文件的默认路径为/var/lib/kubelet/config.yaml,请根据实际情况填写。

    3. 在配置完成后,执行systemctl restart kubelet命令重启kubelet。

9.7 - 配置非root用户访问Kubernetes集群

操作步骤

  1. 拷贝Kubernetes集群的认证文件,/etc/kubernetes/admin.conf修改为实际使用的认证文件。

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
  2. 修改认证文件的用户与用户组。

    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  3. 配置当前用户的KUBECONFIG环境变量,以Ubuntu 20.04举例如下。

    echo "export KUBECONFIG=$HOME/.kube/config" >> ~/.bashrc
    source ~/.bashrc
    

10 - 故障处理

10.1 - 华为CSI服务相关问题

10.1.1 - 启动huawei-csi-node失败,提示错误为:“/var/lib/iscsi is not a directory”

现象描述

启动huawei-csi-node时,无法启动huawei-csi-node服务, 使用kubectl describe daemonset huawei-csi-node -n huawei-csi命令查看,提示错误为:“/var/lib/iscsi is not a directory”。

根因分析

huawei-csi-node中容器内部无/var/lib/iscsi目录。

解决措施或规避方法

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 进入Helm工程的目录下,如果无法找到之前的Helm工程,则将组件包中的helm目录拷贝到master节点的任意目录下,组件包路径请参考表 软件包组件描述

  3. 进入下一级目录templates,找到huawei-csi-node.yaml文件。

    cd /templates
    
  4. 执行以下命令,将huawei-csi-node.yaml > volumes > iscsi-dir > hostPath中“path“设置为“/var/lib/iscsi“ ,然后保存并退出文件。

    vi huawei-csi-node.yaml
    
  5. 执行以下命令升级Helm chart。升级命令将更新Deployment、DaemonSet和RBAC资源。其中,helm-huawei-csi为自定义的chart名称,huawei-csi为自定义的命名空间。

    helm upgrade helm-huawei-csi ./ -n huawei-csi values.yaml
    

    命令结果示例如下。

    Release "helm-huawei-csi" has been upgraded. Happy Helming!
    NAME: helm-huawei-csi
    LAST DEPLOYED: Thu Jun  9 07:58:15 2022
    NAMESPACE: huawei-csi
    STATUS: deployed
    REVISION: 2
    TEST SUITE: None
    

10.1.2 - 启动华为CSI服务失败,提示错误:“/etc/localtime is not a file”

现象描述

安装部署CSI时,Pod运行不起来,处于ContainerCreating状态,查看Pod中有打印告警事件:/etc/localtime is not a file。

根因分析

容器挂载主机/etc/localtime文件时,识别类型有误,容器挂载不上主机侧/etc/localtime文件,导致Pod运行不起来。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行命令,查看CSI服务Pod运行状态。

    kubectl get pod -n huawei-csi
    

    命令结果示例如下。其中,huawei-csi为CSI服务部署的命名空间。

    NAME                                     READY   STATUS               RESTARTS   AGE
    huawei-csi-controller-6dfcc4b79f-9vjtq   9/9     ContainerCreating    0          24m
    huawei-csi-controller-6dfcc4b79f-csphc   9/9     ContainerCreating    0          24m
    huawei-csi-node-g6f4k                    3/3     ContainerCreating    0          20m
    huawei-csi-node-tqs87                    3/3     ContainerCreating    0          20m
    
  3. 执行命令,通过查看容器的“Events”参数。

    kubectl describe pod huawei-csi-controller-6dfcc4b79f-9vjtq -n huawei-csi
    

    命令结果示例如下。其中,huawei-csi-controller-6dfcc4b79f-9vjtq2中查找到的状态显示为“ContainerCreating”的Pod名称,huawei-csi为该Pod所在的命名空间。

    ...
    Events:
      Type     Reason       Age                From               Message
      ----     ------       ----               ----               -------
      Normal   Scheduled    96s                default-scheduler  Successfully assigned huawei-csi/huawei-csi-controller-6dfcc4b79f-9vjtq to node1
      Warning  FailedMount  33s (x8 over 96s)  kubelet            MountVolume.SetUp failed for volume "host-time" : hostPath type check failed: /etc/localtime is not a file
    
  4. 执行命令cd /helm/esdk/templates,进入到CSI的安装包路径下。路径请参见表 软件包组件描述

  5. 以huawei-csi-controller.yaml文件为例,执行以下命令,查看文件内容。

    vi huawei-csi-controller.yaml
    

    找到对应volumes配置下的host-time挂载项,删除type: File这一行配置内容。对templates目录下涉及该配置项的huawei-csi-node.yaml部署文件,执行相同的操作。

    ...
    ...
    volumes:
      - hostPath:
          path: /var/log/
          type: Directory
        name: log
      - hostPath:
          path: /etc/localtime
          type: File
        name: host-time
    ...
    ...
    
  6. 参考Helm卸载华为CSI卸载服务后,重新安装服务。

  7. 执行以下命令,查看华为CSI服务Pod运行状态为Running。

    kubectl get pod -n huawei-csi
    

    命令结果示例如下。

    NAME                                     READY   STATUS    RESTARTS   AGE
    huawei-csi-controller-6dfcc4b79f-9vjts   9/9     Running   0          24m
    huawei-csi-controller-6dfcc4b79f-csphb   9/9     Running   0          24m
    huawei-csi-node-g6f41                    3/3     Running   0          20m
    huawei-csi-node-tqs85                    3/3     Running   0          20m
    

10.1.3 - 启动huawei-csi服务时,服务启动异常, 状态显示InvalidImageName

现象描述

启动huawei-csi时,无法启动huawei-csi服务(huawei-csi-controller服务或者huawei-csi-node服务),使用kubectl get pod -A | grep huawei命令查看,显示状态为InvalidImageName

kubectl get pod -A | grep huawei

命令结果示例如下。

huawei-csi     huawei-csi-controller-fd5f97768-qlldc     6/9     InvalidImageName     0          16s
huawei-csi     huawei-csi-node-25txd                     2/3     InvalidImageName     0          15s

根因分析

controller和node的yaml配置文件中,配置Huawei CSI的镜像版本号错误。例如:

        ...
        - name: huawei-csi-driver
          image: huawei-csi:4.5.0
        ...

解决措施或规避方法

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,修改huawei-csi-node服务的配置文件。按IInsert进入编辑状态,修改相关参数。修改完成后,按Esc,并输入 :wq! ,保存修改。

    kubectl edit daemonset huawei-csi-node -o yaml -n=huawei-csi
    

    • 示例yaml文件中huawei-csi-driver的参数image配置项,修改华为CSI镜像huawei-csi:4.5.0。
    containers:
      ...
      - name: huawei-csi-driver
        image: huawei-csi:4.5.0
    
  3. 执行以下命令,修改huawei-csi-controller服务的配置文件。按IInsert进入编辑状态,修改相关参数。修改完成后,按Esc,并输入 :wq! ,保存修改。

    kubectl edit deployment huawei-csi-controller -o yaml -n=huawei-csi
    

    • 示例yaml文件中huawei-csi-driver的参数image配置项,修改华为CSI镜像huawei-csi:4.5.0。
    containers:
      ...
      - name: huawei-csi-driver
        image: huawei-csi:4.5.0
    
  4. 等待huawei-csi-node和huawei-csi-controller服务启动。

  5. 执行以下命令,查看huawei csi服务是否启动。

    kubectl get pod -A  | grep huawei
    

    命令结果示例如下。Pod状态为“Running“说明服务启动成功。

    huawei-csi   huawei-csi-controller-58799449cf-zvhmv   9/9     Running       0          2m29s
    huawei-csi   huawei-csi-node-7fxh6                    3/3     Running       0          12m
    

10.2 - 存储后端相关问题

10.2.1 - 使用oceanctl工具管理后端时调用webhook失败

现象描述

当webhook的配置发生改变后,例如修改webhookPort参数值后,此时使用oceanctl工具对后端进行管理时调用webhook报错,如下:

根因分析

当webhook的配置发生改变后,导致validatingwebhookconfiguration资源失效。

解决措施或规避方法

  1. 执行以下命令,删除validatingwebhookconfiguration资源。

    kubectl delete validatingwebhookconfiguration storage-backend-controller.xuanwu.huawei.io
    
  2. 执行以下命令,重启CSI Controller,请通过“–replicas=*”恢复CSI Controller的副本数,下例为恢复至1个,请根据实际情况修改。

    kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=0 
    kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=1
    
  3. 执行以下命令,检查CSI Controller是否成功拉起。

    kubectl get pod -n huawei-csi
    

    命令结果示例如下。Pod状态为“Running“说明Controller成功拉起。

    NAME                                     READY   STATUS    RESTARTS   AGE
    huawei-csi-controller-58d5b6b978-s2dsq   9/9     Running   0          19s
    huawei-csi-node-dt6nd                    3/3     Running   0          77m
    

10.2.2 - 使用oceanctl工具创建后端失败,报错:context deadline exceeded

现象描述

用户使用oceanctl工具创建存储后端失败,控制台回显:“failed to call webhook: xxx :context deadline exceeded; error: exist status 1”。

根因分析

创建存储后端时,将会调用CSI提供的webhook服务校验与存储管理网络的连通性和存储账号密码信息,出现该问题原因可能是以下两种原因:

  • 华为CSI校验存储管理网络连通性失败。
  • kube-apiserver和CSI webhook通信异常。

华为CSI校验存储管理网络连通性失败

请按照以下步骤检查是否是华为CSI校验存储管理网络连通性失败。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行命令,获取CSI服务信息。其中,huawei-csi为CSI服务部署的命名空间。

    kubectl get pod -n huawei-csi -owide
    

    命令结果示例如下:

    NAME                        READY   STATUS    RESTARTS   AGE   IP         NODE       NOMINATED NODE   READINESS GATES
    huawei-csi-controller-xxx   9/9     Running   0          19h   host-ip1   host-1     <none>           <none>
    huawei-csi-node-mnqbz       3/3     Running   0          19h   host-ip1   host-1     <none>           <none>
    
  3. 登录huawei-csi-controller所在节点,如2中的host-1。

  4. 进入到/var/log/huawei目录。

    # cd /var/log/huawei
    
  5. 查看storage-backend-controller日志,以连接存储超时为例。

    tail -n 1000 storage-backend-controller
    

    日志示例如下:

    2024-01-01 06:30:44.280661 1 [INFO]: Try to login https://192.168.129.155:8088/deviceManager/rest
    2024-01-01 06:31:44.281626 1 [ERROR]: Send request method: POST, Url: https://192.168.129.155:8088/deviceManager/rest/xx/sessions, error: Post "https://192.168.129.155:8088/deviceManager/rest/xx/sessions": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
    2024-01-01 06:31:44.281793 1 [WARNING]: Login https://192.168.129.155:8088/deviceManager/rest error due to connection failure, gonna try another Url
    2024-01-01 06:31:44.291668 1 [INFO]: Finished validateCreate huawei-csi/backend-test.
    2024-01-01 06:31:44.291799 1 [ERROR]: Failed to validate StorageBackendClaim, error: unconnected
    
  6. 如果日志中有相关登录超时、登录失败或者请求耗时较长,请检查宿主机和存储连通性或网络情况。

  7. 如果日志中没有收到任何请求,则是kube-apiserver和CSI webhook通信异常。

kube-apiserver和CSI webhook通信异常

联系Kubernetes平台管理员查看kube-apiserver与CSI webhook网络问题。例如kube-apiserver存在HTTPS代理时可能无法访问CSI webhook服务。

临时规避方案中,将会删除webhook资源,该资源用于在创建存储后端时校验输入的账户信息是否正确和能否和存储建立连接,因此删除该资源仅影响创建后端时的校验,无其他功能影响,但需要注意以下几点。

  • 请保证huawei-csi-controller服务所在宿主机能和存储通信。
  • 请保证输入的账号密码正确。
  1. 可执行以下命令查看CSI webhook信息。

    kubectl get validatingwebhookconfiguration storage-backend-controller.xuanwu.huawei.io
    

    命令结果如下。

    NAME                                          WEBHOOKS   AGE
    storage-backend-controller.xuanwu.huawei.io   1          4d22h
    
  2. 联系Kubernetes平台管理员检查kube-apiserver与CSI webhook是否存在通信异常。

  3. 临时规避方案:可执行以下命令删除webhook。

    kubectl delete validatingwebhookconfiguration storage-backend-controller.xuanwu.huawei.io
    
  4. 创建存储后端,可参考管理存储后端

  5. 如果kube-apiserver与CSI webhook通信恢复正常,需要重建webhook,执行以下命令,重启CSI Controller,通过指定“–replicas=*”恢复CSI Controller的副本数,下例为恢复至1个,请根据实际情况修改。

    先将副本数修改为0。

    kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=0 
    

    再将副本数恢复为原数量。

    kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=1
    

10.2.3 - 存储侧更新密码后账户被锁定

现象描述

用户在存储侧修改后端密码之后,该后端账号被锁定。

根因分析

CSI登录存储时使用存储后端配置的账户和密码,当存储侧修改了该账户密码之后,CSI登录失败后会重试。以OceanStor Dorado存储为例,默认的登录策略是密码校验失败3次后将会锁定账户,因此当CSI重试超过3次之后,该账户就会被锁定。

解决措施或规避方法

  1. 如果后端配置的账户是admin,请执行以下命令,将huawei-csi-controller服务副本数置为0,如果使用的是非admin账户,忽略此步骤。

    kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=0
    
  2. 使用admin账户登录存储,修改登录策略。以OceanStor Dorado存储为例,在DeviceManager管理界面,选择“设置 > 用户与安全 > 安全策略 >登录策略 >修改>密码锁定”,取消密码锁定。

  3. 如果如果后端配置的账户是admin,执行以下命令,通过“–replicas=*”恢复CSI Controller的副本数,下例为恢复至1个,请根据实际情况修改。如果使用的是非admin账户,忽略此步骤。

    kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=1
    
  4. 使用oceanctl工具修改存储后端密码,修改后端密码请参考更新存储后端章节。

  5. 使用admin账户登录存储,修改登录策略,以OceanStor Dorado存储为例,在DeviceManager管理界面,选择“设置 > 用户与安全 > 安全策略 >登录策略 >修改>密码锁定”,恢复密码锁定。

10.3 - PVC相关问题

10.3.1 - 创建PVC时, PVC的状态为Pending

现象描述

执行完成PVC的创建操作,一段时间后,PVC的状态仍然处于Pending。

根因分析

原因1:由于没有提前创建指定名称的StorageClass,导致Kubernetes在创建PVC时无法找到指定StorageClass名称。

原因2:由于存储池能力和StorageClass能力不匹配,导致huawei-csi选择存储池失败。

原因3:由于存储RESTful接口执行返回具体错误码(例如:50331651),导致huawei-csi在执行创建PVC时失败。

原因4:由于存储在huawei-csi设定的超时时间内没有返回,huawei-csi向Kubernetes返回超时错误。

原因5:其他原因。

解决措施或规避方法

创建PVC时,如果PVC处于Pending状态,需要根据以下不同的原因采取不同的解决措施。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查看PVC的详细信息。

    kubectl describe pvc mypvc
    
  3. 根据PVC详细信息中Events信息,执行相应操作。

    • 如果由原因1导致PVC处于Pending状态,执行以下步骤。

      Events:
        Type     Reason              Age                  From                         Message
        ----     ------              ----                 ----                         -------
        Warning  ProvisioningFailed  0s (x15 over 3m24s)  persistentvolume-controller  storageclass.storage.k8s.io "mysc" not found
      
      1. 删除PVC。
      2. 创建StorageClass,可参考动态卷供应典型场景StorageClass配置示例
      3. 创建新的PVC,可参考动态卷供应PVC参数说明
    • 如果由原因2导致PVC处于Pending状态,执行以下步骤。

      Events:
        Type     Reason                Age                From                                                                                       Message
        ----     ------                ----               ----                                                                                       -------
        Normal   Provisioning          63s (x3 over 64s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  External provisioner is provisioning volume for claim "default/mypvc"
        Warning  ProvisioningFailed    63s (x3 over 64s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  failed to provision volume with StorageClass "mysc": rpc error: code = Internal desc = failed to select pool, the capability filter failed, error: failed to select pool, the final filter field: replication, parameters map[allocType:thin replication:True size:1099511627776 volumeType:lun]. please check your storage class
      
      1. 删除PVC。
      2. 删除StorageClass。
      3. 根据Events信息修改StorageClass.yaml文件。
      4. 创建StorageClass,详细请参考动态卷供应典型场景StorageClass配置示例
      5. 创建新的PVC,详情请参考动态卷供应PVC参数说明
    • 如果由原因3导致PVC处于Pending状态,请联系华为工程师处理。

      Events:
        Type     Reason                Age                From                                                                                       Message
        ----     ------                ----               ----                                                                                       -------
        Normal   Provisioning          63s (x4 over 68s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  External provisioner is provisioning volume for claim "default/mypvc"
        Warning  ProvisioningFailed    62s (x4 over 68s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  failed to provision volume with StorageClass "mysc": rpc error: code = Internal desc = Create volume map[ALLOCTYPE:1 CAPACITY:20 DESCRIPTION:Created from Kubernetes CSI NAME:pvc-63ebfda5-4cf0-458e-83bd-ecc PARENTID:0] error: 50331651
      
    • 如果由原因4导致PVC处于Pending状态,执行以下步骤。

      Events:
        Type     Reason                Age                From                                                                                       Message
        ----     ------                ----               ----                                                                                       -------
        Normal   Provisioning          63s (x3 over 52s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  External provisioner is provisioning volume for claim "default/mypvc"
        Warning  ProvisioningFailed    63s (x3 over 52s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  failed to provision volume with StorageClass "mysc": rpc error: code = Internal desc = context deadline exceeded (Client.Timeout exceeded while awaiting headers)
      
      1. 请先等待10分钟, 参考本章节再次检查PVC详细信息
      2. 如果还处于Pending状态,请联系华为工程师处理。
    • 如果由原因5导致PVC处于Pending状态,请联系华为工程师处理。

10.3.2 - 删除PVC前,PVC的状态为Pending

现象描述

在执行删除PVC前,PVC的状态处于Pending。

根因分析

原因1:由于没有提前创建指定名称的StorageClass,导致Kubernetes在创建PVC时无法找到指定StorageClass名称。

原因2:由于存储池能力和StorageClass能力不匹配,导致huawei-csi选择存储池失败。

原因3:由于存储RESTful接口执行返回具体错误码(例如:50331651),导致huawei-csi在执行创建PVC时失败。

原因4:由于存储在huawei-csi设定的超时时间内没有返回,huawei-csi向Kubernetes返回超时错误。

原因5:其他原因。

解决措施或规避方法

删除Pending状态下的PVC,需要根据以下不同的原因采取不同的解决措施。

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查看PVC的详细信息。

    kubectl describe pvc mypvc
    
  3. 根据PVC详细信息中Events信息,执行相应操作。

    • 如果由原因1导致PVC处于Pending状态,可以执行 kubectl delete pvc mypvc 命令,删除PVC。

      Events:
        Type     Reason              Age                  From                         Message
        ----     ------              ----                 ----                         -------
        Warning  ProvisioningFailed  0s (x15 over 3m24s)  persistentvolume-controller  storageclass.storage.k8s.io "mysc" not found
      
    • 如果由原因2导致PVC处于Pending状态,可以执行 kubectl delete pvc mypvc 命令,删除PVC。

      Events:
        Type     Reason                Age                From                                                                                       Message
        ----     ------                ----               ----                                                                                       -------
        Normal   Provisioning          63s (x3 over 64s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  External provisioner is provisioning volume for claim "default/mypvc"
        Warning  ProvisioningFailed    63s (x3 over 64s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  failed to provision volume with StorageClass "mysc": rpc error: code = Internal desc = failed to select pool, the capability filter failed, error: failed to select pool, the final filter field: replication, parameters map[allocType:thin replication:True size:1099511627776 volumeType:lun]. please check your storage class
      
    • 如果由原因3导致PVC处于Pending状态,可以执行 kubectl delete pvc mypvc 命令,删除PVC。

      Events:
        Type     Reason                Age                From                                                                                       Message
        ----     ------                ----               ----                                                                                       -------
        Normal   Provisioning          63s (x4 over 68s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  External provisioner is provisioning volume for claim "default/mypvc"
        Warning  ProvisioningFailed    62s (x4 over 68s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  failed to provision volume with StorageClass "mysc": rpc error: code = Internal desc = Create volume map[ALLOCTYPE:1 CAPACITY:20 DESCRIPTION:Created from Kubernetes CSI NAME:pvc-63ebfda5-4cf0-458e-83bd-ecc PARENTID:0] error: 50331651
      
    • 如果由原因4导致PVC处于Pending状态,请联系华为工程师处理。

      Events:
        Type     Reason                Age                From                                                                                       Message
        ----     ------                ----               ----                                                                                       -------
        Normal   Provisioning          63s (x3 over 52s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  External provisioner is provisioning volume for claim "default/mypvc"
        Warning  ProvisioningFailed    63s (x3 over 52s)  csi.huawei.com_huawei-csi-controller-b59577886-qqzm8_58533e4a-884c-4c7f-92c3-6e8a7b327515  failed to provision volume with StorageClass "mysc": rpc error: code = Internal desc = context deadline exceeded (Client.Timeout exceeded while awaiting headers)
      
    • 如果由原因5导致PVC处于Pending状态,请联系华为工程师处理。

10.3.3 - 通用临时卷扩容失败

现象描述

在Kubernetes版本低于1.25环境中,对LUN类型的通用临时卷扩容失败,显示PV已经扩容,但PVC未成功更新容量。

根因分析

该问题是由Kubernetes的bug导致,Kubernetes在1.25版本中修复了该问题。

10.3.4 - PVC扩容的目标容量超过存储池容量导致扩容失败

现象描述

在低于1.23版本的Kubernetes环境中,对PVC进行扩容,当目标容量超过存储池容量时,扩容失败。

根因分析

Kubernetes社区已知问题,详情请参考处理扩充卷过程中的失败

解决措施或规避方法

参考处理扩充卷过程中的失败

10.4 - Pod相关问题

10.4.1 - 集群中worker节点宕机并恢复后,Pod完成failover,但是Pod所在源主机出现盘符残留

现象描述

worker节点 A上运行Pod, 并通过CSI挂载外置块设备到该Pod;异常掉电节点worker节点A; Kubernetes平台会在感知到节点故障后,将Pod切换至worker节点B;恢复worker节点A, 节点A上的盘符会从正常变为故障。

环境配置

Kubernetes版本:1.18及以上

存储类型:块存储

根因分析

worker节点A恢复后,Kubernetes会向存储发起解除映射操作,但是不会发起主机侧的移除盘符操作。在Kubernetes解除映射后,worker节点A上就会出现盘符残留。

解决措施或规避方法

目前的解决方法只能人工介入,手动清理掉主机的残留盘符(或者再次重启主机,利用主机重启过程中扫盘机制,清理掉残留盘符)。具体方法如下:

  1. 排查主机的残留盘符。

    1. 执行命令,判断是否存在多路径状态异常的DM多路径设备:

      multipath -ll
      

      命令结果示例如下。路径状态为failed faulty running表示异常,对应的DM多路径设备为dm-12,关联的SCSI磁盘为sdi和sdj,在配置多条路径时,会有多个SCSI磁盘。记录这些SCSI磁盘。

      mpathb (3618cf24100f8f457014a764c000001f6) dm-12 HUAWEI  ,XSG1            
      size=100G features='0' hwhandler='0' wp=rw
      `-+- policy='service-time 0' prio=-1 status=active
        |- 39:0:0:1        sdi 8:48  failed faulty running
        `- 38:0:0:1        sdj 8:64  failed faulty running
      
      • => 继续执行步骤1.2
      • => 不涉及。
    2. 执行以下命令,判断残留的DM多路径设备是否可读。

      dd if=/dev/dm-12 of=/dev/null count=1 bs=1M iflag=direct
      

      命令结果示例如下。如果返回结果为:Input/output error,且读取数据为“0 bytes (0 B) copied”,表示该设备不可读。其中,dm-xx步骤1.1查到的设备号。

      dd: error reading ‘/dev/dm-12’: Input/output error
      0+0 records in
      0+0 records out
      0 bytes (0 B) copied, 0.0236862 s, 0.0 kB/s
      
      • => 记录残留的dm-xx设备以及关联磁盘号(见步骤1.1),执行清理步骤
      • 命令卡死 => 继续执行步骤1.3
      • 其他 => 联系技术支持。
    3. 在另一窗口再次登录该节点。

      1. 执行以下命令,查看卡死的进程。

        ps -ef | grep dm-12 | grep -w dd
        

        命令结果示例如下。

        root     21725  9748  0 10:33 pts/10   00:00:00 dd if=/dev/dm-12 of=/dev/null count=1 bs=10M iflag=direct
        
      2. 将该pid杀死。

        kill -9 pid
        
      3. 记录残留的dm-xx设备以及关联磁盘号(见步骤1.1),执行清理步骤。

  2. 清理主机的残留盘符。

    1. 根据步骤1获取的DM多路径设备,执行命令,清理残留的多路径聚合设备信息。

      multipath -f /dev/dm-12
      

      如果执行报错,请联系技术支持。

    2. 清理残留的SCSI磁盘,根据步骤1获取的残留磁盘的盘符,依次执行命令:

      echo 1 > /sys/block/xxxx/device/delete
      

      配置多条多路径时,依次根据盘符清除,本次残留路径为sdi/sdj:

      echo 1 > /sys/block/sdi/device/delete
      echo 1 > /sys/block/sdj/device/delete
      

      如果执行报错,请联系技术支持。

    3. 确认DM多路径设备和SCSI磁盘信息是否已经清理干净。

      依次执行下列命令,查询的多路径和磁盘信息显示,残留的dm-12和SCSI磁盘sdi/sdj均已消失,则证明清理完成。

      1. 查看多路径信息。

        multipath -ll
        

        命令结果示例如下。残留的dm-12已消失。

        mpathb (3618cf24100f8f457014a764c000001f6) dm-3 HUAWEI  ,XSG1            
        size=100G features='0' hwhandler='0' wp=rw
        `-+- policy='service-time 0' prio=-1 status=active
          |- 39:0:0:1        sdd 8:48  active ready running
          `- 38:0:0:1        sde 8:64  active ready running
        mpathn (3618cf24100f8f457315a764c000001f6) dm-5 HUAWEI  ,XSG1            
        size=100G features='0' hwhandler='0' wp=rw
        `-+- policy='service-time 0' prio=-1 status=active
          |- 39:0:0:2        sdc 8:32  active ready running
          `- 38:0:0:2        sdb 8:16  active ready running
        
      2. 查看设备信息。

        ls -l /sys/block/
        

        命令结果示例如下。SCSI磁盘sdi/sdj均已消失。

        total 0
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 dm-0 -> ../devices/virtual/block/dm-0
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 dm-1 -> ../devices/virtual/block/dm-1
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 dm-2 -> ../devices/virtual/block/dm-2
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 dm-3 -> ../devices/virtual/block/dm-3
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 sdb -> ../devices/platform/host35/session2/target35:0:0/35:0:0:1/block/sdb
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 sdc -> ../devices/platform/host34/target34:65535:5692/34:65535:5692:0/block/sdc
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 sdd -> ../devices/platform/host39/session6/target39:0:0/39:0:0:1/block/sdd
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 sde -> ../devices/platform/host38/session5/target38:0:0/38:0:0:1/block/sde
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 sdh -> ../devices/platform/host39/session6/target39:0:0/39:0:0:3/block/sdh
        lrwxrwxrwx 1 root root 0 Aug 11 19:56 sdi -> ../devices/platform/host38/session5/target38:0:0/38:0:0:3/block/sdi
        
      3. 查看磁盘信息

        ls -l /dev/disk/by-id/
        

        命令结果示例如下。SCSI磁盘sdi/sdj均已消失。

        total 0
        lrwxrwxrwx 1 root root 10 Aug 11 19:57 dm-name-mpathb -> ../../dm-3
        lrwxrwxrwx 1 root root 10 Aug 11 19:58 dm-name-mpathn -> ../../dm-5
        lrwxrwxrwx 1 root root 10 Aug 11 19:57 dm-uuid-mpath-3618cf24100f8f457014a764c000001f6 -> ../../dm-3
        lrwxrwxrwx 1 root root 10 Aug 11 19:58 dm-uuid-mpath-3618cf24100f8f457315a764c000001f6 -> ../../dm-5
        lrwxrwxrwx 1 root root  9 Aug 11 19:57 scsi-3618cf24100f8f457014a764c000001f6 -> ../../sdd
        lrwxrwxrwx 1 root root  9 Aug 11 19:57 scsi-3618cf24100f8f45712345678000103e8 -> ../../sdi
        lrwxrwxrwx 1 root root  9 Aug  3 15:17 scsi-3648435a10058805278654321ffffffff -> ../../sdb
        lrwxrwxrwx 1 root root  9 Aug  2 14:49 scsi-368886030000020aff44cc0d060c987f1 -> ../../sdc
        lrwxrwxrwx 1 root root  9 Aug 11 19:57 wwn-0x618cf24100f8f457014a764c000001f6 -> ../../sdd
        lrwxrwxrwx 1 root root  9 Aug 11 19:57 wwn-0x618cf24100f8f45712345678000103e8 -> ../../sdi
        lrwxrwxrwx 1 root root  9 Aug  3 15:17 wwn-0x648435a10058805278654321ffffffff -> ../../sdb
        lrwxrwxrwx 1 root root  9 Aug  2 14:49 wwn-0x68886030000020aff44cc0d060c987f1 -> ../../sdc
        

10.4.2 - 创建Pod时,Pod的状态为ContainerCreating

现象描述

执行完成Pod的创建操作,一段时间后,Pod的状态仍然处于ContainerCreating,查看具体日志信息(详情请参考如何查看华为CSI日志),报错“Fibre Channel volume device not found”。

根因分析

该问题是因为在主机节点有磁盘残留,导致下次创建Pod时,查找磁盘失败。

解决措施或规避方法

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,查看Pod所在节点信息。

    kubectl get pod -o wide
    

    命令结果示例如下。

    NAME        READY   STATUS              RESTARTS   AGE     IP             NODE   NOMINATED NODE   READINESS GATES
    mypod       0/1     ContainerCreating   0          51s     10.244.1.224   node1  <none>           <none>
    
  3. 删除Pod。

  4. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的 node1 节点。node1 节点为2中查询的节点。

  5. 移除盘符残留,详情请参考解决措施或规避方法

10.4.3 - 创建Pod时,Pod的状态长时间处于ContainerCreating状态

现象描述

创建Pod时,Pod长时间处于ContainerCreating状态,此时查看huawei-csi-node的日志信息(详情请参考如何查看华为CSI日志),huawei-csi-node的日志中无创建Pod的日志记录,执行kubectl get volumeattachment命令后,PV列无该Pod使用的PV名称。在等待较长时间后(超过十分钟),Pod正常创建,Pod状态变为Running状态。

根因分析

该问题是因为Kubernetes的kube-controller-manager组件服务异常导致。

解决措施或规避方法

请联系容器平台侧工程师解决。

10.4.4 - 创建Pod失败,日志显示执行mount命令超时

现象描述

创建Pod时,Pod一直处于ContainerCreating状态,此时查看huawei-csi-node的日志信息(详情请参考如何查看华为CSI日志),日志显示执行mount命令超时。

根因分析

原因1:该问题可能由于配置的业务IP网络不通,导致mount命令执行超时失败。

原因2:对于部分操作系统,如Kylin V10 SP1和SP2,使用NFSv3从容器内执行mount命令耗时较长,导致mount命令超时并报错“error: exit status 255”,该问题可能由于容器运行时containerd的LimitNOFILE参数值过大(10亿+)。

原因3:可能由于网络问题导致挂载失败,CSI默认挂载超时时间为30秒,超过30秒仍挂载失败,日志会显示执行mount命令超时。

解决措施或规避方法

  1. 执行ping命令判断业务IP网络是否连通,如果无法ping通,则为原因1,请配置可用的业务IP地址,如果可以ping通,则执行2

  2. 进入任意可以执行mount命令的容器中,指定使用NFSv3执行mount命令。如果命令超时,则可能是原因2,继续执行systemctl status containerd.service命令查看配置文件路径,然后执行cat _/xxx/containerd.service_命令查看配置文件。文件中如果有LimitNOFILE=infinity或LimitNOFILE的值大小为10亿,请执行3。否则请联系华为工程师处理。

  3. 原因2可参考以下方式处理:

    • 尝试使用NFSv4.0及以上协议。
    • 参考社区修改方案,将LimitNOFILE参数值修改为合适的值。该方案将会重启容器运行时,请评估对业务的影响。
  4. 在挂载失败的宿主机手动挂载该文件系统,如果时间超过30秒,需要用户自行排查该宿主机到存储节点网络是否存在问题。mount命令示例如下

    • 执行以下命令创建测试目录。

      mkdir /tmp/test_mount
      
    • 执行mount命令,挂载文件系统,并观察耗时,其中ip:nfs_share_path可以从huawei-csi-node日志中获取,详情请参考如何查看华为CSI日志

      time mount ip:nfs_share_path /tmp/test_mount
      
    • 测试结束,执行以下命令解挂载文件系统

      umount /tmp/test_mount
      

10.4.5 - 创建Pod失败,日志显示执行mount命令失败

现象描述

NAS场景下,创建Pod时,Pod一直处于ContainerCreating状态,此时查看huawei-csi-node的日志信息(详情请参考如何查看华为CSI日志),日志显示执行mount命令失败。

根因分析

该问题可能由于存储侧未开启NFS 4.0/4.1/4.2协议,主机在使用NFS v4协议挂载失败后,未进行协商使用NFS v3协议挂载。

解决措施或规避方法

10.4.6 - 创建Pod失败,Events日志显示“publishInfo doesn't exist”

现象描述

创建Pod时,Pod一直处于ContainerCreating状态,查看Pod中有打印告警事件:rpc error: code = Internal desc = publishInfo doesn’t exist。

根因分析

按照CSI协议约定,工作负载要使用一个PV卷时,CO(Container Orchestration system,通过RPC请求与CSI插件通信)会调用CSI插件提供的CSI协议中的“ControllerPublishVolume”接口(huawei-csi-controller服务提供)完成PV卷的映射,然后调用CSI插件提供的“NodeStageVolume”接口(huawei-csi-node服务提供)完成PV卷的挂载。导致出现“publishInfo doesn’t exist”错误的原因是在一次完整的挂载时,仅huawei-csi-node服务收到了“NodeStageVolume”请求,而在此之前huawei-csi-controller服务未收到“ControllerPublishVolume”请求,导致huawei-csi-controller服务未完成PV卷的映射,没有把映射信息传递给huawei-csi-node服务。

解决措施

解决该问题,需要触发Kubernetes调用“ControllerPublishVolume”接口。

如果集群中所有旧版本创建的工作负载均触发了该操作,则后续将不会出现该问题。

操作步骤

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,获取工作负载所在节点信息。

    kubectl get pod error-pod -n error-pod-in-namespace -owide
    

    命令结果示例如下。

    NAME      READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
    pod-nfs   0/1     ContainerCreating   0          3s    <none>   node-1      <none>           <none>
    
  3. 将该工作负载漂移至其他节点。

  4. 若在集群内无法完成漂移,可在原节点完成工作负载重建,即进行删除-新建操作。

  5. 观察该工作负载是否成功拉起,如果拉起失败请联系华为工程师。

集群工作负载排查

Kubernetes调用CSI插件完成卷映射时,将使用VolumeAttachment资源保存映射信息,用于表示将指定的卷从指定的节点上附加或分离。由于该问题是由于publishInfo不存在导致,因此可通过查看VolumeAttachment资源信息排查集群中其他工作负载是否存在该问题。具体步骤如下:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行以下命令,获取VolumeAttachment信息,并保留ATTACHER字段为csi.huawei.com的资源,其中csi.huawei.com为华为CSI驱动名称,可在values.yaml文件中配置,配置项为csiDriver.driverName,配置项详情描述参考表 csiDriver配置项说明

    kubectl get volumeattachments.storage.k8s.io 
    

    命令结果示例如下。

    NAME          ATTACHER         PV       NODE     ATTACHED   AGE
    csi-47abxx   csi.huawei.com   pvc-1xx   node-1   true       12h
    
  3. 执行以下命令查看VolumeAttachment资源详情,其中csi-47abxx为2中查询到的资源名称。

    kubectl get volumeattachments.storage.k8s.io csi-47abxx -o yaml
    

    命令结果示例如下。

    kind: VolumeAttachment
    metadata:
      annotations:
        csi.alpha.kubernetes.io/node-id: '{"HostName":"node-1"}'
       finalizers:
      - external-attacher/csi-huawei-com
      name: csi-47abxxx
      uid: 0c87fa8a-c3d6-4623-acb8-71d6206d030d
    spec:
      attacher: csi.huawei.com
      nodeName: debian-node
      source:
        persistentVolumeName: pvc-1xx
    status:
      attached: true
      attachmentMetadata:
         publishInfo: '{<PUBLISH-INFO>}'
    
  4. 3中查询到的资源中存在status.attachmentMetadata.publishInfo,则证明node-1节点上使用pvc-1xx创建的若干工作负载不会存在本FAQ描述的错误,其中node-1和pvc-1xx为2中查询结果。若status.attachmentMetadata.publishInfo不存在,请参考解决措施章节解决。

  5. 存在多个VolumeAttachment资源时,重复执行3~4

10.4.7 - 创建Pod失败或重启kubelet后,日志显示挂载点已存在

现象描述

创建Pod时,Pod一直处于ContainerCreating状态,或者重启kubelet后,日志中显示挂载点已存在。此时查看huawei-csi-node的日志信息(详情请参考如何查看华为CSI日志),日志提示错误为:The mount /var/lib/kubelet/pods/xxx/mount is already exist, but the source path is not /var/lib/kubelet/plugins/kubernetes.io/xxx/globalmount

根因分析

该问题的根因是Kubernetes进行重复挂载操作。

解决措施或规避方法

执行以下命令,将已存在的路径解除挂载,其中“/var/lib/kubelet/pods/xxx/mount”为日志中提示的已存在的挂载路径。

umount /var/lib/kubelet/pods/xxx/mount

10.4.8 - Pod挂载卷目录提示I/O error

现象描述

Pod对所挂载卷进行读写时,提示I/O error。

根因分析

使用SCSI等协议时,如果Pod持续往挂载目录写入数据时,存储发生重启,导致主机上设备到存储的链路中断,触发I/O error。存储恢复时,挂载目录仍然为只读。

解决措施

重新挂载该卷,即通过重建Pod可以触发重新挂载。

10.4.9 - Kubernetes平台第一次搭建时, iscsi tcp服务没有正常启动,导致创建Pod失败

现象描述

创建Pod时报错,在/var/log/huawei-csi-node日志中报错“ Cannot connect ISCSI portal *.*.*.*: libkmod: kmod_module_insert_module: could not find module by name=‘iscsi_tcp’。

根因分析

搭建Kubernete和安装iSCSI服务后, iscsi_tcp服务可能会被停掉,可通过执行以下命令查看服务是否被停掉。

lsmod | grep iscsi | grep iscsi_tcp

命令结果示例如下。

iscsi_tcp              18333  6 
libiscsi_tcp           25146  1 iscsi_tcp
libiscsi               57233  2 libiscsi_tcp,iscsi_tcp
scsi_transport_iscsi    99909  3 iscsi_tcp,libiscsi

解决措施或规避方法

执行以下命令,手动加载iscsi_tcp服务。

modprobe iscsi_tcp
lsmod | grep iscsi | grep iscsi_tcp

10.5 - 对接Tanzu Kubernetes集群常见问题及解决方法

本章节用于说明对接Tanzu Kubernetes集群时常见问题及解决办法,目前对接Tanzu Kubernetes集群时主要有以下三个问题:

  • 未创建PSP权限导致Pod无法创建
  • 主机挂载点与原生Kubernetes不同导致挂载卷失败
  • livenessprobe容器端口与Tanzu vSphere端口冲突导致容器不断重启

10.5.1 - 未创建PSP权限导致Pod无法创建

现象描述

创建huawei-csi-controller和huawei-csi-node时,仅Deployment和DaemonSet资源创建成功,controller和node的Pod未创建。

根因分析

创建资源使用的service account没有PSP策略的“use”权限。

解决措施或规避方法

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行vi psp-use.yaml 命令, 创建psp-use.yaml文件。

    vi psp-use.yaml
    
  3. 配置psp-use.yaml文件。

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: huawei-csi-psp-role
    rules:
    - apiGroups: ['policy']
      resources: ['podsecuritypolicies']
      verbs: ['use']
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: huawei-csi-psp-role-cfg
    roleRef:
      kind: ClusterRole
      name: huawei-csi-psp-role
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: Group
      apiGroup: rbac.authorization.k8s.io
      name: system:serviceaccounts:huawei-csi
    - kind: Group
      apiGroup: rbac.authorization.k8s.io
      name: system:serviceaccounts:default
    
  4. 执行以下命令,创建PSP权限。

    kubectl create -f psp-use.yaml
    

10.5.2 - 修改主机挂载点

现象描述

创建Pod时失败,华为CSI日志中报错“mount point does not exist”。

根因分析

huawei-csi-node中的“pods-dir”目录原生Kubernetes集群与Tanzu Kubernetes集群不一致。

解决措施或规避方法

  1. 进入helm/esdk/目录,执行vi values.yaml命令打开配置文件。

    vi values.yaml
    
  2. 将kubeletConfigDir参数修改为kubelet实际的安装目录。

    # Specify kubelet config dir path.
    # kubernetes and openshift is usually /var/lib/kubelet
    # Tanzu is usually /var/vcap/data/kubelet
    kubeletConfigDir: /var/vcap/data/kubelet
    

10.5.3 - 修改livenessprobe容器的默认端口

现象描述

huawei-csi-controller组件中livenessprobe容器一直重启。

根因分析

huawei-csi-controller的livenessprobe容器的默认端口(9808)与已有的Tanzu的vSphere CSI端口冲突。

解决措施或规避方法

将livenessprobe容器的默认端口修改为未占用端口。

  1. 进入“helm/esdk”目录,执行vi values.yaml命令打开配置文件。

    vi values.yaml
    
  2. 将controller.livenessProbePort默认值9808修改为其他未占用端口,例如改为9809。

    controller:
      livenessProbePort: 9809
    
  3. 使用Helm更新华为CSI,具体信息请参考升级华为CSI

10.5.4 - 创建临时卷失败

现象描述

创建通用临时卷失败,报错PodSecurityPolicy: unable to admit pod: [spec.volumes[0]: Invalid value: “ephemeral”: ephemeral volumes are not allowed to be used spec.volumes[0]

根因分析

当前使用的PSP策略中没有使用“ephemeral”卷的权限。

解决措施或规避方法

在默认PSP “pks-privileged"和"pks-restricted"中增加使用“ephemeral”卷的权限,以修改"pks-privileged"举例:

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。

  2. 执行命令, 修改pks-privileged的配置。

    kubectl edit psp pks-privileged
    
  3. 在spec.volumes中增加“ephemeral”,示例如下:

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: policy/v1beta1
    kind: PodSecurityPolicy
    metadata:
      annotations:
        apparmor.security.beta.kubernetes.io/allowedProfileName: '*'
        seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
      creationTimestamp: "2022-10-11T08:07:00Z"
      name: pks-privileged
      resourceVersion: "1227763"
      uid: 2f39c44a-2ce7-49fd-87ca-2c5dc3bfc0c6
    spec:
      allowPrivilegeEscalation: true
      allowedCapabilities:
      - '*'
      supplementalGroups:
        rule: RunAsAny
      volumes:
      - glusterfs
      - hostPath
      - iscsi
      - nfs
      - persistentVolumeClaim
      - ephemeral
    
  4. 执行命令,确认是否添加成功。

    kubectl get psp pks-privileged -o yaml
    

11 - 附录

11.1 - OceanStor V5系列和OceanStor Dorado V3系列ALUA特性配置策略样例

例1.配置文件如下:

parameters:
  ALUA:
    "*":
      MULTIPATHTYPE: 1
      FAILOVERMODE: 3
      SPECIALMODETYPE: 0
      PATHTYPE: 0
    node1:
      MULTIPATHTYPE: 1
      FAILOVERMODE: 3
      SPECIALMODETYPE: 0
      PATHTYPE: 1

对于主机名为“node1”,上述ALUA配置段都能用于配置启动器。根据配置华为企业存储后端的ALUA参数中的配置策略规则,优先级顺序为第2条配置段(HostName为"node1")高于第1条配置段(HostName为"*")。

例2.配置文件如下:

parameters:
  ALUA:
    node[0-9]:
      MULTIPATHTYPE: 1
      FAILOVERMODE: 3
      SPECIALMODETYPE: 0
      PATHTYPE: 0
    node[5-7]:
      MULTIPATHTYPE: 1
      FAILOVERMODE: 3
      SPECIALMODETYPE: 0
      PATHTYPE: 1

对于主机名为“node6”的主机,上述ALUA配置段都能用于配置启动器。根据配置华为企业存储后端的ALUA参数中的配置策略规则,选择第一条ALUA配置段来配置启动器。

例3.配置文件如下:

parameters:
  ALUA:
   node$:
      MULTIPATHTYPE: 1
      FAILOVERMODE: 3
      SPECIALMODETYPE: 0
      PATHTYPE: 0
   node10$:
      MULTIPATHTYPE: 1
      FAILOVERMODE: 3
      SPECIALMODETYPE: 0
      PATHTYPE: 1

根据配置华为企业存储后端的ALUA参数中的配置策略规则,对于主机名为“node1”的主机,选择第一条ALUA配置段来配置启动器;对于主机名为“node10”的主机,选择第二条ALUA配置段来配置启动器。^表示匹配字符串的开头,$表示匹配字符串的结尾。

11.2 - OceanStor Dorado ALUA特性配置策略样例

例1.配置文件如下:

parameters:
  ALUA:
    "*":
     accessMode: 1
     hyperMetroPathOptimized: 1
   node1:
      accessMode: 1
      hyperMetroPathOptimized: 0

对于主机名为“node1”,上述ALUA配置段都能用于配置启动器。根据配置华为企业存储后端的ALUA参数中的配置策略规则,优先级顺序为第2条配置段(HostName为"node1")高于第1条配置段(HostName为"*")。

例2.配置文件如下:

parameters:
  ALUA:
   node[0-9]:
     accessMode: 1
     hyperMetroPathOptimized: 1
   node[5-7]:
     accessMode: 1
     hyperMetroPathOptimized: 0

对于主机名为“node6”的主机,上述ALUA配置段都能用于配置启动器。根据配置华为企业存储后端的ALUA参数中的配置策略规则,选择第一条ALUA配置段来配置启动器。

例3.配置文件如下:

parameters:
  node1$:
    node[0-9]:
    accessMode: 1
    hyperMetroPathOptimized: 1
  node10$:
    accessMode: 1
    hyperMetroPathOptimized: 0

根据配置华为企业存储后端的ALUA参数中的配置策略规则,对于主机名为“node1”的主机,选择第一条ALUA配置段来配置启动器;对于主机名为“node10”的主机,选择第二条ALUA配置段来配置启动器。^表示匹配字符串的开头,$表示匹配字符串的结尾。

11.3 - 分布式存储ALUA特性配置策略样例

例1.配置文件如下:

parameters:
  ALUA:
    "*":
      switchoverMode: Enable_alua
      pathType: optimal_path
    node1:
      switchoverMode: Enable_alua
      pathType: non_optimal_path

对于主机名为“node1”,上述ALUA配置段都能用于配置启动器。根据配置分布式存储后端的ALUA参数中的配置策略规则,优先级顺序为第2条配置段(HostName为"node1")高于第1条配置段(HostName为"*")。

例2.配置文件如下:

parameters:
  ALUA:
    node[0-9]:
      switchoverMode: Enable_alua
      pathType: optimal_path
    node[5-7]:
      switchoverMode: Enable_alua
      pathType: non_optimal_path

对于主机名为“node6”的主机,上述ALUA配置段都能用于配置启动器。根据配置分布式存储后端的ALUA参数中的配置策略规则,选择第一条ALUA配置段来配置启动器。

例3.配置文件如下:

parameters:
  ALUA:
    node1$:
      switchoverMode: Enable_alua
      pathType: optimal_path
    node10$:
      switchoverMode: Enable_alua
      pathType: non_optimal_path

根据配置分布式存储后端的ALUA参数中的配置策略规则,对于主机名为“node1”的主机,选择第一条ALUA配置段来配置启动器;对于主机名为“node10”的主机,选择第二条ALUA配置段来配置启动器。^表示匹配字符串的开头,$表示匹配字符串的结尾。

11.4 - 通信矩阵

源设备

源IP

源端口

目的设备

目的IP

目的端口 (监听)

协议

端口说明

监听端口是否可更改

认证方式

加密方式

所属平面

特殊场景

CSI controller所在主机

源设备IP

1024~65536

存储设备

存储阵列管理IP

8088

TCP

用于卷创建/管理/删除等一系列动作

用户名/密码

TLS 1.3/TLS 1.2

OM

CSI controller所在主机

源设备IP

1024~65536

CSI controller所在主机

目的设备IP

9808

TCP

用于k8s对CSI controller的健康检查

证书认证

TLS 1.3/TLS 1.2

运维面

CSI node所在主机

源设备IP

1024~65536

CSI node所在主机

目的设备IP

9800

TCP

用于k8s对CSI node的健康检查

证书认证

TLS 1.3/TLS 1.2

运维面

k8s master节点

源设备IP

1024~65536

CSI controller所在主机

目的设备IP

4433

TCP

用于调用webhook校验

证书认证

TLS 1.3/TLS 1.2

运维面

11.5 - 配置自定义权限

自定义角色配置

针对不同的存储资源,请参考以下配置:

可参考存储文档:《OceanStor Dorado 6000, Dorado 18000系列 产品文档》配置自定义角色权限。

表 1 NAS相关资源最小权限说明

权限对象

父级对象

读写权限

功能说明

workload_type

file_storage_service

只读

查询应用类型

file_system

file_storage_service

读写

管理文件系统

fs_snapshot

file_storage_service

读写

管理文件系统快照

quota

file_storage_service

读写

管理文件系统配额

nfs_service

file_storage_service

只读

查询NFS服务

share

file_storage_service

读写

管理NFS共享

dtree

file_storage_service

读写

管理dtree

hyper_metro_pair

hyper_metro

读写

创建文件系统双活Pair

hyper_metro_domain

hyper_metro

只读

查询文件系统双活域信息

remote_device

local_data_protection

只读

查询远端设备信息

storage_pool

pool

只读

查询存储池信息

smart_qos

resource_performance_tuning

读写

管理SmartQoS策略

system

system

只读

查询存储设备信息(仅所属组为系统组时需要配置)

vstore

vstore

只读

查询租户信息

port

network

只读

查询逻辑端口信息

表 2 SAN相关资源最小权限说明

权限对象

父级对象

读写权限

功能说明

remote_device

local_data_protection

只读

查询远端设备信息

hyper_clone

local_data_protection

读写

管理Clone Pair

lun_snapshot

local_data_protection

读写

管理LUN快照

workload_type

lun

只读

查询应用类型

lun

lun

读写

管理LUN

host

mapping_view

读写

管理主机

host_group

mapping_view

读写

管理主机组

initiator

mapping_view

读写

管理启动器

lun_group

mapping_view

读写

管理LUN组

mapping_view

mapping_view

读写

管理映射视图

target

mapping_view

只读

查询iSCSI启动器

port

network

只读

查询逻辑端口

storage_pool

pool

只读

查询存储池信息

smart_qos

resource_performance_tuning

读写

管理SmartQoS策略

system

system

只读

查询存储设备信息(仅所属组为系统组时需要配置)

vstore

vstore

只读

查询租户信息

11.6 - 华为CSI资源管理

本章节列举了华为CSI插件中每个容器所使用的资源请求和限制。其中单位说明请参考Kubernetes 中的资源单位

表 1 容器资源请求和限制

Pod 名称

容器名称

CPU 请求

CPU 限制

Memory 请求

Memory 限制

huawei-csi-controller

huawei-csi-driver

50m

500m

128Mi

1Gi

storage-backend-sidecar

50m

300m

128Mi

512Mi

storage-backend-controller

50m

300m

128Mi

512Mi

huawei-csi-extender

50m

300m

128Mi

512Mi

csi-attacher

50m

300m

128Mi

512Mi

csi-provisioner

50m

300m

128Mi

512Mi

csi-resize

50m

300m

128Mi

512Mi

csi-snapshotter

50m

300m

128Mi

512Mi

snapshot-controller

50m

300m

128Mi

512Mi

liveness-probe

10m

100m

128Mi

128Mi

huawei-csi-node

huawei-csi-driver

50m

500m

128Mi

1Gi

csi-node-driver-registrar

50m

300m

128Mi

128Mi

liveness-probe

10m

100m

128Mi

128Mi

修改资源请求和限制

如果需要修改容器的资源请求和限制,以Helm安装华为CSI为例,可参考以下步骤

  1. 使用Helm安装时进入/helm/esdk/templates 目录。手动部署时需要修改的文件在/manual/esdk/deploy目录,其中组件包路径请参考表 软件包组件描述

  2. 修改部署模板文件。

    • Pod名称为huawei-csi-controller时,修改huawei-csi-controller.yaml文件。
    • Pod名称为huawei-csi-node时,修改huawei-csi-node.yaml文件。

    Pod名称的分类,请参考表 容器资源请求和限制

    以修改Pod名称为huawei-csi-node中huawei-csi-driver容器的资源请求为例,执行命令编辑配置文件,找到spec.template.spec.containes.name为huawei-csi-driver的容器。按需修改资源请求和限制。

    vi huawei-csi-node.yaml
    

    编辑如下内容。

    containers
     - name: huawei-csi-driver
       ...
       resources:
         limits:
           cpu: 500m
           memory: 1Gi
         requests:
           cpu: 50m
           memory: 128Mi
    
  3. 若华为CSI未安装,则参考Kubernetes、OpenShift、Tanzu安装华为CSI章节安装华为CSI后,资源请求和限制的修改生效。

  4. 若已安装华为CSI,则参考升级华为CSI章节更新华为CSI后,资源请求和限制的修改生效。