Skip to main content

Making any container part of your Kubernetes namespace

Simple Usecase

This example demonstrates how to run a local Ubuntu container instance as part of your Kubernetes namespace.


What you will learn

  • Run a Ubuntu container as part of a Kubernetes namespace
  • Install additional software to that instance
  • Use this container to call Kubernetes services

What you will need

  • Gefyra
  • Getdeck for setting up the development infrastructure (runs on k3d)
  • kubectl
  • Optionally: k3d or any other preferred Kubernetes cluster

Table of contents

  1. TOC

Creating the local development infrastructure

First, we need a Kubernetes-based development infrastructure which contains all required components. Luckily this can be achieved quite easily with the Deck CLI from here.

Just run:

deck get https://github.com/Blueshoe/buzzword-charts.git

and you will get a fresh k3d cluster running locally with all required components installed.

Important: These workloads are intended for demonstration purposes and are not safe for production deployments.

Optional: If you don't want to create the development infrastructure using Getdeck you can also provide it yourself. You need:

  • a Kubernetes cluster
  • some workload, you can choose the example from here and helm install it yourself
  • a node port at 31820:31820/UDP (if running it locally)

Getting the App Running

Optional: In order to observe the workload booting up, check out the Kubernetes dashboard coming with this deck.

Connecting Gefyra to the Kubernetes cluster

The first would be to spin up Gefyra with gefyra up. Please be sure to still have the development cluster active in your current kubectl context.

Important: If you are running a remote Kubernetes cluster you need to specify the --host argument with IP of one of your data plane nodes. The default port is 31820 (--port), it may be different depending on firewalls and the cluster networking.

Running a container in a Kubernetes namespace

In this example, a Ubuntu will become part of the cluster namespace buzzword. Start the container instance like so :

$> gefyra run -i ubuntu -N myubuntu -n buzzword -c "bash -c 'tail -f /dev/null'"
> [INFO] Container image 'ubuntu:latest' started with name 'myubuntu' in Kubernetes namespace 'buzzword'

No worries, the following explains the parameter list:

  • -i ubuntu: run the public Docker image ob Ubuntu from here: https://hub.docker.com/_/ubuntu
  • -N myubuntu: name this local Docker instance myubuntu for further reference
  • -n buzzword: place this Docker instance in the Kubernetes namespace buzzword (where this example plays)
  • -c "bash -c 'tail -f /dev/null'": start this Docker instance and keep it running forever

You can check the output of docker ps to see your container instance running. It should look something like this:

CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                                                            NAMES
660ce52ce4e1 ubuntu "bash -c 'tail -f /d…" 9 seconds ago Up 8 seconds myubunut
e0add97dee80 gefyra-cargo:20220426153151 "/init" 14 seconds ago Up 13 seconds gefyra-cargo
97f9908c55df rancher/k3d-proxy:4.4.8 "/bin/sh -c nginx-pr…" 12 minutes ago Up 12 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:34089->6443/tcp k3d-another-cluster-serverlb
1dccf93fc087 rancher/k3s:v1.20.4-k3s1 "/bin/k3s agent" 12 minutes ago Up 12 minutes 0.0.0.0:31820->31820/udp, :::31820->31820/udp k3d-another-cluster-agent-0
91ef49d000b5 rancher/k3s:v1.20.4-k3s1 "/bin/k3s server --t…" 12 minutes ago Up 12 minutes k3d-another-cluster-server-0

Enter the container and call a service

Now that the container is running, you can enter a bash by running: docker exec -it myubuntu bash

root@6178770cd6b1:/#

In order to call an http service from this Kubernetes namespace a terminal application could be handy. The official Ubuntu Docker image does not provide on of my favorites out of the box, but it is easy to add it.

root@6178770cd6b1:/# apt update && apt install wget -y
[...]

On another terminal (so not in your Ubuntu bash) you can consult kubectl to inspect the services in the buzzword namespace. For this example it tells:

$> kubectl -n buzzword get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-kubernetes-dashboard ClusterIP 10.43.147.1 <none> 8080/TCP 18m
[...]
buzzword-counter ClusterIP 10.43.221.222 <none> 9000/TCP 18m
buzzword-counter-postgresql ClusterIP 10.43.140.176 <none> 5432/TCP 18m
buzzword-counter-postgresql-headless ClusterIP None <none> 5432/TCP 18m
buzzword-counter-rabbitmq ClusterIP 10.43.0.48 <none> 4369/TCP,5672/TCP,25672/TCP,15672/TCP 18m
buzzword-counter-rabbitmq-headless ClusterIP None <none> 4369/TCP,5672/TCP,25672/TCP,15672/TCP 18m

Let's see how this works. From within your running Ubuntu bash, you can now call the buzzword-counter service on port 9000:

root@6178770cd6b1:/# wget -O- buzzword-counter:9000
--2022-04-26 13:41:43-- http://buzzword-counter:9000/
Resolving buzzword-counter (buzzword-counter)... 10.43.221.222
Connecting to buzzword-counter (buzzword-counter)|10.43.221.222|:9000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 565 [text/html]
Saving to: 'STDOUT'

- 0%[ ] 0 --.-KB/s <h1>Buzzwords</h1>
<form action="/increase-counter/" method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="HrGPa8q6GyjVi5ZeHsf4noTFZoOpxA78OmpOEe8cWut8uyeuVxyZ8wPLN0e3QISM">
<table>
<tr>
<th>Buzzword</th>
<th>Count</th>
<th>Increase</th>
<th>Decrease</th>
</tr>

</table>
<div>
<label for="new_buzzword">New Buzzword:</label>
<input type="text" id="new_buzzword" name="new_buzzword">
<button type="submit">Submit</button>
</div>
</form>
- 100%[==================================================================================================>] 565 --.-KB/s in 0s

2022-04-26 13:41:43 (18.9 MB/s) - written to stdout [565/565]

Et voila! The service responded to the HTTP Get request with the same answer you would get with your browser at: http://buzzword-counter.127.0.0.1.nip.io:8080. You can now look around and make yourself familiar with the services in this namespace - or even connect with the psql client to the PostgreSQL instance running in the cluster.

Remove the Ubuntu container

Once you are done with your work, you can remove this Ubuntu instance again with: docker kill myubuntu. That's it.

Remove the Development Infrastructure

First run gefyra down to uninstall Gefyra's components. If you have initially created the development infrastructure using Getdeck you can now run:

$> deck remove --cluster https://github.com/Blueshoe/buzzword-charts.git
[INFO] Deleting the k3d cluster with name another-cluster

If you created the infrastructure yourself, you probably already know how to get rid of everything yourself ;-)

Additional Notes

If you want maximum convenience for your developers and a supported team oriented workflow, we recommend you check out Unikube. Gefyra is part of Unikube's development workflow.