【玩转腾讯云】腾讯云部署K8s集群

  如果想要了解 K8s 的一些特性,并且将其应运的很好,那就需要动手部署一个 K8s 集群。下面讲解下在腾讯云上 K8s 集群部署流程。

单机版 K8s

  环境:

  • Ubuntu 16.04
  • GPU 驱动 418.56
  • Docker 18.06
  • K8s 1.13.5

以上的环境,针对的是高版本的 K8s,而且 Docker 的版本必须要注意。另外 GPU 驱动的话,如果大家是非 GPU 机器的话,可以考虑不用。如果含有 GPU 机器的话,需要安装驱动,并且驱动版本不能过低喔。

设置环境

在配置环境前,首先备份一下源配置:

cp /etc/apt/sources.list /etc/apt/sources.list.cp

然后我们重新写一份配置,编辑内容,加上阿里源:

vim /etc/apt/sources.list

deb-src http://archive.ubuntu.com/ubuntu xenial main restricted
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/xenial-backports main restricted universe multiverse
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

添加好后,可以执行如下命令,更新一下源:

apt-get update

如果出现问题,可以执行如下命令来自动修复安装出现 broken 的 package:

apt --fix-broken install

执行升级命令时,注意:对于 GPU 机器可不执行,否则可能升级 GPU 驱动导致问题。

apt-get upgrade

由于 K8s 安装要求,需要关闭防火墙:

ufw disable

安装 SELinux:

apt install selinux-utils

SELinux 防火墙配置:

setenforce 0

vim/etc/selinux/conifg

SELINUX=disabled

设置网络,将桥接的 IPV4 流量传递到 iptables 的链:

tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

为了防止下面执行的会报错,可以先执行一下:

modprobe br_netfilter

最后,查看 IPV4 与 v6 配置是否生效:

sysctl --system

配置 iptables:

iptables -P FORWARD ACCEPT

vim /etc/rc.local
/usr/sbin/iptables -P FORWARD ACCEPT

需要永久关闭 swap 分区:

sed -i 's/.*swap.*/#&/' /etc/fstab

以上为 K8s 系统的环境配置,这个条件是硬性的,必须要处理。接下来就是安装需要的配套工具了。

安装 Docker

设置环境,在 Docker 安装前设置:

apt-get install apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt-get update

删除已经存在的低版本 Docker:

apt-get purge docker-ce docker docker-engine docker.io  && rm -rf /var/lib/docker

apt-get autoremove docker-ce docker docker-engine docker.io

安装指定版本的 Docker:

apt-get install -y docker-ce=18.06.3~ce~3-0~ubuntu

启动 Docker 并设置开机自重启:

systemctl enable docker && systemctl start docker

安装好 Docker 后,需要配置一下 Docker 以让其生效:

vim /etc/docker/daemon.json
{
 "log-driver": "json-file",
 "log-opts": {
   "max-size": "100m",
   "max-file": "10"
 },
 "insecure-registries": ["http://k8s.gcr.io"],
 "data-root": "",
 "default-runtime": "nvidia",
 "runtimes": {
     "nvidia": {
         "path": "/usr/bin/nvidia-container-runtime",
         "runtimeArgs": []
     }
 }
}

上面是含 GPU 的配置,如果你的机器不含 GPU,可按照下面来配置:

{
"registry-mirrors":[
"https://registry.docker-cn.com"
],
"storage-driver":"overlay2",
"log-driver":"json-file",
"log-opts":{
"max-size":"100m"
},
"exec-opts":[
"native.cgroupdriver=systemd"
],
"insecure-registries":["http://k8s.gcr.io"],
"live-restore":true
}

最后,我们重启 Docker 服务并设置开机自动重启,重启后可以看到 Docker 的相关信息:

systemctl daemon-reload && systemctl restart docker && docker info

安装 K8s

在安装 K8s 之前,我们需要设置一下环境,以便很快的拉取相关的镜像,这里选择了阿里源:

apt-get update && apt-get install -y apt-transport-https curl

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF

配置完阿里源后,我们更新一下资源:

apt-get update

更新完后,先摒弃不可用或损坏的 K8s 组件 kubectl、kubeadm、kubelet 的残留:

apt-get purge kubelet=1.13.5-00 kubeadm=1.13.5-00 kubectl=1.13.5-00
apt-get autoremove kubelet=1.13.5-00 kubeadm=1.13.5-00 kubectl=1.13.5-00

重新更新、安装一份指定版本的 K8s 组件:

apt-get install -y kubelet=1.13.5-00 kubeadm=1.13.5-00 kubectl=1.13.5-00
apt-mark hold kubelet=1.13.5-00 kubeadm=1.13.5-00 kubectl=1.13.5-00

这里的三大组件 kubectl、kubeadm、kubelet,都是比较重要的,下面简单介绍下:

  • kubectl 是 K8s 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
  • kubeadm 是部署、安装 K8s 的一种命令工具。它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 Kubernetes 集群的最佳实践。
  • 关于 kubelet,在 K8s 集群中,在每个 Node 上都会启动一个 kubelet 服务的进程。该进程用于处理 Master 下发到本节点的任务,管理 Pod 及 Pod 中的容器。每个 kubelet 进程都会在 API Server 上注册节点自身的信息,定期向 Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源。

