学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
Python实战微信订餐小程序 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
目录 |
回到顶部## 简介
KubeEdge是面向边缘计算场景、专为边云协同设计的业界首个云原生边缘计算框架,在 Kubernetes 原生的容器编排调度能力之上实现了边云之间的应用协同、资源协同、数据协同和设备协同等能力,完整打通了边缘计算中云、边、设备协同的场景。其中KubeEdge架构主要包含云边端三部分:
KubeEdge是Kubernetes在边缘场景下的延伸。目标是将Kubernetes对容器编排的能力延伸到边缘上;KubeEdge主要包含两个组件,云端的CloudCore和边缘节点上EdgeCore,同时还有一个Device模块,用于管理海量的边缘设备。
回到顶部## KubeEdge
为了更好的支持KubeEdge并提供可视化界面管理边缘节点,本文档使用KubeSphere平台用来管理边缘节点,KubeSphere官方文档。
使用admin身份访问KubeSphere控制台,进入集群管理,点击定制资源定义
,找到ClusterConfiguration
,编辑ks-install
;
edgeruntime
和kubeedge
,将enabled
的值修改为true
;edgeruntime.kubeedge.cloudCore.cloudHub.advertiseAddress
的值设置为公网IP地址;完成后点击右下角的"确定",并检查ks-installer
的日志查看部署状态。
启动完成后使用如下命令即可看到cloudcore的NodePort端口。
$ kubectl get svc -n kubeedge -l k8s-app=kubeedge
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cloudcore NodePort 10.96.0.106 10000:30000/TCP,10001:30001/TCP,10002:30002/TCP,10003:30003/TCP,10004:30004/TCP 3m
需要按照下列端口配置公网端口转发,将10000-10004端口转发到NodePort的30000-30004端口。
字段 | 外网端口 | 字段 | 内网端口 |
---|---|---|---|
cloudhubPort | 10000 | cloudhubNodePort | 30000 |
cloudhubQuicPort | 10001 | cloudhubQuicNodePort | 30001 |
cloudhubHttpsPort | 10002 | cloudhubHttpsNodePort | 30002 |
cloudstreamPort | 10003 | cloudstreamNodePort | 30003 |
tunnelPort | 10004 | tunnelNodePort | 30004 |
如果有云厂商,则需要创建负载均衡按照上述表格的规则进行转发。如果没有云厂商,可以使用如下命令配置iptables
规则进行端口转发:
iptables -t nat -A PREROUTING -p tcp --dport 10000 -j REDIRECT --to-ports 30000
iptables -t nat -A PREROUTING -p tcp --dport 10001 -j REDIRECT --to-ports 30001
iptables -t nat -A PREROUTING -p tcp --dport 10002 -j REDIRECT --to-ports 30002
iptables -t nat -A PREROUTING -p tcp --dport 10003 -j REDIRECT --to-ports 30003
iptables -t nat -A PREROUTING -p tcp --dport 10004 -j REDIRECT --to-ports 30004
部署完成后,发现DaemonSet资源iptables未调度到k8s-master节点上,需要配置容忍master污点。
$ kubectl get pod -o wide -n kubeedge
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cloud-iptables-manager-q9bsx 1/1 Running 0 28m 172.20.1.12 k8s-node02
cloud-iptables-manager-vvpv8 1/1 Running 0 28m 172.20.1.11 k8s-node01
cloudcore-54b7f4f699-wcpjc 1/1 Running 0 70m 10.244.0.27 k8s-node02
edgeservice-855fdd8f94-8zd8k 1/1 Running 0 53m 10.244.0.42 k8s-node02
找到"应用负载"-“工作负载”-“守护进程集”,编辑"cloud-iptables-manager"添加如下配置:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: cloud-iptables-manager
namespace: kubeedge
spec:
template:
spec:
......
# 添加如下配置
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
注:如果未修改以上配置,则在KubeSphere上无法对边缘节点的Pod查看日志和执行命令。
配置完成后再次检查iptables守护进程是否已经调度到所有节点
$ kubectl get pod -o wide -n kubeedge
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cloud-iptables-manager-q9bsx 1/1 Running 0 28m 172.20.1.12 k8s-node02
cloud-iptables-manager-vvpv8 1/1 Running 0 28m 172.20.1.11 k8s-node01
cloud-iptables-manager-zwmdg 1/1 Running 0 29m 172.20.1.10 k8s-master
cloudcore-54b7f4f699-wcpjc 1/1 Running 0 70m 10.244.0.27 k8s-node02
edgeservice-855fdd8f94-8zd8k 1/1 Running 0 53m 10.244.0.42 k8s-node02
添加边缘节点文档:https://kubesphere.com.cn/docs/installing-on-linux/cluster-operation/add-edge-nodes/
KubeEdge 支持多种容器运行时,包括 Docker、containerd、CRI-O 和 Virtlet。有关更多信息,请参见KubeEdge 文档。为了确保 KubeSphere 可以获取 Pod 指标,需要在边缘端安装 Docker v19.3.0 或更高版本。
到边缘端执行KubeSphere上复制过来的命令
arch=$(uname -m); if [[ $arch != x86_64 ]]; then arch='arm64'; fi; curl -LO https://kubeedge.pek3b.qingstor.com/bin/v1.9.2/$arch/keadm-v1.9.2-linux-$arch.tar.gz \
&& tar xvf keadm-v1.9.2-linux-$arch.tar.gz \
&& chmod +x keadm && ./keadm join --kubeedge-version=1.9.2 --region=zh --cloudcore-ipport=1x.xx.xx.28:10000 --quicport 10001 --certport 10002 --tunnelport 10004 --edgenode-name edge-node-01 --edgenode-ip 192.168.1.63 --token c2d7e72e15d28aa3e2b9340b9429982595b527b334a756be919993f45b7422b1.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTY2NDU5NDJ9.bQeNr4RFca5GByALxVEQbiQpEYTyyWNzpDQVhm39vc8 --with-edge-taint
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 52.3M 100 52.3M 0 0 1020k 0 0:00:52 0:00:52 --:--:-- 1057k
./keadm
install MQTT service successfully.
kubeedge-v1.9.2-linux-amd64.tar.gz checksum:
checksum_kubeedge-v1.9.2-linux-amd64.tar.gz.txt content:
[Run as service] start to download service file for edgecore
[Run as service] success to download service file for edgecore
kubeedge-v1.9.2-linux-amd64/
kubeedge-v1.9.2-linux-amd64/cloud/
kubeedge-v1.9.2-linux-amd64/cloud/cloudcore/
kubeedge-v1.9.2-linux-amd64/cloud/cloudcore/cloudcore
kubeedge-v1.9.2-linux-amd64/cloud/iptablesmanager/
kubeedge-v1.9.2-linux-amd64/cloud/iptablesmanager/iptablesmanager
kubeedge-v1.9.2-linux-amd64/cloud/csidriver/
kubeedge-v1.9.2-linux-amd64/cloud/csidriver/csidriver
kubeedge-v1.9.2-linux-amd64/cloud/admission/
kubeedge-v1.9.2-linux-amd64/cloud/admission/admission
kubeedge-v1.9.2-linux-amd64/edge/
kubeedge-v1.9.2-linux-amd64/edge/edgecore
kubeedge-v1.9.2-linux-amd64/version
KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -b
查看边缘节点是否添加成功
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
edge-node-01 Ready agent,edge 23h v1.21.4-kubeedge-v1.9.2
k8s-master Ready control-plane,master 16d v1.21.5
k8s-node01 Ready 16d v1.21.5
k8s-node02 Ready 25h v1.21.5
边缘节点加入集群后,部分 Pod 在调度至该边缘节点上后可能会一直处于 Pending 状态。由于部分守护进程集(例如,Calico)有强容忍度,您需要使用以下脚本手动 Patch Pod 以防止它们调度至该边缘节点。
#!/bin/bash
NodeSelectorPatchJson='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/master": "","node-role.kubernetes.io/worker": ""}}}}}'
NoShedulePatchJson='{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}}}}'
edgenode="edgenode"
if [ $1 ]; then
edgenode="$1"
fi
namespaces=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $1}' ))
pods=($(kubectl get pods -A -o wide |egrep -i $edgenode | awk '{print $2}' ))
length=${#namespaces[@]}
for((i=0;i<$length;i++));
do
ns=${namespaces[$i]}
pod=${pods[$i]}
resources=$(kubectl -n $ns describe pod $pod | grep "Controlled By" |awk '{print $3}')
echo "Patching for ns:"${namespaces[$i]}",resources:"$resources
kubectl -n $ns patch $resources --type merge --patch "$NoShedulePatchJson"
sleep 1
done
1、在 ClusterConfiguration
的 ks-installer
中,将metrics_server
的enable
改为true
。
2、到边缘节点编辑 vim /etc/kubeedge/config/edgecore.yaml
配置文件将edgeStream
的enable
改为true
edgeStream:
enable: true
handshakeTimeout: 30
readDeadline: 15
server: 1x.xx.xx.x8:10004
tlsTunnelCAFile: /etc/kubeedge/ca/rootCA.crt
tlsTunnelCertFile: /etc/kubeedge/certs/server.crt
tlsTunnelPrivateKeyFile: /etc/kubeedge/certs/server.key
writeDeadline: 15
3、重启systemctl restart edgecore.service
部署到边缘节点的Pod需要配置容忍污点
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "node-role.kubernetes.io/edge"
operator: "Exists"
effect: "NoSchedule"
回到顶部## EdgeMesh
EdgeMesh的定位是KubeEdge用户数据面轻量化的通讯组件,完成节点之间网络的Mesh,在边缘复杂网络拓扑上的节点之间建立P2P通道,并在此通道上完成边缘集群中流量的管理和转发,最终为用户KubeEdge集群中的容器应用提供与Kubernetes Service一致的服务发现与流量转发体验。
官网:https://edgemesh.netlify.app/zh/
上图展示了 EdgeMesh 的简要架构,EdgeMesh 包含两个微服务:edgemesh-server 和 edgemesh-agent。
EdgeMesh-Server:
EdgeMesh-Agent:
云端是标准的Kubernetes集群,可以使用任意CNI网络插件,比如Flannel、Calico,可以部署任意Kubernetes原生组件,比如Kubelet、KubeProxy;同时云端部署KubeEdge云上组件CloudCore,边缘节点上运行KubeEdge边缘组件EdgeCore,完成边缘节点向云上集群的注册。
核心优势:
使用admin身份登入KubeSphere,点击工作台进入"system-workspace"工作空间,在kubesphere-master集群项目中找到kubeedge并进入,
在该项目应用负载中创建基于模板的应用,选择从"应用商店"搜索找到"edgemesh"并点击安装,安装前请确认安装位置是否正确。
在应用设置中修改如下几处内容并点击安装:
server:
nodeName: "k8s-node01" # 指定edgemesh-server部署的节点
advertiseAddress:
- 1x.xx.xx.x8 # 指定edgemesh-server对外暴漏服务的IP列表(此处填写的是华为云ELB的公网IP)
modules:
tunnel:
enable: true
listenPort: 20004 # 需要将该端口暴漏到公网(无需修改)
agent:
modules:
edgeProxy:
enable: true
socks5Proxy:
enable: true # 开启SSH隧道代理
listenPort: 10800
部署完成后需要设置edgemesh-agent的节点容忍,使其能调度到master和edge节点上。
spec:
template:
spec:
# 添加如下内容
tolerations:
- key: node-role.kubernetes.io/edge
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
最后查看部署结果(确保edgemesh-agent在每一个节点都运行了一个pod):
$ kubectl get pod -n kubeedge -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cloud-iptables-manager-q9bsx 1/1 Running 0 16h 172.20.1.12 k8s-node02
cloud-iptables-manager-vvpv8 1/1 Running 0 16h 172.20.1.11 k8s-node01
cloud-iptables-manager-zwmdg 1/1 Running 0 16h 172.20.1.10 k8s-master
cloudcore-54b7f4f699-wcpjc 1/1 Running 0 16h 10.244.0.27 k8s-node02
edgemesh-agent-2l25t 1/1 Running 0 15m 172.20.1.12 k8s-node02
edgemesh-agent-cd67c 1/1 Running 0 14m 172.20.1.11 k8s-node01
edgemesh-agent-jtl9l 1/1 Running 0 14m 192.168.1.63 edge-node-01
edgemesh-agent-vdmzc 1/1 Running 0 16m 172.20.1.10 k8s-master
edgemesh-server-65b6db88fb-stckp 1/1 Running 0 16h 172.20.1.11 k8s-node01
edgeservice-855fdd8f94-8zd8k 1/1 Running 0 16h 10.244.0.42 k8s-node02
前提条件
yum -y install nc
进行安装。$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
edge-node-01 Ready agent,edge 21h v1.21.4-kubeedge-v1.9.2
k8s-master Ready control-plane,master 16d v1.21.5
k8s-node01 Ready 16d v1.21.5
k8s-node02 Ready 23h v1.21.5
$ ssh -o "ProxyCommand nc --proxy-type socks5 --proxy 169.254.96.16:10800 %h %p" root@edge-node-01
The authenticity of host 'edge-node-01 ()' can't be established.
ECDSA key fingerprint is SHA256:alzjCdezpa8WxcW6lZ70x6sZ4J5193wM2naFG7nNmOw.
ECDSA key fingerprint is MD5:56:b7:08:1d:79:65:2e:84:8f:92:2a:d9:48:3a:15:31.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'edge-node-01' (ECDSA) to the list of known hosts.
root@edge-node-01's password:
Last failed login: Fri Jul 1 09:33:11 CST 2022 from 192.168.1.63 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Fri Jul 1 09:25:01 2022 from 192.168.20.168
[root@edge-node-01 ~]#
注:由于节点的 IP 可能重复,所以只支持通过节点名称进行连接。
在v3.3.0版本中可支持在ks控制台中登入终端。
错误处理:
1、kubeedge和edgemesh的服务都正常且日志没有报错,但是云和边无法互相访问。
云端配置
# 在云端,开启 dynamicController 模块,并重启 cloudcore
$ kubectl edit cm cloudcore -n kubeedge
modules:
..
dynamicController:
enable: true
..
$ kubectl rollout restart deploy cloudcore -n kubeedge
边缘端配置
# 打开 metaServer 模块(如果你的 KubeEdge < 1.8.0,还需关闭 edgeMesh 模块)
vim /etc/kubeedge/config/edgecore.yaml
modules:
..
edgeMesh:
enable: false
..
metaManager:
metaServer:
enable: true
# 配置 clusterDNS 和 clusterDomain
$ vim /etc/kubeedge/config/edgecore.yaml
modules:
..
edged:
clusterDNS: 169.254.96.16
clusterDomain: cluster.local
# 重启 edgecore
$ systemctl restart edgecore
验证
$ curl 127.0.0.1:10550/api/v1/services
{"apiVersion":"v1","items":[{"apiVersion":"v1","kind":"Service","......}
关键术语:
相关文章:
相关视频:
相关问题:
Q:安全信怎么做防护的?A:EdgeMesh-Server与EdgeMesh-Agent之间都有证书进行加密。
Q:服务之间通信效率?A:在500 qps以内访问接近于直连网络,网络损耗特别低,打洞成功会有10%左右中继的消耗。
Q:资源消耗情况?A:每一个EdgeMesh-Agent占用内存不到40兆,CPU只有1%-5%以内。