1 - 安装Helm 3

本章节指导用户如何安装Helm 3。

参考: https://helm.sh/docs/intro/install/

前提条件

确保Kubernetes集群中的master节点可以访问Internet。

操作步骤

  1. 执行以下命令,下载Helm 3的安装脚本。

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
    
  2. 执行以下命令,修改Helm 3的安装脚本权限。

    chmod 700 get_helm.sh
    
  3. 根据Helm与Kubernetes版本配套关系确认需要安装的Helm版本,配套关系请参考 Helm Version Support Policy ,执行以下命令,修改DESIRED_VERSION环境变量为需要安装的Helm版本,并执行安装命令。

    DESIRED_VERSION=v3.9.0 ./get_helm.sh
    
  4. 执行以下命令,查看指定版本的Helm 3是否安装成功。

    helm version
    

    命令结果示例如下,说明安装成功。

    version.BuildInfo{Version:"v3.9.0", GitCommit:"7ceeda6c585217a19a1131663d8cd1f7d641b2a7", GitTreeState:"clean", GoVersion:"go1.17.5"}
    

2 - 信息收集

2.1 - 如何获取CSI版本信息

本章节指导用户如何查看CSI版本信息。

操作步骤

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

  2. 执行以下命令,查看huawei-csi-node所在节点信息。

    kubectl get pod -A  -owide | grep huawei-csi-node
    

    命令结果示例如下:

    NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE     IP               NODE            NOMINATED NODE   READINESS GATES
    huawei-csi    huawei-csi-node-87mss                      3/3     Running   0               6m41s   192.168.129.155      node-1          <none>           <none>
    huawei-csi    huawei-csi-node-xp8cc                      3/3     Running   0               6m41s   192.168.129.156      node-2          <none>           <none
    
  3. 使用远程访问工具(以PuTTY为例),通过节点IP地址,登录任意huawei-csi-node所在节点。

  4. 执行以下命令,查看CSI版本信息。

    cat /var/lib/kubelet/plugins/csi.huawei.com/version
    

    命令显示版本信息如下。

    4.9.0
    

2.2 - 如何查看华为CSI日志

查看huawei-csi-controller服务的日志

  1. 执行以下命令,获取huawei-csi-controller所在的节点

    kubectl get pod -A -o wide | grep huawei
    

    命令结果示例如下,其中IP为节点主机IP地址,NODE为节点主机名称。

    NAME                                    READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
    huawei-csi-controller-695b84b4d8-tg64l  9/9     Running  0          14s     <host1-ip>     <host1-name> <none>           <none>
    
  2. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群中huawei-csi-controller服务所在节点

  3. 进入日志目录。

    cd /var/log/huawei
    
  4. 执行以下命令,查看容器自定义输出日志。

    vi huawei-csi-controller
    
  5. 进入容器目录。

    cd /var/log/containers
    
  6. 执行以下命令, 查看容器标准输出日志。

    vi huawei-csi-controller-<name>_huawei-csi_huawei-csi-driver-<container-id>.log
    

查看huawei-csi-node服务的日志

  1. 执行以下命令,获取huawei-csi-node所在的节点

    kubectl get pod -A -o wide | grep huawei
    

    命令结果示例如下,其中IP为节点主机IP地址,NODE为节点主机名称。

    NAME                     READY   STATUS    RESTARTS   AGE     IP             NODE         NOMINATED NODE   READINESS GATES
    huawei-csi-node-g6f7z    3/3     Running  0          14s     <host2-ip>     <host2-name> <none>           <none>
    
  2. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录Kubernetes集群中huawei-csi-node服务所在节点

  3. 进入日志目录。

    cd /var/log/huawei
    
  4. 执行以下命令,查看容器自定义输出日志。

    vi huawei-csi-node
    
  5. 进入容器目录。

    cd /var/log/containers
    
  6. 执行以下命令, 查看容器标准输出日志。

    vi huawei-csi-node-<name>_huawei-csi_huawei-csi-driver-<container-id>.log
    

2.3 - 日志收集

