KubeEdge环境搭建(支持网络插件flannel)

准备工作——K8s集群环境搭建

官方文档:
使用Keadm进行部署

首先要配置好Kubernetes集群。

K8s需要全程在root用户下进行操作,因此需要先切换到root用户下:

sudo su

安装K8s一般使用kubeadm,官方文档:
kubeadm官方文档

按照官方文档进行安装

准备开始

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
    CPU 2 核心及以上。
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
  • 开启机器上的某些端口。
  • 禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区。

禁用交换分区使用命令

	swapoff -a

但是重启机器后会失效,如果需要永久关闭需要编辑文件

	vi /etc/fstab

在里面注释掉最后一行(应该有swap字样,大概长这样/dev/mapper/cl-swap swap swap defaults 0 0),如果不含swap那就还是别乱注释,每次开机运行上面的命令关一下吧。

配置国内镜像(仅amd64架构,如果是arm架构的不要更改镜像)

首先使用以下命令进入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,就会提示安装docker的命令。
使用

sudo apt install docker.io

安装K8s

安装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 <<EOF >/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就安装成功了。

初始化Master节点

在准备工作全部完成后,就可以在主节点上使用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:
已经ready

再复制一份kube-flannel-edge.yaml修改其中:
93行改名为kube-flannel-edge-ds
118行左右添加:

- key: node-role.kubernetes.io/agent
  operator: Exists

并且我的边缘节点架构是arm64,所以也修改了一下
修改

在161行左右添加一行参数:

- --kube-api-url=http://127.0.0.1:10550

添加参数
然后再应用该配置文件:

kubectl apply -f kube-flannel-edge.yml

部署可视化KuBoard

Kuboard官网
提供的命令如下:

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

部署完成后,进入30080端口可以看到这个命令,运行
部署完成

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

然后就可以看到集群信息了
完成

Cloud节点配置

进入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成功运行。
pods
使用

./keadm gettoken

获取token
token

Edge节点配置

下载keadm,与上面Master的下载方法相同,解压完成后进入目录(我这里是arm,你们的目录不一定一样)

 cd keadm-v1.12.0-linux-arm64/keadm/

需要运行:(<ip>是master的ip,<token>就是上面获取的token)

./keadm join --cloudcore-ipport=<ip>:10000 --token=<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,则说明部署成功。
查看节点信息

如果去主节点看还是没有,可以看日志寻找问题,见最后一章问题排查

修改EdgeCore配置

为了让flannel能够访问到 http://127.0.0.1:10550,我们需要配置EdgeCore的metaServer功能,在边缘节点上修改:

vim /etc/kubeedge/config/edgecore.yaml

在161行左右配置为true
打开metaServer
然后重启一下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命令,运行成功:
运行成功

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值