1

所以在过去的几天里,我试图找到一种动态附加入口名称(如game-1.myapp.com)的方法,以解决 Kubernetes 上 Steam 专用服务器的 TCP 和 UDP 问题。我附上了下图说明我是如何计划的,但是我遇到了一些问题。

我可以使用 Kubernetes API 为每个单独的游戏服务器动态创建命名空间、Pod(由 Stateful Sets 控制)、PVC、服务和入口。每个游戏服务器都位于自己的命名空间中,彼此完全分开。我保证服务器在后台运行,Pod 也在运行且处于活动状态,日志很好。

当我需要将 Stateful Set 服务分配给能够通过使用命名空间 DNS 连续回复 TCP/UDP 流量的 Ingress 时,我被锁定了,该 DNS 路由到集群的 Ingress Controller(在 Minikube 中;对于生产,ALB/NLB应该使用,AFAIK)。

不知何故,我需要一种方法来进入game-xxxxx.myapp.com特定game-xxxxx命名空间的 pod。他们是否有附加端口并不重要。

为此,我可以简单地通过 API 调用 DNS 求解器,myapp.com并在需要时添加或删除A Records。这似乎没问题,但我发现我可以使用 ExternalDNS ( https://github.com/bitnami/charts/tree/master/bitnami/external-dns ) 根据现有服务自动为我执行此操作。

我已经尝试过,还没有运气:

NGINX

设置 NGINX,但我必须为每个服务定义公开的端口。根据他们的文档(https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services),每次修改 ConfigMap 并重新创建 NGINX pod 都是过分的,因为可能有很多变化,这似乎不可行。另外,我非常怀疑 NGINX 在重负载下会变得轻而易举,我发现它更适合 Web 服务器而不是游戏服务器。

此外,我可能需要一种方法来确保我可以拥有重复的端口。例如,我不能在 NGINX 中将相同的28015端口分配给许多其他服务器,即使它们位于不同的命名空间中。如果我使用 Agones ( https://github.com/googleforgames/agones/blob/release-1.9.0/examples/gameserver.yaml ) 分配随机端口,在某些时候我可能会用完它们来分配。

特拉菲克

我曾尝试使用 Traefik,但没有运气。IngressRoute 允许 TCP/UDP 从 Router 路由到 EntryPoint,然后将其路由到分配的服务。我不确定这是如何工作的,我尝试为服务设置注释并定义入口点,但它仍然拒绝工作:https ://doc.traefik.io/traefik/routing/providers/kubernetes-crd/#kind- ingressroutetcp

过去的

Agones 应该适用于游戏服务器,并且它支持TCPUDP服务端口协议,但同样没有运气。

流动

我已经在图表下方发布了关于事情应该如何工作的信息。我还有以下 YAML 文件,它将创建有状态集、PVC 和服务。您可以清楚地看到我尝试了 ExternalName 设置,所以也许我可以将 Minikube IP 设置为该名称并能够连接,但再次失败:

Steam 专用服务器工作流程

apiVersion: v1
kind: Service
metadata:
  name: rust-service
  labels:
    game: rust
spec:
  # type: ExternalName
  # externalName: rust-1.rust.coal.app
  # clusterIP: ""
  selector:
    game: rust
  ports:
  - name: rust-server-tcp
    protocol: TCP
    port: 28015
    targetPort: 28015
  - name: rust-server-udp
    protocol: UDP
    port: 28015
    targetPort: 28015
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rust-server
spec:
  selector:
    matchLabels:
      game: rust
  replicas: 1
  serviceName: rust-service
  template:
    metadata:
      name: rust-server
      labels:
        game: rust
    spec:
      containers:
      - name: rust
        image: didstopia/rust-server:latest
        ports:
          - name: rust-server-tcp
            protocol: TCP
            containerPort: 28015
          - name: rust-server-udp
            protocol: UDP
            containerPort: 28015
  volumeClaimTemplates:
    - metadata:
        name: local-disk
      spec:
        resources:
          requests:
            storage: "10Gi"
        accessModes: ["ReadWriteOnce"]

编辑:凹凸

4

2 回答 2

1

旁注!

如果使用/提及Ingress资源,则它指的是HTTP/HTTPS流量。


您发布的图表看起来像是使用Servicetype的好机会LoadBalancer

服务类型LoadBalancer用于处理外部TCP/UDP流量(第 4 层)。

免责声明!

此解决方案一次仅支持一个协议, TCPUDP

要将两个协议都放在同一个端口上,您需要回退到Service类型NodePort(它将节点上的端口从30000to分配32767)。

NodePort您可以通过以下链接阅读有关创建使用服务类型的与云无关的 LoadBalancer 的更多信息:

在此设置中,需要或不需要Ingress控制器,因为它们只是您和.TraefikNginxClientPod

LoadBalancer你的定义中已经有了这样的例子YAML(我稍微修改了它):

apiVersion: v1
kind: Service
metadata:
  name: rust-service
  labels:
    game: rust
spec:
  type: LoadBalancer # <-- THE CHANGE
  selector:
    game: rust
  ports:
  - name: rust-server-tcp
    protocol: TCP
    port: 28015
    targetPort: 28015

如果您打算使用AWS它,EKS请参阅它的文档:

可能的设置示例(步骤):

  • 对于每个“游戏-X”:
    • 创建一个namespace“游戏-X-命名空间”
    • 创建deployment“游戏-X-部署”
    • 创建一个指向“game-X-deployment”的“game-X-”service类型LoadBalancer
    • 创建一条DNS记录,将“game-X.com”指向LoadBalancer上一步创建的 IP。

每个LoadBalancer都有自己的 IP 和DNS与之关联的名称,例如:

  • awesome-game.com123.123.123.123带有要连接的 IP和端口28015/TCP
  • magnificent-game.com234.234.234.234带有要连接的 IP和端口28015/TCP

我认为这个创建专用 Steam 服务器的中型指南可能会很有用:


其他资源:

于 2020-11-27T10:13:04.983 回答
1

所以正如之前的回复所说,入口是针对网络流量的。我没有使用 Ingresses 实现工作设置,但我已经设法使用该服务NodePort并确保使用将自定义子域名绑定到正确 IP 的外部 DNS 创建 DNS 记录:https ://github.com /kubernetes-sigs/external-dns

现在,问题出现在必须创建部署的想法之后,等待 Pod 被分配,并确保 pod 与该节点保持一致,或者在节点耗尽的情况下,以某种方式保持相同的节点 IP(a非临时性的),只要部署不被删除,它将继续留在 pod 中。这样,当我需要现有的 Deployment 来部署 Pod 时,我应该确保标记节点。

于 2020-11-30T09:48:55.440 回答