前置检查

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

  2. 执行以下命令,显示版本号为v4.9.0

    oceanctl version
    

    命令结果示例如下:

    Oceanctl Version: v4.9.0
    
  3. 执行oceanctl collect logs –help命令,返回信息如下。

    $ oceanctl collect logs --help
    Collect logs of one or more nodes in specified namespace in Kubernetes
    
    Usage:
      oceanctl collect logs [flags]
    
    Examples:
      # Collect logs of all nodes in specified namespace
      oceanctl collect logs -n <namespace>
    
      # Collect logs of specified node in specified namespace
      oceanctl collect logs -n <namespace> -N <node>
    
      # Collect logs of all nodes in specified namespace
      oceanctl collect logs -n <namespace> -a
    
      # Collect logs of all nodes in specified namespace with a maximum of 50 nodes collected at the same time
      oceanctl collect logs -n <namespace> -a --threads-max=50
    
      # Collect logs of specified node in specified namespace
      oceanctl collect logs -n <namespace> -N <node> -a
    
    Flags:
      -a, --all                Collect all nodes messages
      -h, --help               help for logs
      -n, --namespace string   namespace of resources
      -N, --nodename string    Specify the node for which information is to be collected.
          --threads-max int    set maximum number[1~1000] of threads for nodes to be collected. (default 50)
    
    Global Flags:
          --log-dir string   Specify the directory for printing log files. (default "/var/log/huawei")
    
  4. 执行以下命令,检查Pod是否正常启动,其中,huawei-csi为CSI安装的命名空间。

    kubectl get deployment -n huawei-csi
    

    命令结果示例如下:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    huawei-csi-controller   1/1     1            1           21h
    

使用oceanctl收集CSI命名空间下所有日志

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录 前置检查 章节中检查的节点。

  2. 执行oceanctl collect logs -n <namespace> -a –threads-max=<max_node_processing_num>命令,收集集群内所有CSI容器所在节点的CSI日志,其中threads-max参数指定了同时收集日志的最大节点数量,默认为50,可以根据主机性能与负载情况配置。

    oceanctl collect logs -n huawei-csi -a --threads-max=10
    
  3. 检查/tmp目录下生成的日志压缩包,可以使用unzip <zip_name> -d collect_logs解压日志压缩包,其中<zip_name>为压缩包的名字。

    # date
    Wed Sep 20 02:49:24 EDT 2023
    
    # ls
    huawei-csi-2023-09-20-02:48:22-all.zip
    

使用oceanctl收集CSI单个节点日志

  1. 使用远程访问工具(以PuTTY为例),通过管理IP地址,登录 前置检查 章节中检查的节点。

  2. 执行oceanctl collect logs -n <namespace> -N <nodeName>命令,收集集群内所有CSI容器所在节点的CSI日志。

    oceanctl collect logs -n huawei-csi -N node-1
    
  3. 检查/tmp目录下生成的日志压缩包,可以使用unzip <zip_name> -d collect_logs解压日志压缩包,其中<zip_name>为压缩包的名字。

    # date
    Thu Sep 21 04:08:47 EDT 2023
    
    # ls
    huawei-csi-2023-09-21-04:05:15-node-1.zip
    

3 - 下载容器镜像

使用containerd下载容器镜像

  1. 执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉取的镜像及其标签。

    ctr image pull <image>:<tag>
    
  2. 执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。

    ctr image export <file>.tar <image>:<tag>
    

使用Docker下载容器镜像

  1. 执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉去的镜像。

    docker pull <image>:<tag>
    
  2. 执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。

    docker save <image>:<tag> -o <file>.tar
    

使用Podman下载容器镜像

  1. 执行以下命令,下载镜像到本地。其中 image:tag 表示需要拉去的镜像。

    podman pull <image>:<tag>
    
  2. 执行以下命令,导出镜像到文件。其中 image:tag 表示需要导出的镜像,file 表示镜像导出后的文件名称。

    podman save <image>:<tag> -o <file>.tar 
    

4 - 更新huawei-csi-controller或huawei-csi-node服务

当您需要更新huawei-csi-controller或huawei-csi-node服务时,例如修改huawei-csi-controller服务的副本数时,执行此操作。

