1. kubesphere安装请参考博客
2. 配置master节点
控制台->平台管理->集群管理->自定义CRD,搜索clusterconfiguration或者ClusterConfiguration,查看详情,在资源列表中,点击 ks-installer 右侧的图标,然后选择编辑配置文件。
将kubeedge.enabled的false改为true
edgeruntime:
enabled: false
kubeedge:
cloudCore:
cloudHub:
advertiseAddress:
- ''
service:
cloudhubHttpsNodePort: '30002'
cloudhubNodePort: '30000'
cloudhubQuicNodePort: '30001'
cloudstreamNodePort: '30003'
tunnelNodePort: '30004'
enabled: true #修改为true
将kubeedge.cloudCore.cloudHub.advertiseAddress 的值设置为集群的公共 IP 地址或边缘节点可以访问的 IP 地址。完成后,点击右下角的更新保存配置。
kubectl get pod -A #查看全部运行正常就可以了
等待几分钟或者浏览器重新登录账号,最后不行重启服务器后就看到了如下的图片
查看 CloudCore 挂载的 ConfigMap 和 Secret,ConfigMap 主要挂载 cloudcore.yaml 配置文件到 /etc/kubeedge/config, 可灵活修改 CloudCore Modules 配置。Secret 挂载 CloudCore 和 EdgeCore 需要用到的一些 TLS 证书。
3. 添加边缘节点
3.1 对边缘节点的操作
#关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#关闭swap:
swapoff -a # 临时
sed -i 's/.*swap.*/#&/' /etc/fstab # 永久
# 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
yum -y install docker-ce-20.10.0-3.el7 #这里指定版本
# 生成docker配置文件
mkdir -p /etc/docker/
touch /etc/docker/daemon.json
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
# 启动docker
systemctl enable docker --now
systemctl start docker
systemctl status docker
docker --version
# 这里注意:cgroupdriver=cgroupfs。修改为systemd则会出现两者之间不一致的问题
3.2 进入 KubeSphere Console,导航到节点-> 边缘节点,添加边缘节点
填写边缘节点的名字和边缘节点的 IP,生成边缘节点配置命令,粘贴到边缘节点执行:
请注意
更能换端口,由于我们使用的 cloudcore 的服务是通过 NodePort 暴露出来的,所以在边缘节点注册 Cloudcore 时,需要使用 NodeIP:NodePort 形式,此处将 10000-10004 替换为 30000-30004 端口。
#一定要将 10000-10004 替换为 30000-30004 端口,负责不成功
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=192.168.0.9:30000 --quicport 30001 --certport 30002 --tunnelport 30004 --edgenode-name edge02 --edgenode-ip 192.168.0.56 --token a768800af2883b5e9bab902260451ab0db252e2f8f63838e5fab85199510e8b0.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTgxMjcwNDh9.l5OZp1lUzbU9S82mAKj_Ze1pGIlNhSRq941gyWFyBTY --with-edge-taint
#这里记录安装的全过程
[root@ecs-42cb ~]# 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=192.168.0.9:30000 --quicport 30001 --certport 30002 --tunnelport 30004 --edgenode-name edge02 --edgenode-ip 192.168.0.56 --token a768800af2883b5e9bab902260451ab0db252e2f8f63838e5fab85199510e8b0.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTgxMjcwNDh9.l5OZp1lUzbU9S82mAKj_Ze1pGIlNhSRq941gyWFyBTY --with-edge-taint
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 36.0M 100 36.0M 0 0 989k 0 0:00:37 0:00:37 --:--:-- 1033k
./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/edge/
kubeedge-v1.9.2-linux-amd64/edge/edgecore
kubeedge-v1.9.2-linux-amd64/version
kubeedge-v1.9.2-linux-amd64/cloud/
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/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 edgecore is running, For logs visit: journalctl -u edgecore.service -b
[root@ecs-42cb ~]# ps -ef|grep edgecore
root 21334 1 1 15:16 ? 00:00:00 /usr/local/bin/edgecore
root 21521 8861 0 15:17 pts/1 00:00:00 grep --color=auto edgecore
[root@ecs-42cb ~]# systemctl status edgecore
● edgecore.service
Loaded: loaded (/etc/systemd/system/edgecore.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2023-10-23 15:16:40 CST; 3min 30s ago
Main PID: 21334 (edgecore)
Tasks: 12
Memory: 32.9M
CGroup: /system.slice/edgecore.service
└─21334 /usr/local/bin/edgecore
Oct 23 15:19:56 ecs-42cb edgecore[21334]: I1023 15:19:56.461153 21334 edged.go:1105] consume added pod [kube-proxy-m52vn] successfully
Oct 23 15:20:01 ecs-42cb edgecore[21334]: E1023 15:20:01.460996 21334 metaclient.go:112] send sync message kube-system/configmap/kubernete...tries: 2
Oct 23 15:20:01 ecs-42cb edgecore[21334]: I1023 15:20:01.461051 21334 record.go:19] Warning Failed Error: get configmap from metaManager f...ondition
Oct 23 15:20:01 ecs-42cb edgecore[21334]: E1023 15:20:01.461187 21334 kuberuntime_manager.go:864] init container &Container{Name:upgrade-i...ETES_NOD
Oct 23 15:20:01 ecs-42cb edgecore[21334]: I1023 15:20:01.461234 21334 edged.go:990] worker [2] get pod addition item [calico-node-j949f]
Oct 23 15:20:01 ecs-42cb edgecore[21334]: I1023 15:20:01.461247 21334 edged.go:1058] start to consume added pod [calico-node-j949f]
Oct 23 15:20:01 ecs-42cb edgecore[21334]: I1023 15:20:01.461347 21334 process.go:282] ########## process get: req[{Header:{ID:c7916859-533...gmap/kub
Oct 23 15:20:01 ecs-42cb edgecore[21334]: E1023 15:20:01.461371 21334 process.go:284] remote query failed: timeout to get response
Oct 23 15:20:01 ecs-42cb edgecore[21334]: E1023 15:20:01.461393 21334 edged.go:1009] worker [2] handle pod addition item [calico-node-j949...to queue
Oct 23 15:20:01 ecs-42cb edgecore[21334]: I1023 15:20:01.848183 21334 record.go:19] Normal Pulled Container image "registry.cn-beijing.ali... machine
Hint: Some lines were ellipsized, use -l to show in full.
[root@ecs-42cb ~]#
查看 KubeSphere 控制台的边缘节点,已经可以看到边缘节点注册上来:
4. Metrics& 日志
此时我们发现节点的 CPU 内存信息无法统计,需要开启 KubeSphere Metrics_Server 并在 Edge 端开启 EdgeStream:
编辑 cc,开启 metrics-server:
编辑边缘节点 /etc/kubeedge/config/edgecore.yaml 文件,搜索 edgeStream,将 false 更改为 true:
vim /etc/kubeedge/config/edgecore.yaml
修改部分如下:
28 websocket:
29 enable: true
30 handshakeTimeout: 30
31 readDeadline: 15
32 server: 192.168.0.9:30000
33 writeDeadline: 15
34 edgeStream:
35 enable: true #修改这个----------------------
36 handshakeTimeout: 30
37 readDeadline: 15
38 server: 192.168.0.9:30004 #也需要修改
39 tlsTunnelCAFile: /etc/kubeedge/ca/rootCA.crt
40 tlsTunnelCertFile: /etc/kubeedge/certs/server.crt
41 tlsTunnelPrivateKeyFile: /etc/kubeedge/certs/server.key
42 writeDeadline: 15
43 edged:
44 cgroupDriver: cgroupfs
45 cgroupRoot: ""
46 cgroupsPerQOS: true
47 clusterDNS: ""
48 clusterDomain: ""
此处 server 字段设置端口为 30004,因为我们使用 NodePort 端口和云端通信
systemctl restart edgecore.service #重启edgecore.service
systemctl status edgecore.service
查看节点监控信息:
我们上面章节中已经在 edgecore 开启 edgestream,实现了云端收集 Edge 节点的 Metrics 功能,这个操作同时也实现了边端日志查看的能力。
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
edge02 Ready agent,edge 30m v1.21.4-kubeedge-v1.9.2
master1 Ready control-plane,master,worker 147m v1.22.10
[root@master1 ~]# kubectl get nodes edge02 -o yaml
spec:
podCIDR: 10.233.66.0/24
podCIDRs:
- 10.233.66.0/24
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/edge
status:
addresses:
- address: 192.168.0.56
type: InternalIP
- address: edge02
type: Hostname
conditions:
- lastHeartbeatTime: "2023-10-23T07:47:21Z"
lastTransitionTime: "2023-10-23T07:42:20Z"
message: edge is posting ready status
reason: EdgeReady
status: "True"
type: Ready
daemonEndpoints:
kubeletEndpoint:
Port: 10351
InternalIP+kubeletEndpoint 组成 kubelet server 的地址,kubectl logs 就可以请求这个地址得到相关日志信息。但对于边缘端来说,大多数情况这个 internalIP 云端是无法访问的。
此时就需要 CloudCore 的 CloudStream 和 EdgeCore 的 EdgeStream 建立一个云边通道,在 CloudCore 和 EdgeCore 建立云边 WebSocket 通信后,将请求的 Edge kubelet server 的日志信息能通过通道返回给云端。这个通道需要两边开启 CloudStream 和 EdgeStream,并通过 TLS 证书进行验证。
边缘端在上面已经开启 EdgeStream,云端部署 CloudCore 后会自动开启。
查看云端挂载的 CloudCore.yaml 配置文件:
搜 cloudcore
当然,云边通道只能将日志从消息返回,具体返回到 CloudCore 的 CloudStream,还需设置一个 NAT 规则:
[root@master1 ~]# iptables -t nat -A OUTPUT -p tcp --dport 10350 -j DNAT --to 159.138.146.72:10003 #这里的IP是master公网IP,在master上执行
[root@master1 ~]# iptables -t nat -A OUTPUT -p tcp --dport 10351 -j DNAT --to 159.138.146.72:10003 #这里的IP是master公网IP,在master上执行
这个操作已经让自动部署的 iptables-manager 完成了~
[root@master1 ~]# iptables -t nat -L|grep 10003
DNAT tcp -- anywhere anywhere tcp dpt:10350 to:159.138.146.72:10003
DNAT tcp -- anywhere anywhere tcp dpt:10350 to:159.138.146.72:10003
DNAT tcp -- anywhere anywhere tcp dpt:10351 to:159.138.146.72:10003
DNAT tcp -- anywhere anywhere tcp dpt:10351 to:10.233.97.30:10003
[root@master1 ~]#
进入边缘节点,查看容器组,我们可以看到有几个 daemonset 有强容忍度,调度到了边缘节点,由于边缘端很多情况存在不稳定通信,不适合运行 Calico 这种 CNI 组件,更多使用 EdgeMesh 进行云边通信和服务发现,我们可以手动 Patch Pod 以防止非边缘节点调度至工作节点:
#在master上执行
kubectl get daemonset -n kube-system |grep -v NAME |awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n kube-system --type='json' -p='[{"op": "replace","path": "/spec/template/spec/affinity","value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'
kubectl get daemonset -n metallb-system |grep -v NAME |awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n metallb-system --type='json' -p='[{"op": "replace","path": "/spec/template/spec/affinity","value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'
查看边缘节点容器组:
5. 运行应用
既然边缘节点注册进来了,我们来运行个应用吧。
进-应用负载-工作负载,创建一个 Deployment 工作负载:
#在master上操作
cat > nginx.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 可根据需要进行调整
template:
metadata:
labels:
app: nginx
spec:
nodeName: edge02 #如果是集群需要指定调度到边缘节点
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
tolerations:
- key: "node-role.kubernetes.io/edge"
operator: "Exists"
effect: "NoSchedule"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
EOF
kubectl apply -f nginx.yaml
kubectl get pods,svc -o wide
[root@master1 ~]# kubectl get pods,svc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-deployment-654cc5c59b-4wl6r 1/1 Running 0 65s 172.17.0.3 edge02 <none> <none>
pod/nginx-deployment-654cc5c59b-dj9h5 1/1 Running 0 65s 172.17.0.4 edge02 <none> <none>
pod/nginx-deployment-654cc5c59b-hbg79 1/1 Running 0 65s 172.17.0.2 edge02 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 3h12m <none>
service/nginx-service NodePort 10.233.47.70 <none> 80:30212/TCP 65s app=nginx
[root@master1 ~]#
此时可以发现访问是不通的,因为云端无法访问边缘端的 Pod 网络,查看边缘 nginx-edge 的 ip:
[root@ecs-42cb ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81acff7e9de2 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes k8s_nginx_nginx-deployment-654cc5c59b-dj9h5_default_5f0080de-a596-4c93-bfdd-010c4f3be4ba_0
dea58ebbceaf nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes k8s_nginx_nginx-deployment-654cc5c59b-hbg79_default_ffbdfbf0-960d-4a31-a0b2-2fb4071d30cd_0
104f90c8bf5e nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes k8s_nginx_nginx-deployment-654cc5c59b-4wl6r_default_811135eb-8676-473f-8ab9-a1b80dcb7334_0
c1e8767bf118 kubeedge/pause:3.1 "/pause" 6 minutes ago Up 6 minutes k8s_POD_nginx-deployment-654cc5c59b-dj9h5_default_5f0080de-a596-4c93-bfdd-010c4f3be4ba_0
064017aa1c5d kubeedge/pause:3.1 "/pause" 6 minutes ago Up 6 minutes k8s_POD_nginx-deployment-654cc5c59b-4wl6r_default_811135eb-8676-473f-8ab9-a1b80dcb7334_0
9f9d485352e8 kubeedge/pause:3.1 "/pause" 6 minutes ago Up 6 minutes k8s_POD_nginx-deployment-654cc5c59b-hbg79_default_ffbdfbf0-960d-4a31-a0b2-2fb4071d30cd_0
[root@ecs-42cb ~]#
#在边缘节点访问访问 172.17.0.3
[root@ecs-42cb ~]# curl 172.17.0.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@ecs-42cb ~]#
可见 Nginx Pod 服务是正常的,这个 IP 地址分配也很熟悉,172.17.0.0/16,这不是 docker bridge 网段嘛,查看下边缘节点 docker0 地址:
[root@ecs-42cb ~]# ip add|grep docker
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
5: veth2fadd3b@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
7: veth95b5b91@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
9: veth0bc8fb6@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
[root@ecs-42cb ~]#
我们可以看到 nginx-deployment 这个容器还是以 Pod 形式运行的,通过 pause 容器共享网络命名空间,只不过它没有使用集群的 PodCIDR 分配,而是使用 docker bridge 网络。因此在没有 coredns 和 kube-proxy 的服务发现和云边容器网络互通的条件下,边端的 Pod Service 是无法访问的。这很符合边云特点,边缘端更多是私网,且无法被云端访问,这种单向通信的特点需要有其他形式的网络促成云边的通信和服务访问,比如建立隧道。
6. 已安装过KS通过管理界面进行添加应用商店的设置
若之前已安装过kubesphere,则可通过kubesphere管理界面左侧菜单CRD -> 搜索clusterconfiguration -> 然后编辑其下资源ks-installer,如下图
设置openpitrix.store.enabled为true:
设置完成后可发现在KS管理界面上出现应用商店菜单,如下图:
也可以在不登录控制台的情况下直接访问 <节点 IP 地址>:30880/apps 进入应用商店。
如 http://159.138.146.72:30880/apps
且KubeSphere 3.2.x 中的应用商店启用后,OpenPitrix 页签不会显示在系统组件页面。
应用商店的具体使用请参考:博客
7. 云边服务互访
KubeEdge 社区有个 EdgeMesh 的项目。在边缘计算机的场景下,网络拓扑结构更加复杂。不同区域的边缘节点往往不能互联,而应用之间又需要业务流量互通。EdgeMesh 即可满足边缘节点之间流量互通的要求。按照官方 Github 介绍,EdgeMesh 作为 KubeEdge 集群的数据平面组件,为应用程序提供简单的服务发现和流量代理功能,从而屏蔽了边缘场景中的复杂网络结构。
因此 EdgeMesh 主要实现两个终极目标:
用户可以在不同的网络中访问边到边、边到云、云到边的应用
部署 EdgeMesh 相当于部署了 CoreDNS+Kube-Proxy+CNI
7.1 应用商店安装edgemesh
7.1.1 为edgemesh教程创建一个企业空间。
7.1.2 为edgemesh教程创建一个项目
7.1.3 在appstore应用商店后找到edgemesh进行安装
进入应用设置页面,可以设置应用名称(默认会随机提供一个唯一的名称)和选择安装的位置(对应的 Namespace) 和版本,然后点击右上角 “下一步”。
根据 EdgeMesh 文档的指导编辑 values.yaml 文件,主要是修改 server.nodeName
和 server.advertiseAddress
的值,然后点击 “安装” 使用配置。
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):
7.1.4 部署 EdgeMesh
使用 admin 身份登入 KubeSphere,点击工作台进入 “system-workspace” 工作空间,在 kubesphere-master 集群项目中找到 kubeedge 并进入,在该项目应用负载中创建基于模板的应用,选择从 " 应用商店 " 搜索找到 “edgemesh” 并点击安装,安装前请确认安装位置是否正确。