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.5.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-<contrainer-id>.log
    

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

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

    kubectl get pod -A -o wide | grep huawei
    

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

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

  3. 进入日志目录。

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

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

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

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

2.3 - 日志收集

前置检查

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

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

    oceanctl version
    

    命令结果示例如下:

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

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

    kubectl get deployment -n huawei-csi
    

    命令结果示例如下:

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

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

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

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

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

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

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

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

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

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

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

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命名空间。组件包路径请参考表 软件包组件描述

    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命名空间。组件包路径请参考表 软件包组件描述

    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。

由于ReadWriteOncePod访问模式在当前已发布的Kubernetes v1.22/1.23/1.24版本中是alpha特性,需要先在kube-apiserver、kube-scheduler和kubelet的feature-gates中开启ReadWriteOncePod特性才能使用。

CCE / CCE Agile平台暂时不支持开启ReadWriteOncePod功能门

操作步骤

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

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

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

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

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

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

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

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

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

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

  3. 为kubelet启用ReadWriteOncePod功能门。


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

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

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

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

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

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

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