A couple of weeks ago I came across an awesome GitHub repo called KubeInvaders which is brilliant work of Eugenio Marzo (b|t)
KubeInvaders allows you to play Space Invaders in order to kill pods in Kubernetes and watch new pods be created (this actually might be my favourite github repo of all time).
I demo SQL Server running in Kubernetes a lot so really wanted to get this working in my Azure Kubernetes Service cluster. Here’s how you get this up and running.
Prerequisites
1. A DockerHub repository
2. An Azure Kubernetes Service cluster – I blogged about spinning one up here
3. A HTTPS ingress controller on AKS with a FQDN for the ingress controller IP. I didn’t have to change anything in the instructions in the link but don’t worry if the final test doesn’t work…it didn’t work for me either.
Building the image
First, clone the repo:-
git clone https://github.com/lucky-sideburn/KubeInvaders.git
Switch to the AKS branch:-
cd KubeInvaders git checkout aks
Build the image:-
docker build -t kubeinvaders .
Once the image has built, tag it with a public repository name and then push:-
docker tag kubeinvaders dbafromthecold/kubeinvaders:aks docker push
Deploying to AKS
Now that the image is in a public repository, we can deploy to Kubernetes. Eugenio has provided all the necessary yaml files, so it’s really easy! Only a couple of changes are needed.
First one is the the kubeinvaders-deployment.yaml file, the image name needs to be updated:-
spec: containers: - image: dbafromthecold/kubeinvaders:aks
And the host in the kubeinvaders-ingress.yaml file needs to be set to the FQDN of your ingress (set when following the MS docs): –
spec: tls: - hosts: - apruski-aks-ingress.eastus.cloudapp.azure.com rules: - host: apruski-aks-ingress.eastus.cloudapp.azure.com
Cool. So now each of the files can be deployed to your cluster: –
kubectl apply -f kubernetes/kubeinvaders-namespace.yml kubectl apply -f kubernetes/kubeinvaders-deployment.yml -n kubeinvaders kubectl expose deployment kubeinvaders --type=NodePort --name=kubeinvaders -n kubeinvaders --port 8080 kubectl apply -f kubernetes/kubeinvaders-ingress.yml -n kubeinvaders kubectl create sa kubeinvaders -n foobar kubectl apply -f kubernetes/kubeinvaders-role.yml kubectl apply -f kubernetes/kubeinvaders-rolebinding.yml
Finally, set some environment variables: –
TARGET_NAMESPACE='foobar' TOKEN=`kubectl describe secret $(kubectl get secret -n foobar | grep 'kubeinvaders-token' | awk '{ print $1}') -n foobar | grep 'token:' | awk '{ print $2}'` ROUTE_HOST=apruski-aks-ingress.eastus.cloudapp.azure.com kubectl set env deployment/kubeinvaders TOKEN=$TOKEN -n kubeinvaders kubectl set env deployment/kubeinvaders NAMESPACE=$TARGET_NAMESPACE -n kubeinvaders kubectl set env deployment/k/ubeinvaders ROUTE_HOST=$ROUTE_HOST -n kubeinvaders
Now navigate to the FQDN of the ingress in a browser and you should see…
Testing the game!
By default KubeInvaders points to a namespace called foobar so we need to create it: –
kubectl create namespace foobar
And now create a deployment running 10 SQL Server pods within the foobar namespace: –
kubectl run sqlserver --image=mcr.microsoft.com/mssql/server:2019-CTP3.1-ubuntu --replicas=10 -n foobar
Now the game will have 10 invaders which represent the pods!
Let’s play! Watch the pods and kill the invaders!
kubectl get pods -n foobar --watch
How awesome is that! You can even hit a to switch to automatic mode!
What a cool way to demo pod regeneration in Kubernetes.
Thanks for reading!