# 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)