controller

command module
v0.0.0-...-764ac46 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 18, 2022 License: MIT Imports: 14 Imported by: 0

README

Note: Controller is obsolete

Use this kubernetes-sigs/external-dns fork for GameServers


Contributors Forks Stargazers Issues


Agones Minecraft DNS Controller

Custom Kubernetes controller for automating external DNS on Minecraft GameServers
Explore the docs »

View Example · Report Bug · Request Feature

Table of Contents

  1. About The Project
  2. Getting Started
  3. Usage
  4. Roadmap
  5. Contributing
  6. License
  7. Acknowledgements
  8. Author

About The Project

Custom Kubernetes controller for automating external DNS records for Agones Minecraft GameServers using third-party DNS providers

Built With

Getting Started

Prerequisites

You need a running GKE cluster running with Agones resources and controllers installed

  • GKE
gcloud container clusters create minecraft --cluster-version=1.18 \
  --tags=mc \
  --scopes=gke-default,"https://www.googleapis.com/auth/ndev.clouddns.readwrite" \ # GKE scope needed for Cloud DNS
  --node-labels=agones-mc/<DOMAIN_NAME> \ # Replace with the domain for the zone that the controller will manage
  --num-nodes=2 \
  --no-enable-autoupgrade \
  --machine-type=n2-standard-4
gcloud config set container/cluster minecraft
gcloud container clusters get-credentials minecraft
gcloud compute firewall-rules create mc-server-firewall \
  --allow tcp:7000-8000 \
  --target-tags mc \
  --description "Firewall rule to allow mc server tcp traffic"
  • Agones
kubectl create namespace agones-system
kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.13.0/install/yaml/install.yaml

Installation

kubectl apply

apiVersion: v1
kind: ServiceAccount
metadata:
  name: agones-mc-dns
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: agones-mc-dns
rules:
  - apiGroups: ['agones.dev']
    resources: ['gameservers']
    verbs: ['get', 'watch', 'list', 'update']
  - apiGroups: ['']
    resources: ['nodes']
    verbs: ['get', 'watch', 'list', 'update']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: agones-mc-dns-viewer
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: agones-mc-dns
subjects:
  - kind: ServiceAccount
    name: agones-mc-dns
    namespace: default
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: agones-mc-dns-controller
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: agones-mc-dns-controller
  template:
    metadata:
      labels:
        app: agones-mc-dns-controller
    spec:
      serviceAccountName: agones-mc-dns
      containers:
        - name: agones-mc-dns-controller
          image: saulmaldonado/agones-mc-dns-controller
          args:
            - --zone=<MANAGED_ZONE> # Replace with name of DNS managed zone
          imagePullPolicy: Always
Or run locally out of cluster
 docker run -it --rm --name agones-mc-dns-controller \
 -v $HOME/.kube/config:/root/.kube/config \ # Passes kubeconfig to container
 -v $HOME/.config/gcloud/:/root/.config/gcloud/ \ # Passes gcloud credentials to container
 -e HOME=/root \ # Needed for google oauth authentication
 saulmaldonado/agones-mc-dns-controller \
 --gcp-project=$(GCP_PROJECT) \ # Replace with GCP project ID
 --zone=$(MANAGED_ZONE) # Replace with Managed DNS zone

Usage

This controller takes advantage of dynamic host port allocation that Agones provisions for GameServers. Instead of creating external DNS records for Kubernetes services and ingresses, DNS A and SRV are created to point to GameServer host nodes and the their GameServer ports.

Nodes

To provision an A record for Nodes, they need to have agones-mc/domain label that contains the domain of the zone that the controller is managing. This will indicate to the controller that the Node needs an A record.

Labeling existing Nodes can be done using kubectl:

kubectl label node/<NODE_NAME> agones-mc/domain=<DOMAIN>

All Nodes that you intend to host GameServers one should have this label.

A new annotation with agones-mc/externalDNS will contain the new A record that points to the Node IP.

Example:

Node Name domain label Resulting A Record
gke-minecraft-default-pool-79cd0803-42d7 example.com gke-minecraft-default-pool-79cd0803-42d7.example.com

GameServer

To provision an SRV record for GameServers, they need to contain an agones-mc/domain annotation that contains the domain for the controller's Managed Zone. This will indicate to the controller that the GameServer needs a SRV record.

GameServer Pod template example
template:
  metadata:
    annotations:
      agones-mc/domain: <DOMAIN_NAME> # Domain name of the managed zone
      # agones-mc/externalDNS: <GAMESERVER_NAME>.<DOMAIN_NAME> # Will be added by the controller
  spec:
    containers:
      - name: mc-server
        image: itzg/minecraft-server # Minecraft server image
        imagePullPolicy: Always
        env: # Full list of ENV variables at https://github.com/itzg/docker-minecraft-server
          - name: EULA
            value: 'TRUE'

      - name: mc-monitor
        image: saulmaldonado/agones-mc-monitor # Agones monitor sidecar
        imagePullPolicy: Always

Once the pod has been created, a new SRV will be generated with the format _minecraft._tcp.<GAMESERVER_NAME>.<DOMAIN>. that points to the A record of the host Node 0 0 <PORT> <HOST_A_RECORD>.

A new annotation agones-mc/externalDNS will then be added to the GameServer containing the URL from which players can connect to.

GameServer Name Port domain annotation Node A Record Resulting SRV Record Minecraft Server URL
mc-server-cfwd7 7908 agones-mc/domain: example.com gke-minecraft-default-pool-79cd0803-42d7.example.com. _minecraft._tcp.mc-server-cfwd7.example.com 0 0 7908 gke-minecraft-default-pool-79cd0803-42d7.example.com. mc-server-cfwd7.example.com
Full GameServer specification example
Full Fleet specification example

Run Locally with Docker

 docker run -it --rm --name agones-mc-dns-controller \
 -v $HOME/.kube/config:/root/.kube/config \ # Passes kubeconfig to container
 -v $HOME/.config/gcloud/:/root/.config/gcloud/ \ # Passes gcloud credentials to container
 -e HOME=/root \ # Needed for google oauth authentication
 saulmaldonado/agones-mc-dns-controller \
 --gcp-project=$(GCP_PROJECT) \ # Replace with GCP project ID
 --zone=$(MANAGED_ZONE) # Replace with Managed DNS zone

Flags:

  --gcp-project string
        GCP project id
  --kubeconfig string
        Paths to a kubeconfig. Only required if out-of-cluster.
  --zone string
        DNS zone that the controller will manage

Roadmap

See the open issues for a list of proposed features (and known issues).

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Clone the Project
  3. Create your Feature or Fix Branch (git checkout -b (feat|fix)/AmazingFeatureOrFix)
  4. Commit your Changes (git commit -m 'Add some AmazingFeatureOrFix')
  5. Push to the Branch (git push origin (feat|fix)/AmazingFeature)
  6. Open a Pull Request

Build from source

  1. Clone the repo

    git clone https://github.com/saulmaldonado/agones-minecraft.git
    
  2. Build

    make go-build
    

Build from Dockerfile

  1. Clone the repo

    git clone https://github.com/saulmaldonado/agones-minecraft.git
    
  2. Build

    docker build -t <hub-user>/agones-mc-dns-controller:latest ./controller
    
  3. Push to Docker repo

    docker push <hub-user>/agones-mc-dns-controller:latest
    

License

Distributed under the MIT License. See LICENSE for more information.

Acknowledgements

Author

Saul Maldonado

Show your support

Give a ⭐️ if this project helped you!

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
internal
dns

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL