Deploying using Keadm | KubeEdge一个支持边缘计算的开放平台
可参看上述链接,对kubeedge部署有一个大致的了解
我们在KubeEdge文档里查看Kubernetes兼容性信息,确定我们要安装的版本
kubeedge/kubeedge: Kubernetes Native Edge Computing Framework (project under CNCF) (github.com)
我这里选择KubeEdge1.10和Kubernetes1.22进行安装
我们使用服务器版的Ubuntu22.04-server,在4台虚拟机上安装,一台作为云master,一台作为云node,另外两台作为edge-node,均使用ubuntu典型安装
主机名 | 硬盘 | 内存 | CPU |
---|---|---|---|
master | 40G | 2G | 双核 |
node | 40G | 2G | 双核 |
edgenode1 | 40G | 1G | 双核 |
edgenode2 | 40G | 1G | 双核 |
安装时软件源改成国内的阿里云:
http://mirrors.aliyun.com
对每台虚拟机按照上表设置固定ip
vi /etc/netplan/00-installer-config.yaml
dhcp4: no # 关闭动态IP设置,因为要设置固定IP
addresses:
- 192.168.134.161/24 # 要设置为的固定IP,后面的24为子网掩码的位数
gateway4: 192.168.134.2 # 要设置的网关地址
nameservers:
addresses: [192.168.134.2,114.114.114.114] # 要设置的DNS地址
sudo netplan apply # 使配置生效
所有主机关闭防火墙
sudo systemctl stop ufw
sudo systemctl disable ufw
注意,所有主机一定要关闭swap,否则会导致kubelet无法启动
# 查看swap分区情况
sudo swapon -s
# 临时关闭swap
sudo swapoff -a
# 永久禁用swap分区
sudo vi /etc/fstab
# 禁用swap分区那一行
所有虚拟机都设置时间同步为windows的时间,方便查看日志和调试
sudo apt install -y ntpdate
sudo ntpdate time.windows.com
sudo timedatectl set-timezone Asia/Shanghai
ubuntu默认没有安装selinux,所以不需要禁用selinux
启用ip转发
sudo vi /etc/sysctl.d/k8s.conf
# 写入以下内容
net.ipv4.ip_forward = 1
net.ipv6.ip_forward = 1
sudo sysctl --system # 生效
在master节点添加hosts
# 在master添加hosts
sudo vi /etc/hosts
# 加入如下几行
192.168.134.161 master
192.168.134.162 node
192.168.134.163 edgenode1
192.168.134.164 edgenode2
ubuntu的源里自带了docker.io,这个是Ubuntu维护的docker版本
docker官方维护的版本叫做docker-ce,这个版本比较新
我们选择安装docker官方的版本,可参考docker[官方文档](Install Docker Engine on Ubuntu | Docker Documentation),亲测速度还挺快的,也可以使用阿里云的国内源安装文档
记住,需要在所有4台节点上都安装docker-ce
卸载旧版
sudo apt-get remove docker docker-engine docker.io containerd runc
安装必要组件
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
增加docker官方仓库钥匙
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
加入docker官方仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装docker-ce
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
如果要安装指定版本的docker(如20.10.17版本)
sudo apt-get install docker-ce=20.10.17 docker-ce-cli=20.10.17 containerd.io docker-compose-plugin
最后,运行helloworld测试一下
sudo docker run hello-world
docker官方镜像仓库访问比较慢,可以使用阿里云加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://knjsrl1b.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
根据阿里云的教程,在两台云主机上,使用阿里源安装kubelet,kubeadm和kubectl组件
sudo apt-get update && apt-get install -y apt-transport-https
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt-get update
# 可先使用apt list kubelet -a 查看所有版本,再指定版本
sudo apt-get install -y kubelet=1.22.11-00 kubeadm=1.22.11-00 kubectl=1.22.11-00
在云master主机上使用kubeadm创建kubernetes集群,这里我们使用阿里云的镜像进行加速,这里kubeadm会安装和自己版本匹配的kubernetes
sudo kubeadm init \
--apiserver-advertise-address=192.168.134.161 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
执行完毕会输出很多提示指令需要我们执行
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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 192.168.134.161:6443 --token d8zuir.ipdqfuxvk4jxa2hl \
--discovery-token-ca-cert-hash sha256:4e90097fab2a4fbb45eedb2f02d5d196c6f86667545da14c4c377e7720316237
我们按照提示在普通用户下执行,这样kubectl就可以访问到本地的kube-api-server了
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
我们接着安装CNI网络插件,下载太慢了可以使用这个网站查询raw.githubusercontent.com的IP地址并且写入hosts文件。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
等待约半个小时,pod才下载完毕,执行kubectl get pods -n kube-system
如果出现如下说明网络插件安装成功
...
kube-flannel-ds-hgn9l 1/1 Running 0 44m
...
在云的node主机上,执行上面提示的命令加入刚才创建的集群
sudo kubeadm join 192.168.134.161:6443 --token d8zuir.ipdqfuxvk4jxa2hl \
--discovery-token-ca-cert-hash sha256:4e90097fab2a4fbb45eedb2f02d5d196c6f86667545da14c4c377e7720316237
过一会,在master主机上执行kubectl get nodes
,如下则加入成功
juju@master:~/.kube$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 58m v1.22.10
node Ready <none> 13m v1.22.10
在 Kubernetes 集群中创建一个 pod,验证是否正常运行
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 52m
service/nginx NodePort 10.109.22.72 <none> 80:32081/TCP 9m59s
可以看到nginx暴露的端口号为32081,因此我们访问地址:http://192.168.134.161:32081或者http://192.168.134.162:32081均可以成功访问nginx首页
kubeEdge和kubernetes类似,提供了keadm工具用来快速搭建kubeedge集群,我们可以提前在KubeEdge的github官网上面下载keadm1.10
wget https://github.com/kubeedge/kubeedge/releases/download/v1.10.0/keadm-v1.10.0-linux-amd64.tar.gz
# 同时提前下载kubeedge压缩包和校验文件
wget https://github.com/kubeedge/kubeedge/releases/download/v1.10.0/kubeedge-v1.10.0-linux-amd64.tar.gz
wget https://github.com/kubeedge/kubeedge/releases/download/v1.10.0/checksum_kubeedge-v1.10.0-linux-amd64.tar.gz.txt
在mater节点上下载安装keadm
tar -xvf keadm-v1.10.0-linux-amd64.tar.gz
cp keadm-v1.10.0-linux-amd64/keadm/keadm /usr/bin/
避免下载过慢,将kubeedge-v1.10.0-linux-amd64.tar.gz
文件和checksum_kubeedge-v1.10.0-linux-amd64.tar.gz.txt
预先下载存放
sudo mkdir /etc/kubeedge/
sudo cp kubeedge-v1.10.0-linux-amd64.tar.gz /etc/kubeedge/
sudo cp checksum_kubeedge-v1.10.0-linux-amd64.tar.gz.txt /etc/kubeedge/
使用keadm安装kubeedge的云端组件cloudcore
sudo keadm init --advertise-address=192.168.134.161 --kubeedge-version=1.10.0
–advertise-address=xxx.xx.xx.xx 这里的xxx.xx.xx.xx换成你master机器的ip,可以是内网地址,也可以是公网ip地址,–kubeedge-version=1.10.0 意思是指定安装的kubeEdge的版本,如果你默认不指定那么keadm会自动去下载最新的版本。
注意,这个命令会下载很多github上的资源,很容易存在无法访问,可以使用这个网站查询raw.githubusercontent.com的IP地址并且写入hosts文件。
经过无数次的连接失败以后,终于成功了
juju@master:~$ sudo keadm init --advertise-address=192.168.134.161 --kubeedge-version=1.10.0
Kubernetes version verification passed, KubeEdge installation will start...
...
kubeedge-v1.10.0-linux-amd64/edge/edgecore
kubeedge-v1.10.0-linux-amd64/version
KubeEdge cloudcore is running, For logs visit: /var/log/kubeedge/cloudcore.log
CloudCore started
我们可以看到cloudcore守护进程已经在运行了,cloudcore会监听本地的10000和10002端口
juju@master:~$ ps -ef|grep cloudcore
root 148617 1 0 02:26 ? 00:00:03 /usr/local/bin/cloudcore
juju 160793 135901 0 02:56 pts/3 00:00:00 grep --color=auto cloudcore
cloudcore可能不会自动启动,我们将其加入systemd自启动管理中
sudo cp /etc/kubeedge/cloudcore.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl start cloudcore.service
sudo systemctl enable cloudcore.service
获得边缘设备接入的token
sudo keadm gettoken
3d68b3620337e71200fd622f35a537395362f48f0f371a67ec110950625ee508.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTU4MjQyODV9.ypZ8BopEyDCCgPE7ZHixmN0EpsFtmfXTzt8I2CkGk8U
在两个边缘节点上,按照上述规格安装好边缘节点操作系统,并且安装好docker-ce
下载解压安装keadm
tar -xvf keadm-v1.10.0-linux-amd64.tar.gz
sudo cp keadm-v1.10.0-linux-amd64/keadm/keadm /usr/bin/
避免下载过慢,将kubeedge-v1.10.0-linux-amd64.tar.gz
文件和checksum_kubeedge-v1.10.0-linux-amd64.tar.gz.txt
预先下载存放
sudo mkdir /etc/kubeedge/
sudo cp kubeedge-v1.10.0-linux-amd64.tar.gz /etc/kubeedge/
sudo cp checksum_kubeedge-v1.10.0-linux-amd64.tar.gz.txt /etc/kubeedge/
加入集群,keadm会安装edgecore和mqtt协议的实现软件mosquitto,mosquitto会监听localhost:1183端口
sudo keadm join --cloudcore-ipport=192.168.134.161:10000 --token=3d68b3620337e71200fd622f35a537395362f48f0f371a67ec110950625ee508.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTU4MjQyODV9.ypZ8BopEyDCCgPE7ZHixmN0EpsFtmfXTzt8I2CkGk8U
--cloudcore-ipport
是边缘节点能访问的云master主机的IP端口号,--token
是上面云matster生成的识别码
如果访问失败,同样去这个网站查询并且修改hosts文件
185.199.108.133 raw.githubusercontent.com
又经过很多次安装后,安装成功
...
kubeedge-v1.10.0-linux-amd64/edge/edgecore
kubeedge-v1.10.0-linux-amd64/version
KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -xe
如果通过sudo systemctl status edgecore
发现服务失败,使用journalctl -u edgecore.service -xe
查看日志
排除错误:
init new edged error, misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"
解决方法,将dockers的cgroup驱动换成cgroupfs
sudo vi /etc/docker/daemon.json
# 加入"exec-opts": ["native.cgroupdriver=cgroupfs"],
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl restart edgecore
排除错误:
kubernetes.io/csi: CSIDriverLister not found on KubeletVolumeHost
删除crt文件,重新初始化
sudo rm /etc/kubeedge/ca/rootCA.crt
sudo rm /etc/systemd/system/edgecore.service
sudo systemctl stop edgecore
sudo keadm join --cloudcore-ipport=192.168.134.161:10000 --token=80f67e7d0dea3df9c2da155274dc6691002c9818d834a291a0cf77765cee073e.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTUzNDY0MDN9.ed9EH1Pw49SiYoKlyOOS52kcBRfCE-swg2SflfqvMLU
排除错误:
connect error: Network Error : dial tcp 127.0.0.1:1883: connect: connection refused
原来是mosquitto没有启动,启动一下
sudo systemctl start mosquitto
juju@edgenode1:~$ sudo netstat -tulpn | grep LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 710/sshd: /usr/sbin
tcp 0 0 127.0.0.1:1883 0.0.0.0:* LISTEN 50096/mosquitto
排除错误:
Error: failed to get edge certificate from the cloudcore, error: Invalid authorization token
token过期了,重新获取token并且重新加入集群(检查一下token有没有复制错误,我就是把用户名也复制进去了,一直出错)
keadm reset --force
sudo rm /etc/kubeedge/ca/rootCA.crt
sudo rm /etc/systemd/system/edgecore.service
sudo systemctl stop edgecore
sudo keadm join --cloudcore-ipport=192.168.134.161:10000 --token=80f67e7d0dea3df9c2da155274dc6691002c9818d834a291a0cf77765cee073e.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTUzNDY0MDN9.ed9EH1Pw49SiYoKlyOOS52kcBRfCE-swg2SflfqvMLU
终于运行成功了!
juju@edgenode1:~$ sudo systemctl status edgecore
● edgecore.service
Loaded: loaded (/etc/systemd/system/edgecore.service; enabled; vendor preset: enab>
Active: active (running) since Wed 2022-06-15 08:07:09 UTC; 23s ago
Main PID: 58687 (edgecore)
...
在master上查看
juju@master:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
edgenode1 Ready agent,edge 16m v1.22.6-kubeedge-v1.10.0
edgenode2 Ready agent,edge 35s v1.22.6-kubeedge-v1.10.0
master Ready control-plane,master 23h v1.22.10
node Ready <none> 23h v1.22.10
Deploying using Keadm | KubeEdge一个支持边缘计算的开放平台
kubeedge1.8.2安装+edgemesh配置 - 简书 (jianshu.com)
【最新版kubeEdge保姆级安装配置教程】kubeEdge v1.7使用keadm安装(半手动安装)_大宇醒言的博客-CSDN博客_kubeedge安装
【cs cd key】专题KubeEdge v1.4部署指南(实操)-木乌鸦 (muwuya.com)
KubeEdge部署(一) 2021-7-27_臭弟弟﹍的博客-CSDN博客_kubeedge部署
KubeEdge框架temperature测试demo部署_诺水城子的博客-CSDN博客
KubeEdge环境搭建-实现原理-官方计数器示例运行成功_Counter Demo_尖耳朵的阿凡达妹妹的博客-CSDN博客
kubernetes集群的服务器重启之后遇到的问题_linlin_1998的博客-CSDN博客
树莓派4B平台部署 kubeedge (cloudcore)+ isula_阿龙哥哥的博客-CSDN博客_kubeedge部署