操作步骤

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

  2. 进入/helm/esdk 目录,执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。组件包路径请参考 表1

    helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
    
  3. 执行 vi update-values.yaml 命令打开 2 中获取的文件,参考 Helm values.yaml参数说明 修改配置项,修改完成后,按Esc,并输入 :wq!,保存修改。

  4. 执行以下命令更新华为CSI服务。

    helm upgrade helm-huawei-csi ./ -n huawei-csi  -f ./update-values.yaml
    

5 - 修改日志输出模式

huawei-csi支持两种日志输出模式,分别是file和console。file指的是输出到固定的日志目录(例如:/var/log/huawei);console指的是输出到容器标准目录。用户可以根据自身需求自行设置日志输出模式,默认为file.

操作步骤

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

  2. 进入/helm/esdk 目录,执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。组件包路径请参考 表1

    helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
    
  3. 执行vi update-values.yaml命令打开 2 中获取的文件,修改配置项,修改完成后,按Esc,并输入 :wq!,保存修改。

    # The CSI driver parameter configuration
    csiDriver:
      # Driver name, it is strongly recommended not to modify this parameter
      # The CCE platform needs to modify this parameter, e.g. csi.oceanstor.com
      driverName: csi.huawei.com
      # Endpoint, it is strongly recommended not to modify this parameter
      endpoint: /csi/csi.sock
      # DR Endpoint, it is strongly recommended not to modify this parameter
      drEndpoint: /csi/dr-csi.sock
      # Maximum number of concurrent disk scans or detaches, support 1~10
      connectorThreads: 4
      # Flag to enable or disable volume multipath access, support [true, false]
      volumeUseMultipath: true
      # Multipath software used by fc/iscsi. support [DM-multipath, HW-UltraPath, HW-UltraPath-NVMe]
      scsiMultipathType: DM-multipath
      # Multipath software used by roce/fc-nvme. only support [HW-UltraPath-NVMe]
      nvmeMultipathType: HW-UltraPath-NVMe
      # Timeout interval for waiting for multipath aggregation when DM-multipath is used on the host. support 1~600
      scanVolumeTimeout: 3
      # Timeout interval for running command on the host. support 1~600
      execCommandTimeout: 30
      # check the number of paths for multipath aggregation
      # Allowed values:
      #   true: the number of paths aggregated by DM-multipath is equal to the number of online paths
      #   false: the number of paths aggregated by DM-multipath is not checked.
      # Default value: false
      allPathOnline: false
      # Interval for updating backend capabilities. support 60~600
      backendUpdateInterval: 60
      # Huawei-csi-controller log configuration
      controllerLogging:
        # Log record type, support [file, console]
        module: file
        # Log Level, support [debug, info, warning, error, fatal]
        level: info
        # Directory for storing logs
        fileDir: /var/log/huawei
        # Size of a single log file
        fileSize: 20M
        # Maximum number of log files that can be backed up.
        maxBackups: 9
      # Huawei-csi-node log configuration
      nodeLogging:
        # Log record type, support [file, console]
        module: file
        # Log Level, support [debug, info, warning, error, fatal]
        level: info
        # Directory for storing logs
        fileDir: /var/log/huawei
        # Size of a single log file
        fileSize: 20M
        # Maximum number of log files that can be backed up.
        maxBackups: 9
    
  4. 执行以下命令更新日志配置。

    helm upgrade helm-huawei-csi ./ -n huawei-csi  -f ./update-values.yaml
    

6 - 开启ReadWriteOncePod功能门

ReadWriteOnce访问模式是Kubernetes v1.22版本为PV和PVC引入的第四种访问模式。如果您使用ReadWriteOncePod访问模式的PVC创建一个Pod,Kubernetes会确保该Pod是整个集群中唯一可以读取或写入该PVC的Pod。

若Kubernetes版本小于v1.29,需要先在kube-apiserver、kube-scheduler和kubelet的feature-gates中开启ReadWriteOncePod特性才能使用。


当前CCE或CCE Agile平台不支持开启ReadWriteOncePod功能门

