有没有办法处理Kubernetes中的SIP,RTP,DIAMETER,M3UA流量?

时间:2018-03-17 14:52:37

标签: kubernetes

通过快速阅读Kubernetes文档,我注意到kube-proxy表现为Level-4代理,并且可能适用于TCP / IP流量(通常是HTTP流量)。

然而,还有其他协议,如SIP(可能通过TCP或UDP),RTP(通过UDP)和核心电信网络信令协议,如DIAMETER(通过TCP或SCTP)或同样M3UA(通过SCTP) 。有没有办法处理在Kubernetes minion中运行的应用程序中的此类流量?

在我的阅读中,我遇到了Kuberntes的Ingress API的概念,但我知道这是一种扩展代理功能的方法。那是对的吗 ?

此外,目前没有已知的Ingress API实现(开源或闭源),可以让Kubernetes集群处理上面列出的流量类型吗?

最后,除了使用Ingress API之外,是否有办法处理上面列出的流量,即使它有性能限制?

3 个答案:

答案 0 :(得分:4)

  

此外,目前没有已知的Ingress API实现(开源或闭源),可以让Kubernetes集群处理上面列出的流量类型吗?

可能,这IBM study on IBM Voice Gateway "Setting up high availability"

https://www.ibm.com/support/knowledgecenter/SS4U29/images/ha.png

(此处有SIPs (Session Initiation Protocol)like OpenSIPS

  

Kubernetes部署

     

在Kubernetes术语中,单个语音网关实例相当于一个pod,其中包含SIP Orchestrator容器和Media Relay容器。   语音网关pod安装在Kubernetes集群中,该集群由外部SIP负载均衡器提供   通过Kubernetes,可以安排语音网关pod在一组VM上运行。该框架还监视窗格,并且可以配置为在检测到故障时自动重新启动语音网关窗格。

     

注意:由于当前不支持Kubernetes中的SIP负载均衡器自动扩展和自动发现新pod,因此需要外部SIP

并且,为了说明Kubernetes的局限性:

  

由于语音网关使用的协议,在Kubernetes环境中运行IBM Voice Gateway需要在部署典型的基于HTTP的应用程序之外进行特殊考虑。

     

语音网关依赖于用于呼叫信令的SIP协议和用于媒体的RTP协议,这两者都需要与特定语音网关实例的亲和性。为避免破坏会话亲和性,必须绕过这些协议的Kubernetes入口路由器

     

要解决入口路由器的限制,必须在主机网络模式下配置语音网关容器。
  在主机网络模式下,当在任一语音网关容器中打开端口时,这些相同的端口也会打开并映射到基本虚拟机或节点上。
  此配置还消除了在kubectl配置文件中定义媒体端口范围的需要,Kubernetes目前不支持该文件。在主机网络模式下,每个节点仅部署一个Pod可确保在主机VM上打开SIP和媒体端口,并且SIP负载均衡器可以看到这些端口。

this answer中最好地说明了为Kubernetes设置的网络配置,其中描述了pod / node-communication中涉及的元素:

https://i.stack.imgur.com/APpSf.png

答案 1 :(得分:1)

可以处理从客户端到服务的TCP和UDP流量,但它稍微取决于您运行Kubernetes的位置。

解决方案

到处工作的解决方案

可以将Ingress用于TCP和UDP协议,而不仅仅是HTTP。一些Ingress实现支持代理这类流量。

这是Nginx Ingress控制器 for TCP 的那种配置example

apiVersion: v1 kind: ConfigMap metadata: name: tcp-configmap-example data: 9000: "default/example-go:8080" here is a "$namespace/$service_name:$port"

和UDP: apiVersion: v1 kind: ConfigMap metadata: name: udp-configmap-example data: 53: "kube-system/kube-dns:53" # here is a "$namespace/$service_name:$port"

因此,实际上,您可以运行需要普通UDP和TCP连接的应用程序,但有一些限制(如果您有多个pod等,则需要以某种方式管理负载平衡)。

但如果您现在有一个可以立即执行的应用程序,而且没有Kubernetes - 我不会认为在迁移到Kubernetes后您将遇到任何问题。

交通流量的一个小例子

对于SIP UDP流量,例如,您可以准备如下配置:

客户 - > Nginx Ingress(UDP) - > OpenSIPS负载均衡器(UDP) - > SIP服务器(UDP)。

因此,客户端会将数据包发送到Ingress,它会将其转发给OpenSIPS,OpenSIPS将管理SIP群集的状态并将客户端数据包发送到正确的SIP服务器。

仅针对云的解决方案

此外,如果您将在云上运行,则可以使用ServiceType LoadBalancer作为Service,并通过外部负载均衡器直接获取应用程序的TCP和UDP流量云平台。

关于SCTP

SCTP ,遗憾的是,不,尚不支持,但您可以跟踪进度here

答案 2 :(得分:1)

关于k8s中的SCTP支持:最近已作为alpha功能将其合并到k8s中。 Service,NetworkPolicy和Pod定义中将SCTP作为新协议类型支持。在此处查看PR:https://github.com/kubernetes/kubernetes/pull/64973

存在一些限制:

    对多宿主SCTP关联的处理不在PR的范围内。对于使用NAT的情况,多宿主SCTP关联的支持是一个更为广泛的主题,这也影响到为协议处理NAT的当前SCTP内核模块。在此处查看示例:https://tools.ietf.org/html/draft-ietf-tsvwg-natsupp-12 从k8s的角度来看,还需要一个CNI插件,该插件支持将多个IP地址(最好在多个接口上)分配给Pod,以便Pod可以建立多宿主SCTP关联。另外,还需要一个增强的服务/端点/ DNS控制器来以正确的方式处理这些多个IP地址。
  • 对SCTP作为type = LoadBalancer Services协议的支持取决于负载均衡器的实现,这不是k8s的问题
    • 为了在NetworkPolicy中使用SCTP,需要一个在NetworkPolicies中支持SCTP的CNI插件