接下来启动服务并设置开机自动重启:

systemctl enable kubelet && sudo systemctl start kubelet

组件安装好了,接下来安装 K8s 相关镜像,由于 gcr.io 网络访问不了,从 registry.cn-hangzhou.aliyuncs.com 镜像地址下载:

docker pull registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-apiserver:v1.13.5

docker pull registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-controller-manager:v1.13.5

docker pull registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-scheduler:v1.13.5

docker pull registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-proxy:v1.13.5

docker pull registry.cn-hangzhou.aliyuncs.com/kuberimages/pause:3.1

docker pull registry.cn-hangzhou.aliyuncs.com/kuberimages/etcd:3.2.24

docker pull registry.cn-hangzhou.aliyuncs.com/kuberimages/coredns:1.2.6

注意:每个镜像的版本要注意,而且对应的 CoreDNS、Etcd 版本也要对应,每个版本的 K8s 对应的不一样的。否则,可能会出问题的。

拉取镜像后,我们需要打标签,因为 kubeadm init 的时候,标签是固定的,具体如下:

docker tag registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-apiserver:v1.13.5 k8s.gcr.io/kube-apiserver:v1.13.5

docker tag registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-controller-manager:v1.13.5 k8s.gcr.io/kube-controller-manager:v1.13.5

docker tag registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-scheduler:v1.13.5 k8s.gcr.io/kube-scheduler:v1.13.5

docker tag registry.cn-hangzhou.aliyuncs.com/gg-gcr-io/kube-proxy:v1.13.5 k8s.gcr.io/kube-proxy:v1.13.5

docker tag registry.cn-hangzhou.aliyuncs.com/kuberimages/pause:3.1 k8s.gcr.io/pause:3.1

docker tag registry.cn-hangzhou.aliyuncs.com/kuberimages/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24

docker tag registry.cn-hangzhou.aliyuncs.com/kuberimages/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

kubeadm 初始化

上面的操作步骤走完后,接下来就是利用 kubeadm 初始化 K8s,其中主机 IP 根据自己的实际情况输入,通过 kubeadm init [flags] 形式可以启动一个 master 节点:

kubeadm init --kubernetes-version=v1.13.5 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.16.0.0/16 --apiserver-advertise-address=${masterIp} | tee kubeadm-init.log

此时,如果未知主机 IP,也可利用 yaml 文件动态初始化,我们通过 hosts 来进行动态加载:

vi /etc/hosts
10.10.5.100 k8s.api.server

vi kube-init.yaml

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.5
imageRepository: registry.aliyuncs.com/google_containers
apiServer:
  certSANs:
  - "k8s.api.server"
controlPlaneEndpoint: "k8s.api.server:6443"
networking:
  serviceSubnet: "10.1.0.0/16"
  podSubnet: "10.244.0.0/16"

设置 Etcd HA 版本:

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.5
imageRepository: registry.aliyuncs.com/google_containers
apiServer:
  certSANs:
  - "api.k8s.com"
controlPlaneEndpoint: "api.k8s.com:6443"
etcd:
    external:
        endpoints:
        - https://ETCD_0_IP:2379
        - https://ETCD_1_IP:2379
        - https://ETCD_2_IP:2379
networking:
  serviceSubnet: 10.1.0.0/16
  podSubnet: 10.244.0.0/16

注意:apiVersion 中用 kubeadm,因为需要用 kubeadm 来初始化,最后执行下面来初始化。

kubeadm init --config=kube-init.yaml

请耐心等几分钟直到结束。

出现问题,解决后,执行:

kubeadm reset

如果需要更多,可执行下面来查看:

 kubeadm --help

部署如果没问题,查看当前的版本:

kubelet --version

部署出现问题

先删除 node 节点(集群版):

kubectl drain <node name> --delete-local-data --force --ignore-daemonsets

kubectl delete node <node name>

清空 init 配置在需要删除的节点上执行(注意,当执行 init 或者 join 后出现任何错误,都可以使用此命令返回):

kubeadm reset

查问题

初始化后出现问题,可以通过以下命令先查看其容器状态以及网络情况:

sudo docker ps -a | grep kube | grep -v pause

sudo docker logs CONTAINERID

sudo docker images && systemctl status -l kubelet

netstat -nlpt

kubectl describe ep kubernetes

kubectl describe svc kubernetes

kubectl get svc kubernetes

kubectl get ep

netstat -nlpt | grep apiser

vi /var/log/syslog

给当前用户配置 K8s apiserver 访问公钥

sudo mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

网络插件

在上面的步骤后,如果查看节点情况:

kubectl get nodes

查看 nodes 状态信息,看到 node 节点的状态为 NotReady,这是因为缺少容器网络的配置。

接下来需要部署网络插件:

kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml

wget https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

vi calico.yaml

- name: CALICO_IPV4POOL_IPIP
 value:"off"
- name: CALICO_IPV4POOL_CIDR
 value: "10.244.0.0/16

