官方文档:
使用Keadm进行部署
首先要配置好Kubernetes集群。
K8s需要全程在root用户下进行操作,因此需要先切换到root用户下:
sudo su
安装K8s一般使用kubeadm,官方文档:
kubeadm官方文档
按照官方文档进行安装
禁用交换分区使用命令
swapoff -a
但是重启机器后会失效,如果需要永久关闭需要编辑文件
vi /etc/fstab
在里面注释掉最后一行(应该有swap字样,大概长这样/dev/mapper/cl-swap swap swap defaults 0 0),如果不含swap那就还是别乱注释,每次开机运行上面的命令关一下吧。
首先使用以下命令进入root用户。
sudo su
先把原来的软件源备份一下
cp /etc/apt/sources.list /etc/apt/sources.list.bak
然后输入以下命令配置清华源镜像(适用于20.04版本的Ubuntu,其它版本可以去清华源镜像官网查看)
echo "# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse" > /etc/apt/sources.list
然后执行更新
apt update
这一步很简单,只要输入docker,就会提示安装docker的命令。
使用
sudo apt install docker.io
安装K8s一般使用kubeadm,官方文档:
kubeadm官方文档
官方文档中给出的安装命令如下:
#请不要使用这段代码!
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
但是官方文档在国内网络环境下并不适用,请使用以下代码:
第一步是安装https
sudo apt-get update && sudo apt-get install -y apt-transport-https
但是,由于国内网络原因,无法连接Google,很可能第二步会卡死。
这里可以使用阿里云的镜像,把第二步的命令改为:
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
如果这里出错可能是你没有安装curl,先
apt install curl
然后运行:
cat </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
修改完这个list文件后,更新一下apt-get的配置
apt-get update
下面这句就是安装kubelet,kubeadm,kubectl三个k8s的核心组件
# 如果需要指定版本,使用下一段的命令,此命令是默认安装最新版
apt-get install kubelet kubeadm kubectl
如果需要指定老版本,可以通过=<版本号>来指定版本,如下:
# 需要指定版本才使用下面的命令
apt install kubelet=1.22.15-00 kubectl=1.22.15-00 kubeadm=1.22.15-00
至此,kubelet,kubeadm和kubectl就安装成功了。
在准备工作全部完成后,就可以在主节点上使用kubeadm init命令,不过这里还要加三个参数,–image-repository指定了阿里云镜像,–pod-network-cidr指明pod网络可以使用的IP地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配CIDRs,–kubernetes-version指明k8s的版本:
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.15
我这里出现了等待条件超时的错误:
解决方法是vim创建一个文件/etc/docker/daemon.json
,里面输入
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
把docker的驱动配置为systemd,然后重启docker和kubelet:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl restart kubelet
再运行kubeadm reset
和刚刚的kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.15
就成功了
成功之后会提示运行这三条命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
在root用户和普通用户下都要运行一遍,然后就配置成功了。
如果是root用户还可以执行一条
export KUBECONFIG=/etc/kubernetes/admin.conf
k8s支持的网络插件: https://kubernetes.io/docs/concepts/cluster-administration/addons/
我们使用flannel插件,但是由于kubeedge和网络插件不兼容,所以需要亲和性配置。
首先下载flannel插件的配置文件:
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
下载下来后,复制一份kube-flannel-cloud.yaml
修改其中:
在93行左右改名为kube-flannel-cloud-ds
在118行左右添加:
- key: node-role.kubernetes.io/agent
operator: DoesNotExist
kubectl apply -f kube-flannel-cloud.yml
过段时间后查看node状态可以看到master已经ready:
再复制一份kube-flannel-edge.yaml
修改其中:
93行改名为kube-flannel-edge-ds
118行左右添加:
- key: node-role.kubernetes.io/agent
operator: Exists
在161行左右添加一行参数:
- --kube-api-url=http://127.0.0.1:10550
kubectl apply -f kube-flannel-edge.yml
Kuboard官网
提供的命令如下:
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
curl -k 'http://192.168.31.209:30080/kuboard-api/cluster/default/kind/KubernetesCluster/default/resource/installAgentToKubernetes?token=mFUwzGqKRFgHrT2rj328UeCZKjs0qrUW' > kuboard-agent.yaml
kubectl apply -f ./kuboard-agent.yaml
进入GitHub的release页面复制keadm的下载地址,使用wget命令下载:
wget https://github.com/kubeedge/kubeedge/releases/download/v1.12.0/keadm-v1.12.0-linux-amd64.tar.gz
解压下载好的文件
tar -zxvf keadm-v1.12.0-linux-amd64.tar.gz
然后进入解压后的目录
cd keadm-v1.12.0-linux-amd64/keadm/
然后运行下面的会出现问题,先不要运行
后面的参数是启用cloudCore的dynamicController
# 先不要运行,会出现问题,往下看
# ./keadm init --set cloudCore.modules.dynamicController.enable=true
出现问题:
execute keadm command failed: timed out waiting for the condition
是因为cloudcore没有污点容忍,默认master节点是不部署应用的,可以用下面的命令查看污点:
kubectl describe nodes master2015 | grep Taints
把master的污点删掉
kubectl taint node master2015 node-role.kubernetes.io/master-
然后
./keadm reset
./keadm init --set cloudCore.modules.dynamicController.enable=true
CloudCore成功启动。
查看kubeedge命名空间里的pods,可以看到cloudcore成功运行。
使用
./keadm gettoken
获取token
下载keadm,与上面Master的下载方法相同,解压完成后进入目录(我这里是arm,你们的目录不一定一样)
cd keadm-v1.12.0-linux-arm64/keadm/
需要运行:(
./keadm join --cloudcore-ipport=:10000 --token=
我这里是:
./keadm join --cloudcore-ipport=192.168.31.209:10000 --token=d593d53f0d1294c1088e8f3700dedc842fc9d276a0ab472397fdc5634463c921.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Njc1NDMyNzl9.pdVbe-jpHXKcjiM9iIq-Rj6mS4_m6xyp7v2_fP8nXiA
在Master上验证是否成功,使用
kubectl get nodes -o wide
如果出现版本中带有kubeedge的node,则说明部署成功。
如果去主节点看还是没有,可以看日志寻找问题,见最后一章问题排查
为了让flannel能够访问到 http://127.0.0.1:10550,我们需要配置EdgeCore的metaServer功能,在边缘节点上修改:
vim /etc/kubeedge/config/edgecore.yaml
在161行左右配置为true
然后重启一下edgecore:
service edgecore restart
查看edgecore的日志:
journalctl -u edgecore.service -xe
我第一次失败的原因是Docker中Cgroup Driver的问题,因为kubeedge的默认驱动为cgroupfs,而我的docker以前把默认驱动改成了systemd,所以无法启动。
一种解决方法是修改/etc/docker/daemon.json
,把 "exec-opts": ["native.cgroupdriver=systemd"]
删掉(不要把大括号删掉,不然docker无法启动),重启docker
systemctl daemon-reload
systemctl restart docker
另一种解决方法是使用命令
./keadm join --help
可以看到帮助中提到:
可以运行join命令时指定该参数为systemd
如果重新join时,可能会提示要删除/etc/kubeedge目录,如果提示mqtt容器已经存在之类的问题,可以
1、杀死运行的容器:
docker kill $(docker ps -a -q)
2、删除所有容器:
docker rm $(docker ps -a -q)
最后再执行join命令,运行成功: