部署 Kubernetes 集群

天枢使用kubernetes来调度和管理 训练、notebook等服务。

部署环境

NAMEOS-IMAGEVERSIONDOCKER VERSIONCALICO VERSION
masterUbuntu 16.04 LTS
Ubuntu 18.04 LTS
Ubuntu 20.04 LTS
v1.16.219.03.12v3.9.0
node01Ubuntu 16.04 LTS
Ubuntu 18.04 LTS
Ubuntu 20.04 LTS
v1.16.219.03.12v3.9.0
node02Ubuntu 16.04 LTS
Ubuntu 18.04 LTS
Ubuntu 20.04 LTS
v1.16.219.03.12v3.9.0
node03Ubuntu 16.04 LTS
Ubuntu 18.04 LTS
Ubuntu 20.04 LTS
v1.16.219.03.12v3.9.0

有 GPU 的节点,需安装显卡驱动(参考 安装 NVIDIA 显卡驱动)

部署方案

这里会提供两种部署方式:

快速部署

note

部署指南:

$ wget http://tianshu.org.cn/static/upload/file/dubheDeployScriptfile.zip
$ unzip dubheDeployScriptfile.zip
# 目录结构如下
$ tree dubheDeployScriptfile
dubheDeployScriptfile
├── k8s1.16.2-ubuntu
   ├── apt-key.gpg
   ├── base.config
   ├── calico.yml
   ├── del_kube.sh
   ├── k8s1.16.2.sh
   ├── node_install_k8s.sh
   ├── README.md
   ├── setup.log
   ├── ssh_trust_add.exp
   └── ssh_trust_init.exp

文件说明

对于 k8s1.16.2-ubuntu 目录下文件:

  • base.config: 配置文件,需要用户手动配置

  • k8s1.16.2.sh: master 节点部署脚本

  • node_install_k8s.sh: node 节点部署脚本

  • del_kube.sh: 卸载 k8s 以及 docker 脚本

  • calico.yml: calico 网络插件部署资源清单

  • ssh_trust_add.exp 和 ssh_trust_init.exp: 服务器互信脚本

服务器需求

目前该自动化部署脚本仅在 Ubuntu16.04 server 版本验证通过,不一定兼容其他 Ubuntu 发行版本,

一定不兼容 CentOs 等其他 Linux 系统。

在执行脚本前,各个节点服务器需要授权 root 用户登录,集群各服务器 root 密码设为统一的密码

  • 授权 root 用户 ssh 登录:

如果 ssh 服务未安装,先安装:

sudo apt-get install openssh-server

然后修改配置文件:

vim /etc/ssh/sshd_config

找到如下配置信息:

#Authentication:
LoginGraceTime 120
PermitRootLogin prohibit-password
StrictModes yes

把 prohibit-password 改为 yes,如下:

#Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

(如果这三行被注释,请放开注释)然后重启:

reboot

重启后修改 root 密码:

sudo passwd root

接下来可以通过 shell 工具使用 root 用户登录看看,如果可以登录则授权成功(别跳过,请试一下)。

服务器准备完毕,按照以下流程执行脚本进行快速部署:

  • 在master节点下载并进入脚本目录:
$ wget http://tianshu.org.cn/static/upload/file/dubheDeployScriptfile.zip
$ unzip dubheDeployScriptfile.zip
$ cd dubheDeployScriptfile/k8s1.16.2-ubuntu/
  • 打开 base.config 文件:
vim base.config
  • 根据提示配置以下信息:
# 主节点(master节点)IP地址
masterip="172.16.125.225"
# 过滤IP段,用于过滤得到服务器的IP地址
ip_segment="172.16.125"
# k8s版本,不要更改,就这个,改了就用不了
k8s_version="v1.16.2"
# root用户密码,请设置k8s集群所有服务器root用户密码为统一密码
root_passwd="hBHM25To4n8szg9u"
# 集群所有节点ip,有几台填几台
hostip=(
172.16.125.225
172.16.125.215
172.16.125.216
)
#以下两项会自动生成,不用填写,不用填写!
tocken=
sha_value=
  • 将 k8s1.16.2-ubuntu 目录完整拷贝至 root 目录下(强调:只需要拷贝到 master 节点就行,不用拷到其他节点服务器),执行:
