如何在 Kubernetes 中部署 TURN 服务器(coturn)

How to deploy TURN server(coturn) inside Kubernetes

我正在尝试在 Kubernetes 集群中部署 coturn 服务器。

根据startup manual,似乎每个服务器都必须有自己的外部IP地址。但是我找不到将外部 IP 地址绑定到每个 coturn pods.

的方法

我该如何解决这个问题?或者我应该将服务器放在 Kubernetes 集群之外吗?

虽然您不能将静态 IP 直接分配给 pod,但您可以创建一个服务来公开 pods 并允许您通过外部 IP 地址将流量路由到它们。

例如,您可以通过 运行 将创建服务的以下命令公开部署(此命令假定您的应用程序正在侦听端口 8080):

kubectl expose deployment DEPLOYMENT_NAME --type=LoadBalancer --port 80 --target-port 8080

检索生成的外部 IP 地址运行:

kubectl get services

有一些关于此的更多信息here

您还可以通过创建入口资源来生成外部 IP,详见 here

最简单的方法是使用带有 hostNetwork: true 的 DaemonSet。这样,您将为每个节点服务器提供一个 coturn 服务器,可以直接访问外部接口。

为此,您应该使用合适的 CNI 插件,例如 multus:read this.

简而言之: Multus 在 k8s 外部接口之上创建一个桥接器,然后它将这个桥接器附加到您的容器中,此外,它会附加一个使用 ClusterIP 进行集群间通信的第二个接口,您还可以使用默认的 CoreDNS 服务进行 DNS 查询在 pods.

之间

您创建一个 NetworkAttachmentDefinition 来配置 multus,然后提供如下配置:

  config: '{
  "cniVersion": "0.3.0",
  "type": "macvlan",
  "master": "eth0",
  "mode": "bridge",
  "ipam": {
    "type": "host-local",
    "subnet": "192.168.1.0/24",
    "rangeStart": "192.168.1.200",
    "rangeEnd": "192.168.1.216",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ],
    "gateway": "192.168.1.1"
  }
}'

Multus 将根据预先配置的范围从池中动态分配一个 IP 地址给您的 coturn pod。如果由于某种原因包含“coturn server”容器的 pod 将被杀死(假设您已经配置了适当的 liveliness Probes),它将立即使用 SAME 桥接重新安排到另一个节点外部接口,具有相同的网络设置。

使用“hostNetwork: true”只是个坏主意,它会暴露每个 k8s 节点上的端口,这会使网络变得非常复杂,而且你将无法使用 ClusterIP 与 coturn 服务通信,如果任何其他服务需要它或使用 k8s DNS 服务。