作者

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

背景

在边缘集群中,边缘端和云端为单向网络,云端无法主动连接边缘端,常见的解决方案是边缘端主动和云端(tunnel server)建立长连接,云端通过长连接将请求转发到边缘端。在云端隧道 server 实例扩容后需要考虑新增的实例对已有的边缘端长连接转发的影响。出于系统稳定性的考虑,能通过云边隧道采集到边缘端的监控信息。

社区方案ANP

隧道云端 Server 自动扩缩容

ANP 主要用于代理转发 apiserver 的请求,架构图如下图所示:

ANP 的 server 仅支持单实例,如果是多实例会存存在以问题,下面根据多实例的架构图进行说明:

  • ANP Agent 需要和所有的 ANP Server 实例建立长连接。
  • ANP Server 扩容之后,支持接入的 ANP Agent 的规模不会增加

节点监控

ANP 项目主要针对 K8s 1.16版本发布的特性 EgressSelector,在这个特性中 apiserver 会首先使用 HTTP CONNECT 方法建立隧道,然后通过隧道把请求边缘端的请求发送到 ANP Server,ANP Server 通过与 ANP Agent 建立的长连接,把请求发送到边缘端。业界常用的监控采集组件 Prometheus 是不支持 EgressSelector 特性的,因此使用 ANP 项目是无法支持节点监控的。

SuperEdge 云边隧道(tunnel)方案

SuperEdge 云边隧道 tunnel 在方案设计时使用 DNS 做边缘节点的注册中心,注册中心存储的是 tunnel-edge 的ID 和 tunnel-edge 连接到 tunnel-cloud 的 podIp,在做 apiserver 到边缘端请求转发时可以根据注册中心的ID将请求转发到边缘端连接到的 tunnel cloud 的 pod 上,具体架构图如下所示:

上图中的 apiserver 组件可以是云端其他组件,比如 Prometheus,下面分别从自动扩缩容和节点监控对 tunnel 的使用场景做进一步的说明。

tunnel cloud 的自动扩缩容(HPA)

在多实例的场景下对比 ANP 项目,tunnel 具备以下的优势:

  • tunnel-edge 只需和一个 tunnel-cloud 实例长连接即可。apiserver 根据 tunnel-dns 的存储的 tunnel-edge 的 ID 和 tunnel-cloud pod 的映射关系确定请求的 tunnel-cloud pod ,然后再把请求转发到 tunnel-edge。
  • tunnel-cloud 扩容之后,tunnel-cloud 支持接入的 tunnel-edge 的数目会增加。

自定义自动扩缩容策略

tunnel-cloud 除了根据内存和 CPU 的使用情况自动扩缩容之外,还可以根据与 tunnel-cloud 建立长连接的边缘节点的个数实现自动扩缩容,架构图如下:

  • prometheus 从 tunnel-cloud 的 pod 采集 metrics
{
"__name__": "tunnel_cloud_nodes",
"instance": "172.31.0.10:6000",
"job": "tunnel-cloud-metrics",
"kubernetes_namespace": "edge-system",
"kubernetes_pod_name": "tunnel-cloud-64ff7d9c9d-4lljh"
}
  • prometheus-adapter 向 apiserver 注册 Custom Metrics API 的扩展 apiserver
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "custom.metrics.k8s.io/v1beta1",
"resources": [
{
"name": "namespaces/nodes_per_pod",
"singularName": "",
"namespaced": false,
"kind": "MetricValueList",
"verbs": [
"get"
]
},
{
"name": "pods/nodes_per_pod",
"singularName": "",
"namespaced": true,
"kind": "MetricValueList",
"verbs": [
"get"
]
}
]
}
  • prometheus-adapter 将 metrics 转化为 pod 度量指标
{
"describedObject":{
"kind":"Pod",
"namespace":"edge-system",
"name":"tunnel-cloud-64ff7d9c9d-vmkxh",
"apiVersion":"/v1"
},
"metricName":"nodes_per_pod",
"timestamp":"2021-07-14T10:19:37Z",
"value":"1",
"selector":null
}
  • 配置自定义 HPA
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: tunnel-cloud
namespace: edge-system
spec:
minReplicas: 1
maxReplicas: 10
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: tunnel-cloud
metrics:
- type: Pods
pods:
metric:
name: nodes_per_pod
target:
averageValue: 300 #平均每个pod连接的边缘节点的个数,超过这个数目就会触发扩容
type: AverageValue

