应用层(L7)的多集群互联,用代理把服务暴露到其它集群,不需要打通网络
Skupper 是一个「虚拟应用网络」(Virtual Application Network)实现,由 Red Hat 主导并商品化为 Red Hat Service Interconnect,采用 Apache-2.0 许可。当前最新版本为 2.2.2(2026-08-17),配套的 Skupper Router 为 3.5.x、Console 为 2.2.0,项目仍在活跃开发。
它与 Submariner、Cilium ClusterMesh 的根本区别在于层次。官方原话是:Skupper 工作在应用层,运行在既有 IP 网络之上;Layer 7 的应用路由器在应用端点之间转发消息,而不是在网络端点之间转发 IP 包。这意味着:
Submariner / ClusterMesh 打通 L3,Pod IP 直接可达,应用完全无感
Skupper 不打通 L3,靠站点之间的路由器代理 TCP 连接
因此 Skupper 的典型使用场景不是「把两个集群变成一个集群」,而是把某个服务从 A 集群暴露给 B 集群(混合云、边缘到中心、跨组织协作),且往往能穿过只允许出站的防火墙。
时效性提醒:Skupper v2 与 v1 的 API 与 CLI 完全不兼容。网上大量教程仍是 v1 写法(
skupper init、skupper expose、skupper.io/v1alpha1),在 v2 上会直接报错。本页只描述 v2。
Site 一个「站点」,即运行工作负载的一处环境(Kubernetes 集群、Docker、Podman、Linux 主机)
Link 站点之间的通道
Connector 把本站的工作负载绑到远端站点的 listener 上(服务提供方)
Listener 把本地端口绑定到远端站点的 connector 上(调用方)
Routing key 连接器与监听器之间的匹配键,两者靠它配对
一个 Skupper 网络里所有站点共享同一个「虚拟应用网络」,但站点名必须唯一。
CLI 与控制器是分开的两件事:
# 方式一:安装 CLI(下载对应平台包后解压)
tar -xzf skupper-cli-2.2.2-mac-arm64.tgz
sudo install -m 755 skupper /usr/local/bin/skupper
skupper version
# 方式二:用 Helm 装控制器(OCI chart)
helm install skupper oci://quay.io/skupper/helm/skupper --version 2.2.2
# 升级前先单独更新 CRD(server-side apply,避免注解体积超限)
kubectl apply --server-side -f \
https://github.com/skupperproject/skupper/releases/download/2.2.2/skupper-crds.yaml
Controller 的部署清单也提供集群级与命名空间级两种作用域(skupper-cluster-scope.yaml / skupper-namespace-scope.yaml),后者适合「每个团队一个命名空间、各管各的站点」。
# 在命名空间 west 中创建站点,并允许其它站点链接进来
skupper site create west --enable-link-access
# 查看站点状态(应该变成 Ready)
skupper site status
kubectl get site
# 删除站点
skupper site delete west
对应的声明式写法:
apiVersion: skupper.io/v2alpha1
kind: Site
metadata:
name: west
namespace: west
spec:
linkAccess: default
spec.linkAccess 的取值:
none 默认值,不接受外部链接
default 接受链接,自动选择合适的暴露方式
route 使用 OpenShift Route
loadbalancer 使用 LoadBalancer Service
一个两站点网络中,至少要有一个站点的 link access 不是 none,否则两边无法建立 Link。
v2 用「短期访问令牌」把站点连起来,而不是手工交换证书:
# 在站点 west(需要已开启 link access)签发令牌
skupper token issue ~/west-token.yaml
# 在站点 east 兑换令牌,建立 Link
skupper token redeem ~/west-token.yaml
skupper link status
令牌对应的两个 CRD:
AccessGrant 允许在本地站点兑换令牌的权限(AccessToken 由它派生)
AccessToken 短期的链接凭证
也可以直接用 skupper link create <token-file> 建立链接、用 skupper link delete 断开。令牌是短期凭证,过期后需要重新签发,这也是它与静态证书方案在运维上的主要差别。
服务提供方定义 Connector,调用方定义 Listener,二者通过 routing key 配对:
# 站点 west:把本地的 backend 服务暴露出去
skupper connector create backend 8080 --routing-key backend
# 站点 east:在本地监听 8080,流量转到 west 的 backend
skupper listener create backend 8080 --routing-key backend
# 查看
skupper connector status
skupper listener status
声明式写法:
apiVersion: skupper.io/v2alpha1
kind: Connector
metadata:
name: backend
namespace: west
spec:
routingKey: backend
port: 8080
host: backend
tcp 默认;任何基于 TCP 的协议都可以跑在上面
http1 带 L7 路由与可观测性
http2 同上
官方没有把 UDP 列入支持范围。另外所有站点间流量都会被转换成 AMQP 消息在路由器之间传递:tcp 是一条流式消息,http1/http2 则按请求/响应路由。存在端口协商的协议(例如主动模式 FTP)也无法跨站点工作。
skupper init、skupper expose、skupper.io/v1alpha1 都是 v1 的写法;v2 对应 skupper site create、skupper connector create、skupper.io/v2alpha1。照着旧博客操作会直接失败。spec.linkAccess 决定;两个站点都在 NAT 后且都设成 none 时无法互连,此时至少一端需要 LoadBalancer 或 Route。kubectl get site 的 SITES IN NETWORK 列可以用来核对网络里到底有几个站点。kubectl apply --server-side 应用最新 CRD,否则新字段会被 API Server 的旧 schema 静默丢弃。token issue。把令牌文件放进 Git 是不安全的做法。spec.edge: true 的站点不能接受来自远端站点的 Link,只适合「我只连出去、不接受连入」的边缘场景,配错会表现为 Link 一直建不起来。localhost:8080 或本集群的 Service),这一点在设计应用配置时很容易搞反。spec.ha: true 会启动两个活动路由器。高可用模式下资源占用翻倍,小规模场景通常不需要开。kubectl — Kubernetes集群管理工具submariner — L3 跨集群网络,与 Skupper 定位互补cilium — ClusterMesh 提供 L3/L4 多集群能力gateway-api — Skupper v2 的路由依赖相关生态istio — 另一种跨集群服务互联思路helm — 用 OCI chart 部署 Skupper 控制器