KubeEdge 是一个开源的系统,可将本机容器化应用编排和管理扩展到边缘端设备。 它基于Kubernetes构建,为网络和应用程序提供核心基础架构支持,并在云端和边缘端部署应用,同步元数据。KubeEdge 还支持 MQTT 协议,允许开发人员编写客户逻辑,并在边缘端启用设备通信的资源约束。KubeEdge 包含云端和边缘端两部分。
FabEdge是一个专门针对边缘计算场景设计的,基于kubernetes的容器网络方案,它符合CNI规范,可以无缝集成任何K8S环境,解决边缘计算场景下云边协同,边边协同,服务发现等难题。
参考文档:https://gitee.com/mirrors/FabEdge/tree/main/docs
结合官方所给文档,我将自己部署过程出现过的问题和步骤都总结了一下。
这里官方给出了一键部署的脚本供我们使用。
遵循 kubeadm的最低要求 ,Master && Node 最低2C2G,磁盘空间不小于10G;
⚠️注意:尽可能使用干净的系统,避免其他因素引起安装错误。
Ubuntu 18.04 (官方推荐使用,我使用的是centos7最小化安装版)
Ubuntu 20.04
CentOS 7.9
CentOS 7.8
在主节点也就是master节点上运行以下指令:
sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/install-k8s.sh | bash -
⚠️注意:如果加载时间过长,有可能网速较慢,请耐心等待(确实很长时间,第一个包下1.2G花了半个小时)
安装过程可能出现以下问题:
这个问题上网查了一下,我的解决方法是每个节点都手动配置一下hosts
vi /etc/hosts
#添加以下信息,前面为ip地址,后面为节点名
192.168.230.143 master
192.168.230.144 edge1
192.168.230.145 edge2
2021-11-29 04:04:21,419 INFO {'playbook': '/opt/ansible/pre-deploy.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,419 INFO {'playbook': '/opt/kubespray/cluster.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,420 INFO {'playbook': '/opt/ansible/post-deploy.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,420 INFO {'playbook': '/opt/ansible/cloudcore.yml', 'rc': 0} has been deployed, skipped.
2021-11-29 04:04:21,420 INFO {'playbook': '/opt/ansible/iptables-persistent.yml', 'rc': 0} has been deployed, skipped.
这个问题我自己感觉应该是已经安装好了,但是输入kubectl get node他提示没有找到指令:kubectl
不知道是什么问题造成的没有安装上kubelet,于是我使用了万能的重启大法
reboot
重启之后再进行了一遍安装,还是提示这个错误,但是等了一会kubectl就能用了。
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master,node 3h19m v1.19.7
如果有出现以下信息,表示安装成功:
PLAY RECAP *********************************************************************
master : ok=15 changed=13 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/add-edge-node.sh | bash -s -- --host-vars ansible_hostname={hostname} ansible_user={username} ansible_password={password} ansible_host={edge-node-IP}
参数说明:
ansible_hostname 指定边缘节点的主机名
ansible_user 配置边缘节点的用户名
ansible_password 配置边缘节点的密码
ansible_host 配置边缘节点的IP地址
例如:设置边缘节点的主机名为edge1、用户名是root、密码是root、IP为192.168.230.144,指令如下:
sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/add-edge-node.sh | bash -s -- --host-vars ansible_hostname=edge1 ansible_user=root ansible_password=root ansible_host=192.168.230.144
如果出现以下信息,表示安装成功:
PLAY RECAP *********************************************************************
edge1 : ok=13 changed=10 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
sudo kubectl get node
NAME STATUS ROLES AGE VERSION
edge1 Ready agent,edge 3h16m v1.19.3-kubeedge-v1.5.0
master Ready master,node 3h19m v1.19.7
sudo curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/add-edge-node.sh | bash -s -- --host-vars ansible_hostname=edge2 ansible_user=root ansible_password=root ansible_host=192.168.230.145
PLAY RECAP *********************************************************************
edge2 : ok=13 changed=10 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
edge1 Ready agent,edge 3h20m v1.19.3-kubeedge-v1.5.0
edge2 Ready agent,edge 45s v1.19.3-kubeedge-v1.5.0
master Ready master,node 3h23m v1.19.7
- Kubernetes (v1.19.7)
- Calico (v3.16.5)
- KubeEdge (v1.8.0)
(我们前面步骤已经一键快速部署好了)
确认所有边缘节点上nodelocaldns正常运行
$ kubectl get po -n kube-system -o wide -l "k8s-app=nodelocaldns"
nodelocaldns-4m2jx 1/1 Running 0 25m 10.22.45.30 master
nodelocaldns-p5h9k 1/1 Running 0 35m 10.22.45.26 edge1
确认所有边缘节点上没有运行任何calico的组件
$ kubectl get po -n kube-system -o wide | grep -i calico
calico-kube-controllers-8b5ff5d58-ww4nq 1/1 Running 0 7d18h 10.22.45.30 master1 <none> <none>
calico-node-cxbd9 1/1 Running 0 7d18h 10.22.45.30 master1 <none> <none>
安装helm
$ wget https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz
$ tar -xf helm-v3.6.3-linux-amd64.tar.gz
$ cp linux-amd64/helm /usr/bin/helm
获取当前集群配置信息,供后面使用
$ curl -s http://116.62.127.76/get_cluster_info.sh | bash -
This may take some time. Please wait.
clusterDNS : 169.254.25.10
clusterDomain : root-cluster
cluster-cidr : 10.233.64.0/18
service-cluster-ip-range : 10.233.0.0/18
修改calico pool配置
$ vi ippool.yaml
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: fabedge
spec:
blockSize: 26
cidr: 10.10.0.0/16
natOutgoing: false
disabled: true
ipipMode: Always
cidr是一个用户自己选定的大网段,每个边缘节点会从中分配一个小网段,不能和get_cluster_info脚本输出的cluster-cidr或service-cluster-ip-range冲突。
创建calico pool
$ calicoctl.sh create --filename=ippool.yaml
$ calicoctl.sh get pool # 如果有fabedge的pool说明创建成功
NAME CIDR SELECTOR
default-pool 10.231.64.0/18 all()
fabedge 10.10.0.0/16 all()
# 如果提示没有calicoctl.sh命令,请尝试以下指令
$ export DATASTORE_TYPE=kubernetes
$ export KUBECONFIG=/etc/kubernetes/admin.conf
$ calicoctl create --filename=ippool.yaml
$ calicoctl get pool # 如果有fabedge的pool说明创建成功
NAME CIDR SELECTOR
default-pool 10.231.64.0/18 all()
fabedge 10.10.0.0/16 all()
在云端选取一个运行connector的节点,并为节点做标记。以master为例,
$ kubectl label no master node-role.kubernetes.io/connector=
$ kubectl get node
NAME STATUS ROLES AGE VERSION
edge1 Ready agent,edge 3h27m v1.19.3-kubeedge-v1.5.0
edge2 Ready agent,edge 8m31s v1.19.3-kubeedge-v1.5.0
master Ready connector,master,node 3h31m v1.19.7
选取的节点要允许运行普通的POD,不要有不能调度的污点,否则部署会失败。
为所有边缘节点添加一个标签
$ kubectl label node --overwrite=true edge1 node-role.kubernetes.io/edge=
$ kubectl label node --overwrite=true edge2 node-role.kubernetes.io/edge=
准备helm values.yaml文件
$ vi values.yaml
operator:
edgePodCIDR: 10.10.0.0/16
connectorPublicAddresses: 10.22.46.48
connectorSubnets: 10.233.0.0/18
edgeLabels: node-role.kubernetes.io/edge
enableProxy: true
cniType: calico
说明:
edgePodCIDR:使用上面创建的calico pool的cidr。
connectorPublicAddresses: 前面选取的,运行connector服务的节点的地址,确保能够被边缘节点访问。
connectorSubnets: 云端集群中的pod和service cidr,get_cluster_info脚本输出的service-cluster-ip-range。
edgeLables:前面为边缘节点添加的标签,默认是node-role.kubernetes.io/edge
cniType: 云端集群中使用的cni插件类型,当前支持calico。
安装FabEdge
$ helm install fabedge --create-namespace -n fabedge -f values.yaml http://116.62.127.76/fabedge-0.3.0.tgz
如果出现错误:“Error: cannot re-use a name that is still in use”,是因为fabedge helm chart已经安装,使用以下命令卸载后重试。
$ helm uninstall -n fabedge fabedge release "fabedge" uninstalled
在每个边缘节点上修改edgecore配置文件
$ vi /etc/kubeedge/config/edgecore.yaml
# 必须禁用edgeMesh
edgeMesh:
enable: false
edged:
enable: true
cniBinDir: /opt/cni/bin
cniCacheDirs: /var/lib/cni/cache
cniConfDir: /etc/cni/net.d
networkPluginName: cni
networkPluginMTU: 1500
# get_cluster_info脚本输出的clusterDNS
clusterDNS: "169.254.25.10"
# get_cluster_info脚本输出的clusterDomain
clusterDomain: "root-cluster"
在每个边缘节点上重启edgecore
$ systemctl restart edgecore
在管理节点上确认边缘节点就绪
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
edge1 Ready agent,edge 3h37m v1.19.3-kubeedge-v1.5.0
edge2 Ready agent,edge 18m v1.19.3-kubeedge-v1.5.0
master Ready connector,master,node 3h41m v1.19.7
在管理节点上确认FabEdge服务正常启动
[root@master ~]# kubectl get po -n fabedge
NAME READY STATUS RESTARTS AGE
cert-rf795 0/1 Completed 0 5m28s
connector-5db569b98b-7wv5b 2/2 Running 0 5m10s
fabedge-agent-edge1 2/2 Running 0 4m53s
fabedge-agent-edge2 2/2 Running 0 4m53s
fabedge-operator-869dc7dbff-fvcxd 1/1 Running 0 5m10s
有的网络环境存在非对称路由,需要在云端节点关闭rp_filter
$ for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >$i; done
#保存配置
$ vi /etc/sysctl.conf
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
后续问题待补充…