节点监控方案

节点监控主要采集边缘节点 kubelet 的 metrics 和 node-exporter 采集到的硬件、系统指标。在部署 Prometheus 时配置 pod 的 dns 指向 tunnel-dns,Prometheus 使用节点名访问边缘节点上的 kubelet 和 node-exporter,tunnel-dns 会把节点名解析为边缘节点的 tunnel-edge 连接的 tunnel-cloud 的 podIp,Prometheus 根据 podIp 访问 tunnel-cloud(其中获取 kubelet 的 metrics 访问的是10250端口,请求 node-exporter 访问的9100端口),tunnel-cloud 通过长连接隧道将请求转发到 tunnel-edge,由 tunnel-edge 向 kubelet 和 node-exporter 发起请求,整个流程的框图如下所示:

  • 配置 Prometheus 的 DNS 指向 tunnel-dns
dnsConfig:
nameservers:
- <tunnel-dns的clusterip>
options:
- name: ndots
value: "5"
searches:
- edge-system.svc.cluster.local
- svc.cluster.local
- cluster.local
dnsPolicy: None
  • 配置 Prometheus 使用节点名访问 kubelet 和 node-exporter
- job_name: node-cadvisor
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __address__
replacement: ${1}:10250
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /metrics/cadvisor
- source_labels: [__address__]
target_label: "unInstanceId"
replacement: "none"
- job_name: node-exporter
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __address__
replacement: ${1}:9100
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /metrics
- source_labels: [__address__]
target_label: "unInstanceId"
replacement: "none"

总结和展望

SuperEdge 的云边隧道方案(tunnel)相比社区的 ANP 方案,具有以下的特点:

  • 支持自动扩缩容
  • 支持了 Prometheus 采集节点监控数据
  • SSH 登录边缘节点
  • 支持 TCP 转发

当然我们也会继续完善 tunnel 的能力,使其能够满足更多场景的需求,根据社区小伙伴的反馈,接下来 tunnel 组件会支持以下功能:

  • 支持从云端访问边缘端的 service 和边缘端访问云端的 service
  • 支持 EgressSelector 特性

合作与开源

