Addon SuperEdge 让原生 K8s 集群可管理边缘应用和节点

作者

梁豪,腾讯TEG工程师,云原生开源爱好者,SuperEdge 开发者,现负责TKEX-TEG容器平台运维相关工作。

王冬,腾讯云TKE后台研发工程师,专注容器云原生领域,SuperEdge 核心开发人员,现负责腾讯云边缘容器TKE Edge私有化相关工作。

李腾飞,腾讯容器技术研发工程师,腾讯云TKE后台研发,SuperEdge核心开发成员。

Addon SuperEdge让原生K8s集群可管理边缘应用和节点视频链接

边缘能力

先说说 Addon SuperEdge 后,您的普通 Kubernetes 集群将具备哪些能力:

既能管理中心应用和节点,也能管理边缘应用和节点

可以用一个Kubernetes集群管理中心的应用和节点,也可以同时管理边缘的应用和节点,使用上没有任何区别。此设计将Kubernetes分布式的逻辑概念和实际IDC机房的物理位置完美契合,实现真正意义的云边一朵云。

能Join任意位置的节点

只要节点能访问到kube-apiserver,无论节点位于哪里,或以怎么的状存在,一个edgeadm join命令就能将节点加入到中心集群。用一个Kubernetes集群就可以统一管理各个地方的机器,汇聚各个IDC机房的算力,将机器的利用率发挥到极致

同时管理数十个边缘网点,并具备灰度能力

SuperEdge 的 ServiceGroup 设计,一个应用只要提交一次,就能同时部署到数十个网点,并且在各个网点内实现流量闭环,而且允许各个网点在基础应用的基础上有差异,无论灰度,还是差异化配置都可以支持。

边缘节点具备边缘自治能力

边缘节点和 kube-apiserver 之间网络情况不可预测,可能是专线,也可能是WIFI,公网和内网可能都存在。SuperEdge 让边缘节点即使云边断网也不影响边缘的服务,就是断电重启,边缘服务也能被正常拉起。

Addon SuperEdge的边缘能力

安装条件

  • 用户已有 Kubernetes 集群,所有 kube-controller-manager 已开启
--controllers=*,bootstrapsigner,tokencleaner

参数

  • 目前仅支持通过 kubeadm 搭建的 Kubernetes 集群,其他方式搭建的 Kubernetes 集群并不是不支持,而是可能会有兼容性问题,可看原理部分;

  • 要是没有 kubeadm 搭建的 Kubernetes 集群,可用edgeadm init一键创建一个原生的Kubernetes 集群,可参考: 用edgeadm一键创建边缘k8s集群或原生k8s集群;

  • 支持的 Kubernetes 版本:v1.16~v1.19,edgeadm 提供的安装包是 Kubernetes v1.18.2 版本;

    • 用户需要考虑边缘节点kubelet和原始 Kubernetes 版本的兼容性,统一最好;
    • 其他 Kubernetes 版本可参考 一键安装边缘Kubernetes集群中的 5. 自定义 Kubernetes 静态安装包,自行制作。

下载 edgeadm 静态安装包

在任意一个 Master 节点上下载 edgeadm 静态安装包,并拷贝到准备加入集群的边缘节点中。

arch=amd64 version=v0.4.0 && rm -rf edgeadm-linux-* && wget https://superedge-1253687700.cos.ap-guangzhou.myqcloud.com/$version/$arch/edgeadm-linux-$arch-$version.tgz && tar -xzvf edgeadm-linux-* && cd edgeadm-linux-$arch-$version && ./edgeadm

目前支持目前支持 [[amd64, arm64], 两个体系,下载自己机器对应的体系结构, 其他体系可自行编译edgeadm和制作相应体系安装包,具体可参考 一键安装边缘 Kubernetes 集群中的5. 自定义Kubernetes静态安装包

Addon SuperEdge

在原有集群任意一个 Master 节点上 addon 边缘能力组件

./edgeadm addon edge-apps --ca.cert <集群 CA 证书地址> --ca.key <集群的 CA 证书密钥路径> --master-public-addr <Master节点外网IP/Master节点内网IP/域名>:<Port>

其中:

  • --ca.cert: 集群的 CA 证书路径,默认 /etc/kubernetes/pki/ca.crt
  • --ca.key: 集群的 CA 证书密钥路径,默认 /etc/kubernetes/pki/ca.key
  • --master-public-addr:是边缘节点访问 kube-apiserver服务的地址,默认为 <Master节点内网IP>:<端口>

如果edgeadm addon edge-apps过程没有问题,终端会输出印如下日志:

...
I0606 12:52:51.976165   26593 deploy_tunnel.go:35] Deploy tunnel-coredns.yaml success!
Create tunnel-cloud.yaml success!