操作步骤

  1. 为kube-apiserver启用ReadWriteOncePod功能门。

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

    2. 执行vi /etc/kubernetes/manifests/kube-apiserver.yaml命令,按IInsert进入编辑状态,为 kube-apiserver容器添加参数–feature-gates=ReadWriteOncePod=true。修改完成后,按Esc,并输入 :wq!,保存修改。

      ...
      spec:
        containers:
        - command:
          - kube-apiserver
          - --feature-gates=ReadWriteOncePod=true
          ...
      


      在编辑完成后,Kubernetes会自动应用更新,不需要手动更新。

  2. 为kube-scheduler启用ReadWriteOncePod功能门。

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

    2. 执行vi /etc/kubernetes/manifests/kube-scheduler.yaml命令,按IInsert进入编辑状态,为kube-scheduler容器添加参数–feature-gates=ReadWriteOncePod=true。修改完成后,按Esc,并输入 :wq!,保存修改。

      spec:
        containers:
        - command:
          - kube-scheduler
          - --feature-gates=ReadWriteOncePod=true
          ...
      


      在编辑完成后,Kubernetes会自动应用更新,不需要手动更新。

  3. 为kubelet启用ReadWriteOncePod功能门。


    由于动态Kubelet配置功能在v1.22中已弃用,并且在v1.24中删除,因此集群中每个worker节点上的kubelet都需要执行以下操作。

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

    2. 执行vi /var/lib/kubelet/config.yaml命令,按IInsert进入编辑状态,为KubeletConfiguration对象的featureGates字段添加ReadWriteOncePod: true,如果没有featureGates字段请一并添加。修改完成后,按Esc,并输入 :wq!,保存修改。

      apiVersion: kubelet.config.k8s.io/v1beta1
      featureGates:
        ReadWriteOncePod: true
        ...
      


      kubelet配置文件的默认路径为/var/lib/kubelet/config.yaml,请根据实际情况填写。

    3. 在配置完成后,执行systemctl restart kubelet命令重启kubelet。

7 - 配置非root用户访问Kubernetes集群

操作步骤

  1. 拷贝Kubernetes集群的认证文件,/etc/kubernetes/admin.conf修改为实际使用的认证文件。

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
  2. 修改认证文件的用户与用户组。

    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  3. 配置当前用户的KUBECONFIG环境变量,以Ubuntu 20.04举例如下。

    echo "export KUBECONFIG=$HOME/.kube/config" >> ~/.bashrc
    source ~/.bashrc
    

8 - 配置IPv6

本章节介绍如何使用华为CSI完成IPv6的配置。

8.1 - 首次安装华为CSI时配置IPv6

本章节介绍首次安装华为CSI时如何指定IPv6。

前提条件

  • 仅存储后端类型为oceanstor-nas、oceanstor-san和oceanstor-dtree时,支持配置为IPv6。
  • 主机环境、Kubernetes集群环境已支持IPv6协议。可参考 Kubernetes官方IPv4/IPv6双栈配置

操作步骤

  1. 参考 安装步骤 章节执行 1 ~ 7 ,完成CSI依赖组件的安装。

  2. 执行vi values.yaml命令打开配置文件,修改service.ipFamilyPolicy和service.ipFamilies配置项,具体参数描述见 表5

    修改示例如下:

    service:
      ipFamilyPolicy: SingleStack
      ipFamilies:
        - IPv6
    
  3. 参考 安装步骤 章节执行 8 ~ 9 ,完成华为CSI的安装部署。

  4. 执行以下命令查看huawei-csi命名空间下service的状态。

    kubectl get service -n huawei-csi
    

    命令结果示例如下:

    NAME                    TYPE        CLUSTER-IP         EXTERNAL-IP   PORT(S)    AGE
    huawei-csi-controller   ClusterIP   fd00:10:96::8136   <none>        4433/TCP   19m
    
  5. 执行以下命令查看huawei-csi-controller service的ipFamilies字段值。

    kubectl get svc -n huawei-csi huawei-csi-controller -o=jsonpath='{.spec.ipFamilies}'
    

    命令结果示例如下:

    ["IPv6"]
    
  6. 执行以下命令查看huawei-csi-controller service的ipFamilyPolicy字段值。

    kubectl get svc -n huawei-csi huawei-csi-controller -o=jsonpath='{.spec.ipFamilyPolicy}'
    

    命令结果示例如下:

    SingleStack
    

8.2 - 华为CSI由IPv4切换至IPv6

本章节介绍更新华为CSI时如何由IPv4切换为IPv6。