云边隧道的支持云端 server 自动扩缩容和节点监控新特性已经在 SuperEdge release 0.5.0 [https://github.com/superedge/superedge/blob/main/CHANGELOG/CHANGELOG-0.5.md] 开源,欢迎大家体验。我们也会持续提升 Tunnel 的能力,适用更加复杂的边缘网络场景,也欢迎对边缘计算感兴趣的公司、组织及个人一起共建 SuperEdge 边缘容器项目。

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

SuperEdge 高可用云边隧道有哪些特点?的更多相关文章

  1. 一文读懂 SuperEdge 云边隧道

    作者 李腾飞,腾讯容器技术研发工程师,腾讯云TKE后台研发,SuperEdge核心开发成员. 杜杨浩,腾讯云高级工程师,热衷于开源.容器和Kubernetes.目前主要从事镜像仓库,Kubernete ...

  2. keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群

    keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...

  3. 亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计

    设计高可用的应用是架构师的一个重要目标,可是基于云计算平台设计高可用应用与基于传统平台的设计有很多不同.云计算在给架构师带来了很多新的设计挑战的时候,也给带来了很多新的设计理念和可用的服务.怎样在设计 ...

  4. 转://Oracle 高可用技术与云基础架构

    众所周知Oracle云基础架构已经在越来越多的行业里应用.大家了解云基础架构是如何演进的嘛?可能有人会说Oracle高可用技术是组成云架构的基础,那它们的关系是怎么样的?大家又了解Oracle高可用技 ...

  5. 腾讯云部署keepalived高可用

    使用背景: 通过调用python SDK在腾讯云手动部署keepalived高可用 部署环境 系统:centos7.3 Master:192.168.0.100 Slave:192.168.0.14 ...

  6. 使用睿云智合开源 Breeze 工具部署 Kubernetes v1.12.3 高可用集群

    一.Breeze简介 Breeze 项目是深圳睿云智合所开源的Kubernetes 图形化部署工具,大大简化了Kubernetes 部署的步骤,其最大亮点在于支持全离线环境的部署,且不需要FQ获取 G ...

  7. 基于阿里云SLB/ESS/EIP/ECS/VPC的同城高可用方案演练

    今天基于阿里云SLB/ESS/EIP/ECS/VPC等产品进行了一次同城高可用方案演练: 基本步骤如下: 1. 在华东1创建VPC网络VPC1,在华东1可用区B和G各创建一个虚拟交换机vpc1_swi ...

  8. Redis之高可用、集群、云平台搭建(非原创)

    文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Cluster(分布式集群)实战五.Java之Je ...

  9. 阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天

    阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天

随机推荐

  1. 2021年Wordpress博客装修美化(二)

    使用古腾堡来排版页面 废话不多说,我们直接开始吧,今天主要来聊聊如何使用Wordpress自带的可视化页面编辑器.我相信只有驾驭最基础的可视化排版,后面才能对高级版本的扩展可视化编辑器elemento ...

  2. Kubernetes架构原理

    1.了解架构 在研究Kubernetes如何实现其功能之前,先具体了解下Kubernetes集群有哪些组件.Kubernetes集群分为两部分: Kubernetes控制平面 (工作)节点 具体看下这 ...

  3. 开发小技巧之:unicode的排序和正则匹配

    目录 简介 ASCII字符的排序 本地字符的排序 为什么不使用unicode进行排序 emoji的正则匹配 总结 简介 我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑,最 ...

  4. Gitlab 定时备份

    要求 1.为了能够备份和恢复,请确保你的系统上安装了Rsync #Debian/Ubauntu sudo apt-get install rsync # RHEL/Centos sudo yum in ...

  5. 第14章:部署Java网站项目案例

    1 说明 (1) 项目迁移到k8s平台的流程 1) 制作镜像 dockerfile.docker+jenkins持续集成.镜像分类:基础镜像.中间镜像.项目镜像 2) 控制器管理pod 控制器管理po ...

  6. Redis:Redis的安装

    Redis优势 性能极高             – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富的数据类型  – Redis支持二进制案例的 Strings, Li ...

  7. linux学习之路第五天(文件目录类第一部分)

    文件目录类 pwd 指令 基本语法 pwd (显示当前目录的绝对路径) Ls 指令 cd 指令 -代表的是上一级目录 mkdir指令 用于创建目录 基本语法 mkdir [选项] 要创建的目录 常用选 ...

  8. 等了半年,m1芯片原生支持的.NET IDE出现了

    m1芯片是苹果2020年发布的一款基于arm的桌面芯片,目前已经应用在MacBook Air .MacBook Pro.IMac.Ipad等设备上.可以说整个苹果生态圈都在去intel化. 今年年初跟 ...

  9. python使用笔记003-文件操作(一)

    文件操作分为: 1.打开文件,如果文件在当前目录下直接写文件名,如果文件在其他目录下写绝对路径 2.读/写文件 3.关闭文件 一.文件打开模式 # 'r':只读,文件读取后,会有文件指针记录读取文件的 ...

  10. C语言:数组长度的检测方法

    //数组长度的检测方法 #include <stdio.h> int main() { int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5 ...