执行过程中如果出现问题会直接返回相应的错误信息,并中断边缘组件的安装,可使用./edgeadm detach命令卸载边缘组件恢复集群。

./edgeadm detach edge-apps --ca.cert <集群 CA 证书地址> --ca.key <集群的 CA 证书密钥路径>

到此原有的 Kubernetes 集群就变成了一个既能管理云端应用,也能下发和管理边缘应用的 Kubernetes。

Join边缘节点

安装条件

边缘节点遵循 kubeadm 的最低要求 ,最低2C2G,磁盘空间不小于1G;

⚠️注意:尽可能提供干净的机器,避免其他因素引起安装错误。要有机器上有容器服务在安装过程中可能会被清理,请在执行之前细心确认

创建 Join 边缘节点的 token

边缘能力组件 addon 成功后,Join 边缘节点和 kubeadm 的用法类似,可执行以下命令获取:

./edgeadm token create --print-join-command 

如果执行过程中没有问题,终端会输出 Join 的命令

...
edgeadm join <Master节点内网IP>:Port --token xxxx \
     --discovery-token-ca-cert-hash sha256:xxxxxxxxxx 

提示:创建 token 的有效期和 kubeadm 一样是24h,过期之后可再次执行上述命令获取Join 命令;

边缘节点加入原有集群

在边缘节点上下载 2.<2>.中的 edgeadm 静态安装包,或者通过其他方式把 edgeadm 静态安装包上传到边缘节点,然后在边缘节点上执行3.<2>得到的 Join 命令:

./edgeadm join <Master 节点外网 IP/Master 节点内网IP/域名>:Port 
     --token xxxx \
     --discovery-token-ca-cert-hash sha256:xxxxxxxxxx 
     --install-pkg-path <edgeadm Kube-*静态安装包地址/FTP路径> 

注意:可以把edgeadm create token --print-join-command打印的 join 提示命令kube-apiserver的服务地址,视情况换成Master节点外网IP/Master节点内网IP/域名,主要取决于想让边缘节点通过外网还是内网访问 kube-apiserver 服务,默认输出的 Master 节点内网 IP。

其中:

  • --install-pkg-path: Kubernetes 静态安装包的路径;
  • <Master节点外网IP/Master节点内网IP/域名>:Port 是边缘节点访问 kube-apiserver 服务的地址

要是执行过程中没有问题,新的 Node 成功加入集群,会输出如下内容:

This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

执行过程中如果出现问题会直接返回相应的错误信息,并中断节点的添加,可使用./edgeadm reset命令回滚加入节点的操作,重新 Join。

提示:边缘节点 join 成功后都会被打上标签: superedge.io/edge-node=enable,方便后续应用通过 nodeSelector 选择应用调度到边缘节点;

以上操作如有问题,可以加入到SuperEdge的SlackGoogle论坛微信群和我们进行交流,也可在社区提Issues给我们反馈。

实现原理

主要步骤

其实Addon SuperEdge 实现的原理很简单,主要分为两步:

  • 第一步:Addon SuperEdge 的边缘能力组件;
  • 第二步:准备边缘节点 Join 进原生 Kubernetes 集群所需要的配置;

第一步没有什么可细说的,就是把边缘能力组件以 Addon 的方式部署进原生的 Kubernetes 集群,用户也可以很方便的用edgeadm detach把 SuperEdge 边缘能力组件卸载掉。

关键是第二步:把边缘节点 Join 进原生的 Kubernetes 集群,面对的问题如下:

1. kube-apiserver 证书处理

原生 Kubernetes 集群的 Kube-apiserver 服务端证书也许并没有签订外网IP或者外网的访问的域名,那么边缘节点如何以公网IP访问 Kube-apiserver?

