您可以通过以下链接,获取PDF版用户指南:
PDF下载华为容器存储套件
- 1: 前言
- 2: 概述
- 3: 快速开始
- 4: 兼容性和特性
- 4.1: Kubernetes及操作系统兼容性
- 4.2: Kubernetes特性矩阵
- 4.3: 华为企业存储兼容性
- 4.4: 华为分布式存储兼容性
- 5: 安装部署
- 5.1: 安装前准备
- 5.1.1: 下载华为CSI软件包
- 5.1.2: 上传华为CSI镜像
- 5.1.3: 检查华为存储上的用户配置
- 5.1.4: 检查卷快照依赖组件
- 5.1.5: 检查主机多路径配置
- 5.1.6: 检查主机依赖软件状态
- 5.1.7: 检查CSI依赖的镜像
- 5.2: 安装华为CSI
- 5.2.1: 使用Helm安装华为CSI
- 5.2.1.1: Kubernetes、OpenShift、Tanzu安装华为CSI
- 5.2.1.2: CCE和CCE Agile平台安装华为CSI
- 5.2.1.3: Helm values.yaml参数说明
- 5.2.2: 手动安装华为CSI
- 5.3: 卸载华为CSI
- 5.3.1: Helm卸载华为CSI
- 5.3.1.1: Kubernetes、OpenShift、Tanzu卸载华为CSI
- 5.3.1.2: CCE和CCE Agile卸载华为CSI
- 5.3.1.3: 卸载CSI依赖组件服务
- 5.3.2: 手动卸载华为CSI
- 5.4: 升级/回退华为CSI
- 5.4.1: 使用Helm升级/回退华为CSI
- 5.4.1.1: 升级华为CSI
- 5.4.1.1.1: 从2.x或3.x升级至4.x版本
- 5.4.1.1.2: Kubernetes、OpenShift、Tanzu升级华为CSI
- 5.4.1.1.3: CCE和CCE Agile升级华为CSI
- 5.4.1.2: 回退华为CSI
- 5.4.1.2.1: Kubernetes、OpenShift、Tanzu回退华为CSI
- 5.4.1.2.2: CCE和CCE Agile回退华为CSI
- 5.4.2: 手动升级/回退
- 6: 存储后端管理
- 6.1: 管理存储后端
- 6.1.1: 创建存储后端
- 6.1.1.1: 典型场景存储后端配置文件示例
- 6.1.1.2: 存储后端配置项说明
- 6.1.2: 查询存储后端
- 6.1.3: 更新存储后端
- 6.1.3.1: oceanctl更新存储后端密码
- 6.1.3.2: 手动更新存储后端
- 6.1.4: 删除存储后端
- 6.2: 新增证书到存储后端(可选)
- 6.3: oceanctl命令说明
- 7: 使用华为CSI
- 7.1: PVC管理
- 7.1.1: 创建PVC
- 7.1.1.1: 动态卷供应
- 7.1.1.1.1: 动态卷供应典型场景StorageClass配置示例
- 7.1.1.1.2: 动态卷供应StorageClass参数说明
- 7.1.1.1.3: 动态卷供应PVC参数说明
- 7.1.1.2: 纳管卷供应
- 7.1.1.2.1: 纳管卷供应典型场景StorageClass配置示例
- 7.1.1.2.2: 纳管卷供应StorageClass参数说明
- 7.1.1.2.3: 纳管卷供应PVC参数说明
- 7.1.1.3: 静态卷供应
- 7.1.1.3.1: 静态卷供应PV参数说明
- 7.1.1.3.2: 静态卷供应PVC参数说明
- 7.1.2: 扩容PVC
- 7.1.3: 克隆PVC
- 7.1.4: 从快照创建PVC
- 7.2: 创建VolumeSnapshot
- 7.2.1: 检查卷快照依赖组件信息
- 7.2.2: 配置VolumeSnapshotClass
- 7.2.3: 配置VolumeSnapshot
- 8: 高级特性
- 8.1: 配置ALUA特性
- 8.1.1: 通过Helm配置ALUA特性
- 8.1.1.1: 配置华为企业存储后端的ALUA参数
- 8.1.1.2: 配置分布式存储后端的ALUA参数
- 8.2: 配置存储拓扑感知
- 8.2.1: 通过Helm配置存储拓扑感知
- 8.3: PVC变更
- 8.3.1: 开启PVC变更特性
- 8.3.1.1: 使用Helm开启PVC变更特性
- 8.3.1.2: 手动方式开启PVC变更特性
- 8.3.2: 配置PVC变更
- 9: 常用操作
- 9.1: 安装Helm 3
- 9.2: 信息收集
- 9.2.1: 如何获取CSI版本信息
- 9.2.2: 如何查看华为CSI日志
- 9.2.3: 日志收集
- 9.3: 下载容器镜像
- 9.4: 更新huawei-csi-controller或huawei-csi-node服务
- 9.5: 修改日志输出模式
- 9.6: 开启ReadWriteOncePod功能门
- 9.7: 配置非root用户访问Kubernetes集群
- 10: 故障处理
- 10.1: 华为CSI服务相关问题
- 10.1.1: 启动huawei-csi-node失败,提示错误为:“/var/lib/iscsi is not a directory”
- 10.1.2: 启动华为CSI服务失败,提示错误:“/etc/localtime is not a file”
- 10.1.3: 启动huawei-csi服务时,服务启动异常, 状态显示InvalidImageName
- 10.2: 存储后端相关问题
- 10.2.1: 使用oceanctl工具管理后端时调用webhook失败
- 10.2.2: 使用oceanctl工具创建后端失败,报错:context deadline exceeded
- 10.2.3: 存储侧更新密码后账户被锁定
- 10.3: PVC相关问题
- 10.3.1: 创建PVC时, PVC的状态为Pending
- 10.3.2: 删除PVC前,PVC的状态为Pending
- 10.3.3: 通用临时卷扩容失败
- 10.3.4: PVC扩容的目标容量超过存储池容量导致扩容失败
- 10.4: Pod相关问题
- 10.4.1: 集群中worker节点宕机并恢复后,Pod完成failover,但是Pod所在源主机出现盘符残留
- 10.4.2: 创建Pod时,Pod的状态为ContainerCreating
- 10.4.3: 创建Pod时,Pod的状态长时间处于ContainerCreating状态
- 10.4.4: 创建Pod失败,日志显示执行mount命令超时
- 10.4.5: 创建Pod失败,日志显示执行mount命令失败
- 10.4.6: 创建Pod失败,Events日志显示“publishInfo doesn't exist”
- 10.4.7: 创建Pod失败或重启kubelet后,日志显示挂载点已存在
- 10.4.8: Pod挂载卷目录提示I/O error
- 10.4.9: Kubernetes平台第一次搭建时, iscsi tcp服务没有正常启动,导致创建Pod失败
- 10.5: 对接Tanzu Kubernetes集群常见问题及解决方法
- 10.5.1: 未创建PSP权限导致Pod无法创建
- 10.5.2: 修改主机挂载点
- 10.5.3: 修改livenessprobe容器的默认端口
- 10.5.4: 创建临时卷失败
- 11: 附录
- 11.1: OceanStor V5系列和OceanStor Dorado V3系列ALUA特性配置策略样例
- 11.2: OceanStor Dorado ALUA特性配置策略样例
- 11.3: 分布式存储ALUA特性配置策略样例
- 11.4: 通信矩阵
- 11.5: 配置自定义权限
- 11.6: 华为CSI资源管理
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以及华为存储的整体结构如下图所示:
华为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的部署模型如下所示:
本文档主要介绍华为CSI V4.5.0插件的安装部署和使用。
3 - 快速开始
本章节说明如何快速上手安装并使用华为CSI管理PVC。
华为CSI使用流程概览
兼容性和特性
使用前请先了解对接的华为存储、容器平台和主机操作系统相关的兼容性以及支持的特性。
安装前准备
安装华为CSI前,需要对容器平台、主机等环境做相关配置准备。
安装部署
华为CSI提供了Helm和手动安装两种安装方式,并适用于包含Kubernetes、OpenShift等不同的容器平台。
创建存储后端
在使用华为CSI前,需要先创建存储后端资源。
使用华为CSI
现在,您可以开始使用华为CSI进行PVC管理了。
4 - 兼容性和特性
本章节会详细说明华为CSI插件支持的容器管理平台、操作系统、多路径软件以及CSI插件配合华为存储所提供的特性和功能。
4.1 - Kubernetes及操作系统兼容性
华为CSI插件支持如下容器管理平台:
表 1 支持的容器管理平台
- 华为CSI对接Tanzu Kubernetes仅支持集中式存储NAS场景,相关FAQ请参见对接Tanzu Kubernetes集群常见问题及解决方法。
- 华为CSI对接CCE/CCE Agile仅支持集中式存储。
华为CSI插件支持的操作系统以及多路径信息如下表所示。
表 2 支持的主机操作系统及多路径软件版本
注释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版本与支持的特性
- 注释1 Manage Provisioning是华为CSI自定义的纳管卷特性,该特性支持将已有存储资源纳管至Kubernetes。不允许将一个存储资源纳管多次和针对同一个存储资源进行并发删除/创建操作。当同一个存储资源被多个集群纳管时,在单个集群中针对该纳管卷的操作仅在当前集群内生效,不会同步到其他集群中,需要使用者自行在其他集群中对该纳管卷进行数据同步操作。
- 注释2 Modify Volume是华为CSI自定义的PVC变更特性,该特性支持将普通卷变更为双活卷,使用该特性需要对接存储支持卷双活特性。
4.3 - 华为企业存储兼容性
华为CSI插件兼容华为OceanStor系列的全闪存存储和混合闪存存储,具体支持的存储版本如下表所示:
表 1 支持的华为企业存储
华为CSI插件针对华为企业存储支持如下特性。
表 2 华为企业存储支持的特性及约束
SAN:支持使用Dynamic Provisioning,Manage Provisioning方式创建的非双活卷 NAS:仅6.1.5及其之后版本支持使用Dynamic Provisioning,Manage Provisioning方式创建的卷 | ||||
- 注释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支持的特性
表 4 Dtree支持的华为存储版本
4.4 - 华为分布式存储兼容性
华为CSI插件兼容华为OceanStor系列的分布式存储系统,具体支持的存储版本如下表所示:
表 1 支持的华为分布式存储
华为CSI插件针对华为分布式存储支持如下特性。
表 2 华为分布式存储支持的特性及约束
- 注释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软件包
本章节详细说明了下载方法以及软件包组件结构。
打开浏览器,访问仓库地址:https://github.com/Huawei/eSDK_K8S_Plugin/releases。
根据CPU架构,下载对应的4.5.0版本软件包。
软件包命名规范:插件名称(eSDK_Huawei_Storage_Kubernetes_CSI_Plugin)+版本号+CPU架构
将下载的软件包解压。软件包组件结构如下表所示。
表 1 软件包组件描述
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主机,且该主机支持访问镜像仓库。
操作步骤
执行docker load -i huawei-csi-v4.5.0-arch.tar命令,将CSI镜像导入当前节点。
docker load -i huawei-csi-v4.5.0-arch.tar
执行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
执行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或其他容器引擎。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录需要导入镜像的节点。
将Kubernetes CSI组件包中的"image"目录拷贝到当前节点的任意目录下。
执行cd image命令,进入到image的工作目录。工具路径请参见表 软件包组件描述。
执行命令依次将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 Dorado 6.1.0, 6.1.2, 6.1.3, 6.1.5, 6.1.6, 6.1.7, 6.1.8 | ||||
- 注释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安装文件。
执行以下命令查看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
进入/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的资料和软件包。软件包版本请参考表 软件包组件描述。
操作步骤
如果您使用iSCSI/FC协议对接华为企业存储,请参考OceanStor Dorado & OceanStor在Red Hat下的主机连通性指南,对主机多路径进行配置和检查。
如果您使用NVMe over RoCE/NVMe over FC协议对接华为企业存储,请参考OceanStor Dorado & OceanStor在Red Hat下的主机连通性指南,对主机多路径进行配置和检查。
如果您使用iSCSI协议对接华为分布式存储,请参考 《FusionStorage 8.0.1 块存储基础业务配置指南》中的“应用服务器配置多路径”章节,对主机多路径进行配置和检查。
如果您使用了操作系统原生多路径时,需要检查/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依赖的镜像
集群若未连接互联网,需要手动下载容器镜像并上传到集群中,具体操作请参考下载容器镜像。
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的获取、安装请参考:https://helm.sh/docs/intro/install/
- Helm与Kubernetes版本对应关系请参考:https://helm.sh/docs/topics/version_skew/
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
安装步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录集群的任意master节点。
将Kubernetes CSI组件包中的"helm"目录拷贝到master节点的任意目录下。Helm工具路径请参见表 软件包组件描述。
进入到helm/esdk的工作目录下。
cd helm/esdk
准备values.yaml文件,华为CSI已经在软件包的helm/esdk目录下提供了values.yaml模板文件,您也可以根据Helm values.yaml参数说明修改参数对华为CSI进行定制。
安装前配置:
- 若容器平台为Kubernetes,可跳过该步骤。
- 若容器平台为Openshift,请根据OpenShift平台安装配置进行配置。
- 若容器平台为Tanzu,请根据Tanzu平台安装配置进行配置。
执行命令,更新存储后端CRD
kubectl apply -f ./crds/backend/
(可选) 请务必按照检查卷快照依赖组件章节检查快照依赖组件,确认无误后执行执行命令更新快照CRD,如果controller.snapshot.enabled参数设置为false或Kubernetes版本低于v1.17,可跳过本步骤,详情请参考表 controller配置项说明。
kubectl apply -f ./crds/snapshot-crds/ --validate=false
执行如下命令安装华为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
完成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资源。
执行命令,编辑helm_scc.yaml文件。
vi helm_scc.yaml
修改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
执行命令,创建SecurityContextConstraints。
oc create -f helm_scc.yaml
Tanzu平台安装配置
Tanzu平台请执行以下命令配置kubelet安装目录。
进入到安装包的helm/esdk目录下,执行命令打开配置文件,修改后保存。安装包目录请参见表 软件包组件描述。
vi values.yaml
修改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权限
执行命令, 创建rbac.yaml文件。
vi rbac.yaml
粘贴如下内容至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
执行命令,创建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安装包后上传至平台模板市场进行安装。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录已部署Helm的任意节点。
将华为CSI组件包中的"helm"目录拷贝到节点的任意目录下。Helm工具路径请参见表 软件包组件描述。
进入到helm的工作目录下。
cd helm/
修改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
执行命令制作Helm安装包,该命令会将安装包生成到当前路径下。
helm package ./esdk/ -d ./
安装华为CSI
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录已部署CCE Agile平台master的任意节点。
执行命令创建部署华为CSI的命名空间,huawei-csi为自定义的命名空间。
kubectl create namespace huawei-csi
导出Helm安装包,具体请参考制作Helm安装包。
在主页单击“模板市场> 我的模板>上传模板”,进入上传模板对话框。将导出的Helm安装包导入CCE Agile平台。
安装包上传完毕,在主页单击“模板市场>我的模板”,进入我的模板页面,单击“安装>提交”。其中模板实例名称可自定义填写。
在主页单击“模板市场>模板实例”,选择安装时指定的项目(例如样例中的项目是“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配置项说明
livenessprobe sidecar镜像。 | |||
csi-provisioner sidecar镜像。 | |||
csi-attacher sidecar镜像。 | |||
csi-resizer sidecar镜像。 | |||
csi-snapshotter sidecar镜像。 | |||
snapshot-controller sidecar镜像。 | |||
csi-node-driver-registrar sidecar镜像。 |
- huaweiCSIService、storageBackendSidecar、storageBackendController、huaweiCSIExtender参数的值,请参考上传华为CSI镜像章节的说明,使用最终生成镜像的名称和版本。
- 其他sidecar镜像参数,请参考检查CSI依赖的镜像章节的说明,使用最终上传的镜像的名称和版本。
controller参数配置说明
controller配置项用于配置huawei-csi-controller组件的相关配置。
表 2 controller配置项说明
PV名称的前缀,默认值为pvc,即创建的PV名称为:pvc-<uuid>。前缀必须满足DNS 子域名的命名规则,且PV名称总长度不得超过253个字符。 | 对应的provisioner参数名称为:--volume-name-prefix。 详细配置请参考配置PV名称前缀。
| |||
huawei-csi-controller的节点选择器。配置后huawei-csi-controller仅会调度到存在该标签的节点上。 | 节点选择器的详细说明请参考:将 Pod 分配给节点 | |||
huawei-csi-controller的污点容忍。配置后huawei-csi-controller能够容忍节点上存在该污点。 | 污点和容忍度的详细说明请参考:污点和容忍度 | |||
当controller.snapshot.enabled参数配置为true时,需要安装“helm/crd/snapshot-crds”目录下的卷快照CRD资源。
node参数配置说明
node配置项用于配置huawei-csi-node组件的相关配置。
表 3 node配置项说明
详细说明请参考:Volume Limits | ||||
节点选择器的详细说明请参考:将 Pod 分配给节点 | ||||
- 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" | 污点和容忍度的详细说明请参考:污点和容忍度 | |||
当一个块设备被成功挂载之后,挂载路径的目录结构应该如下所示: /var/lib/kubelet/plugins/kubernetes.io/csi/{kubeletVolumeDevicesDirName}/publish/{specName}/{podUID} |
csiDriver参数配置说明
csiDriver配置项包括了华为CSI运行时的基本配置,如华为驱动名称、多路径类型等配置信息。
表 4 csiDriver配置项说明
如果您的容器环境已经部署了华为CSI,请确保csiDriver.driverName的设置和之前部署时的配置保持一致。否则会导致系统中已存在的有华为CSI发放的卷/快照无法被新部署的华为CSI管理。
其他参数配置说明
其他配置项包括了CSI插件某些特性的开关或者镜像获取策略。
表 5 其他配置项说明
华为CSI运行时所在Kubernetes命名空间,支持用户自定义。名称必须由小写字母、数字和“-”组成,例如:my-name、123-abc。 | ||||
| ||||
CSIDriver特性在Kubernetes v1.18成为GA版本,因此要求Kubernetes版本高于v1.18,当Kubernetes版本低于 v1.18时,请设置该参数为false。 | ||||
| 参数attachRequired在Kubernetes v1.18支持配置。 如果CSIDriverObject.isCreate为true并且attachRequired参数设置为false时,huawei-csi插件将不会部署csi-attacher这个sidecar。
| |||
基础卷是否支持在装载之前更改卷的所有权和权限。支持配置如下参数:
| 参数fsGroupPolicy在Kubernetes v1.20支持配置,并且当CSIDriverObject.isCreate为true时该参数生效。 该特性在Kubernetes v1.20中为Beta版本,在Kubernetes v1.23成为GA版本,因此要求Kubernetes版本高于v1.20。 | |||
请确保此kubernetes.namespace填入的命名空间在Kubernetes上已经存在,如果不存在请使用如下命令创建对应的命名空间。本例中,华为CSI运行的命名空间为“huawei-csi”。kubectl create namespace huawei-csi
5.2.2 - 手动安装华为CSI
本章节介绍如何手动安装华为CSI。
手动安装华为CSI当前仅支持Kubernetes平台。
安装步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录集群的任意master节点。
将Kubernetes CSI组件包中的"manual"目录拷贝到master节点的任意目录下。
执行命令创建一个命名空间。
kubectl create ns huawei-csi
进入到manual/esdk的工作目录下。具体路径请参见表 软件包组件描述。
cd manual/esdk
执行命令,更新存储后端CRD
kubectl apply -f ./crds/backend/
(可选) 请务必按照检查卷快照依赖组件章节检查快照依赖组件,确认无误后执行执行命令更新快照CRD,如果Kubernetes版本低于v1.17,跳过本步骤。
kubectl apply -f ./crds/snapshot-crds/ --validate=false
(可选) 执行命令安装CSIDriver。如果不使用CSIDriver特性,可跳过本步骤,详情请参考CSIDriver特性。
kubectl apply -f ./deploy/csidriver.yaml
执行命令安装huawei-csi-controller服务。如果Kubernetes版本低于v1.17,删除名称为csi-snapshotter和snapshot-controller的容器,并根据检查CSI依赖的镜像中的版本要求,修改其它容器镜像版本。
kubectl apply -f ./deploy/huawei-csi-controller.yaml
执行命令安装huawei-csi-node服务。
kubectl apply -f ./deploy/huawei-csi-node.yaml
执行命令检查服务是否启动。
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。
操作步骤
卸载huawei-csi-host-info对象使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令卸载华为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
卸载huawei-csi-host-info对象,请参考卸载huawei-csi-host-info对象进行操作。
卸载webhook资源,请参考卸载Webhook资源进行操作。
(可选)卸载快照依赖组件服务,请参考卸载Snapshot依赖组件服务进行操作。
(可选)卸载Lease资源,请参考卸载Lease资源进行操作。
5.3.1.2 - CCE和CCE Agile卸载华为CSI
本章节介绍如何在CCE / CCE Agile平台卸载华为CSI,以CCE Agile v22.3.2为例。
操作步骤
登录CCE Agile平台。
在主页单击“模板市场> 模板实例 ”,进入模板实例页面。
选择华为CSI模板实例,单击“卸载”,在弹出的提示框中单击“确定”。
卸载huawei-csi-host-info对象,请参考卸载huawei-csi-host-info对象进行操作。
卸载webhook资源,请参考卸载Webhook资源进行操作。
(可选)卸载快照依赖组件服务,请参考卸载Snapshot依赖组件服务进行操作。
5.3.1.3 - 卸载CSI依赖组件服务
本章节介绍如何卸载CSI依赖组件服务。
卸载huawei-csi-host-info对象
名称为huawei-csi-host-info的Secret对象中保存着集群中各个节点的启动器信息,例如iSCSI启动器。使用helm uninstall命令时不会卸载该资源,若需卸载该资源,请参考以下步骤:
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令卸载Secret对象,其中huawei-csi-host-info是Secret对象的名称,huawei-csi是Secret对象所在的命名空间。
kubectl delete secret huawei-csi-host-info -n huawei-csi
执行以下命令检查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命令时不会卸载该资源,若需卸载该资源,请参考以下步骤:
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,查询webhook依赖组件服务。
kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io storage-backend-controller.xuanwu.huawei.io
命令结果如下。
NAME WEBHOOKS AGE storage-backend-controller.xuanwu.huawei.io 1 12d
执行以下命令,卸载webhook依赖组件服务。
kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io storage-backend-controller.xuanwu.huawei.io
执行以下命令,检查服务是否已成功卸载。如果结果为空,表示已成功卸载。
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资源。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,卸载Snapshot依赖组件服务。
kubectl delete crd volumesnapshotclasses.snapshot.storage.k8s.io volumesnapshotcontents.snapshot.storage.k8s.io volumesnapshots.snapshot.storage.k8s.io
执行以下命令,检查服务是否已成功卸载。如果结果为空,表示已成功卸载。
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配置项说明。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,查询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
执行以下命令,卸载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-
执行以下命令,检查是否已成功卸载。
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服务
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令卸载 huawei-csi-node 服务,huawei-csi 替换为华为CSI所在的命名空间。
kubectl delete daemonset huawei-csi-node -n huawei-csi
执行以下命令检查服务是否已成功卸载(如果提示NotFound错误,表示已成功卸载)。
kubectl get daemonset huawei-csi-node -n huawei-csi
卸载huawei-csi-controller服务
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令卸载 huawei-csi-controller 服务,huawei-csi 替换为华为CSI所在的命名空间。
kubectl delete deployment huawei-csi-controller -n huawei-csi
执行以下命令检查服务是否已成功卸载(如果提示NotFound错误,表示已成功卸载)。
kubectl get deployment huawei-csi-controller -n huawei-csi
卸载csidriver对象
如果安装时未使用CSIDriver特性,可跳过本步骤。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令卸载csidriver对象。
kubectl delete csidriver csi.huawei.com
执行以下命令检查服务是否已成功卸载(如果提示NotFound错误,表示已成功卸载)。
kubectl get csidriver csi.huawei.com
删除RBAC权限
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
删除RBAC权限。
kubectl -n huawei-csi -l provisioner=csi.huawei.com delete ServiceAccount,Service,role,rolebinding,ClusterRole,ClusterRoleBinding
其它资源卸载
- 卸载huawei-csi-host-info对象,请参考卸载huawei-csi-host-info对象进行操作。
- 卸载webhook资源,请参考卸载Webhook资源进行操作。
- (可选)卸载快照依赖组件服务,请参考卸载Snapshot依赖组件服务进行操作。
- (可选)卸载Lease资源,请参考卸载Lease资源进行操作。
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版本,请按照以下操作步骤备份存储后端配置:
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令备份后端信息到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。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
将目标版本CSI组件包拷贝到master节点的任意目录下。
进入到helm/esdk的工作目录下,目录路径请参见表 软件包组件描述。
cd helm/esdk
执行kubectl apply -f ./crds/backend/命令,更新存储后端CRD
kubectl apply -f ./crds/backend/
(可选) 请务必按照检查卷快照依赖组件章节检查快照依赖组件,确认无误后执行执行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
执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。
helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
执行vi update-values.yaml命令打开6中获取的文件,修改images配置项,更新镜像至最新版本。需要修改的参数请参考表 images配置项。
表 1 images配置项
livenessprobe sidecar镜像。
csi-provisioner sidecar镜像。
csi-attacher sidecar镜像。
csi-resizer sidecar镜像。
csi-snapshotter sidecar镜像。
snapshot-controller sidecar镜像。
csi-node-driver-registrar sidecar镜像。
(可选)在升级过程中如需自定义更新配置项信息或者需要新增配置信息,可参考Helm values.yaml参数说明修改update-values.yaml文件中配置信息。
升级时,如果update-values.yaml与values.yaml配置文件中存在相同配置项,update-values.yaml中的配置将会优先生效。
执行以下命令,升级华为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
完成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的软件包。
操作步骤
- 参考CCE和CCE Agile卸载华为CSI卸载CSI。
- 参考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的更新。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
进入到helm/esdk的工作目录下,目录路径请参见表 软件包组件描述。
cd helm/esdk
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
执行命令,回退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的软件包。
操作步骤
- 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
- 参考操作步骤卸载CSI。
- 参考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版本,请按照以下操作步骤升级:
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行命令备份后端信息到configmap.json文件中。OpenShift平台使用oc替换kubectl命令。
kubectl get cm huawei-csi-configmap -n huawei-csi -o json > configmap.json
参考手动卸载华为CSI卸载CSI。
参考手动安装华为CSI安装当前版本的CSI。
从4.x版本的CSI升级至4.5.0版本。
如果您从4.x版本的CSI升级至4.5.0版本,请按照以下操作步骤升级:
5.4.2.2 - 回退华为CSI
请参考手动卸载华为CSI卸载CSI,然后下载安装升级之前版本的CSI。
- 在升级/回退过程中,已经存在的PVC/快照/Pod等资源会正常运行,不会影响您的业务访问。
- 在升级/回退过程中,不能使用华为CSI创建新的资源,或者对已有的PVC做挂载/卸载操作。
- 在升级/回退过程中,请勿卸载Snapshot依赖组件服务。
前提条件
已下载原版本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 - 创建存储后端
- 使用oceanctl创建存储后端时,输入的账号和秘钥信息保存在Secret对象中,建议客户容器平台根据供应商或者K8s社区的建议自行对Secret进行加密。K8s社区对Secret加密可参考启用静态加密。
- 通过json文件创建后端时,旧版本的backend名称中可能存在大写字母或"_“字符。如果出现这种情况,旧的名称将会被重映射为一个新的名称,映射过程自动发生,不会影响原有功能。例如“ABC_123”将会被映射为“abc-123-fd68e”,具体映射规则如下:
- 大写字母转换成小写字母。
- “_“字符转换成“-”字符。
- 末尾追加5位Hash码。
- 当存储后端对接租户时,在存储后端创建完成后,不允许修改租户名称。
创建后端步骤
参考典型场景存储后端配置文件示例章节准备后端配置文件,如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"
执行以下命令创建存储后端。
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):
输入待创建后端序号,并输入账号密码。
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):
检查存储后端创建结果。
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协议类型的存储后端
- 配置FC协议类型的存储后端
- 配置NVMe over RoCE协议类型的存储后端
- 配置NVMe over FC协议类型的存储后端
- 配置NFS协议类型的存储后端
- 配置SCSI协议类型的存储后端
- 配置DPC协议类型的存储后端
- 配置Dtree类型的存储后端
- 配置双活类型的存储后端
配置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配置项说明
| 一个后端只允许提供一种存储服务。如果单套华为存储系统可以同时提供SAN和NAS的存储服务时,可以配置创建多个后端,每个后端使用不同的存储服务类型。 | |||
存储侧的账户名称。当对接资源是OceanStor Pacific NAS存储,需要在指定账户下发放NAS资源时,需要指定该参数。 | ||||
当对接后端是OceanStor或OceanStor Dorado存储,需要在指定租户下发放资源时,该参数配置为指定租户的逻辑管理端口URL。 | ||||
|
| |||
业务访问端口。节点会使用该端口对存储资源进行读写访问。参数格式为一个列表 iscsi,roce协议支持配置多个端口,nfs协议仅支持配置一个端口,fc、fc-nvme、dpc协议无需配置业务端口,scsi协议的端口形式为字典格式,key为主机名称,value为IP地址,仅支持IPv4。 |
| |||
如果主机多路径配置启用了ALUA,请确保后端ALUA配置和主机的ALUA配置一致。 ALUA详细配置请参考通过Helm配置ALUA特性。 | ||||
如果启用存储拓扑感知,需要配置该参数。具体请参考通过Helm配置存储拓扑感知。 | ||||
6.1.2 - 查询存储后端
请参考查询存储后端节,使用oceanctl命令查询存储后端信息。
6.1.3 - 更新存储后端
- 当前使用oceanctl更新存储后端信息时,仅支持更新存储后端密码。
- 若在存储侧更新了后端的账号密码,CSI插件会因登录失败而重试,可能会导致账号被锁定。如果账号被锁定,请参考存储侧更新密码后账户被锁定章节修改。
6.1.3.1 - oceanctl更新存储后端密码
更新后端示例
执行以下命令获取更新存储后端帮助。
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
执行以下命令更新存储后端信息。
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的存储后端不允许修改名称。
- 存储后端修改后,新增配置仅作用于新发放的卷。
- 存储后端修改期间,请勿执行卷管理操作。
操作步骤
6.1.4 - 删除存储后端
正在执行卷管理操作期间,请勿删除存储后端。
删除后端示例
执行以下命令获取存储后端。
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
执行以下命令删除指定存储后端。
oceanctl delete backend backend-1
执行以下命令检查删除结果。
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为例,证书制作过程请参考:点此前往。
创建证书示例
提前准备好证书文件,如cert.crt。
执行以下命令获取存储后端。
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
执行以下命令为指定存储后端创建证书。
oceanctl create cert cert-1 -b backend-1 -f /path/to/cert.crt
检查证书创建结果。
oceanctl get cert -b backend-1
命令结果示例如下。
NAMESPACE NAME BOUNDBACKEND huawei-csi cert-1 backend-1
6.2.2 - 查询存储后端证书
请根据查询存储后端证书所示命令对存储后端证书进行查询。
6.2.3 - 更新存储后端证书
更新证书前请准备好新的证书文件,并参考本章节更新存储后端证书。如果不再使用证书,请参考删除存储后端证书章节移除存储后端上的证书。
更新证书步骤
执行以下命令获取存储后端。
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
执行以下命令查看指定存储后端是否存在证书。
oceanctl get cert -b backend-1
命令结果示例如下。
NAMESPACE NAME BOUNDBACKEND huawei-csi cert-1 backend-1
执行以下命令更新指定存储后端的证书。
oceanctl update cert -b backend-1 -f /path/to/cert.crt
6.2.4 - 删除存储后端证书
删除证书步骤
执行以下命令获取存储后端。
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
执行以下命令获取指定存储后端的证书。
oceanctl get cert -b backend-1
命令结果示例如下。
NAMESPACE NAME BOUNDBACKEND huawei-csi cert-1 backend-1
执行以下命令删除指定存储后端的证书。
oceanctl delete cert -b backend-1
检查删除结果。
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
根据业务需要,参考动态卷供应典型场景StorageClass配置示例和动态卷供应StorageClass参数说明,创建StorageClass配置文件,如本例从的mysc.yaml文件。
执行命令,使用配置文件创建StorageClass。
kubectl apply -f mysc.yaml
执行命令,查看已创建的StorageClass信息。
kubectl get sc mysc
命令结果示例如下:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE mysc csi.huawei.com Delete Immediate true 8s
配置PVC
根据业务需要,参考本节描述和PVC配置文件示例,修改具体参数,生成本次需要创建的PVC配置文件,如本例中mypvc.yaml文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: mypvc spec: accessModes: - ReadWriteOnce volumeMode: Filesystem storageClassName: mysc resources: requests: storage: 100Gi
执行命令,使用配置文件创建PVC。
kubectl create -f mypvc.yaml
等待一段时间后,执行以下命令,查看已经创建的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中设置后端和存储池
- StorageClass中设置NFS访问方式
- StorageClass中设置Dtree类型
- StorageClass中设置本地文件系统访问方式
- StorageClass中设置DPC访问方式
- StorageClass中设置应用类型
- StorageClass中设置软配额
- StorageClass中设置双活
- StorageClass中设置挂载目录权限
- StorageClass中设置QoS
- CCE / CCE Agile平台中配置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。
执行以下命令,基于该yaml文件创建StorageClass。
kubectl create -f mysc.yaml
执行以下命令,查看当前已经创建的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配置参数说明
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。 | ||||
|
| |||
如果不设置,华为CSI会在所选后端上随机选择一个满足容量要求的存储池创建资源。建议指定存储池,确保创建的资源在预期的存储池上。 | ||||
|
| |||
| ||||
| 仅当StorageClass的volumeType设置为“lun”,且PVC的volumeMode配置为“Filesystem”时生效。 | |||
可以使用“*”表示任意客户端。当您不确定访问客户端IP信息时,建议使用“*”防止客户端访问被存储拒绝。 可以同时输入多个主机名称、IP地址或IP地址段,以英文分号,空格或按回车键隔开。如示例:"192.168.0.10;192.168.0.0/24;myserver1.test" | ||||
| ||||
配置项值是字典格式的JSON字符串(字符串两边由单引号修饰,字典key由双引号修饰)。如:'{"maxMBPS": 999, "maxIOPS": 999}' | 支持的QoS配置请参考表2说明。 | |||
PV在存储侧配额设置。仅在对接OceanStor Pacific系列存储使用NAS时生效。 配置项值是字典格式的JSON字符串(字符串两边由单引号修饰,字典key由双引号修饰)。如:'{"spaceQuota": "softQuota", "gracePeriod": 100}' | 支持的配额配置请参考表3说明。 | |||
| 当使用的后端是双活类型的后端,且需要发放双活卷时,设置该参数为"true",若设置为"false",在后端对接的逻辑管理端口漂移的场景下,有业务中断的风险。 | |||
|
| |||
配置格式参考Linux权限设置,如“777”、“755”等。 支持所有的SAN存储,NAS存储仅支持OceanStor Dorado 、OceanStor、OceanStor Pacific 8.1.2及之后版本的存储设备。 | ||||
| ||||
| ||||
| ||||
| ||||
| ||||
| ||||
指定NFS版本挂载时,当前支持NFS 3/4.0/4.1/4.2协议(需存储设备支持且开启)。当配置参数为nfsvers=4时,因为操作系统配置的不同,实际挂载可能为NFS 4的最高版本协议,如4.2,当需要使用4.0协议时,建议配置nfsvers=4.0。 | ||||
acl、aclonlyposix、cnflush、cflush参数描述仅供参考,详细参数说明请参考《OceanStor Pacific系列 产品文档》 > 配置 > 文件服务基础业务配置指南 > 配置基础业务(DPC场景) > 客户端访问DPC共享 > 步骤2。 | ||||
DPC命名空间支持POSIX ACL功能,DPC客户端支持POSIX ACL的鉴权行为。 支持POSIX ACL的协议有:DPC、NFSv3、HDFS。如使用NFSv4 ACL或NT ACL,会导致DPC客户端无法识别该类型的ACL,从而导致该类型的ACL不会生效。 | ||||
异步刷盘模式,当文件关闭时不会同步将Cache的数据持久化到存储介质中,而是通过Cache异步刷盘的方式将数据写入存储介质,Cache的后台刷盘将在写业务完成后根据刷盘周期定时刷盘。在多客户端场景下,对同一文件进行并行操作,文件Size的更新会受刷盘周期的影响,即当刷盘动作完成后才会更新文件的Size,更新通常会在数秒内完成。同步I/O不受刷盘周期影响。 | ||||
| ||||
| ||||
表 2 支持的QoS配置
表 3 支持的配额配置
7.1.1.1.3 - 动态卷供应PVC参数说明
在完成配置StorageClass以后,就可以用该StorageClass来配置PVC。PVC的配置模板请参考华为CSI软件包中的examples目录下的pvc*.yaml文件示例。
表 1 pvc*.yaml文件示例参数说明
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。 | ||||
卷模式。可选参数。 当使用LUN类型的卷时,支持配置以下类型:
|
| |||
PVC容量的规格取决于存储规格限制和主机规格限制。以OceanStor Dorado 6.1.2/OceanStor Pacific系列 8.1.0对接CentOS 7为例,当使用的是ext4文件系统时,容量限制见表 ext4容量的规格;当使用的是XFS文件系统时,容量限制见表 XFS容量的规格。如果使用的是NFS或者裸设备,容量需满足使用的华为存储设备型号和版本所要求的规格约束。 | ||||
|
|
表 2 ext4容量的规格
表 3 XFS容量的规格
7.1.1.2 - 纳管卷供应
纳管卷供应(Manage Volume Provisioning)允许管理员使用已经在存储侧创建的资源做为PV,并能够支持动态卷的特性,例如:扩容,快照,克隆等,属于华为CSI自定义能力。使用该特性可满足如下场景:
- 容器化应用的改造场景,需要使用已有的存储卷。
- 重建Kubernetes集群。
- 容灾场景下,对存储数据进行迁移。
在多Kubernetes集群场景下,使用纳管卷特性对同一存储资源进行管理时,在任一集群中对该资源对应的PVC进行管理操作后,不会同步到其他集群中。 例如:在某一集群中对PVC进行扩容时,其他集群对应的PVC不会自动扩容,需要在其他集群中手动根据扩容PVC中的扩容命令进行扩容。
前提条件
- 已在CSI中注册需要纳管卷所在存储。
- 已登录存储设备获取需要纳管卷的名称和容量。
配置StorageClass
根据业务需要,参考动态卷供应典型场景StorageClass配置示例和动态卷供应StorageClass参数说明,创建StorageClass配置文件,如本例从的mysc.yaml文件。
执行命令,使用配置文件创建StorageClass。
kubectl apply -f mysc.yaml
执行命令,查看已创建的StorageClass信息。
kubectl get sc mysc
命令结果示例如下:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE mysc csi.huawei.com Delete Immediate true 8s
配置PVC
根据业务需要,参考本节描述和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
执行命令,使用配置文件创建PVC。
kubectl create -f mypvc.yaml
等待一段时间后,执行以下命令,查看已经创建的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中设置后端和存储池
- StorageClass中设置NFS访问方式
- StorageClass中设置本地文件系统访问方式
- StorageClass中设置DPC访问方式
- 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。
执行以下命令,基于该yaml文件创建StorageClass。
kubectl create -f mysc.yaml
执行以下命令,查看当前已经创建的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配置参数说明
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。 | ||||
|
| |||
|
| |||
| 仅当StorageClass的volumeType设置为“lun”,且PVC的volumeMode配置为“Filesystem”时生效。 | |||
| ||||
指定NFS版本挂载时,当前支持NFS 3/4.0/4.1/4.2协议(需存储设备支持且开启)。当配置参数为nfsvers=4时,因为操作系统配置的不同,实际挂载可能为NFS 4的最高版本协议,如4.2,当需要使用4.0协议时,建议配置nfsver:ws=4.0。 | ||||
acl、aclonlyposix、cnflush、cflush参数描述仅供参考,详细参数说明请参考《OceanStor Pacific系列 产品文档》 > 配置 > 文件服务基础业务配置指南 > 配置基础业务(DPC场景) > 客户端访问DPC共享 > 步骤2。 | ||||
DPC命名空间支持POSIX ACL功能,DPC客户端支持POSIX ACL的鉴权行为。 支持POSIX ACL的协议有:DPC、NFSv3、HDFS。如使用NFSv4 ACL或NT ACL,会导致DPC客户端无法识别该类型的ACL,从而导致该类型的ACL不会生效。 | ||||
异步刷盘模式,当文件关闭时不会同步将Cache的数据持久化到存储介质中,而是通过Cache异步刷盘的方式将数据写入存储介质,Cache的后台刷盘将在写业务完成后根据刷盘周期定时刷盘。在多客户端场景下,对同一文件进行并行操作,文件Size的更新会受刷盘周期的影响,即当刷盘动作完成后才会更新文件的Size,更新通常会在数秒内完成。同步I/O不受刷盘周期影响。 | ||||
| ||||
| ||||
7.1.1.2.3 - 纳管卷供应PVC参数说明
在完成配置StorageClass以后,就可以用该StorageClass来配置PVC。PVC的配置模板请参考华为CSI软件包中的examples目录下的pvc-manager.yaml文件示例。
表 1 pvc-manager.yaml文件示例参数说明
| csi.huawei.com/manageVolumeName: * csi.huawei.com/manageBackendName: * |
| ||
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。 | ||||
卷模式。可选参数。 当使用LUN类型的卷时,支持配置以下类型:
|
| |||
PVC容量的规格取决于存储规格限制和主机规格限制。以OceanStor Dorado 6.1.2/OceanStor Pacific系列 8.1.0对接CentOS 7为例,当使用的是ext4文件系统时,容量限制见表2;当使用的是XFS文件系统时,容量限制见表3。如果使用的是NFS或者裸设备,容量需满足使用的华为存储设备型号和版本所要求的规格约束。 | ||||
|
|
表 2 ext4容量的规格
表 3 XFS容量的规格
7.1.1.3 - 静态卷供应
静态卷供应(Static Volume Provisioning)允许管理员使用已经在存储侧创建的资源做为PV,供集群中的容器使用。
为了完成静态卷供应,需要完成如下两步:
- 配置PV
- 配置PVC
前提条件
存储侧已经存在待创建PV所需要的存储资源,如LUN或者文件系统。如果存储资源是文件系统,还需要创建文件系统的共享和客户端信息。
配置PV
准备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。
执行以下命令,基于准备好的yaml文件创建PV。
kubectl create -f mypv.yaml
等待一段时间后,执行以下命令,查看已经创建的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,从而供容器使用。
首先准备PVC配置文件。如下示例是一个使用静态卷供应的PVC配置文件。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: mypvc spec: storageClassName: "" accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 100Gi volumeName: mypv # 对应PV名称
执行以下命令,基于已配置的yaml文件创建PVC。
kubectl create -f mypvc.yaml
等待一段时间后,执行以下命令,查看已经创建的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 静态卷供应参数
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。 | ||||
卷模式。可选参数。 当使用LUN类型的卷时,支持配置以下类型:
|
| |||
|
| |||
| ||||
请确保与存储上对应资源的容量保持一致。Kubernetes并不会调用CSI检查此字段值的正确性,所以在PV容量与存储上对应资源的容量不一致也能被成功创建。 | ||||
指定NFS版本挂载时,当前支持NFS 3/4.0/4.1/4.2协议(需存储设备支持且开启)。当配置参数为nfsvers=4时,因为操作系统配置的不同,实际挂载可能为NFS 4的最高版本协议,如4.2,当需要使用4.0协议时,建议配置nfsvers=4.0。 | ||||
acl、aclonlyposix、cnflush、cflush参数描述仅供参考,详细参数说明请参考《OceanStor Pacific系列 产品文档》 > 配置 > 文件服务基础业务配置指南 > 配置基础业务(DPC场景) > 客户端访问DPC共享 > 步骤2。 | ||||
DPC命名空间支持POSIX ACL功能,DPC客户端支持POSIX ACL的鉴权行为。 支持POSIX ACL的协议有:DPC、NFSv3、HDFS。如使用NFSv4 ACL或NT ACL,会导致DPC客户端无法识别该类型的ACL,从而导致该类型的ACL不会生效。 | ||||
异步刷盘模式,当文件关闭时不会同步将Cache的数据持久化到存储介质中,而是通过Cache异步刷盘的方式将数据写入存储介质,Cache的后台刷盘将在写业务完成后根据刷盘周期定时刷盘。在多客户端场景下,对同一文件进行并行操作,文件Size的更新会受刷盘周期的影响,即当刷盘动作完成后才会更新文件的Size,更新通常会在数秒内完成。同步I/O不受刷盘周期影响。 | ||||
7.1.1.3.2 - 静态卷供应PVC参数说明
表 1 PVC参数说明
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字开头和结尾。 | ||||
|
| |||
可选, 支持Filesystem或Block, 默认为Filesystem。该参数在创建Pod时生效,其中Filesystem表示在PVC上创建一个文件系统访问存储, Block表示使用裸卷的方式访问存储。 | ||||
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将无法被创建。 | ||||
7.1.2 - 扩容PVC
当容器使用的PVC容量不足时,需要对该PVC进行扩容操作。
前提条件
PVC已创建,所在的backend存在且支持扩容。
支持扩容的存储请参考表 华为企业存储支持的特性及约束和表 华为分布式存储支持的特性及约束,支持扩容的Kubernetes版本请参考Kubernetes特性矩阵。
huawei-csi-controller启用了csi-resizer服务。
kubectl describe deploy huawei-csi-controller -n huawei-csi | grep csi-resizer
命令回显示例如下则说明已启用csi-resizer服务。
csi-resizer: Image: k8s.gcr.io/sig-storage/csi-resizer:v1.4.0
操作步骤
执行命令,查询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。
执行以下命令,将“allowVolumeExpansion“的值修改为“true“。其中,mysc 为需要修改的StorageClass名称。
kubectl patch sc mysc --patch '{"allowVolumeExpansion":true}'
执行命令,查询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
执行以下命令进行扩容。
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扩容的目标容量超过存储池容量导致扩容失败。
执行命令,检查容量修改是否生效。
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特性矩阵。
操作步骤
执行以下命令,基于克隆卷的配置文件创建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特性矩阵。
操作步骤
执行以下命令,基于从快照创建卷的配置文件创建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参数说明
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。 | ||
|
|
前提条件
华为CSI支持快照且运行所依赖的卷快照组件CRD已经安装。具体CRD信息请参考检查卷快照依赖组件章节说明,支持创建VolumeSnapshot的Kubernetes版本请参考表 Kubernetes版本与支持的特性。
操作步骤
执行以下命令,使用已经创建的VolumeSnapshotClass配置文件创建VolumeSnapshotClass。
kubectl create -f mysnapclass.yaml
执行以下命令,查看已创建的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参数说明
以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。 | ||
前提条件
- 源PVC存在,且PVC所在的backend存在支持创建VolumeSnapshot。支持创建VolumeSnapshot的存储请参考表 华为企业存储支持的特性及约束和表 华为分布式存储支持的特性及约束,支持创建VolumeSnapshot的Kubernetes版本请参考表 Kubernetes版本与支持的特性。
- 华为CSI运行所依赖的卷快照组件CRD已经安装。具体信息请参考检查卷快照依赖组件章节说明。
- 系统中已经存在使用华为CSI的VolumeSnapshotClass。
操作步骤
执行以下命令,使用已经创建的VolumeSnapshot配置文件创建VolumeSnapshot。
kubectl create -f mysnapshot.yaml
执行以下命令,查看已创建的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参数说明
主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》。 当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则。 | ||
| ||
| ||
| ||
|
以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参数说明
主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》。 当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则。 | ||
| ||
|
以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参数说明
主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》。 当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则。 | ||
| 非双活场景,存储系统自身为Active/Active模式,选择“启用ALUA”没有实际意义,建议选择“禁用ALUA”。当前华为CSI未支持SAN双活场景,请谨慎启用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节点完成拓扑的标签配置,标签配置方法如下:
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,查看当前集群中的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
执行以下命令,给worker节点配置拓扑标签。其中 nodename 为worker节点名称, key 和 value 参数说明请参考表 参数说明。
kubectl label node <nodename> <key>=<value>
表 1 参数说明
- 拓扑标签必须以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需要满足全部筛选条件。
执行命令, 查看当前集群中所有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配置存储拓扑感知
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
进入Helm工程的目录下,如果无法找到之前的Helm工程,则将组件包中的helm目录拷贝到master节点的任意目录下,组件包路径请参考表 软件包组件描述。
进入后端服务配置目录/examples/backend/下,备份backend.yaml文件
cp backend.yaml backend.yaml.bak
执行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"
执行以下命令删除待修改存储后端,其中“dorado-iscsi-155”为存储后端名称。
oceanctl delete backend dorado-iscsi-155 -n huawei-csi
执行以下命令创建存储后端。
oceanctl create backend -f ../examples/backend/backend.yaml -i yaml
根据命令提示输入存储用户名和密码。
Please enter this backend user name:admin Please enter this backend password:
执行vi StorageClass.yaml命令,修改yaml文件。按I或Insert进入编辑状态,在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 参数说明
可配置“WaitForFirstConsumer”或“Immediate”
“WaitForFirstConsumer”:表示延迟PersistentVolume的绑定和调配,直到创建使用PVC的Pod。
“key”:可支持配置“topology.kubernetes.io/zone”,“topology.kubernetes.io/region”,
topology.kubernetes.io/protocol.<protocol>, 其中<protocol>为协议类型, 例如:iscsi, fc, nfs等。
“key”如果是“topology.kubernetes.io/zone”,“topology.kubernetes.io/region”,“value”值需要和前提条件中设置的拓扑标签保持一致。
“key”如果是topology.kubernetes.io/protocol.<protocol>, “value”值固定为“csi.huawei.com”
执行以下命令,基于该yaml文件创建StorageClass。
kubectl create -f StorgeClass.yaml
使用该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及以上版本。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令检查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
进入/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命令。
helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
执行vi update-values.yaml命令打开4中获取的文件,修改以下配置。修改完成后,按Esc,并输入**:wq!**,保存修改。
csiExtender: volumeModify: enabled: true
执行以下命令更新华为CSI服务。
helm upgrade helm-huawei-csi ./ -n huawei-csi -f ./update-values.yaml
执行命令检查服务是否启动。
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。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
进入manual/esdk工作目录下,执行以下命令,配置卷变更CRD。
kubectl apply -f ./crds/volume-modify/
执行以下命令。组件包路径请参考表 软件包组件描述。
kubectl apply -f ./deploy/huawei-csi-controller-extender.yaml
执行命令检查服务是否启动。
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 资源说明
- VolumeModifyClaim资源支持创建/删除/查询,不支持更新。
- VolumeModifyContent资源仅支持查询,用于展示单个PVC变更详情,请勿手动创建/删除/修改。
- VolumeModifyContent资源被VolumeModifyClaim管理,请勿手动管理VolumeModifyContent资源。
8.3.2.1.1 - 准备PVC变更文件
PVC变更文件说明
PVC变更文件样例模板为/examples/volumemodifyclaim.yaml,具体配置项如下表所示:
表 1 参数说明
名称必须满足DNS 子域名的命名规则,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以小写字母数字字符开头和结尾,最大长度不超过63个字符 | ||||
| 当且仅当spec.parameters.hyperMetro为"true"时生效。
|
- 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的多次变更,请在单次变更完成之后再执行。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,创建PVC变更。
kubectl create -f volumemodifyclaim.yaml
参考查询PVC变更查询创建结果。
8.3.2.2 - 查询PVC变更
本章节介绍如何使用Kubectl查询PVC变更状态,当前华为CSI通过CRD提供以下API。
查询VolumeModifyClaim
使用kubectl查询VolumeModifyClaim步骤如下。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,查询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 回显说明
- Pending:初始状态。
- Creating:VolumeModifyClaim完成基本校验,且服务端已经接收变更任务,但是该任务还未执行完成。
- Completed:所有关联的PVC均完成变更。
- Rollback:关联的PVC部分完成变更时,用户执行了删除PVC变更操作。
- Deleting:关联的PVC全部完成变更时,用户执行了删除PVC变更操作。
VolumeModifyClaim支持使用kubectl查看Events信息,当VolumeModifyClaim无法满足创建要求,或者创建过程中出现错误时,服务端将记录Events信息。参考命令如下:
kubectl describe volumemodifyclaims local-to-hypermetro
查询VolumeModifyContent
VolumeModifyContent由VolumeModifyClaim资源创建,记录了单个PVC的变更详情,使用kubectl查询VolumeModifyContent步骤如下。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行命令,查询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 回显说明
VolumeModifyContent资源状态,可取值如下:
- Pending:初始状态。
- Creating:VolumeModifyContent完成基本校验,且服务端已经接收变更任务,但是该任务还未执行完成。
- Completed:关联的PVC完成变更。
- Rollback:正在回滚PVC变更。
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变更,基于步骤如下。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,删除PVC变更。其中 vmc-name 为VolumeModifyClaim资源名称。
kubectl delete volumemodifyclaims <vmc-name>
参考创建PVC变更资源查询删除结果。
9 - 常用操作
9.1 - 安装Helm 3
本章节指导用户如何安装Helm 3。
参考:https://helm.sh/docs/intro/install/
前提条件
确保Kubernetes集群中的master节点可以访问Internet。
操作步骤
执行以下命令,下载Helm 3的安装脚本。
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
执行以下命令,修改Helm 3的安装脚本权限。
chmod 700 get_helm.sh
根据Helm与Kubernetes版本配套关系确认需要安装的Helm版本,配套关系请参考Helm Version Support Policy,执行以下命令,修改DESIRED_VERSION环境变量为需要安装的Helm版本,并执行安装命令。
DESIRED_VERSION=v3.9.0 ./get_helm.sh
执行以下命令,查看指定版本的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版本信息。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,查看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
使用远程访问工具(以PuTTY为例),通过节点IP地址,登录任意huawei-csi-node所在节点。
执行以下命令,查看CSI版本信息。
cat /var/lib/kubelet/plugins/csi.huawei.com/version
命令显示版本信息如下。
4.5.0
9.2.2 - 如何查看华为CSI日志
查看huawei-csi-controller服务的日志
执行以下命令,获取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>
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群中huawei-csi-controller服务所在节点
进入日志目录。
cd /var/log/huawei
执行以下命令,查看容器自定义输出日志。
vi huawei-csi-controller
进入容器目录。
cd /var/log/containers
执行以下命令, 查看容器标准输出日志。
vi huawei-csi-controller-<name>_huawei-csi_huawei-csi-driver-<contrainer-id>.log
查看huawei-csi-node服务的日志
执行以下命令,获取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>
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群中huawei-csi-node服务所在节点
进入日志目录。
cd /var/log/huawei
执行以下命令,查看容器自定义输出日志。
vi huawei-csi-node
进入容器目录。
cd /var/log/containers
执行以下命令, 查看容器标准输出日志。
vi huawei-csi-node-<name>_huawei-csi_huawei-csi-driver-<contrainer-id>.log
9.2.3 - 日志收集
前置检查
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群内有oceanctl工具的节点。
执行以下命令,显示版本号为v4.5.0。
oceanctl version
命令结果示例如下:
Oceanctl Version: v4.5.0
执行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")
执行以下命令,检查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命名空间下所有日志
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录前置检查章节中检查的节点。
执行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
检查/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单个节点日志
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录前置检查章节中检查的节点。
执行oceanctl collect logs -n <namespace> -N <nodeName>命令,收集集群内所有CSI容器所在节点的CSI日志。
oceanctl collect logs -n huawei-csi -N node-1
检查/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下载容器镜像
执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉取的镜像及其标签。
ctr image pull <image>:<tag>
执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。
ctr image export <file>.tar <image>:<tag>
使用Docker下载容器镜像
执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉取的镜像及其标签。
docker pull <image>:<tag>
执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。
docker save <image>:<tag> -o <file>.tar
使用Podman下载容器镜像
执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉取的镜像及其标签。
podman pull <image>:<tag>
执行以下命令,导出镜像到文件。其中 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服务的副本数时,执行此操作。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
进入/helm/esdk 目录,执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。组件包路径请参考表 软件包组件描述。
helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
执行 vi update-values.yaml 命令打开2中获取的文件,参考Helm values.yaml参数说明修改配置项,修改完成后,按Esc,并输入 :wq!,保存修改。
执行以下命令更新华为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.
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
进入/helm/esdk 目录,执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。组件包路径请参考表 软件包组件描述。
helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
执行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
执行以下命令更新日志配置。
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功能门
操作步骤
为kube-apiserver启用ReadWriteOncePod功能门。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行vi /etc/kubernetes/manifests/kube-apiserver.yaml命令,按I或Insert进入编辑状态,为 kube-apiserver容器添加参数–feature-gates=ReadWriteOncePod=true。修改完成后,按Esc,并输入 :wq!,保存修改。
... spec: containers: - command: - kube-apiserver - --feature-gates=ReadWriteOncePod=true ...
在编辑完成后,Kubernetes会自动应用更新,不需要手动更新。
为kube-scheduler启用ReadWriteOncePod功能门。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行vi /etc/kubernetes/manifests/kube-scheduler.yaml命令,按I或Insert进入编辑状态,为kube-scheduler容器添加参数–feature-gates=ReadWriteOncePod=true。修改完成后,按Esc,并输入 :wq!,保存修改。
… spec: containers: - command: - kube-scheduler - --feature-gates=ReadWriteOncePod=true ...
在编辑完成后,Kubernetes会自动应用更新,不需要手动更新。
为kubelet启用ReadWriteOncePod功能门。
由于动态Kubelet配置功能在v1.22中已弃用,并且在v1.24中删除,因此集群中每个worker节点上的kubelet都需要执行以下操作。使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意worker节点。
执行vi /var/lib/kubelet/config.yaml命令,按I或Insert进入编辑状态,为KubeletConfiguration对象的featureGates字段添加ReadWriteOncePod: true,如果没有featureGates字段请一并添加。修改完成后,按Esc,并输入 :wq!,保存修改。
apiVersion: kubelet.config.k8s.io/v1beta1 featureGates: ReadWriteOncePod: true ...
kubelet配置文件的默认路径为/var/lib/kubelet/config.yaml,请根据实际情况填写。
在配置完成后,执行systemctl restart kubelet命令重启kubelet。
9.7 - 配置非root用户访问Kubernetes集群
操作步骤
拷贝Kubernetes集群的认证文件,/etc/kubernetes/admin.conf修改为实际使用的认证文件。
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
修改认证文件的用户与用户组。
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置当前用户的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目录。
解决措施或规避方法
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
进入Helm工程的目录下,如果无法找到之前的Helm工程,则将组件包中的helm目录拷贝到master节点的任意目录下,组件包路径请参考表 软件包组件描述。
进入下一级目录templates,找到huawei-csi-node.yaml文件。
cd /templates
执行以下命令,将huawei-csi-node.yaml > volumes > iscsi-dir > hostPath中“path“设置为“/var/lib/iscsi“ ,然后保存并退出文件。
vi huawei-csi-node.yaml
执行以下命令升级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运行不起来。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
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
执行命令,通过查看容器的“Events”参数。
kubectl describe pod huawei-csi-controller-6dfcc4b79f-9vjtq -n huawei-csi
命令结果示例如下。其中,huawei-csi-controller-6dfcc4b79f-9vjtq 为2中查找到的状态显示为“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
执行命令cd /helm/esdk/templates,进入到CSI的安装包路径下。路径请参见表 软件包组件描述。
以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 ... ...
参考Helm卸载华为CSI卸载服务后,重新安装服务。
执行以下命令,查看华为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
...
解决措施或规避方法
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,修改huawei-csi-node服务的配置文件。按I或Insert进入编辑状态,修改相关参数。修改完成后,按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
执行以下命令,修改huawei-csi-controller服务的配置文件。按I或Insert进入编辑状态,修改相关参数。修改完成后,按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
等待huawei-csi-node和huawei-csi-controller服务启动。
执行以下命令,查看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资源失效。
解决措施或规避方法
执行以下命令,删除validatingwebhookconfiguration资源。
kubectl delete validatingwebhookconfiguration storage-backend-controller.xuanwu.huawei.io
执行以下命令,重启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
执行以下命令,检查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校验存储管理网络连通性失败。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行命令,获取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>
登录huawei-csi-controller所在节点,如2中的host-1。
进入到/var/log/huawei目录。
# cd /var/log/huawei
查看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
如果日志中有相关登录超时、登录失败或者请求耗时较长,请检查宿主机和存储连通性或网络情况。
如果日志中没有收到任何请求,则是kube-apiserver和CSI webhook通信异常。
kube-apiserver和CSI webhook通信异常
联系Kubernetes平台管理员查看kube-apiserver与CSI webhook网络问题。例如kube-apiserver存在HTTPS代理时可能无法访问CSI webhook服务。
临时规避方案中,将会删除webhook资源,该资源用于在创建存储后端时校验输入的账户信息是否正确和能否和存储建立连接,因此删除该资源仅影响创建后端时的校验,无其他功能影响,但需要注意以下几点。
- 请保证huawei-csi-controller服务所在宿主机能和存储通信。
- 请保证输入的账号密码正确。
可执行以下命令查看CSI webhook信息。
kubectl get validatingwebhookconfiguration storage-backend-controller.xuanwu.huawei.io
命令结果如下。
NAME WEBHOOKS AGE storage-backend-controller.xuanwu.huawei.io 1 4d22h
联系Kubernetes平台管理员检查kube-apiserver与CSI webhook是否存在通信异常。
临时规避方案:可执行以下命令删除webhook。
kubectl delete validatingwebhookconfiguration storage-backend-controller.xuanwu.huawei.io
创建存储后端,可参考管理存储后端。
如果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次之后,该账户就会被锁定。
解决措施或规避方法
如果后端配置的账户是admin,请执行以下命令,将huawei-csi-controller服务副本数置为0,如果使用的是非admin账户,忽略此步骤。
kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=0
使用admin账户登录存储,修改登录策略。以OceanStor Dorado存储为例,在DeviceManager管理界面,选择“设置 > 用户与安全 > 安全策略 >登录策略 >修改>密码锁定”,取消密码锁定。
如果如果后端配置的账户是admin,执行以下命令,通过“–replicas=*”恢复CSI Controller的副本数,下例为恢复至1个,请根据实际情况修改。如果使用的是非admin账户,忽略此步骤。
kubectl scale deployment huawei-csi-controller -n huawei-csi --replicas=1
使用oceanctl工具修改存储后端密码,修改后端密码请参考更新存储后端章节。
使用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状态,需要根据以下不同的原因采取不同的解决措施。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,查看PVC的详细信息。
kubectl describe pvc mypvc
根据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
- 删除PVC。
- 创建StorageClass,可参考动态卷供应典型场景StorageClass配置示例。
- 创建新的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
- 删除PVC。
- 删除StorageClass。
- 根据Events信息修改StorageClass.yaml文件。
- 创建StorageClass,详细请参考动态卷供应典型场景StorageClass配置示例。
- 创建新的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)
- 请先等待10分钟, 参考本章节再次检查PVC详细信息
- 如果还处于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,需要根据以下不同的原因采取不同的解决措施。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,查看PVC的详细信息。
kubectl describe pvc mypvc
根据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上就会出现盘符残留。
解决措施或规避方法
目前的解决方法只能人工介入,手动清理掉主机的残留盘符(或者再次重启主机,利用主机重启过程中扫盘机制,清理掉残留盘符)。具体方法如下:
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。
- 否 => 不涉及。
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
执行以下命令,查看卡死的进程。
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
将该pid杀死。
kill -9 pid
记录残留的dm-xx设备以及关联磁盘号(见步骤1.1),执行清理步骤。
清理主机的残留盘符。
根据步骤1获取的DM多路径设备,执行命令,清理残留的多路径聚合设备信息。
multipath -f /dev/dm-12
如果执行报错,请联系技术支持。
清理残留的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
如果执行报错,请联系技术支持。
确认DM多路径设备和SCSI磁盘信息是否已经清理干净。
依次执行下列命令,查询的多路径和磁盘信息显示,残留的dm-12和SCSI磁盘sdi/sdj均已消失,则证明清理完成。
查看多路径信息。
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
查看设备信息。
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
查看磁盘信息
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时,查找磁盘失败。
解决措施或规避方法
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
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>
删除Pod。
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的 node1 节点。node1 节点为2中查询的节点。
移除盘符残留,详情请参考解决措施或规避方法。
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命令超时。
解决措施或规避方法
执行ping命令判断业务IP网络是否连通,如果无法ping通,则为原因1,请配置可用的业务IP地址,如果可以ping通,则执行2。
进入任意可以执行mount命令的容器中,指定使用NFSv3执行mount命令。如果命令超时,则可能是原因2,继续执行systemctl status containerd.service命令查看配置文件路径,然后执行cat _/xxx/containerd.service_命令查看配置文件。文件中如果有LimitNOFILE=infinity或LimitNOFILE的值大小为10亿,请执行3。否则请联系华为工程师处理。
- 尝试使用NFSv4.0及以上协议。
- 参考社区修改方案,将LimitNOFILE参数值修改为合适的值。该方案将会重启容器运行时,请评估对业务的影响。
在挂载失败的宿主机手动挂载该文件系统,如果时间超过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协议挂载。
解决措施或规避方法
- 开启存储侧的NFS 3/4.0/4.1/4.2协议,重新尝试默认挂载。
- 直接指定可用的NFS协议进行挂载,参考动态卷供应典型场景StorageClass配置示例。
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”接口。
如果集群中所有旧版本创建的工作负载均触发了该操作,则后续将不会出现该问题。
操作步骤
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,获取工作负载所在节点信息。
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>
将该工作负载漂移至其他节点。
若在集群内无法完成漂移,可在原节点完成工作负载重建,即进行删除-新建操作。
观察该工作负载是否成功拉起,如果拉起失败请联系华为工程师。
集群工作负载排查
Kubernetes调用CSI插件完成卷映射时,将使用VolumeAttachment资源保存映射信息,用于表示将指定的卷从指定的节点上附加或分离。由于该问题是由于publishInfo不存在导致,因此可通过查看VolumeAttachment资源信息排查集群中其他工作负载是否存在该问题。具体步骤如下:
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行以下命令,获取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
执行以下命令查看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>}'
若3中查询到的资源中存在status.attachmentMetadata.publishInfo,则证明node-1节点上使用pvc-1xx创建的若干工作负载不会存在本FAQ描述的错误,其中node-1和pvc-1xx为2中查询结果。若status.attachmentMetadata.publishInfo不存在,请参考解决措施章节解决。
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”权限。
解决措施或规避方法
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行vi psp-use.yaml 命令, 创建psp-use.yaml文件。
vi psp-use.yaml
配置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
执行以下命令,创建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集群不一致。
解决措施或规避方法
进入helm/esdk/目录,执行vi values.yaml命令打开配置文件。
vi values.yaml
将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容器的默认端口修改为未占用端口。
进入“helm/esdk”目录,执行vi values.yaml命令打开配置文件。
vi values.yaml
将controller.livenessProbePort默认值9808修改为其他未占用端口,例如改为9809。
controller: livenessProbePort: 9809
使用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"举例:
使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群的任意master节点。
执行命令, 修改pks-privileged的配置。
kubectl edit psp pks-privileged
在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
执行命令,确认是否添加成功。
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 - 通信矩阵
11.5 - 配置自定义权限
自定义角色配置
针对不同的存储资源,请参考以下配置:
- NAS相关资源请参考表 NAS相关资源最小权限说明配置最小权限。
- SAN相关资源请参考表 SAN相关资源最小权限说明配置最小权限。
可参考存储文档:《OceanStor Dorado 6000, Dorado 18000系列 产品文档》配置自定义角色权限。
表 1 NAS相关资源最小权限说明
表 2 SAN相关资源最小权限说明
11.6 - 华为CSI资源管理
本章节列举了华为CSI插件中每个容器所使用的资源请求和限制。其中单位说明请参考Kubernetes 中的资源单位。
表 1 容器资源请求和限制
修改资源请求和限制
如果需要修改容器的资源请求和限制,以Helm安装华为CSI为例,可参考以下步骤
使用Helm安装时进入/helm/esdk/templates 目录。手动部署时需要修改的文件在/manual/esdk/deploy目录,其中组件包路径请参考表 软件包组件描述。
修改部署模板文件。
- 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
若华为CSI未安装,则参考Kubernetes、OpenShift、Tanzu安装华为CSI章节安装华为CSI后,资源请求和限制的修改生效。
若已安装华为CSI,则参考升级华为CSI章节更新华为CSI后,资源请求和限制的修改生效。