过时了,请使用更新后的文档
术语
术语 | 解释 |
---|---|
dev-box | 集群安装、管理与维护节点,不用的时候可以关机,请不要格式化,否则再也无法维护集群 |
master | 集群主节点 |
worker | 集群计算节点 |
所有机器 | 包括dev-box、master和worker在内的所有节点 |
前提条件
- 所有机器操作系统为全新的Ubuntu 18.04 LTS server;
- 所有机器具有相同用户名和密码的管理员账户;
- 所有机器时区为上海;
- 所有机器IP在同一网段,一台机器多个IP也是不允许的。
注1: Openpai项目文档建议用Ubuntu 16.04 LTS,但是我在Ubuntu 16.04 LTS遇到了很严重的问题,所以更新到Ubuntu 18.04。
注2: master,worker必须为物理机器(其实也可以是虚拟机,但是生产环境不建议这样用,还要考虑显卡直通虚拟机的问题也挺麻烦),dev-box可以是硬盘空间不少于40GB的虚拟机(如果要调试代码或二次开发可能要100G以上硬盘空间),毕竟他只有安装和维护系统的时候才用到,用物理机器太浪费了。
注3:k8s不支持swap,安装系统的时候请不要添加swap分区,否则节点重启就挂了。
初始化
所有机器
关闭自动更新
Ubuntu 18.04 LTS server默认是开启自动更新的,需要关闭,以避免不必要的系统故障。
1 | sudo nano /etc/apt/apt.conf.d/20auto-upgrades |
1 | APT::Periodic::Update-Package-Lists "0"; |
参考:Prevent Ubuntu 18.06 And Nvidia Drivers From Updating
切换清华源
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
更新依赖
1 | sudo apt update |
启动BBR(可选)
拥塞控制算法,比默认的更好。
查看:
1 | sudo sysctl net.ipv4.tcp_congestion_control |
设置:
1 | sudo bash -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf' |
验证:
1 | sudo sysctl net.ipv4.tcp_congestion_control |
安装openssh-server
1 | sudo apt install openssh-server |
安装ntp
1 | sudo apt install ntp |
安装docker
https://docs.docker.com/engine/install/ubuntu/
1 | sudo apt remove docker docker-engine docker.io containerd runc |
1 | sudo apt update |
1 | echo \ |
1 | sudo apt update |
删除添加的docker源,因为安装Openpai的时候,Openpai的脚本会再添加一次docker源,会导致源冲突。
1 | sudo rm /etc/apt/sources.list.d/docker.list |
安装python
按理说Ubuntu默认是有安装python的,但是我在实际操作的时候发现有的机器就是没有python,所以手动确认以下,以避免报错。
1 | sudo apt install python |
安装nfs客户端
1 | sudo apt install nfs-common |
安装压缩软件
1 | sudo apt install zip |
修改daemon
在所有机器的/etc/docker/daemon.json
中写入{}
,可以避免不必要的报错。
如果您局域网地址是172.*.*.*
,请参考这个文档Docker-Compose导致ssh连接断开的问题,修改/etc/docker/daemon.json
,否则可能出现奇怪的网络问题。即使用下面的daemon文件:
1 | { |
修改完daemon之后重启一下docker:
1 | sudo systemctl restart docker |
worker
注1: 下面介绍的是使用NVIDIA显卡的worker节点配置方法,如果使用AMD显卡请自己参考项目文档,由于我没有ADM显卡,所以无法测试。
注2: 如果是CPU计算节点可以跳过这一部分。
安装GPU驱动
https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
https://howtoinstall.co/en/ubuntu/xenial/xserver-xorg?action=remove
https://chrisalbon.com/code/deep_learning/setup/prevent_nvidia_drivers_from_upgrading/ 1
2
3
4
5
6sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470
sudo apt autoremove xserver-xorg
sudo apt autoremove --purge xserver-xorg
sudo apt-mark hold nvidia-driver-470 # Freeze NVIDIA Drivers
安装nvidia-container-runtime
https://github.com/NVIDIA/nvidia-container-runtime#installation
先用这个命令ping
一下nvidia.github.io
看看返回的IP地址是否正常。 1
ping nvidia.github.io
我的网络环境这个域名已经被DNS污染了(DNS返回127.0.0.1),我的解决方案是在/etc/hosts
文件中添加一行如下: 1
185.199.110.153 nvidia.github.io
然后继续安装即可
1 | curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \ |
填入下面的配置文件:
1 | { |
如果有按照上一部分修改daemon,配置文件应该如下:
1 | { |
最后重启docker。
1 | sudo systemctl restart docker |
设置GPU常驻内存
设置GPU常驻内存,可将nvidia-smi -pm 1
加入/etc/rc.local
,重启生效,可解决GPU初始化缓慢、无任务运行但是利用率居高不下、偶尔丢卡等问题。
Ubuntu 18.04 LTS的rc.local逻辑已经改变了,需要自己调整一下。
/lib/systemd/system/rc-local.service
文件新增以下内容:
1 | [Install] |
- 设置rc-local开机自启:
1 | sudo systemctl enable rc-local |
- 在
/etc/rc.local
中填入以下内容:
1 | #!/bin/sh -e |
- 赋予可执行权限:
1 | sudo chmod +x /etc/rc.local |
测试驱动是否正常
- 重启一下服务器。
1 | sudo reboot |
- 检查显卡驱动以及常驻内存是否生效
1 | nvidia-smi |
- 能正确返回信息即驱动安装成功,
Persistence-M
的状态为On
,则常驻内存配置成功。
检查nvidia-container-runtime
是否安装成功。
1 | sudo docker run nvidia/cuda:10.0-base nvidia-smi |
处理容器内nvidia-smi无法显示占用GPU进程问题
nvidia-smi can not detect the PID of processes using GPU
dev-box
配置免密登录
- 生成密钥
1 | ssh-keygen |
- 向远程主机注册密钥
1 | ssh-copy-id username@remote_host |
- 测试是否可免密登录
1 | ssh username@remote_host |
开始安装
下面都在dev-box中操作
https://openpai.readthedocs.io/en/pai-1.6.y/manual/cluster-admin/installation-guide.html
准备项目
1 | git clone https://github.com/microsoft/pai.git |
修改部分文件
注:下面所有命令中<pai-code-dir>
需要替换为您的pai项目所在路径。
修改理由在这里看:Problems of install v1.6.0
1 | ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml docker-cache-config-distribute.yml || exit $? |
1 | sudo python3 -m pip install ansible==2.9.7 |
改为 1
sudo python3 -m pip install ansible==2.9.24
离线安装相关文件准备
参考:https://github.com/microsoft/pai/issues/5592
修改安装脚本
将 <pai-code-dir>/contrib/kubespray/quick-start-kubespray.sh
由 1
2
3
4
5
6...
echo "Performing docker-cache config distribution..."
#ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml docker-cache-config-distribute.yml -e "@${CLUSTER_CONFIG}" || exit $?
echo "Starting kubernetes..."
/bin/bash script/kubernetes-boot.sh || exit $?
改为 1
2
3
4
5
6
7
8
9...
echo "Performing docker-cache config distribution..."
#ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml docker-cache-config-distribute.yml -e "@${CLUSTER_CONFIG}" || exit $?
echo "Performing offline deploy file distribution..."
ansible-playbook -i ${HOME}/pai-deploy/cluster-cfg/hosts.yml offline-deploy-files-distribute.yml || exit $?
echo "Starting kubernetes..."
/bin/bash script/kubernetes-boot.sh || exit $?
即在运行script/kubernetes-boot.sh
之前运行offline-deploy-files-distribute.yml
。
下载并保存离线文件
Windows直接使用浏览器下载,Linux可使用下述命令下载: 1
curl https://08kytw.bn.files.1drv.com/y4mnHqJp5eDwIMFZgFBpZMdF6RZs9RLPIRZUQKyxfMxCCj5lS-NUxgM7bNstYdH-pMI0J_VgdUgssFfrcGw0mol-bjpGc0ntnKlSXz2hS-Tp3Mh68XMa_H__Trd4wDjpFkp_3VX_De6PZfpDF15z-I5nkkpY47WEzuQO97IAIqSoFYfjzmi_Uqi1Ijwzhx4we3oG1gUpuc_MSBobyot09h76A -o pai-offline-deploy-distribute.zip
解压
1
2unzip pai-offline-deploy-distribute.zip
cd pai-offline-deploy-distribute将
offline-deploy-files-distribute.yml
复制到<pai-code-dir>/contrib/kubespray
。
1 | cp offline-deploy-files-distribute.yml <pai-code-dir>/contrib/kubespray |
- 将
roles/offline-deploy-files-distribute
复制到<pai-code-dir>/contrib/kubespray/roles
。
1 | cp -r roles/offline-deploy-files-distribute <pai-code-dir>/contrib/kubespray/roles |
注意,上述文件适用于x86_64架构,其他架构的相关文件链接可在 kubespray/blob/master/roles/download/defaults/main.yml找到。
脚本所作操作如下:
加载需要的docker镜像;
由这一行可知,安装的时候下载的文件会存放在
/tmp/releases/
文件夹,故可提前下载好相关文件以避免网络问题。由这一行可知,如果使用了
skip_downloads: true
参数,kubeadm默认不会在master节点安装,所以手动安装kubeadm。
编写参数文件
参考项目文档编写layout.yaml
文件。
参考下面的格式编写config.yaml
文件。
1 | user: <your-ssh-username> |
因为我们已经下载好了相关文件,所以使用skip_downloads: true
禁用下载文件相关代码,使用download_container: false
禁用拉取镜像相关代码。
安装
1 | cd contrib/kubespray |
重启服务注意事项
https://github.com/microsoft/pai/issues/5465
项目文档说管理集群要使用/pai/paictl.py,但是该文件默认checkout的是最终版本而非当前版本,所以会导致版本不一致问题。
如果要使用这个脚本的话,每次启动容器都要手动checkout一下,否则可能导致服务无法正常启动。
目前的解决方案是将本地checkout好的项目挂载到容器里面然后直接用那里面的paictl.py。
1 | sudo docker run -itd \ |
运行这个命令前确保${HOME}/pai
中检出版本与安装版本一致,然后容器中使用/mnt/pai
中的paictl.py
。
后续
成功启动service之后,其他个性化配置过程一般不会有问题,除非配置文件写错了,务必检查清楚。