2. 用户的 Kubernetes 集群不是 Kubeadm 搭建的

要是用户的 Kubernetes 集群不是 Kubeadm 搭建的,根本没有 kubeadm-config、kubelet-config、cluster-info 等等的配置信息,那么又如何把边缘节点 Join 进去?

3. 用户的 Kubernetes 集群是 kubeadm 搭建的

要是用户的 Kubernetes 集群是 kubeadm 搭建的,边缘节点如何以公网 Join 进用户的 Kubernetes,如何保证对用户原 Join 普通节点不受影响?
……

所以说实现 Addon Superedge 核心不在 Addon SuperEdge 的边缘能力组件,而是如何把边缘节点 Join 进用户原先的 Kubernetes 集群,又不对用户的 Kubernetes 集群有什么影响。

设计实践

整体的实现思路是为用户任何方式搭建的 Kubernetes 集群准备好 Kubeadm 方式Join节点的配置,然后把边缘节点像 Kubeadm join 一样 Join 进去

1. kube-apiserver 证书处理

对 kube-apiserver 我们并没有更换用户原 Kubernetes 集群证书和重启 kube-apiserver,那么我们是如何实现让边缘节点通过公网添加进用户的 Kubernetes 集群的?
答案是通过写边缘节点 hosts。一般 Kubernetes 集群的 kube-apiserver 都会签如下几个地址:

kuberneteskubernetes.defaultkubernetes.default.svckubernetes.default.svc.cluster.local

在用户执行 Join 命令的时候:

./edgeadm join<Master节点外网 IP/Master 节点内网IP/域名>:Port ...

我们给边缘节点了句hosts:

Master 节点外网IP/Master节点内网 IP kubernetes.default

然后边缘节点访问云端 kube-apiserver 都是通过kubernetes.default:Port, 既绕过了 kube-apiserver 证书没有签公网IP的问题,也成功把边缘 Join 到了用户的 Kubernetes 集群。对于域名,我们不会写 hosts, 所以用户需要注意给定的域名是否在 Kube-apiserver 的证书中已经签定了。
要是用户的 Kube-apiserver 证书中没有签订kubernetes.default怎么办?

那用户 Join 边缘节点的时候就不能给IP了,只能用域名,需要保证给定的域名自己 kubernetes 的 kube-apiserver 证书已经签订了该地址,并且边缘节点能够访问到。

2. 用户的 Kubernetes 集群不是 Kubeadm 搭建的

处理办法是不是Kubeadm搭建的就把他变成Kubeadm搭建的, 只要把 kubeadm join 需要的信息备全,那么就可以通过类似 kubeadm join 的方式将边缘节点加入集群。具体实现是在执行edgeadm addon edge-apps安装部署边缘组件的阶段把 edgeadm join 边缘节点的条件准备好,典型的有如下条件:

  • 创建 kube-public 命名空间以及该命名空间下 cluster-info的 ConfigMap
  • 创建存在 kube-system 命名空间下的 kubeadm-config 和 kubelet-config 的 ConfigMap
  • 创建边缘节点加入集群时 kubelet 访问上述 ConfigMap 和集群其它资源所需要的 RBAC 权限

3. 用户的 Kubernetes 集群是 kubeadm 搭建的

我们在执行edgeadm addon edge-apps会对需要添加的 ConfigMap 进行检测,要是用户的集群信息已经存在就不在添加,直接用户的。
要是用户 kubeadm 搭建的集群信息,比如 cluster-info 的 ConfigMap,不够我们用,我们自己会生成一个新的避免更改和覆盖用户原来的。

集群经过了上述配置,边缘节点就可以使用edgeadm join命令加入集群,其他更详细的处理请查看源码edgeadm addon edge-apps的详细处理。

合作和开源

TKE Edge 边缘容器管理服务的边缘计算能力核心组件已经开源到 SuperEdge 项目,欢迎共建边缘计算,参与SuperEdge 开源项目的建设,让您开发的边缘能力惠及更多人。以下是 SuperEdge 开源项目的微信群,欢迎参与交流讨论。

SuperEdge版本:
TKE Edge相关文章:
落地案例相关资料:
posted @ 2021-07-08 14:26  腾讯云原生  阅读(316)  评论(0编辑  收藏  举报