高级特性
- 1: 配置ALUA特性
- 1.1: 通过Helm配置ALUA特性
- 1.1.1: 配置华为企业存储后端的ALUA参数
- 1.1.2: 配置分布式存储后端的ALUA参数
- 2: 配置存储拓扑感知
- 2.1: 通过Helm配置存储拓扑感知
- 3: PVC变更
- 3.1: 开启PVC变更特性
- 3.1.1: 使用Helm开启PVC变更特性
- 3.1.2: 手动方式开启PVC变更特性
- 3.2: 配置PVC变更
1 - 配置ALUA特性
ALUA(Asymmetric Logical Unit Access,非对称逻辑单元访问),是一种多目标器端口访问模型。在多路径状态下,ALUA标准提供了一种将卷的Active/Passive模型呈现给主机的方式。同时还提供了端口的可访问状态切换接口,可用来实现卷工作控制器切换等。例如,卷在一个控制器故障时,可以将该控制器的端口置为Unavailable,支持ALUA的主机多路径软件收到该状态后,会将I/O切换到另一端控制器。
1.1 - 通过Helm配置ALUA特性
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中的配置应用到存储侧。
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中的配置应用到存储侧。
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"}]
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参数说明。
3 - PVC变更
本章节介绍如何使用华为CSI完成PVC变更。
3.1 - 开启PVC变更特性
当前华为CSI安装时默认关闭PVC变更特性,如需要使用该特性,请按照以下步骤开启。
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
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
3.2 - 配置PVC变更
PVC变更特性使用CRD实现,当前资源说明如下。
表 1 资源说明
- VolumeModifyClaim资源支持创建/删除/查询,不支持更新。
- VolumeModifyContent资源仅支持查询,用于展示单个PVC变更详情,请勿手动创建/删除/修改。
- VolumeModifyContent资源被VolumeModifyClaim管理,请勿手动管理VolumeModifyContent资源。
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"
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变更查询创建结果。
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
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变更资源查询删除结果。