Routes Minecraft client connections to backend servers based upon the requested server address.
-api-binding host:port
The host:port bound for servicing API requests (env API_BINDING)
-connection-rate-limit int
Max number of connections to allow per second (env CONNECTION_RATE_LIMIT) (default 1)
-cpu-profile string
Enables CPU profiling and writes to given path (env CPU_PROFILE)
-debug
Enable debug logs (env DEBUG)
-in-kube-cluster
Use in-cluster kubernetes config (env IN_KUBE_CLUSTER)
-kube-config string
The path to a kubernetes configuration file (env KUBE_CONFIG)
-kube-discovery
Enables discovery of annotated kubernetes services (env KUBE_DISCOVERY)
-mapping string
Comma-separated mappings of externalHostname=host:port (env MAPPING)
-metrics-backend string
Backend to use for metrics exposure/publishing: discard,expvar,influxdb (env METRICS_BACKEND) (default "discard")
-metrics-backend-config-influxdb-addr string
(env METRICS_BACKEND_CONFIG_INFLUXDB_ADDR)
-metrics-backend-config-influxdb-database string
(env METRICS_BACKEND_CONFIG_INFLUXDB_DATABASE)
-metrics-backend-config-influxdb-interval duration
(env METRICS_BACKEND_CONFIG_INFLUXDB_INTERVAL) (default 1m0s)
-metrics-backend-config-influxdb-password string
(env METRICS_BACKEND_CONFIG_INFLUXDB_PASSWORD)
-metrics-backend-config-influxdb-retention-policy string
(env METRICS_BACKEND_CONFIG_INFLUXDB_RETENTION_POLICY)
-metrics-backend-config-influxdb-tags value
any extra tags to be included with all reported metrics (env METRICS_BACKEND_CONFIG_INFLUXDB_TAGS)
-metrics-backend-config-influxdb-username string
(env METRICS_BACKEND_CONFIG_INFLUXDB_USERNAME)
-port port
The port bound to listen for Minecraft client connections (env PORT) (default 25565)
-version
Output version and exit (env VERSION)
-
GET /routes
(withAccept: application/json
)Retrieves the currently configured routes
-
POST /routes
(withContent-Type: application/json
)Registers a route given a JSON body structured like:
{ "serverAddress": "CLIENT REQUESTED SERVER ADDRESS", "backend": "HOST:PORT" }
-
POST /defaultRoute
(withContent-Type: application/json
)Registers a default route to the given backend. JSON body is structured as:
{ "backend": "HOST:PORT" }
-
DELETE /routes/{serverAddress}
Deletes an existing route for the given
serverAddress
The multi-architecture image published at Docker Hub supports amd64, arm64, and arm32v6 (i.e. RaspberryPi).
The following diagram shows how the example docker-compose.yml
configures two Minecraft server services named vanilla
and forge
, which also become the internal
network aliases. Notice those services don't need their ports exposed since the internal
networking allows for the inter-container access.
The router
service is only one of the services that needs to exposed on the external
network. The --mapping
declares how the hostname users will enter into their Minecraft client
will map to the internal services.
To test out this example, I added these two entries to my "hosts" file:
127.0.0.1 vanilla.example.com
127.0.0.1 forge.example.com
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.mc-router.itzg.me/defaultServer
: The service's clusterIP and target port are used as the default if no otherexternalServiceName
annotations applies.
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"
- 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 themc-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
- This deployment assumes two persistent volume claims:
mc-stable
andmc-snapshot
- I extended the allowed node port range by adding
--service-node-port-range=25000-32767
to/etc/kubernetes/manifests/kube-apiserver.yaml
docker run -it --rm \
-v gopkg:/go/pkg \
-v ${PWD}:/build -w /build \
golang:1.12 \
go build ./cmd/mc-router
docker run -it --rm \
-v ${PWD}:/build -w /build \
-v /var/run/docker.sock:/var/run/docker.sock \
goreleaser/goreleaser \
release --snapshot --rm-dist