本文主要为您介绍节点管理常见问题。

如何在已有集群的GPU节点上手动升级Kernel?

下面为您介绍如何在已有集群的GPU节点上手动升级Kernel。
说明 当前kernel版本低于3.10.0-957.21.3

请确认需要升级的目标kernel版本,并谨慎操作。

本文提供方案并不涉及kernel升级,仅针对在kernel升级的前提下对应的Nvidia驱动升级。

  1. 通过kubectl工具连接集群
  2. 将GPU节点设置为不可调度(本例以节点 cn-beijing.i-2ze19qyi8votgjz12345为例)。
    kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
  3. 将要升级驱动的GPU节点进行排水。
    kubectl drain cn-beijing.i-2ze19qyi8votgjz12345 --grace-period=120 --ignore-daemonsets=true
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 cordoned
    WARNING: Ignoring DaemonSet-managed pods: flexvolume-9scb4, kube-flannel-ds-r2qmh, kube-proxy-worker-l62sf, logtail-ds-f9vbg
    pod/nginx-ingress-controller-78d847fb96-5fkkw evicted
  4. 卸载当前的nvidia-driver。
    说明 本步骤中卸载的是版本为384.111的驱动包,如果您的驱动版本不是384.111,则需要在Nvidia官网下载对应的驱动安装包,并将本步骤中的384.111替换成您实际的版本。
    1. 登录到该GPU节点,通过nvidia-smi查看驱动版本。
      nvidia-smi -a | grep 'Driver Version'
      Driver Version                      : 384.111
    2. 下载Nvidia驱动安装包。
      cd /tmp/
      curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run
      说明 需要在安装包中卸载Nvidia。
    3. 卸载当前Nvidia驱动。
      chmod u+x NVIDIA-Linux-x86_64-384.111.run
      ./NVIDIA-Linux-x86_64-384.111.run --uninstall -a -s -q
  5. 升级Kernel。
    您可以根据需要升级Kernel。
  6. 重启GPU机器。
    reboot
  7. 重新登录GPU节点,安装对应的kernel devel。
    yum install -y kernel-devel-$(uname -r)
  8. 请到Nvidia官网下载和安装您需要的nvidia驱动, 本文以410.79为例。
    cd /tmp/
    curl -O https://cn.download.nvidia.cn/tesla/410.79/NVIDIA-Linux-x86_64-410.79.run
    chmod u+x NVIDIA-Linux-x86_64-410.79.run
    sh ./NVIDIA-Linux-x86_64-410.79.run -a -s -q
    
    warm up GPU
    nvidia-smi -pm 1 || true
    nvidia-smi -acp 0 || true
    nvidia-smi --auto-boost-default=0 || true
    nvidia-smi --auto-boost-permission=0 || true
    nvidia-modprobe -u -c=0 -m || true
  9. 查看 /etc/rc.d/rc.local,确认其中是否包含以下配置,如果没有请手动添加。
    nvidia-smi -pm 1 || true
    nvidia-smi -acp 0 || true
    nvidia-smi --auto-boost-default=0 || true
    nvidia-smi --auto-boost-permission=0 || true
    nvidia-modprobe -u -c=0 -m || true
  10. 重启kubelet和docker。
    service kubelet stop
    service docker restart
    service kubelet start
  11. 将这个GPU节点重新设置为可调度。
    kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
  12. 在GPU节点上的device plugin pod验证版本。
    kubectl exec -n kube-system -t nvidia-device-plugin-cn-beijing.i-2ze19qyi8votgjz12345 nvidia-smi
    Thu Jan 17 00:33:27 2019
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 410.79       Driver Version: 410.79       CUDA Version: N/A      |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla P100-PCIE...  On   | 00000000:00:09.0 Off |                    0 |
    | N/A   27C    P0    28W / 250W |      0MiB / 16280MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    说明 如果通过docker ps命令,发现GPU节点没有容器被启动,请参见修复GPU节点容器启动问题

修复GPU节点容器启动问题

在某些特定Kubernetes版本中的GPU节点上,重启Kubelet和Docker时,发现没有容器被启动。
service kubelet stop
Redirecting to /bin/systemctl stop kubelet.service
service docker stop
Redirecting to /bin/systemctl stop docker.service
service docker start
Redirecting to /bin/systemctl start docker.service
service kubelet start
Redirecting to /bin/systemctl start kubelet.service

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
执行以下命令,查看Docker的Cgroup Driver。
docker info | grep -i cgroup
Cgroup Driver: cgroupfs
此时发现的Cgroup Driver类型是cgroupfs。