前提条件

操作步骤

  1. 执行以下命令,获取原有服务配置文件。其中helm-huawei-csi为旧版本安装时指定的Helm Chart名称,huawei-csi为旧版本安装时指定的Helm Chart命名空间。

    helm get values helm-huawei-csi -n huawei-csi -a > ./update-values.yaml
    
  2. 执行vi update-values.yaml命令打开 1 中获取的文件,修改service.ipFamilyPolicy和service.ipFamilies配置项,具体参数描述见 表5

    修改示例如下:

    service:
      ipFamilyPolicy: SingleStack
      ipFamilies:
        - IPv6
    
  3. 切换IPv6前,先执行以下命令,删除huawei-csi命名空间下的service。

    kubectl delete service -n huawei-csi --all
    
  4. 执行以下命令,升级华为CSI。其中helm-huawei-csi为指定的Helm Chart名称,huawei-csi为指定的Helm Chart命名空间,update-values.yaml为 1 中获取的文件。

    helm upgrade helm-huawei-csi ./ -n huawei-csi -f ./values.yaml -f ./update-values.yaml
    
  5. 执行以下命令查询更新后的huawei-csi-controller service的ipFamilies参数。

    kubectl get svc -n huawei-csi huawei-csi-controller -o=jsonpath='{.spec.ipFamilies}'
    

    预期结果如下:

    ["IPv6"]
    

9 - 配置存储拓扑感知

在Kubernetes集群中,可以根据节点的拓扑标签以及存储后端支持的拓扑能力调度和发放资源。

前提条件

需要在集群中的worker节点完成拓扑的标签配置,标签配置方法如下:

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

  2. 执行以下命令,查看当前集群中的worker节点信息。

    kubectl get node
    

    命令结果示例如下:

    NAME     STATUS   ROLES                      AGE   VERSION
    node01   Ready    controlplane,etcd,worker   42d   v1.22.3
    node02   Ready    worker                     42d   v1.22.3
    node03   Ready    worker                     42d   v1.22.3
    
  3. 执行以下命令,给worker节点配置拓扑标签。其中_ nodename _为worker节点名称, key 和 value 参数说明请参考 表1

    kubectl label node <nodename> <key>=<value>
    

    表 1 拓扑标签参数说明

    参数名

    参数描述

    备注

    <key>

    拓扑标签的唯一标识。

    可支持配置:zone,region,protocol.<protocol>

    其中<protocol>可支持配置iscsi, nfs, fc, roce。

    <value>

    拓扑标签的参数值。

    “key”如果是“zone”“region”“value”值为自定义参数。

    “key”如果是protocol.<protocol>“value”值固定为“csi.huawei.com”

    • 拓扑标签必须以topology.kubernetes.io开头。拓扑标签示例:
    • 示例1:topology.kubernetes.io/region=China-west
    • 示例2:topology.kubernetes.io/zone=ChengDu
    • 示例3:topology.kubernetes.io/protocol.iscsi=csi.huawei.com
    • 示例4:topology.kubernetes.io/protocol.fc=csi.huawei.com
    • 同一节点上拓扑标签中同一个key只能支持一个value值。
    • 如果同一节点上拓扑标签中同时配置多个protocol,配置StorageClass时,StorageClass只需要满足其中一个protocol即可。
    • 如果同一节点上拓扑标签中同时配置region和zone,配置StorageClass时,StorageClass需要满足全部筛选条件。
  4. 执行命令, 查看当前集群中所有worker节点的标签信息。

    kubectl get nodes -o=jsonpath='{range .items[*]}[{.metadata.name}, {.metadata.labels}]{"\n"}{end}' | grep --color "topology.kubernetes.io"
    

    命令结果示例如下:

    [node01,"beta.kubernetes.io/arch":"amd64","beta.kubernetes.io/os":"linux","kubernetes.io/arch":"amd64","kubernetes.io/hostname":"node01","kubernetes.io/os":"linux","node-role.kubernetes.io/controlplane":"true","node-role.kubernetes.io/etcd":"true","node-role.kubernetes.io/worker":"true","topology.kubernetes.io/zone":"ChengDu"}]
    