kubectl apply -f calico.yaml

单机下允许 master 节点部署 pod 命令如下:

kubectl taint nodes --all node-role.kubernetes.io/master-

禁止 master 部署 pod:

kubectl taint nodes k8s node-role.kubernetes.io/master=true:NoSchedule

以上单机版部署结束,如果你的项目中,交付的是软硬件结合的一体机,那么到此就结束了。记得单机下要允许 master 节点部署哟!

K8s 集群版实战

以上面部署的机器为例,作为 master 节点,我们备份一些配置到节点机器,执行:

scp /etc/kubernetes/admin.conf $nodeUser@$nodeIp:/home/$nodeUser

scp /etc/kubernetes/pki/etcd/* $nodeUser@$nodeIp:/home/$nodeUser/etcd

kubeadm token generate

kubeadm token create $token_name --print-join-command --ttl=0

kubeadm join $masterIP:6443 --token  $token_name --discovery-token-ca-cert-hash $hash

注意,这个 token 24 小时后会失效,如果后面有其他节点要加入的话,处理方法:

kubeadm token generate

kubeadm token list

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

然后拿到 token 和一个 sha256 密钥后执行下面即可加入集群:

kubeadm join $masterIP:6443 --token  $token_name --discovery-token-ca-cert-hash $hash

Node 机器执行时,如果需要 Cuda,可以参考以下资料:

正式执行:

vim /etc/modprobe.d/blacklist-nouveau.conf

blacklist nouveau
options nouveau modeset=0
update-initramfs -u

重启 Ubuntu 查看是否禁用成功:

lsmod | grep nouveau

apt-get remove --purge nvidia*

https://developer.nvidia.com/cuda-downloads

sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

安装 Cuda:

accept

select "Install" / Enter

select "Yes"

sh cuda_10.1.168_418.67_linux.run

echo 'export PATH=/usr/local/cuda-10.1/bin:$PATH' >> ~/.bashrc

echo 'export PATH=/usr/local/cuda-10.1/NsightCompute-2019.3:$PATH' >> ~/.bashrc

echo 'export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc

source ~/.bashrc

重启机器,检查 Cuda 是否安装成功。

查看是否有 nvidia* 的设备:

cd /dev && ls -al

如果没有,创建一个 nv.sh:

vi nv.sh
#!/bin/bash /sbin/modprobe nvidia
if [ "$?" -eq 0 ];
then
NVDEVS=`lspci |
 grep -i NVIDIA
`
N3D=`
echo
"$NVDEVS"
| grep "3D controller" |
 wc -l
`
NVGA=`
echo
"$NVDEVS"
| grep "VGA compatible controller" |
 wc -l
`
N=`
expr $N3D + $NVGA -
1
`
for i in `
seq
0
 $N
`; do
    mknod -m 666 /dev/nvidia$i c 195 $i
done
    mknod -m 666 /dev/nvidiactl c 195 255
else
    exit 1
fi

chmod +x nv.sh && bash nv.sh

再次重启机器查看 Cuda 版本:

nvcc -V

编译:

cd /usr/local/cuda-10.1/samples &&  make

cd  /usr/local/cuda-10.1/samples/bin/x86_64/linux/release ./deviceQuery

以上如果输出“Result = PASS”,代表 Cuda 安装成功。

安装 nvdocker:

vim /etc/docker/daemon.json
{
"runtimes":{
    "nvidia":{
         "path":"nvidia-container-runtime",
          "runtimeArgs":[]
     }
},
"registry-mirrors":["https://registry.docker-cn.com"],
"storage-driver":"overlay2",
"default-runtime":"nvidia",
"log-driver":"json-file",
"log-opts":{
 "max-size":"100m"
},
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": [$harborRgistry],
"live-restore": true
}

重启 Docker:

sudo systemctl daemon-reload && sudo systemctl restart docker && docker info

检查 nvidia-docker 安装是否成功:

docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

在节点机器进入 su 模式:

su $nodeUser

给当前节点用户配置 K8s apiserver 访问公钥:

mkdir -p $HOME/.kube

cp -i  admin.conf $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

mkdir -p $HOME/etcd

sudo rm -rf /etc/kubernetes

sudo mkdir -p /etc/kubernetes/pki/etcd

sudo cp /home/$nodeUser/etcd/* /etc/kubernetes/pki/etcd

sudo kubeadm join $masterIP:6443 --token  $token_name --discovery-token-ca-cert-hash $hash

如:

sudo kubeadm join 192.168.8.116:6443 --token vyi4ga.foyxqr2iz9i391q3 --discovery-token-ca-cert-hash sha256:929143bcdaa3e23c6faf20bc51ef6a57df02edf9df86cedf200320a9b4d3220a

检查 node 是否加入 master:

kubectl get node

以上是在腾讯云服务器上部署K8s集群版。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
【玩转腾讯云】腾讯云部署K8s集群
如果想要了解 K8s 的一些特性,并且将其应运的很好,那就需要动手部署一个 K8s 集群。下面讲解下在腾讯云上 K8s 集群部署流程。
<<上一篇
下一篇>>