作者

作者李腾飞,腾讯容器技术研发工程师,腾讯云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. Linux关闭打开防火墙命令

    Linux下打开和关闭防火墙 1.及时生效,重启后复原 关闭:service iptables stop  开启:service iptalbes start  查看状态:service iptabl ...

  2. SpringBoot_登录注册

    学习SpringBoot需要的前期基础 Spring(Bean容器 IOC set 构造方法 AOP) SpringMVC(GET POST Restful) 对于SpringBoot,约定大于配置 ...

  3. ES6中的Generator函数

    今天小编发现一个es6中的新概念,同时也接触到了一个新关键字yeild,下面我就简单和大家聊聊es6中的generator函数.大家还可以关注我的微信公众号,蜗牛全栈. 一.函数声明:在functio ...

  4. .NET 云原生架构师训练营(Identity Server)--学习笔记

    目录 OAuth 2.0 OpenID Connect QuickStart OAuth 2.0 概念 过程 通信 组件 示例代码 概念 OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是 ...

  5. 常见DDoS攻击

    导航: 这里将一个案例事项按照流程进行了整合,这样观察起来比较清晰.部分资料来自于Cloudflare 1.DDoS介绍 2.常用DDoS攻击 3.DDoS防护方式以及产品 4.Cloudflare ...

  6. 我是怎么写 Git Commit message 的?

    目录 作用 用的什么规范? type scope subject body footer 参考文章 用的什么辅助工具? 作用 编写格式化的 commit message 能够大大提高代码的维护效率. ...

  7. C# 启动项目直接修改电脑的日期格式

    启动界面添加 1.引用添加 using System.Runtime.InteropServices; 2.方法添加 [DllImport("kernel32.dll", Entr ...

  8. Java数据库开发(二)之——DBCP连接数据库

    1.载入jar包 DBCP需要以下几个jar包,可到apache及mysql的官网下载 2.程序编写 public static BasicDataSource ds = null; static f ...

  9. PHP严格类型检查模式

    前言 PHP默认情况下是弱类型校验模式,在php7下declare新增了strict_types指令,通过设置strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句 ...

  10. Java刷题常用API

    目录 输入输出 快速查看 最大最小值 string stringbuilder 集合 map queue stack set 优先队列 PriorityQueue (Heap) 数组 静态数组 动态数 ...