首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K8s游戏服务器:通过服务/入侵动态转发用于Pods的TCP和UDP

K8s游戏服务器:通过服务/入侵动态转发用于Pods的TCP和UDP
EN

Stack Overflow用户
提问于 2020-11-10 14:32:09
回答 2查看 1.1K关注 0票数 2

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

我可以使用Kubernetes API动态地为每个单独的游戏服务器创建名称空间、Pods (由状态集控制)、PVCs、服务和插件。每个游戏服务器都位于自己的名称空间中,完全由其他服务器分开。我保证服务器在引擎盖下运行,Pod也在运行和活动,日志很好。

当我需要将状态集服务分配给一个能够通过使用命名空间DNS来持续响应TCP/UDP通信量的侵入时,我就被锁定了,它将路由到集群的(在Minikube中;为了生产应该使用ALB/北草坪会议大楼,AFAIK)。

不知何故,我需要一种将game-xxxxx.myapp.com导入到特定game-xxxxx名称空间的荚的方法。它们是否会附加端口并不重要。

为此,我只需调用myapp.com的DNS解决程序,并在需要时添加或删除A Records即可。这似乎没问题,但我发现可以根据现有的服务使用ExternalDNS (https://github.com/bitnami/charts/tree/master/bitnami/external-dns)自动完成这一任务。

我尝试过的,还没有运气:

尼克斯

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

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

特雷菲克

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

阿戈内斯

Agones应该在游戏服务器上工作,并且它支持服务端口的TCPUDP协议,但同样,这方面没有任何进展。

我在下面贴出了关于事情应该如何运作的图表。我还有下面的YAML文件,它将创建状态集、PVC和服务。您可以清楚地看到,我尝试过ExternalName设置,因此也许我可以将Minikube设置为该名称,并且能够再次连接,但没有运气:

蒸汽专用服务器工作流

代码语言:javascript
复制
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"]

编辑:凹凸

EN

回答 2

Stack Overflow用户

发布于 2020-11-27 10:13:04

A副词! 如果使用/提到入口资源,它指的是HTTP/HTTPS流量。

您发布的图表看起来是使用Service类型LoadBalancer的好机会。

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

免责声明 此解决方案只支持一个在时间协议上, TCPUDP. 要使这两个协议位于同一个端口上,您需要回过头来使用Service类型的NodePort (它在从3000032767的节点上分配端口)。 通过以下链接,您可以了解有关创建使用NodePort类型服务的云不可知论的NodePort的更多信息:

在此设置中,不需要Ingress控制器(如TraefikNginx ),因为它们只是在ClientPod之间的一个额外步骤。

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

代码语言:javascript
复制
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-部署”
    • 创建一个类型为“service of LoadBalancer ”的“-X-”,指向“游戏-X-部署”。
    • DNS 创建一个记录,将“-X.com”指向在前一步中创建的的IP。

每个LoadBalancer都有自己的IP和与其关联的DNS名称,如下所示:

  • awesome-game.com与IP的123.123.123.123和端口连接到28015/TCP
  • magnificent-game.com与IP的234.234.234.234和端口连接到28015/TCP

我认为这个创建专用蒸汽服务器的媒体指南可以证明是有用的:

追加资源:

票数 1
EN

Stack Overflow用户

发布于 2020-11-30 09:48:55

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

现在,问题仍然存在于必须创建一个部署、等待Pod被分配、并确保吊舱与该节点连接在一起,或者在节点被抽干时,以某种方式保持同一个节点IP (一个非短暂的IP),只要部署不被删除,这个节点IP就会一直与吊舱保持在一起。通过这种方式,当我需要一个现有的部署来部署豆荚时,我应该确保标记节点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64770916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档