安装常见问题解答和故障排查

安装常见问题

我应该安装什么版本的NVIDIA显卡驱动?

首先,请参阅英伟达官网上的文档来确认适合您显卡的驱动版本。接着,您可以参考这个表格来确认不同版本CUDA对显卡驱动的要求。

请注意,在老显卡驱动的环境下,有些包含新CUDA版本的Docker镜像将无法被使用。目前,我们推荐您安装418版本的显卡驱动。418显卡驱动支持CUDA 9.0到10.1(目前大多数深度学习框架使用的是这几个版本的CUDA)。

如何加快在大集群上的部署速度?

默认情况下,Ansible使用5个进程在所有机器并行执行命令。如果您的集群比较大,那么5个进程可能会比较慢。

如果您想要加速,可以在源码的ansibleansible-playbook命令中加入参数-f <并发数>。关于细节,请参考ansible的相关文档

如何移除K8S的网络插件?

在安装后,如果您使用的是weave插件,并且在使用过程中碰到了一些网络相关的问题,例如:一些pod无法连接互联网。此时,您可以移除网络插件来解决这个问题。

请先运行kubectl delete ds weave-net -n kube-system来移除weave-net DaemonSet。

接着,您可以参考下面的ansible-playbook来移除网络插件:

---
- hosts: all
  tasks:
    - name: remove cni
      shell: |
        sed -i '/KUBELET_NETWORK_PLUGIN/d' /etc/kubernetes/kubelet.env
        echo KUBELET_NETWORK_PLUGIN=\"\" >> /etc/kubernetes/kubelet.env
      args:
        executable: /bin/bash

    - name: remove weave
      shell: ip link delete weave
      args:
        executable: /bin/bash

    - name: restart network
      shell: systemctl restart networking
      args:
        executable: /bin/bash

    # - name: restart network for ubuntu 18.04
    #   shell: systemctl restart systemd-networkd
    #   args:
    #     executable: /bin/bash

    - name: clean ip table
      shell: |
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -t nat -F
        iptables -t mangle -F
        iptables -F
        iptables -X

    - name: config-docker
      shell: |
        sed -i 's/--iptables=false/--iptables=true --ip-masq=true/g' /etc/systemd/system/docker.service.d/docker-options.conf
        systemctl daemon-reload
      args:
        executable: /bin/bash

    - name: stop kubelet
      shell: systemctl stop kubelet
      args:
        executable: /bin/bash

    - name: restart docker
      shell: systemctl restart docker
      args:
        executable: /bin/bash

    - name: start kubelet
      shell: systemctl start kubelet
      args:
        executable: /bin/bash

在这些步骤后,您需要修改coredns来解决DNS问题: 请使用命令kubectl edit cm coredns -n kube-system,修改.:53.:9053。 请使用命令kubectl edit service coredns -n kube-system,修改targetPort: 53targetPort: 9053。 请使用命令kubectl edit deployment coredns -n kube-system,修改containerPort: 53containerPort: 9053,在pod定义中添加hostNetwork: true

如何检查GPU驱动被正确安装了?

对于NVIDIA GPU, 您可以使用命令nvidia-smi来检查。

如何安装GPU驱动?

对于NVIDIA GPU,请先确认您想安装哪个版本的GPU(您可以参考这个问题)。然后参考下面的步骤:

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-418
sudo reboot

在上述命令中,我们使用NVIDIA Driver 418作为示例。您可以修改nvidia-418为您需要的版本。如果遇到任何问题,请在Nvidia社区需求解决方案。

如何安装nvidia-container-runtime?

请参阅官方文档。 另外,不要忘记在docker-config-file中将nvidia-container-runtime设置为docker的默认runtime。 下面是docker-config-file /etc/docker/daemon.json的一个示例:

{
  "default-runtime": "nvidia",
  "runtimes": {
      "nvidia": {
          "path": "/usr/bin/nvidia-container-runtime",
          "runtimeArgs": []
      }
  }
}

如何在Azure Kubernetes Service (AKS)部署带有Cluster Autoscaler的OpenPAI集群?

请参考这里

故障排查

Ansible 报告 Failed to update apt cacheapt install <some package> 失败

请先检查机器是否有网络相关的问题。除了网络之外,还有一个可能的原因:ansible有时会在安装apt包前先运行一次apt update。如果apt update返回的代码是非0的,那整个命令都会失败。

您可以在对应机器上运行sudo apt update; echo $? 来进行检查。如果退出代码是非0的,请修复一下。退出代码非0的可能原因如下:

如果您在sudo apt update的返回中发现类似于the following signatures couldn’t be verified because the public key is not available这样的信息,您可以使用下面的命令来进行修复。请将<key-number>换成您的。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key-number>
sudo apt update

如果您发现sudo apt update报告有一些repo list是过期的(expired repo lists),您可以使用下面的命令来进行修复。 请将<repo-list-file>换成您的。

sudo rm -rf  /etc/apt/sources.list.d/<repo-list-file>
sudo apt update

Ansible playbook因为超时退出

有些时候,如果您给某个机器分配了一个和原有hostname不同的新hostname,很多包含sudo的命令会在这台机器上变得很慢。这是因为系统的DNS会去尝试去找新的hostname,但是会因为超时而失败。

解决方法:您可以在对应机器上运行下面的命令,给/etc/hosts加入新的hostname:

sudo chmod 666 /etc/hosts
sudo echo 127.0.0.1 `hostname` >> /etc/hosts
sudo chmod 644 /etc/hosts

Ansible因为sudo命令超时而退出

和“Ansible playbook因为超时退出”的解决方案相同。

网络相关的问题

如果您是中国用户,请先参考这个文档.

无法下载kubeadm或hyperkube二进制文件

在安装时,安装脚本会从storage.googleapis.com下载kubeadm和hyperkube的二进制文件。 具体来说,我们会使用kubespray的2.11 release,对应使用的kubeadmhyperkube文件为:

  • kubeadm: https://storage.googleapis.com/kubernetes-release/release/v1.15.11/bin/linux/amd64/kubeadm
  • hyperkube: https://storage.googleapis.com/kubernetes-release/release/v1.15.11/bin/linux/amd64/hyperkube

请寻找这两个文件合适的下载链接,并在config文件中修改kubeadm_download_urlhyperkube_download_url

无法下载一些Docker镜像

请先检查安装过程中的日志,看看是哪些镜像无法下载。如果确认是网络问题的话,请在config文件中修改gcr_image_repokube_image_repoquay_image_repodocker_image_repo

另外,如果您发现无法从gcr.io上下载镜像,您需要首先寻找一个合适的镜像registry(如果您在中国,您可以尝试gcr.azk8s.cn是否可行)。然后,修改gcr_image_repokube_image_repo

特别地,对于gcr.io来说, 我们发现kubespray 2.11版本源码中有些链接并没有采取gcr_image_repokube_image_repo的值,而是直接使用gcr.io。您得在文件~/pai-deploy/kubespray中手工修改它们。命令grep -r --color gcr.io ~/pai-deploy/kubespray 可能会对您有帮助。