操作步骤

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

  2. 进入Helm工程的目录下,如果无法找到之前的Helm工程,则将组件包中的helm目录拷贝到master节点的任意目录下,组件包路径请参考 表1

  3. 进入后端服务配置目录/examples/backend/下,备份backend.yaml文件

    cp backend.yaml backend.yaml.bak
    
  4. 执行 vi backend.yaml 命令打开文件,按需求配置拓扑感知,示例如下所示。修改完成后,按 Esc 并输入 :wq! ,保存修改。

    storage: "oceanstor-san"
    name: "dorado-iscsi-155"
    namespace: "huawei-csi"
    urls:
      - "https://192.168.129.155:8088"
    pools:
      - "StoragePool001"
    parameters:
      protocol: "iscsi"
      portals:
        - "10.10.30.20"
        - "10.10.30.21"
    supportedTopologies:
      - { "topology.kubernetes.io/region": "China-west", "topology.kubernetes.io/zone": "ChengDu" }
      - { "topology.kubernetes.io/region": "China-south","topology.kubernetes.io/zone": "ShenZhen" }
    maxClientThreads: "30"
    
  5. 执行以下命令删除待修改存储后端,其中“dorado-iscsi-155”为存储后端名称。

    oceanctl delete backend dorado-iscsi-155 -n huawei-csi
    
  6. 执行以下命令创建存储后端。

    oceanctl create backend -f ../examples/backend/backend.yaml -i yaml
    

    根据命令提示输入存储用户名和密码。

    Please enter this backend user name:admin
    Please enter this backend password:
    
  7. 执行** vi StorageClass.yaml** 命令,修改yaml文件。按 IInsert 进入编辑状态,在yaml文件下增加相关参数,详细参数说明请参见 表2 。修改完成后,按 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
      

    表 2 StorageClass参数说明

    参数名

    参数描述

    备注

    volumeBindingMode

    PersistentVolume绑定方式,用于控制何时进行PersistentVolume动态资源调配和绑定。

    可配置“WaitForFirstConsumer”“Immediate”

    “WaitForFirstConsumer”:表示延迟PersistentVolume的绑定和调配,直到创建使用PVC的Pod。

    “Immediate”:表示创建PVC后,立即发生PersistentVolume绑定和调配。

    allowedTopologies.matchLabelExpressions

    拓扑信息标签,用于过滤CSI后端和Kubernetes节点。如果匹配失败,会导致PVC或Pod无法创建。

    配置时需要同时按照固定格式配置“key”“value”.

    “key”:可支持配置“topology.kubernetes.io/zone”“topology.kubernetes.io/region”

    topology.kubernetes.io/protocol.<protocol>, 其中<protocol>为协议类型, 例如:iscsi, fc, nfs等。

    “value”

    “key”如果是“topology.kubernetes.io/zone”“topology.kubernetes.io/region”“value”值需要和前提条件中设置的拓扑标签保持一致。

    “key”如果是topology.kubernetes.io/protocol.<protocol>“value”值固定为“csi.huawei.com”

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

    kubectl create -f StorgeClass.yaml
    
  9. 使用该StorageClass创建具有拓扑能力的PVC,详细操作请参考 表1

10 - 配置ALUA特性

ALUA(Asymmetric Logical Unit Access,非对称逻辑单元访问),是一种多目标器端口访问模型。在多路径状态下,ALUA标准提供了一种将卷的Active/Passive模型呈现给主机的方式。同时还提供了端口的可访问状态切换接口,可用来实现卷工作控制器切换等。例如,卷在一个控制器故障时,可以将该控制器的端口置为Unavailable,支持ALUA的主机多路径软件收到该状态后,会将I/O切换到另一端控制器。

10.1 - 配置华为企业存储后端的ALUA参数

华为企业存储针对ALUA的配置请参考产品对应的主机连通性指南文档说明。

针对不同的操作系统,ALUA配置可能有所不同。进入 华为技术支持 ,在搜索输入框中输入“主机连通性指南”,单击搜索。在搜索结果中,选择对应操作系统的主机连通性指南。结合实际需要根据指南的说明进行ALUA配置。华为CSI将在华为存储上对该主机的启动器应用您设置的配置项。


