RUNNING KUBERNETES CLUSTERS ON DOCKER CONTAINERS

RUNNING KUBERNETES CLUSTERS ON DOCKER CONTAINERS

Ops Engineer, there are occasions when running Kubernetes clusters on local machines becomes a preferable choice, especially when aiming to avoid the accumulation of charges from various cloud providers.

This article explores two optimal and straightforward methods for deploying your Kubernetes clusters within Docker containers, offering a cost-effective and efficient approach.

  1. Using the kind tool: Kind is a tool for running Kubernetes clusters directly on the docker container nodes. 
  2. Rancher k3s: K3s is a lightweight Kubernetes distribution by Rancher. It uses k3d to create containerized k3s clusters. With Docker, we can spin up a multi-node cluster on a single machine. K3d helps to run k3s inside a Docker container.

For this guide, I am going to be using a Ubuntu-based Linux system.

to check your Ubuntu flavor, run any of the below command from the terminal
$ cat /etc/os-release 
OR
$ lsb_release -a        

Install Docker Container RuntimeEngine

Install Docker CE on the system.

$ curl -fsSL get.docker.com -o get-docker.sh

$ sudo sh get-docker.sh        

Docker service started automatically after installation

Verify the status of the Docker with

$ systemctl status docker        

Output

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-03-08 10:04:28 UTC; 24s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 2005 (dockerd)
      Tasks: 8
     Memory: 24.6M
        CPU: 451ms
     CGroup: /system.slice/docker.service
             └─2005 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock        

Verify the Docker service installation by checking the version;

$ docker --version
Docker version 23.0.1, build a5ee5b1        

With all prerequisites met, the next step involves installing the tool necessary for crafting Kubernetes clusters within Docker containers.

✨ Let's start with KIND TOOL,

Run the following commands on the terminal

To Install the kind tool on Linux / macOS

Linux Os:

$ curl -s https://api.github.com/repos/kubernetes-sigs/kind/releases/latest| grep browser_download_url | grep kind-linux-amd64 | cut -d '"' -f 4  | wget -qi 
$ chmod a+x kind-linux-amd64
$ sudo mv kind-linux-amd64 /usr/local/bin/kind-        

Mac Os:

# Using brew
$ brew install kind

# Using Curl
$ curl -s https://api.github.com/repos/kubernetes-sigs/kind/releases/latest| grep browser_download_url | grep darwin-arm64 | cut -d '"' -f 4  | wget -qi -        

Check installed version

$ kind version
  kind v0.16.0 go1.19.1 linux/amd64        

Run Kubernetes cluster in Docker containers with Kind tool

$ sudo kind create cluster        

Output

Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.25.2) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊        

To view the container created by Kind, run

$ sudo docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
f0c2eff57d05   kindest/node:v1.25.2   "/usr/local/bin/entr…"   3 minutes ago   Up 3 minutes   127.0.0.1:34989->6443/tcp   kind-control-plane        

kind commands can be used to manage the clusters, nodes, and kubeconfig.

$ kind help

kind creates and manages local Kubernetes clusters using Docker container 'nodes


Usage:
  kind [command]


Available Commands:
  build       Build one of [node-image]
  completion  Output shell completion code for the specified shell (bash, zsh or fish)
  create      Creates one of [cluster]
  delete      Deletes one of [cluster]
  export      Exports one of [kubeconfig, logs]
  get         Gets one of [clusters, nodes, kubeconfig]
  help        Help about any command
  load        Loads images into nodes
  version     Prints the kind CLI version


Flags:
  -h, --help              help for kind
      --loglevel string   DEPRECATED: see -v instead
  -q, --quiet             silence all stderr output
  -v, --verbosity int32   info log verbosity, higher value produces more output


Use "kind [command] --help" for more information about a command.
        

To delete created Kubernetes cluster

kind delete cluster        

Manage kind Cluster with kubectl

Install Kubectl on Linux

For command-line access to the Kubernetes cluster, the essential tool is kubectl. Installing this tool is a straightforward process accomplished by executing the following command:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl        

Make the kubectl binary executable.

$ chmod +x ./kubectl        

Move the binary into your PATH.

sudo mv ./kubectl /usr/local/bin/kubectl        

To check the version installed

