近期小伙伴对在使用ks3.1上集成边缘节点有不少疑问,这里说明下guide文档地址,然后可以把这方面的问题汇总在这里,方便后续的小伙伴排查问题,也欢迎大家继续补充。
1 guide文档传送门
激活kubeedge
边缘节点加入
2 ip、端口开放问题
如果使用ks-installer 安装,需要激活kubeedge以及配置master节点对应的外网ip地址.
假设集群master节点ip192.168.10.7, 需要开放的外网端口如下:
序号 | 内网IP | 内网端口(NodePort) | 外网端口 | |
1 | 192.168.10.7 | 30000 | 10000 | https协议端口 |
2 | 192.168.10.7 | 30001 | 10001 | Quic协议端口 |
3 | 192.168.10.7 | 30002 | 10002 | cloudhub首次token获取证书 |
4 | 192.168.10.7 | 30003 | 10003 | cloudstream端口 |
5 | 192.168.10.7 | 30004 | 10004 | tunnel端口(edgestream连接) |
外网端口需要防火墙通过。
如果忘记了设置ks-installer中kubeedge组件部分中外网访问ip,cloudhub起不来,可以使用以下命令补救:
kubectl -n kubeedge edit cm cloudcore
3 获取边缘节点日志、metrics
边缘节点一般来说与master节点不在一个局域网的情况较多,因此我们在上面设计使用外网端口通信。另外,由于kubeedge完成kubectl exec、获取logs以及metrics的功能,依赖虚拟ip进行相应的iptable转发到cloudhub对应的端口,继而获取边缘端的数据,也就是通过edgemesh实现,所以边缘节点绑定的虚拟ip和边缘节点名称必须是唯一的,要自行按规律维护,注意这个虚拟ip不能填边缘节点内网ip,最好选择与内网不冲突的网端,同时要保证metrics-server组件处于开启状态,需要更新为0.4.1版本以上以适应KubeEdge(当前版本主要通过metrics-server获取边缘metrics)。
4 如果边缘节点使用外网ip和端口通信,有些daemonset的容忍度比较强,比如calico,需要给它们patch一下,避免调度到边缘端:
#!/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: $ns, resources: $resources"
kubectl -n $ns patch $resources --type merge --patch "$NoShedulePatchJson"
sleep 1
done
5 kubelet cgroup driver: “cgroupfs” is different from docker cgroup driver: “systemd”
原因:kubelet和master端使用的cgroup不一致导致
解决办法:
添加配置 “exec-opts”: [“native.cgroupdriver=systemd”], 然后重启docker,systemctl daemon-reload &&
systemctl restart kubelet
参考描述:
kubeedge/kubeedge#1772 (comment)
cgroup driver shouldn’t be taken care by the keadm, I think this is also true for “kubeadm”, all that care about the cgroup driver is actually which cri you are using, for example, in your case, you are using docker, so you just need to update the docker configuration to use “systemd” instead.
6 边缘节点和k8s在一个局域网时,如何加入ks纳管?
如果边缘节点和k8s集群在一个局域网,可以使用nodePort方式加入边缘节点,默认已开放的nodeport端口为 30000-30004,所以边缘节点join集群的时候得将外部端口 10000-10004改为 30000-30004,也就是将其中的–cloudcore-ipport=192.168.x.x:10000 –quicport 10001 –certport 10002 –tunnelport 10004 改为 –cloudcore-ipport=192.168.x.x:30000 –quicport 30001 –certport 30002 –tunnelport 30004,不过需要指出的是,设计是从外网考虑,请明确边缘节点的应用场景。
更多请参考guide指南。
7 边缘节点pod metrics支持的最低docker版本
目前边缘端支持的docker版本应该大于等于v19.3.0,具体原因可参考 https://kubesphere.com.cn/forum/d/4494-kubesphere-v310/8
kubeedge v1.6.2 已发布,今天测试该bug已经修复,见图:

由于目前cloudcore image官方还没有build,但是v1.6.1是可以用的。边缘端需要升级到v1.6.2,也可以添加以下配置进行修改:
apiVersion: v1
kind: ConfigMap
metadata:
name: edge-watcher-config
namespace: kubeedge
data:
version: v1.6.2
region: zh
最新版本支持到v1.7.2
8 node metrics不正常显示排除指南
8.1 检查metrics-server服务是否正常
检查metrics-server deployment是否正常,版本是否符合要求(v0.4.1以上),查看kubectl top是否异常,如果异常,可以重启, 或者手动安装:
kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/master/roles/metrics-server/files/metrics-server/metrics-server.yaml
8.2 其他节点都有metrics,只有边缘节点没有metrics
8.2.1 检查iptables是否建立正确的转发, 用以下命令查看iptables pod 部署在哪个node:
kubectl get pods -n kubeedge -o wide
8.2.1 在对应node上获取10350的nat转发规则, 确认转发目的地在k8s master or node ip上

8.2.3 如果转发目的地不对,可以用下面的做法:
kubectl -n kubeedge edit cm edge-watcher

修改完后需要重启edge-watcher-controller-manager deployment
9 证书问题:
kubectl delete secret casecret cloudcoresecret -n kubeedge
需要重启cloudcore。
10 架构类型:
目前支持三种架构类型,arm64,×86_64,amd64