您可以按照以下操作,修复该问题。

  1. 备份/etc/docker/daemon.json,完成后,执行以下命令更新/etc/docker/daemon.json
    cat >/etc/docker/daemon.json <<-EOF
    {
        "default-runtime": "nvidia",
        "runtimes": {
            "nvidia": {
                "path": "/usr/bin/nvidia-container-runtime",
                "runtimeArgs": []
            }
        },
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
            "max-size": "100m",
            "max-file": "10"
        },
        "oom-score-adjust": -1000,
        "storage-driver": "overlay2",
        "storage-opts":["overlay2.override_kernel_check=true"],
        "live-restore": true
    }
    EOF
  2. 执行以下命令,重启Docker和Kubelet。
    service kubelet stop
    Redirecting to /bin/systemctl stop kubelet.service
    service docker restart
    Redirecting to /bin/systemctl restart docker.service
    service kubelet start
    Redirecting to /bin/systemctl start kubelet.service
  3. 执行以下命令,确认Docker的Cgroup Driver的类型为systemd。
    docker info | grep -i cgroup
    Cgroup Driver: systemd

如何更改ACK集群中Worker节点的主机名称?

集群创建完成后,不支持自定义Worker节点的主机名称,但是您可以通过节点池的节点命名规则来修改Worker节点的主机名称。
说明 创建集群时,您可以在自定义节点名称参数中定义Worker节点的主机名称。具体操作,请参见创建Kubernetes托管版集群
  1. 移除节点。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 在集群管理页左侧导航栏中,选择节点管理 > 节点
    4. 节点页面单击目标节点右侧操作列下的更多 > 移除
    5. 在弹出的对话框中选中我已了解上述说明,确认移除节点,然后单击确定
  2. 将移除的节点再添加到节点池。具体操作,请参见手动添加节点
    添加的节点将根据节点池的节点命名规则进行命名。

如何更换节点池OS镜像?

更换为相同OS类型

注意 操作系统属性只会对新加入的节点生效。

如果是相同OS类型,例如由一个旧版本CentOS更换为新版本的CentOS, 您可以直接通过编辑节点池更换OS镜像。但修改完节点池镜像之后,只对新增节点生效。如果需要更新已有节点的镜像,还需要手动对节点进行轮转。

  1. 更换OS镜像。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 在集群管理页左侧导航栏中,选择节点管理 > 节点池
    4. 在目标节点池右侧的操作列中,单击编辑
    5. 在编辑节点池对话框中,修改操作系统为最新的操作系统,然后单击确认
  2. 扩容节点池。
    为了避免水位过高影响节点排空,建议您先对节点池扩容,并等待集群稳定。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 在集群管理页左侧导航栏中,选择节点管理 > 节点池
    4. 在目标节点池右侧的操作列中,单击扩缩容
    5. 在期望节点数中,输入目标值,然后单击确认
      说明 新增的节点数建议为后续步骤单批移除或增加的节点数。
  3. 移除节点。
    1. 在集群管理页左侧导航栏中,选择节点管理 > 节点
    2. 节点页面,选中部分节点,单击下方的批量移除
    3. 在弹出的对话框中选中自动排空节点(drain)我已了解上述说明,确认移除节点,然后单击确定
  4. 添加节点。
    注意 自动添加已有节点会更换节点系统盘,请确保数据保存在数据盘,以免数据丢失。
    1. 在集群管理页左侧导航栏中,选择节点管理 > 节点池
    2. 节点池页面,单击目标节点池操作列的更多 > 添加已有节点
    3. 选择已有云服务器实例配置项页面,选择添加方式自动添加。选中上面移除的节点ECS,然后单击下一步
      说明 请您仔细阅读控制台上添加节点的注意事项,自动添加节点会替换节点的系统盘,系统盘会被重新格式化,额外添加的数据盘不受影响。
    4. 填写实例信息配置项页面,填写实例信息。然后单击下一步,在对话框中单击确定
      具体操作,请参见自动添加节点
  5. 重复步骤3和步骤4,移除节点再添加节点,直到节点池中所有的节点已经被更新。
  6. 将步骤2扩容节点池创建的节点移除,并释放ECS。
    1. 在集群管理页左侧导航栏中,选择节点管理 > 节点
    2. 节点页面,选中扩容节点池创建的节点,单击下方的批量移除
    3. 在弹出的对话框中选中自动排空节点(drain)同时释放ECS我已了解上述说明,确认移除节点,然后单击确定

