本文以commit id:
180282663457080119a1bc6076cce20c922b5c50
, 对应版本tag:v1.2.1
的源码分析tunnel-server的实现逻辑。
1. Tunnel-server简介
云与边一般位于不同网络平面,同时边缘节点普遍位于防火墙内部,采用云(中心)边协同架构,将导致原生 K8s 系统的运维监控能力面临如下挑战:
- K8s 原生运维能力缺失(如 kubectl logs/exec 等无法执行)
- 社区主流监控运维组件无法工作(如 Prometheus/metrics-server )
在 OpenYurt 中,引入了专门的组件 YurtTunnel 负责解决云边通信问题。反向通道是解决跨网络通信的一种常见方式,而 YurtTunnel 的本质也是一个反向通道。 它是一个典型的C/S结构的组件,由部署于云端的 YurtTunnelServer 和部署于边缘节点上的 YurtTunnelAgent组成。
本文主要分析tunnel-server的代理逻辑。
以下是基本架构图:

pkg中的目录结构:
1 | yurttunnel |
2. NewYurttunnelServerCommand
main函数入口:
1 | func main() { |
以下是NewYurttunnelServerCommand构造函数,常见的三件套,不做展开:
-
读取参数:serverOptions.AddFlags(cmd.Flags())
-
生成配置:cfg.Complete()
-
执行Run函数:核心逻辑
1 | func NewYurttunnelServerCommand(stopCh <-chan struct{}) *cobra.Command { |
3. Run(cfg.Complete(), stopCh)
Run函数最终是运行一个tunnelserver的常驻进程。在之前会做一些controller或manager的准备工作。
其中包括:
-
DNS controller
-
IP table manager
-
certificate manager
-
RegisterInformersForTunnelServer
首先是构建并运行上述的manager或controller, 源码中的注释也大概描述了主要流程:
-
注册tunnel所需的SharedInformerFactory
-
运行dns controller
-
运行ip table manager
-
给tunnel server创建certificate manager
-
给tunnel agent 创建certificate manager
-
创建handler wrappers
-
生成TLS 证书
-
运行tunnel server
以下是部分代码,已删除无关紧要的代码:
1 | // run starts the yurttunel-server |
3. TunnelServer
anpTunnelServer实现了TunnelServer的接口,以下分析TunnelServer.Run的部分。
run部分主要运行了三个server
-
proxyServer: 主要是重定向apiserver的请求到tunnel server
-
MasterServer:
-
AgentServer:主要运行一个grpc server与tunnel agent连接,即云边反向隧道
1 | // Run runs the yurttunnel-server |
4. runAgentServer
runAgentServer主要运行一个grpc server与edge端的agent形成grpc连接。
1 | // runAgentServer runs a grpc server that handles connections from the yurttunel-agent |
5. Interceptor
Interceptor(请求拦截器)拦截kube-apiserver的请求转发给tunnel,通过tunnel请求kubelet。
流程图:

1 | // NewRequestInterceptor creates a interceptor object that intercept request from kube-apiserver |
参考:
赞赏一下