Kuvel

用于在 Kubernetes 集群中运行的 Minecraft 服务器的服务器发现 Velocity 插件。

资源图片
# Kuvel ## 概述 Kuvel 是一个 Velocity 的服务发现插件。它将自动发现 Minecraft 服务器并 在 Velocity 中注册/取消注册它们。 ## 特性 * 监控 Kubernetes 集群中的 Minecraft Pod 并自动使用 Velocity 注册/取消注册它们 * 创建一个负载均衡器服务器并将尝试加入的玩家分发到链接的服务器。 * 使用 Redis 在多个 Velocity 服务器之间同步服务器名称 ## 安装 该插件可以从 [Releases](https://github.com/AzisabaNetwork/Kuvel/releases/latest) 下载。 下载 `Kuvel.jar` 并 将其安装到 Velocity 插件目录中。 此外,您还必须填写配置文件。 ```yml # 用于服务器发现的 Kubernetes 命名空间。 namespace: "" # 在使用多个 Velocity 的负载均衡环境中,使用 Redis 进行服务器名称同步是必需的。 redis: group-name: "production" connection: hostname: "redis" port: 6379 # username 是可选的。 如果您启用了身份验证,您可以在此处使用它。 否则,将其留空或 null。 username: "default" # password 是可选的。 如果您启用了身份验证,您可以在此处使用它。 否则,将其留空或 null。 password: "password" ``` 或者,您可以使用环境变量来配置 Kuvel。环境变量将覆盖 config.yml,并且是 `KUVEL_NAMESPACE`, `KUVEL_REDIS_GROUPNAME`, `KUVEL_REDIS_CONNECTION_HOSTNAME`, `KUVEL_REDIS_CONNECTION_PORT`, `KUVEL_REDIS_CONNECTION_USERNAME` 和 `KUVEL_REDIS_CONNECTION_PASSWORD`。 为了让 Kuvel 监控服务器,您必须请求 Kubernetes 允许 Velocity Pods 发现 Minecraft 服务器。对于 Velocity Pods,请允许 Pod 和 ReplicaSet 的 get/list/watch。 ```yml apiVersion: v1 kind: ServiceAccount metadata: name: velocity-account namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: velocity-clusterrolebiding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view subjects: - kind: ServiceAccount name: velocity-account namespace: default ``` ```yml # 将 ServiceAccount 应用到 Velocity Pod apiVersion: apps/v1 kind: ... # ... spec: serviceAccountName: velocity-account # ... ``` ## 在 Minecraft 服务器上启用服务发现 为了告知 Kuvel 该 Pod 是一个 Minecraft 服务器,请使用 Kubernetes 的 Label 功能。 | Label 名称 | 值 | |:-------------------------------------------:|:---:| | `kuvel.azisaba.net/enable-server-discovery` |true / false| | `kuvel.azisaba.net/preferred-server-name` |您希望在 Velocity 中注册的服务器名称| | `kuvel.azisaba.net/initial-server` |true / false| ### Pod ```yml apiVersion: v1 kind: Pod metadata: name: test-server labels: kuvel.azisaba.net/enable-server-discovery: "true" # Kuvel 检测 Minecraft 服务器所需的。 kuvel.azisaba.net/preferred-server-name: "test-server" # Kuvel 命名服务器所需的。 # kuvel.azisaba.net/initial-server: "true" # 如果您想将此服务器设置为初始服务器,请取消注释此行。 spec: containers: - name: test-server image: itzg/minecraft-server:java8 ports: - containerPort: 25565 ``` ### Deployment ```yml apiVersion: apps/v1 kind: Deployment metadata: name: test-server-deployment spec: replicas: 2 selector: matchLabels: app: test-server-deployment template: metadata: labels: app: test-server-deployment kuvel.azisaba.net/enable-server-discovery: "true" # Kuvel 检测 Minecraft 服务器所需的。 kuvel.azisaba.net/preferred-server-name: "test-server" # Kuvel 命名服务器所需的。 # kuvel.azisaba.net/initial-server: "true" # 如果您想将此服务器设置为初始服务器,请取消注释此行。 spec: containers: - name: test-server image: itzg/minecraft-server:java8 ports: - containerPort: 25565 ``` 在两种情况下,服务器都以名称 `test-server` 注册。 但是,如果有两个或多个服务器具有相同的名称,将在服务器名称之后分配一个数字。 具体而言,如果两个 Pod 具有服务器名称 `test-server`,则一个将是 `test-server`,另一个将是 `test-server-1`。 ## 负载均衡器 在 Lobby 等可并行化服务器上,有时希望尽可能地分散玩家数量。 Kuvel 的负载均衡器功能正是在此发挥作用。 ```yml apiVersion: apps/v1 kind: Deployment metadata: name: lobby-deployment labels: kuvel.azisaba.net/enable-server-discovery: "true" kuvel.azisaba.net/preferred-server-name: "lobby" # kuvel.azisaba.net/initial-server: "true" # 如果您想将此负载均衡器服务器设置为初始服务器,请取消注释此行。 spec: replicas: 3 selector: matchLabels: app: lobby-deployment template: metadata: labels: app: lobby-deployment kuvel.azisaba.net/enable-server-discovery: "true" kuvel.azisaba.net/preferred-server-name: "lobby" # kuvel.azisaba.net/initial-server: "true" # 如果您想将此服务器设置为初始服务器,请取消注释此行。 spec: containers: - name: lobby image: itzg/minecraft-server:java8 ports: - containerPort: 25565 ``` 通过将 Label 应用到 Deployment,可以激活 Kuvel 的负载均衡器功能。 1. 将尝试加入负载均衡器服务器的玩家分发到 ReplicaSet 下的 Pod。 2. 与 Kubernetes ReplicaSet 同步并自动注册/取消注册转发目的地 通过此功能,您可以实现一种机制,当 `/server lobby` 运行时,随机连接到 `lobby-1`、`lobby-2` 或 `lobby-3`。 ## 在多 Velocity 环境中同步服务器名称 在 Kubernetes 集群中,Pod 几乎可以同时创建,这可能导致并行 Velocity 环境中的致命 问题,因为不同的 Velocity 服务器可能具有不同的注册名称。 Kuvel 使用 Redis 进行名称同步来避免此 问题。 Kuvel 使用键,其键名以 `kuvel:` 开头。 在 1.x 中,此功能是可选的,但自 2.0.0 起,此设置已默认启用。 ## 许可 [GNU General Public License v3.0](https://github.com/AzisabaNetwork/Kuvel/blob/main/LICENSE)