更换为不同OS类型

如果是更换为不同的OS类型,例如由CentOS更换为Alibaba Cloud Linux,由于目前OS类型是节点池的不可更改属性,因此需要通过新建节点池的方式完成节点轮转。

  1. 创建节点池。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 在集群管理页左侧导航栏中,选择节点管理 > 节点池
    4. 节点池页面右上角,单击创建节点池
    5. 创建节点池页面,选择需要更换的目标操作系统,设置创建节点池的配置项。
      关于创建节点池配置项的更多信息,请参见创建节点池
  2. 扩容新节点池,并等待集群稳定。
    1. 节点池页面,单击新节点池右侧的操作列的扩缩容
    2. 在期望节点数中,输入目标值,然后单击确认
      说明 新增的节点数建议为后续步骤单批移除或增加的节点数。
  3. 移除节点。
    1. 在集群管理页左侧导航栏中,选择节点管理 > 节点
    2. 节点页面,选中部分节点,单击下方的批量移除
    3. 在弹出的对话框中选中自动排空节点(drain)我已了解上述说明,确认移除节点,然后单击确定
  4. 添加节点。
    注意 自动添加已有节点会更换节点系统盘,请确保数据保存在数据盘,以免数据丢失。
    1. 在集群管理页左侧导航栏中,选择节点管理 > 节点池
    2. 节点池页面,单击目标节点池操作列的更多 > 添加已有节点
    3. 选择已有云服务器实例配置项页面,选择添加方式自动添加。选中上面移除的节点ECS,然后单击下一步
      说明 请您仔细阅读控制台上添加节点的注意事项,自动添加节点会替换节点的系统盘,系统盘会被重新格式化,额外添加的数据盘不受影响。
    4. 填写实例信息配置项页面,填写实例信息。然后单击下一步,在对话框中单击确定
      具体操作,请参见自动添加节点
  5. 重复步骤2到步骤4,扩容节点池、移除节点再添加节点,直到旧节点池中没有节点。

开启期望节点数与未开启期望节点数的节点池有什么不同?

期望节点数是指节点池应该维持的节点数量。您可以通过调整期望节点数,达到扩容或缩容节点池的目的。但部分老节点池没有设置过期望节点数,从而未开启期望节点数功能。

开启或未开启期望节点数的节点池对于移除节点、释放ECS等不同的操作方式,会有不同感知,具体如下表。

操作 开启期望节点数节点池 未开启期望节点数节点池 建议
通过ACK的OpenAPI或者控制台移除指定节点。 移除指定节点,期望节点数减少移除节点的数目。例如节点池移除指定节点前,期望节点数为10。移除3个节点后,期望节点数更新为7。 移除指定节点。 推荐使用此方式进行缩容。
通过kubectl delete node方式移除节点。 期望节点数不会感知,没有变化。 无变化。 不推荐。
手动通过ECS控制台或者OpenAPI释放ECS。 生成新ECS实例,补充到设置的期望节点数。 节点池不感知。不会有新ECS实例生成。节点池节点列表被删除的节点会显示状态为“未知”一段时间。 不推荐,会导致ACK、ESS数据与实际情况不一致,请用推荐方式移除节点.。具体操作,请参见移除节点
包年包月ECS实例到期。 生成新ECS实例,补充到设置的期望节点数。 节点池不感知。不会有新ECS实例生成。节点池节点列表被删除的节点会显示状态为“未知”一段时间。 不推荐,会导致ACK、ESS数据与实际情况不一致,请用推荐方式移除节点.。具体操作,请参见移除节点
ESS伸缩组手动开启“实例的健康检查”,并且ECS实例无法通过ESS健康检查(如停机)。 生成新ECS实例,补充到设置的期望节点数。 生成新ECS实例,替换停机实例。 不推荐,请不要直接操作节点池相关的伸缩组。
通过ESS把ECS实例移除伸缩组并且不修改期望实例数。 生成新ECS实例,补充到设置的期望节点数。 不会生成新的ECS实例。 不推荐,请不要直接操作节点池相关的伸缩组。

如何将已有的节点添加到集群?

您可以创建一个0节点的集群节点池,然后手动添加已有ECS为节点。详细信息,请参见添加已有节点
说明 每个节点池对应一个弹性伸缩组实例,节点池本身不额外收费,但节点池使用的ECS实例等云资源由对应的云产品计费。