前言:
8月2日,博云正式发布了 FabEdge 开源项目,这是一款基于 K8S 和 Kubedge 构建的针对边缘计算场景的开源网络方案。发布之后,FabEdge 受到很多开发者的关注,并对 FabEdge 提出了很多宝贵的建议。同时,我们注意到用户在安装部署 FabEdge 的过程中,遇到因为无法搭建 Kubernetes + Kubedge 集群,而无法体验 FabEdge 的挑战。
因此,针对这一问题,FabEdge 团队推出了一键部署K8S 和 Kubedge 的功能,本期文章将介绍使用该功能快速部署集群,从而极速上手体验 FabEdge 项目。
快速部署K8S集群
安装条件
-
遵循 kubeadm 的最低要求 ,Master && Node 最低2C2G,磁盘空间不小于10G;
⚠️注意:尽可能提供干净的机器,避免其他因素引起安装错误。
支持的操作系统
-
Ubuntu 18.04.5 Server 4.15.0-136-generic (推荐使用)
-
Ubuntu 20.04.2 Server 5.4.0-66-generic
-
CentOS Linux release 7.9.2009 (Core)
-
CentOS Linux release 7.8.2003 (Core)
部署k8s集群
1. 安装 k8s Master 节点
以 Ubuntu 18.04.5 系统为例子,运行以下指令:
root@master:~# curl http://116.62.127.76/FabEdge/fabedge/main/deploy/cluster/install-k8s.sh | bash -
⚠️注意:如果加载时间过长,表明网速较慢,请耐心等待
如果出现以下信息,表示安装成功:
PLAY RECAP *********************************************************************master : ok=15 changed=13 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2. 添加 k8s 边缘节点
root@master:~# 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、密码是 pwd111、IP为10.22.45.26,指令如下:
root@master:~# 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=pwd111 ansible_host=10.22.45.26
如果出现以下信息,表示安装成功:
PLAY RECAP *********************************************************************edge1 : ok=13 changed=10 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
3. 确认节点添加成功
root@master:~# kubectl get nodeNAME STATUS ROLES AGE VERSIONedge1 Ready agent,edge 22m v1.19.3-kubeedge-v1.5.0master Ready master,node 32m v1.19.7
⚠️注意:如果边缘节点没有配置密码,需要配置ssh证书。
master节点配置ssh证书:
root@master:~# docker exec -it installer bashroot@master:~# ssh-copy-id {edge-node-IP}
FabEdge部署
关闭 rp_filter
在所有云端节点执行下面命令:
root@master:~# for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >$i; done#保存配置root@master:~# vi /etc/sysctl.conf..net.ipv4.conf.default.rp_filter=0net.ipv4.conf.all.rp_filter=0..#确认配置生效root@master:~# sysctl -a | grep rp_filter | grep -v arp..net.ipv4.conf.cali18867a5062d.rp_filter = 0net.ipv4.conf.cali6202a829553.rp_filter = 0..
查看 nodelocaldns 服务状态
-
确认所有边缘节点上nodelocaldns的pod启动正常
root@master:~# kubectl get po -n kube-system -o wide| grep nodelocaldnsnodelocaldns-4m2jx 1/1 Running 0 25m 10.22.45.30 master nodelocaldns-p5h9k 1/1 Running 0 35m 10.22.45.26 edge1
获取 Fabedge
root@master:~# git clone https://github.com/FabEdge/fabedge.git
为 strongswan 生成证书
-
为每个边缘节点生成证书, 以edge1为例:
root@master:~# kubectl get node NAME STATUS ROLES AGE VERSION edge1 Ready agent,edge 47m v1.19.3-kubeedge-v1.1.0 master Ready master,node 57m v1.19.7# 云端执行,生成证书root@master:~# docker run --rm -v /ipsec.d:/ipsec.d fabedge/strongswan:latest /genCert.sh edge1 # 登录边缘节点,在边缘节点edge1上创建目录root@edge1:~# mkdir -p /etc/fabedge/ipsec root@edge1:~# cd /etc/fabedge/ipsec root@edge1:/etc/fabedge/ipsec# mkdir -p cacerts certs private # 将生成的证书copy到边缘节点, # 注意证书名字: edge1_cert -> edgecert.pem, edge1.ipsec.secrets -> ipsec.secrets# “edgecert.pem”,“ipsec.secrets” 是固定名字,不能改变root@master:~# scp /ipsec.d/cacerts/ca.pem <user>@edge1:/etc/fabedge/ipsec/cacerts/ca.pemroot@master:~# scp /ipsec.d/certs/edge1_cert.pem <user>@edge1:/etc/fabedge/ipsec/certs/edgecert.pemroot@master:~# scp /ipsec.d/private/edge1_key.pem <user>@edge1:/etc/fabedge/ipsec/private/edge1_key.pemroot@master:~# scp /ipsec.d/edge1.ipsec.secrets <user>@edge1:/etc/fabedge/ipsec/ipsec.secrets
-
为connector服务生成证书,并拷贝到运行connector服务的节点上, 以master为例:
root@master:~# kubectl get node NAME STATUS ROLES AGE VERSION edge1 Ready agent,edge 62m v1.19.3-kubeedge-v1.1.0 master Ready master,node 72m v1.19.7 # 在master上执行, 生成证书root@master:~# docker run --rm -v /ipsec.d:/ipsec.d fabedge/strongswan:latest /genCert.sh connector # 在master上执行,创建目录root@master:~# mkdir -p /etc/fabedge/ipsec root@master:~# cd /etc/fabedge/ipsec root@master:/etc/fabedge/ipsec# mkdir -p cacerts certs private # 在master上执行,copy证书root@master:~# cp /ipsec.d/cacerts/ca.pem /etc/fabedge/ipsec/cacerts/ca.pemroot@master:~# cp /ipsec.d/certs/connector_cert.pem /etc/fabedge/ipsec/certs/connector_cert.pemroot@master:~# cp /ipsec.d/private/connector_key.pem /etc/fabedge/ipsec/private/connector_key.pemroot@master:~# cp /ipsec.d/connector.ipsec.secrets /etc/fabedge/ipsec/ipsec.secrets
创建命名空间
-
创建 fabedge 的资源使用的 namespace,默认为 fabedge,
root@master:~# kubectl create ns fabedge
部署 Connector
-
在云端选取一个节点运行 connector,为节点做标记,以 master 为例:
root@master:~# kubectl get node NAME STATUS ROLES AGE VERSION edge1 Ready agent,edge 107m v1.19.3-kubeedge-v1.1.0 master Ready master,node 117m v1.19.7 root@master:~# kubectl label no master node-role.kubernetes.io/connector=root@master:~# kubectl get node NAME STATUS ROLES AGE VERSION edge1 Ready agent,edge 108m v1.19.3-kubeedge-v1.1.0 master Ready connector,master,node 118m v1.19.7
-
修改 connector 的配置
按实际环境修改 edgePodCIDR, ip, sbunets 属性
root@master:~# vi ~/fabedge/deploy/connector/cm.yaml
data: connector.yaml: | tunnelConfig: /etc/fabedge/tunnels.yaml certFile: /etc/ipsec.d/certs/connector_cert.pem viciSocket: /var/run/charon.vici # period to sync tunnel/route/rules regularly syncPeriod: 5m edgePodCIDR: 10.10.0.0/16 # namespace for fabedge resources fabedgeNS: fabedge debounceDuration: 5s tunnels.yaml: | # connector identity in certificate id: C=CN, O=StrongSwan, CN=connector # connector name name: cloud-connector ip: 10.22.45.30 # ip address of node, which runs connector subnets: - 10.233.0.0/17 # CIDR used by pod & service in the cloud cluster nodeSubnets: - 10.22.45.30/32 # IP address of all cloud cluster - 10.22.45.31/32 - 10.22.45.32/32
⚠️注意:
CIDR:无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配IP地址以及在互联网上有效地路由IP数据包的对IP地址进行归类的方法。
edgePodCIDR:选择一个大的网段,每个边缘节点会从中分配一个小段,每个边缘pod会从这个小段分配一个IP地址,不能和云端pod或service的网段冲突。
ip:运行connector服务的节点的IP地址,确保边缘节点能ping通这个ip。
root@edge1:~ # ping 10.22.45.30
subnets: 需要包含service clusterIP CIDR 和 pod clusterIP CIDR
比如,service clusterIP CIDR 是 10.233.0.0/18,podClusterIPCIDR = 10.233.64.0/18 那么subnets是10.233.0.0/17
获取service clusterIP CIDR和pod clusterIP CIDR的方法如下:
# service clusterIP CIDRroot@master:~# grep -rn "service-cluster-ip-range" /etc/kubernetes/manifests# pod clusterIP CIDRroot@master:~# calicoctl.sh get ipPool
nodeSubnets:需要添加所有的云端节点的ip地址
-
为connector创建configmap
root@master:~# kubectl apply -f ~/fabedge/deploy/connector/cm.yaml
-
部署connector
root@master:~# kubectl apply -f ~/fabedge/deploy/connector/deploy.yaml
-
修改calico配置
cidr为前面分配的edgePodCIDR,disabled为true
root@master:~# vi ~/fabedge/deploy/connector/ippool.yaml
apiVersion: projectcalico.org/v3kind: IPPoolmetadata: name: fabedgespec: blockSize: 26 cidr: 10.10.0.0/16 natOutgoing: false disabled: true
-
创建calico pool
# 不同环境,calico的命令可能会不同root@master:~# calicoctl.sh create --filename=/root/fabedge/deploy/connector/ippool.yamlroot@master:~# calicoctl.sh get IPPool --output yaml # 确认pool创建成功# 如果提示没有calicoctl.sh文件,请执行以下指令root@master:~# export DATASTORE_TYPE=kubernetesroot@master:~# export KUBECONFIG=/etc/kubernetes/admin.confroot@master:~# calicoctl get ipPoolNAME CIDR SELECTOR default-pool 10.231.64.0/18 all() fabedge 10.10.0.0/16 all()
配置边缘节点
-
修改edgecore配置文件
root@edge1:~# vi /etc/kubeedge/config/edgecore.yaml
a) 禁用edgeMesh
edgeMesh: enable: false
b) 启用CNI
edged: enable: true # 默认配置,如无必要,不要修改 cniBinDir: /opt/cni/bin cniCacheDirs: /var/lib/cni/cache cniConfDir: /etc/cni/net.d # 这一行默认配置文件是没有的,得自己添加 networkPluginName: cni networkPluginMTU: 1500
c) 配置域名和DNS
edged: clusterDNS: "169.254.25.10" clusterDomain: "root-cluster"
可以在云端执行如下操作获取相关信息
root@master:~# kubectl get cm nodelocaldns -n kube-system -o jsonpath="{.data.Corefile}"root-cluster:53 {...bind 169.254.25.10...}root@master:~# grep -rn "cluster-name" /etc/kubernetes/manifests/kube-controller-manager.yaml20: - --cluster-name=root-cluster# 本例中,domain为root-cluster, dns为169.254.25.10
-
安装CNI插件
root@edge1:~# mkdir -p cni /opt/cni/bin /etc/cni/net.d /var/lib/cni/cacheroot@edge1:~# cd cniroot@edge1:~/cni# wget https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-amd64-v0.9.1.tgzroot@edge1:~/cni# tar xvf cni-plugins-linux-amd64-v0.9.1.tgzroot@edge1:~/cni# cp bridge host-local loopback /opt/cni/bin
-
重启edgecore
root@edge1:~# systemctl restart edgecore
-
确认边缘节点就绪
root@master:~# kubectl get node NAME STATUS ROLES AGE VERSION edge1 Ready agent,edge 125m v1.19.3-kubeedge-v1.1.0 master Ready connector,master,node 135m v1.19.7
部署Operator
-
创建Community CRD
root@master:~# kubectl apply -f ~/fabedge/deploy/crds
-
修改配置文件
按实际环境修改edge-network-cidr
root@master:~# vi ~/fabedge/deploy/operator/fabedge-operator.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: fabedge-operator namespace: fabedge labels: app: fabedge-operatorspec: replicas: 1 selector: matchLabels: app: fabedge-operator template: metadata: labels: app: fabedge-operator spec: containers: - name: operator image: fabedge/operator:latest imagePullPolicy: IfNotPresent args: - -namespace=fabedge - -edge-network-cidr=10.10.0.0/16 # edge pod使用的网络 - -agent-image=fabedge/agent - -strongswan-image=fabedge/strongswan - -connector-config=connector-config - -endpoint-id-format=C=CN, O=StrongSwan, CN={node} - -v=5 hostNetwork: true serviceAccountName: fabedge-operator
⚠️注意:
edge-network-cidr为【部署Connector】中“修改connector的配置”分配的edgePodCIDR
-
创建Operator
root@master:~# kubectl apply -f ~/fabedge/deploy/operator
确认服务正常启动
root@master:~# kubectl get po -n fabedgeNAME READY STATUS RESTARTS AGEconnector-5947d5f66-hnfbv 2/2 Running 0 35mfabedge-agent-edge1 2/2 Running 0 22sfabedge-operator-dbc94c45c-r7n8g 1/1 Running 0 55s
关于FabEdge
FabEdge 是一款基于 kubernetes 和 kubeedge 构建的开源网络方案,解决边缘计算场景下,容器网络配置管理复杂、网络割裂互不通信、缺少服务发现、缺少拓扑感知能力、无法提供就近访问等难题。
并且,Fabedge 支持弱网环境,如4/5G,WiFi,LoRa 等;支持边缘节点动态 IP 地址,适用于物联网,车联网等场景。
Github:
https://github.com/FabEdge/fabedge
官方网站:
http://www.fabedge.io
官方邮箱:
fabedge@beyondcent.com
微信群:打开“博云”公众号,点击菜单栏“扫码入群”