【问题标题】:Is there some way to handle SIP, RTP, DIAMETER, M3UA traffic in Kubernetes?有没有办法在 Kubernetes 中处理 SIP、RTP、DIAMETER、M3UA 流量?
【发布时间】:2018-09-07 15:05:29
【问题描述】:

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

但是,还有其他协议,例如 SIP(​​可以通过 TCP 或 UDP)、RTP(通过 UDP)和核心电信网络信令协议,例如 DIAMETER(通过 TCP 或 SCTP)或类似的 M3UA(通过 SCTP) .有没有办法在 Kubernetes minion 中运行的应用程序中处理此类流量?

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

此外,目前确实没有已知的 Ingress API 实现(开源或闭源)可以允许 Kubernetes 集群处理上述类型的流量?

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

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    此外,目前确实没有已知的 Ingress API 实现(开源或闭源)可以允许 Kubernetes 集群处理上述类型的流量?

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

    (这里有SIPs (Session Initiation Protocol)like OpenSIPS

    Kubernetes 部署

    在 Kubernetes 术语中,单个语音网关实例等同于单个 pod,其中包含 SIP Orchestrator 容器和 Media Relay 容器。
    语音网关 pod 安装到 Kubernetes 集群中,该集群前面有一个外部 SIP 负载均衡器。
    通过 Kubernetes,可以安排语音网关 pod 在虚拟机集群上运行。该框架还监控 pod,并且可以配置为在检测到故障时自动重启语音网关 pod。

    注意:由于目前不支持 Kubernetes 中的 SIP 负载均衡器自动扩展和自动发现新 Pod,因此使用外部 SIP

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

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

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

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


    为 Kubernetes 部署的网络配置在 this answer 中得到了最好的说明,它描述了 pod/node-communication 中涉及的元素:

    【讨论】:

    • 非常相关的参考资料,非常感谢您指出 IBM 研究。对外部负载均衡器的依赖有点令人失望,但仍然是一个解决方案。不过想知道,由于 Kubernetes 为每个 pod 分配了唯一的 10.x.x.x 类 IP 地址,使用主机网络方式,所有 pod 共享相同的主机 IP,并且应用程序(pod 内部)被配置为侦听不同的端口?如果是,那肯定会使配置变得相当复杂。
    • @icarus74 网络配置见我的另一个回答:stackoverflow.com/a/48104579/6309
    • 绝对精彩的答案。需要进行更详细的第二遍,以确保我理解了所有内容并且没有遗漏任何内容。假设答案不是 kube-aws 特定的而是 K8S 的通用答案是否正确?
    • @icarus74 是的,通用于 K8S,基于 Mark Betz 的文章和工作。
    • 太棒了。如果您可以使用指向其他 SO 答案的链接更新您的答案,以涵盖网络方面,那将是一个很好的答案,我很乐意接受。
    【解决方案2】:

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

    解决方案

    无处不在的解决方案

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

    这是一个example 用于 Nginx Ingress 控制器TCP的那种配置:

    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 入口 (UDP) -> OpenSIPS 负载均衡器 (UDP) -> Sip 服务器 (UDP)。

    因此,客户端会将数据包发送到 Ingress,然后将其转发到 OpenSIPS,OpenSIPS 将管理 SIP 集群的状态并将客户端数据包发送到适当的 SIP 服务器。

    仅适用于云的解决方案

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

    关于SCTP

    SCTP 怎么样,不幸的是,不,尚不支持,但您可以跟踪进度here

    【讨论】:

      【解决方案3】:

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

      存在一些限制:

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

      【讨论】:

        猜你喜欢
        • 2022-12-20
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        • 2020-09-07
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多