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.7.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.7.0

    oceanctl version

    命令结果示例如下:

    Oceanctl Version: v4.7.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