$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.3", GitCommit:"434bfd82814af038ad94d62ebe59b133fcb50506", GitTreeState:"clean", BuildDate:"2022-10-12T10:57:26Z", GoVersion:"go1.19.2", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7        

For zsh users, run:

source <(kubectl completion zsh
echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc)        
Adjust the `.kube/config` file to incorporate the configuration of the freshly established Kubernetes cluster.
$ mkdir ~/.kube
$ sudo cp /root/.kube/config ~/.kube
$ sudo chown $USER .kube/config        

Run the following commands to check the kubectl configuration

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:34989
CoreDNS is running at https://127.0.0.1:34989/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

$ kubectl config  get-clusters
NAME
kind-kind

$ kubectl config  get-contexts
CURRENT   NAME        CLUSTER     AUTHINFO    NAMESPACE
*         kind-kind   kind-kind   kind-kind

$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   11m   v1.25.2

$ kubectl get namespaces 
NAME                 STATUS   AGE
default              Active   11m
kube-node-lease      Active   11m
kube-public          Active   11m
kube-system          Active   11m
local-path-storage   Active   11m

$ kubectl get pods -n kube-system
NAME                                         READY   STATUS    RESTARTS   AGE
coredns-565d847f94-4f859                     1/1     Running   0          11m
coredns-565d847f94-65vfd                     1/1     Running   0          11m
etcd-kind-control-plane                      1/1     Running   0          11m
kindnet-wqm6j                                1/1     Running   0          11m
kube-apiserver-kind-control-plane            1/1     Running   0          11m
kube-controller-manager-kind-control-plane   1/1     Running   0          11m
kube-proxy-vx7tv                             1/1     Running   0          11m
kube-scheduler-kind-control-plane            1/1     Running   0          11m        

✨ For k3d Tool

Install k3d on your Linux system

There are a number of options you can use to install k3s.

See below the installation steps for your particular Linux operating system.

Using the installation script to get the latest version:

# With wget
$ wget -q -O - https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash

# Or with curl
$ curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash        

Install on macOS with Homebrew:

$ brew install k3d        

Confirm installed version

$ k3d version
k3d version v5.4.8
k3s version v1.25.6-k3s1 (default)        

Once you have installed it, you can run k3d help to see what you can do with k3d

$ k3d help
https://k3d.io/ 
k3d is a wrapper CLI that helps you to easily create k3s clusters inside docker. 
Nodes of a k3d cluster are docker containers running a k3s image. 
All Nodes of a k3d cluster are part of the same docker network. 

Usage: 
 k3d [flags] 
 k3d [command] 

Available Commands: 
 cluster     Manage cluster(s) 
 completion  Generate completion scripts for [bash, zsh, fish, powershell | psh] 
 help        Help about any command 
 image       Handle container images. 
 kubeconfig  Manage kubeconfig(s) 
 node        Manage node(s) 
 version     Show k3d and default k3s version 

Flags: 
 -h, --help      help for k3d 
     --trace     Enable super verbose output (trace logging) 
     --verbose   Enable verbose output (debug logging) 
     --version   Show k3d and default k3s version 

Use "k3d [command] --help" for more information about a command         

Create a Kubernetes cluster with k3d

To create a cluster named ‘k3d-cluster’ with a single node, run the command below:

$ sudo k3d cluster create k3d-cluster
INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-k3d-cluster'
INFO[0000] Created image volume k3d-k3d-cluster-images
INFO[0000] Starting new tools node...
INFO[0001] Creating node 'k3d-k3d-cluster-server-0'
INFO[0001] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.4.8'
INFO[0002] Pulling image 'docker.io/rancher/k3s:v1.25.6-k3s1'
INFO[0002] Starting Node 'k3d-k3d-cluster-tools'
INFO[0005] Creating LoadBalancer 'k3d-k3d-cluster-serverlb'
INFO[0007] Pulling image 'ghcr.io/k3d-io/k3d-proxy:5.4.8'
INFO[0009] Using the k3d-tools node to gather environment information
INFO[0009] HostIP: using network gateway 172.18.0.1 address
INFO[0009] Starting cluster 'k3d-cluster'
INFO[0009] Starting servers...
INFO[0009] Starting Node 'k3d-k3d-cluster-server-0'
INFO[0015] All agents already running.
INFO[0015] Starting helpers...
INFO[0015] Starting Node 'k3d-k3d-cluster-serverlb'
INFO[0022] Injecting records for hostAliases (incl. host.k3d.internal) and for 2 network members into CoreDNS configmap...
INFO[0024] Cluster 'k3d-cluster' created successfully!
INFO[0024] You can now use it like this:
kubectl cluster-infor        

