Routes Minecraft client connections to backend servers based upon the requested server address
Go to file
2018-05-27 15:36:01 -05:00
.circleci ci: abstract glide into makefile 2018-05-26 12:42:41 -05:00
cmd/mc-router Switch golang flag's to allow for glog argument access 2018-05-27 15:36:01 -05:00
docs docs: document auto service discovery example 2018-05-26 14:03:04 -05:00
mcproto Initial commit 2018-05-07 22:16:01 -05:00
server Use --in-kube-cluster to indicate in-cluster mode 2018-05-26 13:10:45 -05:00
.gitignore Initial commit 2018-05-07 22:16:01 -05:00
.goreleaser.yml docs: document auto service discovery example 2018-05-26 14:03:04 -05:00
Dockerfile ci: avoid /tmp creation in Dockerfile 2018-05-26 13:17:21 -05:00
glide.lock Switch golang flag's to allow for glog argument access 2018-05-27 15:36:01 -05:00
glide.yaml Switch golang flag's to allow for glog argument access 2018-05-27 15:36:01 -05:00
LICENSE.txt Initial commit 2018-05-07 22:16:01 -05:00
Makefile ci: abstract glide into makefile 2018-05-26 12:42:41 -05:00
README.md docs: document more auto service discovery 2018-05-27 14:53:22 -05:00

Routes Minecraft client connections to backend servers based upon the requested server address.

Usage

Flags:
  --help                     Show context-sensitive help (also try --help-long
                             and --help-man).
  --port=25565               The port bound to listen for Minecraft client
                             connections
  --api-binding=API-BINDING  The host:port bound for servicing API requests
  --mapping=MAPPING ...      Mapping of external hostname to internal server
                             host:port

REST API

  • GET /routes Retrieves the currently configured routes
  • POST /routes Registers a route given a JSON body structured like:
{
  "serverAddress": "CLIENT REQUESTED SERVER ADDRESS",
  "backend": "HOST:PORT"
}
  • DELETE /routes/{serverAddress} Deletes an existing route for the given serverAddress

Using kubernetes service auto-discovery

When running mc-router as a kubernetes pod and you pass the --in-kube-cluster command-line argument, then it will automatically watch for any services annotated with mc-router.itzg.me/externalServerName. The value of the annotation will be registered as the external hostname Minecraft clients would used to connect to the routed service. The service's clusterIP and target port are used as the routed backend.

For example, start mc-router's container spec with

image: itzg/mc-router
name: mc-router
args: ["--in-kube-cluster"]

and configure the backend minecraft server's service with the annotation:

apiVersion: v1
kind: Service
metadata:
  name: mc-forge
  annotations:
    "mc-router.itzg.me/externalServerName": "external.host.name"

Example kubernetes deployment

This example deployment

  • Declares an mc-router service that exposes a node port 25565
  • Declares a service account with access to watch and list services
  • Declares --in-kube-cluster in the mc-router container arguments
  • Two "backend" Minecraft servers are declared each with an "mc-router.itzg.me/externalServerName" annotation that declares their external server name
kubectl apply -f https://raw.githubusercontent.com/itzg/mc-router/master/docs/k8s-example-auto.yaml

Notes

  • This deployment assumes two persistent volume claims: mc-stable and mc-snapshot
  • I extended the allowed node port range by adding --service-node-port-range=25000-32767 to /etc/kubernetes/manifests/kube-apiserver.yaml