在过去的几年中,容器的普及和采用猛增,并且Kubernetes容器编排平台也被广泛采用。通过这些更改,在处理现实世界中部署在Kubernetes集群上的应用程序时,出现了一系列新的挑战。挑战之一是如何处理可能位于不同网络(甚至是私有网络),防火墙之后的多个群集之间的通信。

解决此问题的一种可能方法是使用虚拟应用程序网络(VAN),有时将其称为第7层网络。简而言之,VAN是在应用程序级别部署的逻辑网络,它为细粒度的应用程序组件引入了新的寻址层,而对网络拓扑没有任何限制。有关更深入的说明,请阅读这篇文章

那么,什么是Skupper?用项目本身的话来说:

Skupper可以使第七层服务互连。它可以在没有VPN或特殊防火墙规则的情况下跨Kubernetes群集进行安全通信。

Skupper是VAN的实现。其高级架构如图1所示:

将Skupper安装在每个Kubernetes集群中并与其他集群连接后,集群1中的Service A可以与集群2中的Service B通信,并且可以与集群3中的Service C通信(反之亦然)。集群不必全部是公共的,也不必在同一基础结构上。它们可以位于防火墙后面,甚至可以位于无法从外部访问的专用网络上(前提是它们可以到达外部以将其自身连接到skupper VAN)。

Skupper 架构

考虑到总体架构,图1中的绿色Skupper组件如何工作?图2列出了Kubernetes集群1的Skupper组件,并描述了它们之间的交互:

首先要注意的是,可以使用专用的skupper CLI命令来管理Skupper。接下来是当您首次在Kubernetes和OpenShift集群中安装Skupper时,将部署两个组件:skupper-routerskupper-proxy-controller。前者是Apache Qpid的一个实例,Apache Qpid是一种开放源代码的高级消息队列协议(AMQP)路由器,负责创建VAN。 Qpid通过将HTTP和TCP通信隧道传输到AMQP中来帮助Kubernetes和OpenShift集群进行通信。

如果您熟悉 Operator pattern,可以将skupper-proxy-controller视为operator:该工具监视以skupper.io/proxy注释的服务,并为每个实例实例化一个service-*-proxy pod。该Pod将服务A的协议(即HTTP或TCP)通过隧道传输到AMQP中,其余的由skupper-router完成。

用例: 通过 Skupper 将一个本地服务导出

在混合环境中有效开发本地云应用程序编码和测试所带来的另一个挑战。在开发时,组成您的应用程序的某些服务可能会在笔记本电脑上(或在您的开发环境中)本地托管,而其他服务可能会部署在远程Kubernetes集群上。您如何在不设置VPN或其他“复杂”网络配置的情况下轻松地使本地服务可用于远程集群?

一种选择是利用Skupper机制将在Kubernetes外部运行的本地服务导出到远程Kubernetes集群。图3概述了我们要实现的目标—一种在笔记本电脑上运行的简单TCP回显服务,该服务通常连接到防火墙专用网络:

注意:由于此用例尚未实现为skupper CLI子命令,因此目前需要许多手动步骤。关于何时实现该功能还有一个未解决的问题。启用时,以下所有步骤将由单个skupper CLI调用替换。

让我们看看您现在需要执行的步骤:

$ skupper init --id public
  • 使skupper路由器可从群集外部访问:
$ oc apply -f - << EOF
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: skupper-messaging
spec:
  to:
    kind: Service
    name: skupper-messaging
    weight: 100
  port:
    targetPort: amqps
  tls:
    termination: passthrough
    insecureEdgeTerminationPolicy: None
  wildcardPolicy: None
EOF
  • 在集群上创建一个代表本地回显服务的服务。该服务将没有实现,仅用于帮助Skupper正确处理此功能:
$ oc apply -f - << EOF
kind: Service
apiVersion: v1
metadata:
  name: echo
  annotations:
    skupper.io/proxy: tcp
spec:
  ports:
    - protocol: TCP
      port: 2000
      targetPort: 2000
  selector:
    dummy: selector
EOF
  • 克隆skupper-proxy项目:
$ git clone git@github.com:skupperproject/skupper-proxy.git
  • 使用以下命令转到该项目的 bin/ 目录:
$ cd skupper-proxy/bin
  • 提取相互认证您的连接所需的证书:
$ oc extract secret/skupper
  • 修改connection.json如下所示:
{
    "scheme": "amqps",
    "host": "",
    "port": "443",
    "verify": false,
    "tls": {
        "ca": "ca.crt",
        "cert": "tls.crt",
        "key": "tls.key",
        "verify": false
    }
}

可以通过以下方式获取host:

$ oc get route skupper-messaging -o=jsonpath='{.spec.host}{"\n"}'
  • 在将继续保持运行状态的单独shell中,在本地端口2000上运行一个简单的Bash TCP回显服务:
$ nc -l 2000 -k -c 'xargs -n1 echo'
  • 连接到在远程群集上运行的Skupper。请注意,该端口必须与步骤10(即2000)中的echo服务所使用的端口匹配,并且echo必须与您先前在集群上创建的服务的名称匹配:
$ node ./simple.js 'amqp:echo=>tcp:2000'

现在。一切都准备好了。您可以进入远程集群,使用安装了Netcat命令nc的pod(例如busybox:latest),然后运行:

$ nc localhost echo

输入一个单词,当它通过skupper-proxy-pod-> skupper routerrouter->笔记本电脑上的simple.js->笔记本电脑上的TCP回显服务时,它应该会回显!

总结

该项目仍在大规模开发中,并且每天都在改进。在官方网站上或直接从GitHub项目上的代码中查看进度。特别是,这是一个问题,该问题直接作为Skupper CLI命令来跟踪支持本地服务导出器用例所涉及的所有工作。

PS:本文属于翻译,原文


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。