所以在过去的几天里,我试图找到一种动态附加入口名称(如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 设置为该名称并能够连接,但再次失败:
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"]
编辑:凹凸