已经发放的Pod的节点不会主动更改ALUA信息,需要通过在该节点重新发放Pod才会变更主机ALUA配置。

OceanStor V5系列系列存储后端的ALUA参数

华为CSI支持的OceanStor V5系列存储的ALUA参数见 表1

表 1 华为CSI支持的OceanStor V5系列存储的ALUA参数说明

参数名

参数描述

备注

HostName

主机名规则。必填,可使用正则表达式。

主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》

当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则

MULTIPATHTYPE

多路径类型。必填,取值为:

  • 0:不使用第三方多路径
  • 1:使用第三方多路径

--

FAILOVERMODE

启动器的切换模式。条件必选,取值为:

  • 0:旧版本ALUA
  • 1:通用ALUA
  • 2:不使用ALUA
  • 3:特殊模式ALUA

当使用第三方多路径时该参数才需要指定。请参考连通性指南的说明,配置启动器的切换模式。

SPECIALMODETYPE

启动器的特殊模式类型。条件必选,取值为:

  • 0:特殊模式0
  • 1:特殊模式1
  • 2:特殊模式2
  • 3:特殊模式3

当启动器的切换模式为“特殊模式ALUA”时该参数才需要指定。请参考连通性指南的说明,配置启动器的特殊模式类型。

PATHTYPE

启动器的路径类型。条件必选,取值为:

  • 0:优选路径
  • 1:非优选路径

当使用第三方多路径时该参数才需要指定。请参考连通性指南的说明,配置启动器的路径类型。

以OceanStor 18500 V5存储对接Red Hat操作系统为例,主机连通性指南见《华为SAN存储在Red Hat系统下的主机连通性指南》。

如下ALUA设置示例,是非双活存储场景下,OceanStor 18500 V5存储的Red Hat操作系统的连通性指南的推荐设置。本例中假设Kubernetes集群中计算节点“myhost01”的操作系统是RHEL 5.x,其他计算节点操作系统均为RHEL 7.x。根据推荐,RHEL 5.x的切换模式应该为“不使用ALUA”,RHEL 7.x的切换模式应该为“通用ALUA”。

storage: oceanstor-san
name: oceanstor-iscsi-155
urls:
  - https://192.168.129.155:8088
  - https://192.168.129.156:8088
pools:
  - StoragePool001
parameters:
  protocol: iscsi
  portals:
    - 192.168.128.120
    - 192.168.128.121
  ALUA:
    ^myhost01$:
      MULTIPATHTYPE: 1
      FAILOVERMODE: 2
      PATHTYPE: 0
    "*":
      MULTIPATHTYPE: 1
      FAILOVERMODE: 1
      PATHTYPE: 0

OceanStor和OceanStor Dorado系列存储后端的ALUA参数

华为CSI支持的OceanStor和OceanStor Dorado系列存储的ALUA参数见 表2


OceanStor和OceanStor Dorado系列存储在默认情况下启动器主机访问模式为“均衡模式”,因此不建议对OceanStor和OceanStor Dorado系列存储配置ALUA参数。

表 2 OceanStor和OceanStor Dorado系列存储的ALUA参数说明

参数名

参数描述

备注

HostName

主机名规则。必填,可使用正则表达式。

主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》

当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则

accessMode

主机访问模式。必填,取值为:

  • 0:均衡模式
  • 1:非对称模式

非双活场景下建议使用均衡模式。当前华为CSI未支持SAN双活场景,请谨慎使用非对称模式。

hyperMetroPathOptimized

双活场景下,主机在当前阵列的路径是否优选。取值为:

  • 1:是
  • 0:否

当主机访问模式设置为非对称模式时,才需要配置该参数。

当前华为CSI未支持SAN双活场景,请谨慎使用非对称模式。

以OceanStor Dorado 18500存储对接Red Hat操作系统为例,主机连通性指南见《OceanStor Dorado & OceanStor在Red Hat下的主机连通性指南》。

如下ALUA设置示例,是非双活存储场景下,OceanStor Dorado 18500存储的Red Hat操作系统的连通性指南的推荐设置。

storage: "oceanstor-san"
name: "dorado-iscsi-155"
urls:
  - "https://192.168.129.155:8088"
  - "https://192.168.129.156:8088"
