从快速阅读Kubernetes文档,我注意到kube-proxy表现为Level-4代理,并且可能适用于TCP / IP流量(通常是HTTP流量) .
但是,还有其他协议,如SIP(可能通过TCP或UDP),RTP(通过UDP)和核心电信网络信令协议,如DIAMETER(通过TCP或SCTP)或类似M3UA(通过SCTP) . 有没有办法处理在Kubernetes小兵中运行的应用程序中的此类流量?
在我的阅读中,我遇到了Kuberntes的Ingress API的概念,但我知道这是一种扩展代理功能的方法 . 那是对的吗 ?
此外,目前没有已知的Ingress API实现(开源或闭源),可以允许Kubernetes集群处理上面列出的流量类型?
最后,除了使用Ingress API之外,即使它有性能限制,也无法处理上面列出的流量?
3 回答
可能,这个IBM study on IBM Voice Gateway "Setting up high availability"
(这里有SIPs (Session Initiation Protocol),like OpenSIPS)
并且,为了说明Kubernetes的局限性:
为Kubernetes设置的网络配置最好在this answer中说明,它描述了pod / node-communication中涉及的元素:
可以处理从客户端到服务的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"
And 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等,则需要以某种方式管理负载 balancer ) .
但是,如果你现在有一个应用程序可以立即执行,没有Kubernetes - 我认为在迁移到Kubernetes后你不会遇到任何问题 .
A Small example of a traffic flow
例如,对于SIP UDP流量,您可以准备如下配置:
客户端 - > Nginx Ingress(UDP) - > OpenSIPS负载均衡器(UDP) - > SIP服务器(UDP) .
因此,客户端将数据包发送到Ingress,它会将其转发给OpenSIPS,OpenSIPS将管理SIP群集的状态并将客户端数据包发送到正确的SIP服务器 .
仅适用于 Cloud 的解决方案
此外,如果您将在 Cloud 上运行,则可以使用
ServiceType
LoadBalancer作为Service,并通过 Cloud 平台提供的外部负载均衡器直接获取应用程序的TCP和UDP流量 .关于SCTP
那么 SCTP ,不幸的是,没有,那是 not supported yet ,但你可以追踪进展here .
关于k8s中的SCTP支持:它最近已合并为k8s作为alpha功能 . 支持SCTP作为Service,NetworkPolicy和Pod定义中的新协议类型 . 在这里查看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可以 Build 多宿主SCTP关联 . 还需要一个增强的服务/ endpoints / DNS控制器来以正确的方式处理这些多个IP地址 .
SCTP作为type = LoadBalancer Services协议的支持取决于负载均衡器实现,这不是k8s问题
为了在NetworkPolicy中使用SCTP,需要一个支持NetworkPolicies中的SCTP的CNI插件