代码示范【FabEdge v0.8.0】配置 connector 公开端口
FabEdge项目简介:
FabEdge是博云在2021年8月发起,基于Kubernetes 构建的专注于边缘计算场景的容器网络方案,支持 KubeEdge 、SuperEdge、OpenYurt 等主流边缘计算框架。旨在解决边缘计算场景下容器网络配置管理复杂、网络割裂互不通信、缺少拓扑感知能力、无法提供就近访问等问题,适用于物联网,车联网、智慧城市、智慧园区等多种边缘场景。
此后产品不断迭代,在2022年3月8日,博云正式将FabEdge捐献给CNCF社区,并通过相关评定,成为 CNCF 沙箱中首个边缘容器网络项目。目前FabEdge社区已有200多位开发者。
FabEdge最近正式发布了 V0.8.0 版本,该版本增强了边缘侧的服务访问能力,改善了边缘节点的连通性。
边缘侧服务访问能力增强
这次更新主要是改善KubeEdge集群边缘侧的服务访问能力,因为默认情况下KubeEdge集群不会有kube-proxy运行,也不能访问coredns。
FabEdge以前内部实现了一个fab-proxy来实现服务代理,并在边缘侧使用nodelocaldns提供服务域名解析,但是fab-proxy能力有限,且不能及时响应服务信息变更,nodelocaldns的也不适合边缘场景,为了解决以上问题,FabEdge此次更新将kube-proxy和coredns整合至fabedge-agent内,并利用edgecore的metaServer组件向fabedge-agent内的kube-proxy和coredns组件提供数据,从而为边缘节点上运行的容器提供了服务域名解析能力和服务代理。
允许配置connector节点的公开端口
FabEdge v0.8.0添加了connector公开端⼝配置的能⼒。之前FabEdge利用strongswan来创建VPN隧道实现云边通信,strongswan默认的端口为500和4500,connector节点的strongswan占用的端口通常需要做公网端口映射,映射出来的端口很可能不是500和4500,这样限制了FabEdge的使用场景。
这次更新之后,用户可以直接设置connector节点的公开端口,让strongswan可以通过非500和非4500端口建立隧道。但边缘侧暂时不能也没有必要进行端口配置,边缘侧的此类问题可以通过打洞(本次也有更新)功能来解决。
示例
配置connector节点公开端口
环境信息
* kubernetes v1.22.5
* kubeedge v1.12.2
* flannel v0.19.2
* fabedge v0.8.0
kubernetes集群节点信息如下:
其中beijing节点要作为connector节点,它和node1位于同一个局域网,edge1、 edge2位于另一个局域网。
想让边缘侧访问云端,需要为beijing节点做端口映射,这里我们选择将4500 映射为45000。
具体的映射方法需要读者根据环境调整,本文的beijing节点使用vagrant创建的,其实际映射配置为:
```ruby
# stongswan的通信端口,注意这里的协议为UDP
config.vm.network "forwarded_port", guest: 4500, host: 45000, protocol: "udp"
```
笔者开发时也会因为环境限制偶尔使用iptables来实现端口映射,具体规则为:
```shell
$ iptables -t nat -A PREROUTING -p udp --dport 45000 -j REDIRECT --to-ports 4500
```
这里再强调一次,使用strongswan的客户端使用非500端口进行IKE及通信时,服务端的实际目标端口为4500。
安装FabEdge
本文采用quickstart.sh脚本来安装,重点介绍一些参数配置,具体的安装文档参考[快速安装](https://github.com/FabEdge/fabedge/blob/main/docs/get-started_zh.md)。
1. 用helm添加fabedge repo:
```shell
$ helm repo add fabedge https://fabedge.github.io/helm-chart
```
2. 执行安装命令:
```shell
$ curl https://fabedge.github.io/helm-chart/scripts/quickstart.sh | bash -s -- \
--cluster-name beijing \
--cluster-role host \
--cluster-zone beijing \
--cluster-region beijing \
--connectors beijing \
--edges edge1,edge2 \
--connector-public-addresses 10.40.20.181 \
--connector-public-port 45000 \
--chart fabedge/fabedge
```
注意,上面的**connector-public-addresses**参数没有配置为beijing节点的内网地址192.168.56.11 ,而是beijing节点对外的地址**10.40.20.181**,端口也是我们之前映射的**45000**端口。
如果您选择手动安装FabEdge, 相应的配置可以参考以下内容:
```yaml
cluster:
name: beijing
role: host
region: beijing
zone: beijing
cniType: "flannel"
connectorPublicPort: 45000
connectorPublicAddresses:
- 10.22.45.16
clusterCIDR:
- 10.233.64.0/18
serviceClusterIPRange:
- 10.233.0.0/18
agent:
args:
以下两个参数仅需要在kubeedge环境打开
ENABLE_PROXY: "true"
ENABLE_DNS: "true"
```
验证
来检查一下edge1, edge2跟connector创建的隧道信息:
```shell
$ fabctl swanctl list-sa edge1
========================== fabedge-agent-xfntz =================================
beijing.connector: #2, ESTABLISHED, IKEv2, aedd33719dd60b73_i* 1290e9570d67a570_r
local 'C=CN, O=fabedge.io, CN=beijing.edge1' @ 10.22.46.30[4500]
remote 'C=CN, O=fabedge.io, CN=beijing.connector' @ 10.40.20.181[45000]
AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
established 2682s ago, rekeying in 10461s
beijing.connector-p2p: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128
installed 2682s ago, rekeying in 599s, expires in 1279s
in c056eddc, 0 bytes, 0 packets
out cba5947a, 0 bytes, 0 packets
local 10.233.66.0/24
remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24
beijing.connector-p2n: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128
installed 2681s ago, rekeying in 583s, expires in 1279s
in c60aff0c, 0 bytes, 0 packets
out cc298e3f, 0 bytes, 0 packets
local 10.233.66.0/24
remote 192.168.56.11/32 192.168.56.12/32
beijing.connector-n2p: #3, reqid 3, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128
installed 2681s ago, rekeying in 663s, expires in 1279s
in cc583570, 0 bytes, 0 packets
out c6a00d2f, 0 bytes, 0 packets
local 10.22.46.30/32
remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24
$ fabctl swanctl list-sa edge2
========================== fabedge-agent-gb5qd =================================
beijing.connector: #1, ESTABLISHED, IKEv2, 68cc6b323a3d9fe1_i* a572ff308882d651_r
local 'C=CN, O=fabedge.io, CN=beijing.edge2' @ 10.22.46.28[4500]
remote 'C=CN, O=fabedge.io, CN=beijing.connector' @ 10.40.20.181[45000]
AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
established 2683s ago, rekeying in 10862s
beijing.connector-p2p: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128
installed 2683s ago, rekeying in 625s, expires in 1277s
in c801df3f, 0 bytes, 0 packets
out cea754ac, 0 bytes, 0 packets
local 10.233.67.0/24
remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24
beijing.connector-p2n: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128
installed 2683s ago, rekeying in 655s, expires in 1277s
in cf9528de, 0 bytes, 0 packets
out c0785f9e, 0 bytes, 0 packets
local 10.233.67.0/24
remote 192.168.56.11/32 192.168.56.12/32
beijing.connector-n2p: #3, reqid 3, INSTALLED, TUNNEL-in-UDP, ESP:AES_GCM_16-128
installed 2683s ago, rekeying in 703s, expires in 1277s
in c6284776, 0 bytes, 0 packets
out c0eefea6, 0 bytes, 0 packets
local 10.22.46.28/32
remote 10.233.0.0/18 10.233.64.0/24 10.233.65.0/24
```
上面的输出结果包含这么一行:
```
remote 'C=CN, O=fabedge.io, CN=beijing.connector' @ 10.40.20.181[45000]
```
这就意味着edge1, edge2上的strongswan连接云端的strongswan时使用了10.40.20.181:45000这个地址,证明我们的配置成功了。下面让我们看看这个配置会影响edge1, edge2之间的通信吗?
先为edge1, edge2创建一个community:
```shell
cat > all-edges.yaml << EOF
apiVersion: fabedge.io/v1alpha1
kind: Community
metadata:
name: all-edges
spec:
members:
- beijing.edge1
- beijing.edge2
EOF
kubectl apply -f all-edges.yaml
```
然后检查edge1, edge2彼此之间的隧道信息:
```shell
$ fabctl swanctl list-sa edge1
========================== fabedge-agent-xfntz =================================
beijing.edge2: #4, ESTABLISHED, IKEv2, da14230995406a58_i* df83821754f9c263_r
local 'C=CN, O=fabedge.io, CN=beijing.edge1' @ 10.22.46.30[4500]
remote 'C=CN, O=fabedge.io, CN=beijing.edge2' @ 10.22.46.28[4500]
AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
established 62s ago, rekeying in 12926s
beijing.edge2-p2p: #4, reqid 4, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 62s ago, rekeying in 3245s, expires in 3898s
in cfeeafca, 0 bytes, 0 packets
out c8c1f7aa, 0 bytes, 0 packets
local 10.233.66.0/24
remote 10.233.67.0/24
beijing.edge2-p2n: #5, reqid 5, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 62s ago, rekeying in 3233s, expires in 3898s
in cfefe387, 0 bytes, 0 packets
out ccc83258, 0 bytes, 0 packets
local 10.233.66.0/24
remote 10.22.46.28/32
beijing.edge2-n2p: #6, reqid 6, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 62s ago, rekeying in 3420s, expires in 3898s
in c7f1a30b, 0 bytes, 0 packets
out cabd83c9, 0 bytes, 0 packets
local 10.22.46.30/32
remote 10.233.67.0/24
$ fabctl swanctl list-sa edge2
========================== fabedge-agent-gb5qd =================================
beijing.edge1: #3, ESTABLISHED, IKEv2, da14230995406a58_i df83821754f9c263_r*
local 'C=CN, O=fabedge.io, CN=beijing.edge2' @ 10.22.46.28[4500]
remote 'C=CN, O=fabedge.io, CN=beijing.edge1' @ 10.22.46.30[4500]
AES_CBC-128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
established 213s ago, rekeying in 13060s
beijing.edge1-p2p: #4, reqid 4, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 213s ago, rekeying in 3137s, expires in 3747s
in c8c1f7aa, 0 bytes, 0 packets
out cfeeafca, 0 bytes, 0 packets
local 10.233.67.0/24
remote 10.233.66.0/24
beijing.edge1-n2p: #5, reqid 5, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 213s ago, rekeying in 3040s, expires in 3747s
in ccc83258, 0 bytes, 0 packets
out cfefe387, 0 bytes, 0 packets
local 10.22.46.28/32
remote 10.233.66.0/24
beijing.edge1-p2n: #6, reqid 6, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
installed 213s ago, rekeying in 3209s, expires in 3747s
in cabd83c9, 0 bytes, 0 packets
out c7f1a30b, 0 bytes, 0 packets
local 10.233.67.0/24
remote 10.22.46.30/32
```
从上面的输出结果可以看出:edge1与edge2之间的隧道依然利用4500通信,不受connector配置的影响。如果希望边缘节点之间通过500, 4500端口外的值通信要怎么办?
答案是不能且没必要,因为边缘网络比较复杂,为每个边缘节点的strongswan都进行端口映射是个很麻烦的事,而且有些节点本身就在一个局域网,它们之间用500, 4500通信,却为外部通信配置不同的端口也会引入复杂的配置工作。但有些时候,边缘节点就是需要跨网通信,不能配置端口又该怎么做,那就需要使用FabEdge v0.8.0引入的新特性:打洞,见下文。
以上介绍了配置connector公开端口的方法和效果,需要一提的是,一旦使用500, 4500外的端口进行通信,strongswan就会利用non-esp格式,这种格式会一定程度上影响性能,所以能使用500, 4500的情况下最好还是使用。
相关文章:

代码示范【FabEdge v0.8.0】配置 connector 公开端口
FabEdge项目简介: FabEdge是博云在2021年8月发起,基于Kubernetes 构建的专注于边缘计算场景的容器网络方案,支持 KubeEdge 、SuperEdge、OpenYurt 等主流边缘计算框架。旨在解决边缘计算场景下容器网络配置管理复杂、网络割裂互不通信、缺少…...

通过Python的PyPDF2库合并多个pdf文件
文章目录 前言一、PyPDF2库是什么?二、安装PyPDF2库三、查看PyPDF2库版本四、合并多个pdf文件1.引入库2.定义pdf路径3.获取所有要合并的PDF文件名4.创建一个新的PDF文件5.遍历所有PDF文件名6.打开PDF文件7.创建PDF阅读器对象8.遍历PDF中的每一页,并将它们…...
python基础 - python命名空间与作用域
命名空间是名称与对象之间的关系,可以将命名空间看做是字典,其中的键是名称,值是对象。 命名空间不共享名称。 在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的名称可以与不同的对象相关联。但是…...

MapReduce实战案例(3)
案例三: MR实战之TOPN(自定义GroupingComparator) 项目准备 需求测试数据 有如下订单数据 订单id商品id成交金额Order_0000001Pdt_01222.8Order_0000001Pdt_0525.8Order_0000002Pdt_03522.8Order_0000002Pdt_04122.4Order_0000002Pdt_05722.4Order_0000003Pdt_01222.8 现在…...
Socket(三)
文章目录 1. 设置Socket选项2. TCP_NODELAY3. SO_LINGER4. SO_TIMEOUT5. SO_RCVBUF和SO_SNDBUF6. SO_KEEPALIVE7. OOBINLINE8. SO_REUSEADDR9. IP_TOS服务类型10. Socket异常 1. 设置Socket选项 Socket选项指定了Java Socket类所依赖的原生socket如何发送和接受数据࿰…...

【JVM】12. 垃圾回收相关概念
文章目录 12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出(OOM)内存泄漏(Memory Leak) 12.3. Stop The World12.4. 垃圾回收的并行与并发并发(Concurrent)并行(Parallel)并…...

Java 版 spring cloud 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
【Linux系统基础快速入门详解】Linux系统命令行介绍、命令提示符知识详解: ~/#/@等符号
Linux系统的命令行界面是Linux系统的核心部分,也是最常用的部分。在命令行界面中,用户可以使用各种Linux系统命令进行文件操作、系统管理、网络管理等操作。下面介绍一些常见的Linux系统命令行知识,以及命令提示符中的一些符号的含义。 1. 命令行界面 在Linux系统中,命令…...
Python 面向对象编程笔记:中级面向对象
__super__() 在 Python 中,super 是一个内置函数,用于调用父类方法。该函数可以在子类中调用父类中被重写的方法,从而实现对父类方法的继承并且进行扩展。它能够动态地查找当前子类继承链中的下一个类,从而允许设计者更加灵活地…...

JVM学习笔记(上)
1、总体路线 2、程序计数器 Program Counter Register 程序计数器(寄存器) 作用:是记录下一条 jvm 指令的执行地址行号。 特点: 是线程私有的不会存在内存溢出 解释器会解释指令为机器码交给 cpu 执行,程序计数器会…...
反爬虫技术
预计更新 一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 …...

JAVA中.equals()与 ==的区别
1. “”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 2..equals() equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比…...

华为OD机试之羊、狼、农夫过河(Java源码)
羊、狼、农夫过河 题目描述 羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。只计算…...

C++ string的简单应用
C语言的字符串 C的字符串 头文件: #include<string.h> //c #include<string> //C #include<cstring> //C 比较string的大小 两个string对象相加 使用字符串对象来存放字符串 两个string对象相加 string str "Hello,"; st…...

Java中的阻塞队列
阻塞队列的基本概念 1、生产者、消费者的概念 他俩是设计模式的一种,提出这两种概念,通过一个容器的方式能解决强耦合问题 生产者、消费者之间不会直接通讯。通过一个第三方容器、队列的方式进行通讯 生产者生产完数据放入容器之后,不用等待消…...
PriorityBlockingQueue无界阻塞优先级队列
PriorityBlockingQueue无界阻塞优先级队列 PriorityBlockingQueue 是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实 现,研究过数组方式存放最小堆节点的都知道,直接遍历队列元素是无序的。 如图 P…...
「HTML和CSS入门指南」p 标签详解
<p> 标签是什么? HTML5 中的 <p> 标签是用于定义段落的标签。它可以用来标记文章、新闻等长篇内容中的段落,并且可以与其他 HTML 元素配合使用。 <p> 标签的语法和属性 <p> 标签的语法非常简单,只需要在 HTML 文件中插入 <p> 和 </p>…...

【单目标优化算法】孔雀优化算法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

chatgpt赋能python:Python同一行多个语句:如何提高你的编程效率?
Python同一行多个语句:如何提高你的编程效率? Python是一种优雅的编程语言,拥有简洁易懂的语法,可以帮助你快速编写可以在各种领域使用的高级代码。其中,Python同一行多个语句,是一种可以大大提高编程效率…...

Java反射概述
2 反射 2.1 反射概述 Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展2.2 反射获取Class类的对象 我们要想通过反…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...