Icebound

icebound-area

KubeEdge国内Ubuntu部署

KubeEdge及其依赖本身部署难度极低,国外各路大神都已经做好了一键脚本,不幸的是国内的网络环境极差,各种被墙,因此要手动做很多工作。

在部署开始前,请确保自己已经更换了apt的软件源为国内源。

具体来说,我的方法是首先用国内镜像弄好docker和K8s,然后装一个代理,最后通过代理加速直接安装KubeEdge。因为K8s和docker本身比较大,且国内镜像比较多。

依赖环境安装

需要的依赖有docker和k8s,golang选装。

注意1:如果你使用虚拟机环境的话,一定要改成网卡桥接模式,然后给每个虚拟机固定IP。因为K8s如果IP变动会很麻烦。

注意2:你环境中的几个机子的名字一定不要重名。虽然重名也没关系,但是会给你在视觉上带来困扰。

注意3:K8S master节点默认要求2个核心,如果你想在你性能羸弱的单核学生机上运行的话,记着在init时加上--ignore-preflight-errors=NumCPU

注意4:记着关掉swap:swapoff -a

docker安装

因为KubeEdge项目显示最高适配到k8s 1.19版本,因此对应的docker也不能安装最新版。

请参照这篇教程中的【手动安装】部分,选用docker-ce 19.3.9:

https://www.runoob.com/docker/ubuntu-docker-install.html

安装完成后,记着修改docker的镜像源为国内源,这个网上都有很多教程,不再赘述。

K8s 部署

首先在/etc/apt/sources.list添加源

deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main

apt-get update 一下之后,apt-cache madison kubectl 看一下有什么可用版本,选1.19版本中的一个就行,我选的是1.19.7

然后

apt-get install -y kubelet=1.19.7-00 kubeadm=1.19.7-00 kubectl=1.19.7-00

装完之后,由于国内拉k8s镜像容易出问题,所以要提前拉好镜像。

使用下面我提供的这个脚本进行镜像自动拉取:

for  i  in  `kubeadm config images list`;  do
    imageName=${i#k8s.gcr.io/}
    docker pull registry.aliyuncs.com/google_containers/$imageName
    docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.aliyuncs.com/google_containers/$imageName
done;

具体使用方法就是新建一个xxx.sh文件,把上面内容复制进去,再给这个xxx.sh赋予可执行权限,再进行sh xxx.sh,就能自动拉取了。

最后执行docker images检查一下镜像是否准备好,如果都准备好了的话,执行下面命令初始化节点:
kubeadm init --pod-network-cidr=10.244.0.0/16

如果初始化成功,最后一行会提示你使用kubeadm join加入集群,这里我们不要理会。

为了使主节点生效,(也许)需要添加网络插件。(可以不装网络插件flannel!!!)

如果你知道忽略/替换后怎么做的话,以下步骤可以忽略/替换

首先,为了操作kubectl,要先设置环境变量

export KUBECONFIG=/etc/kubernetes/admin.conf

为了添加网络插件,你需要有一个yaml配置文件,然而这个文件被墙了,我上传到了百度网盘上。

链接: https://pan.baidu.com/s/1X-FXapQeYr4WbEaX1Ot2ZA 提取码: uuia

下载之后导入这个配置文件:

kubectl apply -f kube-flannel.yml

导入之后,等个十几分钟之后,执行一下

kubectl get nodes -o wide

如果节点状态已经ready了,那么说明你非常幸运,flannel网络插件成功安装了。如果没有ready,大概率因为flannel文件拉取不下来。(这个过程我一共在4个环境中装过6次,有1次是直接成功了,剩下5次都是拉取不下来)。

这时候可以尝试执行以下脚本:

docker pull quay.io/coreos/flannel:v0.10.0-amd64 
mkdir -p /etc/cni/net.d/
cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=172.100.0.0/16
FLANNEL_SUBNET=172.100.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF

节点状态ready之后,可以认为k8s装好了,就可以进入下一步了。

CloudCore安装

这里如果使用keadm安装,一定给你ubuntu开个代理,因为中间要去github pull资源。对于怎么开代理不再赘述。这里只介绍keadm安装,因为这是官方推荐方法。

首先你要去kubeedge的页面上把keadm下载下来,网址是:

https://github.com/kubeedge/kubeedge/releases/download/v1.5.0/keadm-v1.5.0-linux-amd64.tar.gz

之后解压,直接运行:
./keadm init

它会自动检查k8s的配置,然后自动安装kubeedge。如果一切正常,它最后会提示你在xxx路径看log

EdgeCore安装

Edge端无需k8s,只需要docker,docker版本最好跟cloud一样避免出问题。

这里也说一下用keadm安装(推荐使用代理加速)。

先在云服务器上使用./keadm gettoken获得一段token。

然后在边缘执行
./keadm join --cloudcore-ipport=<MasterIP>:10000 --token=<token>

把MasterIP替换成你服务器IP,token换成刚刚获取的token。

这个边缘的执行过程有时候会中间报错,不用管,重新再执行一次就行。

执行结束之后,在边缘端执行systemctl status edgecore可以查看edgecore的运行状态

最后,去云服务器上执行:kubectl get node可以看到两个node,说明连上了。

注意:这时候Edge端会一直报错,这是因为一开始那个网络插件会被调度到Edge上去执行,但是Edge端并没有支持flannel。可以不装flannel以避免此错误。