bash k8s1.16.2.sh
  • 脚本执行完毕后,执行以下命令查看节点是否就绪(ready):
kubectl get node
  • 也可以执行以下命令查看k8s系统组件是否全部处于running状态:
kubectl get pod -n kube-system
  • 如果集群所有组件都是如下状态,那么master节点已经部署成功:
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-6895d4984b-dd845 1/1 Running 0 73s
calico-node-lb7wj 1/1 Running 0 73s
coredns-5644d7b6d9-d7cs6 1/1 Running 0 73s
coredns-5644d7b6d9-hjh4v 1/1 Running 0 73s
etcd-umaster 1/1 Running 0 25s
kube-apiserver-umaster 1/1 Running 0 22s
kube-controller-manager-umaster 1/1 Running 0 15s
kube-proxy-jl5mw 1/1 Running 0 73s
kube-scheduler-umaster 1/1 Running 0 20s
note

如果你仅仅部署单master节点集群,那么到此Kubernetes集群安装成功,无需进行后续子节点部署流程,但需要注意,k8s master节点默认不开启可调度,请手动开启,开启命令为(请替换[your master hostname]为你实际节点主机名):

kubectl taint node [your master hostname] node-role.kubernetes.io/master-

如果需要在集群中使用GPU,请安装nvidia-device-plugin(如果是安装多节点集群,请所有节点安装完毕再安装) 。接下来按照以下教程继续部署子节点:

  • 如果以上步骤执行顺利,那么子节点 root 下会生成 node_install_k8s.sh、base.config 等文件,在子节点root目录下执行:
bash node_install_k8s.sh
  • 执行完毕后,切换到主节点,在主节点执行以下命令查看节点状态以及集群组件运行情况(可能会发现子节点还没加入,别急,如果以上步骤没问题,稍等一会儿就能看到子节点加入到集群中了):
kubectl get node
kubectl get pod -n kube-system -owide
  • 如果集群安装过程中出现错误,需要卸载 k8s 以及 docker 并重新安装,可以先执行以下脚本彻底清除相关组件
bash del_kube.sh

通过脚本方式快速部署kubernetes集群指南到此结束。如果你想通过手动部署集群,可以往下看分步骤部署过程。

分步骤部署

集群部署前准备

note

无特殊说明,所有节点都需要执行。

  • 修改主机名

    #修改每个节点的主机名
    hostnamectl set-hostname xxx
  • 修改 hosts 文件

    #类似如下
    cat >> /etc/hosts << EOF
    172.16.125.100 master
    172.16.125.101 node01
    172.16.125.102 node02
    172.16.125.103 node03
    EOF
note

特别提示: 如果使用的是阿里云服务器,以下关闭防火墙、关闭swap、同步各节点时间 不需要配置

  • 关闭防火墙
#关闭防火墙
sudo ufw disable
#查看防火墙状态
sudo ufw status
  • 关闭 swap分区,然后重启
#注释掉swap文件对应行
vim /etc/fstab
# /dev/mapper/umaster--vg-swap_1 none swap sw 0 0
reboot
  • 同步各节点时间
#安装ntpdate
sudo apt-get -y install ntpdate
运行命令:crontab -l
添加:0 */1 * * * ntpdate time1.aliyun.com
  • 添加网桥过滤
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
  • 加载br_netfilter模块
modprobe br_netfilter
#查看
lsmod | grep br_netfilter
  • 加载网桥过滤配置文件
sysctl -p /etc/sysctl.d/k8s.conf
  • 开启 ipvs
#安装ipset及ipvsadm
apt-get -y install ipset ipvsadm
#创建sysconfig/modules文件夹
mkdir -p /etc/sysconfig/modules/
#操作如下命令
cat >>/etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

安装 docker

参照官方文档

安装 nvidia-docker2(为了在集群中使用 nvidia gpu)

参照官方文档

修改 docker 配置如下:

vim /etc/docker/daemon.json
#内容如下:
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}

然后重启 docker:

systemctl restart docker

部署 Kubernetes 集群

先添加安装源:

tee /etc/apt/sources.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
  • 安装 kubelet 、kubeadm、kubectl
sudo apt-get update -y && apt-get install -y --allow-unauthenticated kubelet=1.16.2-00 kubeadm=1.16.2-00 kubectl=1.16.2-00
  • 仅设置kubelet开机启动(后续集群初始化会开启kubelet)
#查看kubelet状态
systemctl status kubelet
#设置kubelet开机启动
systemctl enable kubelet
  • 查看k8s集群所需的镜像并进行提前下载
kubeadm config images list
note

温馨提示: 如果k8s所需镜像无法下载,可以从别的镜像源pull,然后重新docker tag,示例如下:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.2 k8s.gcr.io/kube-apiserver:v1.16.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.2
  • 初始化 Kubernetes(仅在 master 节点执行,node节点请勿执行)
note

其中 172.16.0.0 为 kubernetes 集群所在内网网段,10.244.0.0/16 为 Pod 所在网段(自定义的,不用修改)。

kubeadm init --kubernetes-version=v1.16.2 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.16.125.100

结果如下:

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.16.125.100:6443 --token 8urlva.75zrerl6uctfenec \
--discovery-token-ca-cert-hash sha256:c462c05da6c3685a334b1b1743d4d9b30a38b78208c338f03f5e7d67befaf8bb

复制上面输出的 kubeadm join 命令,保存到文本文档待用,然后执行以下命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装网络插件 Calico

master 节点 执行(node节点请勿执行):

  • 下载网络插件calico.yaml文件并执行:
kubectl apply -f calico.yaml
  • 验证master节点安装是否正常
#查看每个容器运行状态(仅且显示STATUS:Running 、 READY:1/1 状态,表示集群安装成功)
kubectl get pod -n kube-system
#通过如下命令定位问题(一般情况为镜像拉取失败)
kubectl describe pod 容器名 -n kube-system
kubectl logs 容器名 -n kube-system
  • Node节点加入集群

在待加入集群的机器上执行上面初始化 kubernetes 过程中出现的 kubeadm join 命令:

kubeadm join 172.16.125.100:6443 --token 8urlva.75zrerl6uctfenec \
--discovery-token-ca-cert-hash sha256:c462c05da6c3685a334b1b1743d4d9b30a38b78208c338f03f5e7d67befaf8bb
note

温馨提示: 如果初始化 kubernetes生成的token和cert-hash过期或忘记,可以通过如下命令查看及重新获取(在master节点执行)

查看有效的token:kubeadm token list

创建永不失效的token:kubeadm token create --ttl 0

获取ca证书sha256编码hash值:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

验证整个集群是否安装成功

在master节点执行:

#查看集群节点以及节点状态是否就绪,Ready为就绪
kubectl get node
#查看每个容器运行状态(仅且显示STATUS:Running 、 READY:1/1 状态,表示容器正常运行,当所有容器正常运行时节点转为就绪状态)
kubectl get pod -n kube-system -owide
#通过如下命令定位问题(一般情况为镜像拉取失败)
kubectl describe pod 容器名 -n kube-system
kubectl logs 容器名 -n kube-system

至此集群安装成功。

note

如果,你搭建的 k8s 只有一台 master,需要执行如下命令:

kubectl taint node [your master hostname] node-role.kubernetes.io/master-

安装 nvidia-device-plugin(为了在集群中使用 nvidia gpu)

在 master 节点执行以下命令:

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.6.0/nvidia-device-plugin.yml

执行下面命令,查看是否安装成功:

kubectl describe node

如果看到 nvidia.com/gpu 有值则说明安装成功。

为gpu节点添加调度标识label,在gpu节点执行以下命令(your-gpu-node-name 替换为该节点hostname)

kubectl label nodes your-gpu-node-name gpu=gpu

部署过程失败处理

卸载k8s环境

kubeadm reset -f
modprobe -r ipip
rm -rf ~/.kube
rm -rf /etc/kubernetes
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
apt-get remove -y kubelet=1.16.2-00 kubeadm=1.16.2-00 kubectl=1.16.2-00
rm -rf /etc/yum.repos.d/kubernetes.repo

卸载docker

sudo apt-get -y autoremove docker docker-ce docker-engine docker.io containerd runc
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
sudo apt-get autoremove docker-ce-*
sudo rm -rf /etc/systemd/system/docker.service.d
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker
Last updated on