Managing k3s Cluster with k3d

The created cluster can be manage either using k3d or kubectl,

Let's see how to use k3d to manage the cluster first.

To see all the command options that can be used with k3d, run

$ k3d help
https://k3d.io/
k3d is a wrapper CLI that helps you to easily create k3s clusters inside docker.
Nodes of a k3d cluster are docker containers running a k3s image.
All Nodes of a k3d cluster are part of the same docker network.


Usage:
  k3d [flags]
  k3d [command]


Available Commands:
  cluster      Manage cluster(s)
  completion   Generate completion scripts for [bash, zsh, fish, powershell | psh]
  config       Work with config file(s)
  help         Help about any command
  image        Handle container images.
  kubeconfig   Manage kubeconfig(s)
  node         Manage node(s)
  registry     Manage registry/registries
  version      Show k3d and default k3s version


Flags:
  -h, --help         help for k3d
      --timestamps   Enable Log timestamps
      --trace        Enable super verbose output (trace logging)
      --verbose      Enable verbose output (debug logging)
      --version      Show k3d and default k3s version


Use "k3d [command] --help" for more information about a command.        

List clusters with k3d

$ sudo k3d cluster lis
NAME         SERVERS   AGENTS   LOADBALANCER 
k3d-cluster   1/1       0/0      truet        

List nodes with k3d

$ sudo k3d node lis
NAME                      ROLE           CLUSTER      STATUS 
k3d-k3d-cluster-server-0   server         newcluster   running 
k3d-k3d-cluster-serverlb   loadbalancer   newcluster   runningt        

Delete a cluster with k3d

$ k3d cluster delete k3d-cluster
INFO[0001] Deleting cluster 'k3d-cluster'                 
INFO[0005] Deleted k3d-k3d-cluster-serverlb               
INFO[0008] Deleted k3d-k3d-cluster-server-0               
INFO[0008] Deleting cluster network '40d1445aaac90b4aa8c2db5c2547d3bbfa7662941808df0721373050ffea9c18'  
INFO[0009] Deleting image volume 'k3d-k3d-cluster-images'  
INFO[0009] Removing cluster details from default kubeconfig...  
INFO[0009] Removing standalone kubeconfig file (if there is one)...  
INFO[0009] Successfully deleted cluster k3d-cluster! r        

Manage k3s Cluster with kubectl

To be able to use Kubectl in the K3s cluster, we need to install Kubectl first and configure the .kube/configure file to the cluster configuration settings.

source <(kubectl completion bash
echo "source <(kubectl completion bash)" >> ~/.bashrc )

mkdir ~/.kub
sudo cp /root/.kube/config ~/.kube
sudo chown $USER .kube/confige        

You can now run k3s cluster commands with kubectl. For example, get all pods

$ sudo kubectl get pods --all-namespaces    
NAMESPACE     NAME                                     READY   STATUS      RESTARTS   AGE 
kube-system   metrics-server-7b4f8b595-26mhr           1/1     Running     0          19m 
kube-system   coredns-66c464876b-pljsx                 1/1     Running     0          19m 
kube-system   local-path-provisioner-7ff9579c6-jj6mn   1/1     Running     0          19m 
kube-system   helm-install-traefik-zp9t4               0/1     Completed   0          19m 
kube-system   svclb-traefik-sdjzp                      2/2     Running     0          18m 
kube-system   traefik-5dd496474-htq9n                  1/1     Running     0          18m         

To create a k3s cluster with more than one worker node, run the command below:

sudo k3d cluster create  newcluster -a 2        

Where -a flag specifies the number of agents you need. In this case, I have specified 2. Remember to export config.

After this, you can start to apply all your Kubernetes manifests to run your applications.

The above can as well be setup easily on your cloud instances!

To view or add a comment, sign in

More articles by Mayowa Fajube

Others also viewed

Explore content categories