pools:
  - "StoragePool001"
parameters:
  protocol: "iscsi"
  portals:
    - "192.168.128.120"
    - "192.168.128.121"
  ALUA:
    "*":
      accessMode: 0

ALUA配置项匹配主机名的规则

  • 如果设置的主机名规则精确匹配的业务节点主机名,则使用该主机名规则对应的ALUA配置项。

    如配置项1中主机名规则为“*”,配置项2中的主机名规则为“^myhost01$”。当计算节点的主机名是“myhost01”时,精确匹配配置项2,华为CSI将使用配置项2中的配置应用到存储侧。

  • 如果设置的主机名规则无法精确匹配的业务节点主机名,则直接使用正则匹配到的第一条ALUA配置项。

    如配置项1中主机名规则为“myhost0[0-9]”,配置项2中的主机名规则为“myhost0[5-9]”,配置项1的优先级高于配置项2。当计算节点的主机名是“myhost06”时,两个配置项均可以匹配,此时华为CSI将使用配置项1中的配置应用到存储侧。

10.2 - 配置分布式存储后端的ALUA参数

华为分布式存储针对ALUA的配置请参考产品对应的主机连通性指南文档说明。

针对不同的操作系统,ALUA配置可能有所不同。进入 华为技术支持 ,在搜索输入框中输入“主机连通性指南”,单击搜索。在搜索结果中,选择对应操作系统的主机连通性指南。结合实际需要根据指南的说明进行ALUA配置。华为CSI将在华为存储上对该主机的启动器应用您设置的配置项。


已经发放的Pod的节点不会主动更改ALUA信息,需要通过在该节点重新发放Pod才会变更主机ALUA配置。 分布式存储非双活场景,存储系统自身为Active/Active模式,选择“启用ALUA”没有实际意义,建议选择存储默认的“禁用ALUA”。因此不建议对分布式存储配置ALUA参数。

华为CSI支持的分布式存储的ALUA参数见 表1

表 1 分布式存储ALUA参数说明

参数名

参数描述

备注

HostName

HostName的值为worker节点的主机名,如HostName1、HostName2。

主机名通常使用 cat /etc/hostname 可获取。支持正则表达式方式匹配,如当HostName=“*”时,该条配置对任意主机名的主机生效。可参考《正则表达式》

当计算节点的主机名可已匹配多条ALUA配置选项,会根据匹配的精确度进行排序,使用第一条ALUA配置选项。排序规则见ALUA配置项匹配主机名的规则

switchoverMode

切换模式。必选,取值为:

  • Disable_alua:禁用ALUA
  • Enable_alua:启用ALUA

非双活场景,存储系统自身为Active/Active模式,选择“启用ALUA”没有实际意义,建议选择“禁用ALUA”。当前华为CSI未支持SAN双活场景,请谨慎启用ALUA。

pathType

路径类型。条件必选,取值为:

  • optimal_path:优选路径
  • non_optimal_path:非优选路径

切换模式为启动ALUA时需要设置该选项。

ALUA配置项匹配主机名的规则

  • 如果设置的主机名规则精确匹配的业务节点主机名,则使用该主机名规则对应的ALUA配置项。

    如配置项1中主机名规则为“*”,配置项2中的主机名规则为“^myhost01$”。当计算节点的主机名是“myhost01”时,精确匹配配置项2,华为CSI将使用配置项2中的配置应用到存储侧。

  • 如果设置的主机名规则无法精确匹配的业务节点主机名,则直接使用正则匹配到的第一条ALUA配置项。

    如配置项1中主机名规则为“myhost0[0-9]”,配置项2中的主机名规则为“myhost0[5-9]”,配置项1的优先级高于配置项2。当计算节点的主机名是“myhost06”时,两个配置项均可以匹配,此时华为CSI将使用配置项1中的配置应用到存储侧。

10.3 - OceanStor V5系列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配置段来配置启动器。^表示匹配字符串的开头,$表示匹配字符串的结尾。

10.4 - 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配置段来配置启动器。^表示匹配字符串的开头,$表示匹配字符串的结尾。

10.5 - 分布式存储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配置段来配置启动器。^表示匹配字符串的开头,$表示匹配字符串的结尾。