Saturday, 15 November 2025

Kubernets - install minikube

Minikube is an open-source tool that makes it easy to run a single-node Kubernetes cluster on your personal machine (like a laptop or desktop).

What is Minikube?

  • It spins up a single-node Kubernetes cluster on your laptop or desktop. 

  • Both the “master” (control plane) and “worker” (node) run on that same machine. 

  • It works via a virtual machine (VM) or a container, depending on your setup. 

  • Comes with “addons” — extra Kubernetes functionalities you can turn on (e.g. dashboard, ingress).

Why Use Minikube?

  • Learning: Great for beginners to learn Kubernetes without needing a cloud or multi-node cluster. Zesty

  • Development / Testing: You can build and test Kubernetes apps on your machine before deploying to a real cluster. Damavis Blog

  • Lightweight: Since it's just one node and local, it's less resource-intensive than a full production setup. Kubernetes+1

Limitations

  • Not for Production: It's not meant to run production-grade workloads. Zesty

  • Single Node: Because it's just one node, you don’t get the resilience or horizontal scaling of real multi-node clusters. GeeksforGeeks

  • Resource Constraints: Since it's running on your local machine, your Kubernetes cluster is limited by your laptop’s hardware.    


Installing Minikube

Refer: https://minikube.sigs.k8s.io/docs/start/?arch=%2Flinux%2Fx86-64%2Fstable%2Fbinary+download for installation.

To install the latest minikube stable release on x86-64 Linux using RPM package:

[root@devopsvm01 ~]# sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
rm: remove regular file 'minikube-linux-amd64'? y
[root@devopsvm01 ~]#
[root@devopsvm01 ~]# curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50.5M  100 50.5M    0     0  7012k      0  0:00:07  0:00:07 --:--:-- 9963k
[root@devopsvm01 ~]# sudo rpm -Uvh minikube-latest.x86_64.rpm
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:minikube-1.37.0-0                ################################# [100%]
[root@devopsvm01 ~]#


Start minikube standalone cluster

minikube start command will do below activities:

prepares Kubernetes configuration

chooses a driver (Docker)

creates a special container called minikube

installs Kubernetes components into that container

configures kubectl

creates the kubeconfig file

It automatically creates a single-node Kubernetes cluster with:

  • 1 Control Plane (Master)

  • 1 Worker Node

[root@devopsvm01 ~]# minikube start --cpus 1
* minikube v1.37.0 on Oracle 9.6 (vbox/amd64)
* Automatically selected the docker driver. Other choices: podman, none, ssh

X Exiting due to RSRC_INSUFFICIENT_CORES:  has less than 2 CPUs available, but Kubernetes requires at least 2 to be available

[root@devopsvm01 ~]#

I increase the VM's cpu count to 2 and re-tried.

[root@devopsvm01 ~]# minikube start
* minikube v1.37.0 on Oracle 9.6 (vbox/amd64)
* Automatically selected the docker driver. Other choices: podman, none, ssh
* The "docker" driver should not be used with root privileges. If you wish to continue as root, use --force.
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.

[root@devopsvm01 ~]#

Looks like we need to run it as non-root user.

[root@devopsvm01 ~]# useradd mahesh
[root@devopsvm01 ~]# passwd mahesh
Changing password for user mahesh.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@devopsvm01 ~]# usermod -aG docker mahesh
[root@devopsvm01 ~]#
[root@devopsvm01 ~]# su - mahesh
[mahesh@devopsvm01 ~]$
[mahesh@devopsvm01 ~]$ minikube status
* Profile "minikube" not found. Run "minikube profile list" to view all profiles.
  To start a cluster, run: "minikube start"
[mahesh@devopsvm01 ~]$  minikube start
* minikube v1.37.0 on Oracle 9.6 (vbox/amd64)
* Automatically selected the docker driver

X Exiting due to RSRC_INSUFFICIENT_CONTAINER_MEMORY: docker only has 1511MiB available, less than the required 1800MiB for Kubernetes

[mahesh@devopsvm01 ~]$

I increased memory and re-tried .

[root@devopsvm01 ~]# su - mahesh
[mahesh@devopsvm01 ~]$ free -m
               total        used        free      shared  buff/cache   available
Mem:            2355         808        1093          27         631        1546
Swap:           2095           0        2095
[mahesh@devopsvm01 ~]$

[mahesh@devopsvm01 ~]$ minikube start
* minikube v1.37.0 on Oracle 9.6 (vbox/amd64)
* Automatically selected the docker driver

X The requested memory allocation of 2355MiB does not leave room for system overhead (total system memory: 235                                          5MiB). You may face stability issues.
* Suggestion: Start minikube with less memory allocated: 'minikube start --memory=2355mb'

* Using Docker driver with root privileges
* Starting "minikube" primary control-plane node in "minikube" cluster
* Pulling base image v0.0.48 ...
* Downloading Kubernetes v1.34.0 preload ...
    > preloaded-images-k8s-v18-v1...:  337.07 MiB / 337.07 MiB  100.00% 5.62 Mi
    > gcr.io/k8s-minikube/kicbase...:  488.49 MiB / 488.52 MiB  99.99% 5.80 MiB
* Creating docker container (CPUs=2, Memory=2355MB) ...
* Preparing Kubernetes v1.34.0 on Docker 28.4.0 ...
* Configuring bridge CNI (Container Networking Interface) ...
* Verifying Kubernetes components...
  - Using image gcr.io/k8s-minikube/storage-provisioner:v5
* Enabled addons: storage-provisioner, default-storageclass
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
[mahesh@devopsvm01 ~]$

Following installation, a .kube directory is created, and inside it, you will find the config file.

[mahesh@devopsvm01 ~]$ cd .kube
[mahesh@devopsvm01 .kube]$ ls -lrt
total 4
-rw-------. 1 mahesh mahesh 827 Nov 15 16:45 config
drwxr-x---. 4 mahesh mahesh  35 Nov 15 16:51 cache
[mahesh@devopsvm01 .kube]$ cat config
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/mahesh/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Sat, 15 Nov 2025 16:45:56 IST
        provider: minikube.sigs.k8s.io
        version: v1.37.0
      name: cluster_info
    server: https://192.168.49.2:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Sat, 15 Nov 2025 16:45:56 IST
        provider: minikube.sigs.k8s.io
        version: v1.37.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /home/mahesh/.minikube/profiles/minikube/client.crt
client-key: /home/mahesh/.minikube/profiles/minikube/client.key
[mahesh@devopsvm01 .kube]$


[mahesh@devopsvm01 ~]$ minikube kubectl -- get pods -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS        AGE
kube-system   coredns-66bc5c9577-5t9v7           1/1     Running   0               5m56s
kube-system   etcd-minikube                      1/1     Running   0               6m1s
kube-system   kube-apiserver-minikube            1/1     Running   0               6m1s
kube-system   kube-controller-manager-minikube   1/1     Running   0               6m1s
kube-system   kube-proxy-7flzw                   1/1     Running   0               5m56s
kube-system   kube-scheduler-minikube            1/1     Running   0               6m1s
kube-system   storage-provisioner                1/1     Running   1 (5m25s ago)   5m58s
[mahesh@devopsvm01 ~]$

While the Pods are running inside the minikube container, minikube enables you to retrieve their details. It does this by configuring your local kubectl to communicate directly with the Kubernetes API Server that resides within the containerized cluster.

So what we did is,

🔍 Think of it like this:

👉 Your Oracle Linux VM

runs Docker

👉 Docker runs a container

called minikube

👉 And that container behaves like

a Kubernetes node/cluster

So your Kubernetes cluster is running inside that minikube container.


Component (Pod)StatusMeaning
corednsRunning (1/1 Ready)The DNS service for your cluster is operational, allowing services to find each other by name.
etcd-minikubeRunning (1/1 Ready)The critical key-value store that holds all the cluster state is working.
kube-apiserverRunning (1/1 Ready)The frontend for the Control Plane, handling all communication.
kube-controller-managerRunning (1/1 Ready)Manages core controllers (like Replication, Endpoint, Namespace).
kube-proxyRunning (1/1 Ready)Manages network routing for services in the cluster.
kube-schedulerRunning (1/1 Ready)Responsible for assigning Pods to Nodes (in this case, your single Minikube node).
storage-provisionerRunning (1/1 Ready)Handles dynamic volume provisioning, so you can easily use persistent storage.
When you ran minikube start with the Docker driver (the default), it created a Docker container named minikube (or whatever profile name you use).

[mahesh@devopsvm01 ~]$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                 NAMES
6be75721042c   gcr.io/k8s-minikube/kicbase:v0.0.48   "/usr/local/bin/entr…"   11 minutes ago   Up 11 minutes   127.0.0.1:32768->22/tcp, 127.0.0.1:32769->2376/tcp, 127.0.0.1:32770->500               0/tcp, 127.0.0.1:32771->8443/tcp, 127.0.0.1:32772->32443/tcp   minikube
[mahesh@devopsvm01 ~]$

Let's verify whats inside the container

[mahesh@devopsvm01 ~]$ docker exec -it minikube bash
root@minikube:/#

Try ps -ef | grep kube  , systemctl status kubelet etc.





























root@minikube:~# cd /etc/kubernetes

root@minikube:/etc/kubernetes#

root@minikube:/etc/kubernetes# ls -lrt

total 36

-rw-------. 1 root root 5635 Nov 15 11:15 admin.conf

-rw-------. 1 root root 5659 Nov 15 11:15 super-admin.conf

-rw-------. 1 root root 5636 Nov 15 11:15 controller-manager.conf

-rw-------. 1 root root 5584 Nov 15 11:15 scheduler.conf

drwxr-xr-x. 1 root root  113 Nov 15 11:15 manifests

-rw-------. 1 root root 1936 Nov 15 11:15 kubelet.conf

drwxr-xr-x. 2 root root   63 Nov 15 11:15 addons

root@minikube:/etc/kubernetes#


We are currently inside the core configuration directory (/etc/kubernetes) of your running Kubernetes node (the minikube container).

The files and directories you see are essential configuration elements that define how the various Kubernetes components operate.

File NamePurposeWhat it Contains
admin.confCluster Administrator KubeconfigThe configuration file (kubeconfig) that grants full administrative access to the cluster. This is often the file that gets copied to your host machine's ~/.kube/config when you run minikube start.
super-admin.confElevated Access KubeconfigSimilar to admin.conf, but potentially configured for a specific, high-privilege access role (sometimes used internally by Minikube for setup).
controller-manager.confController Manager KubeconfigThe configuration file that tells the kube-controller-manager process how to authenticate with and talk to the kube-apiserver.
scheduler.confScheduler KubeconfigThe configuration file that tells the kube-scheduler process how to authenticate with and talk to the kube-apiserver.
kubelet.confKubelet ConfigurationThe file that tells the kubelet (the node agent) how to authenticate with the kube-apiserver and specifies the essential parameters for the node's operation.









🧩 Why inside the minikube container you see many containers?

Because Kubernetes runs its own components as containers.

Kubelet (inside minikube container) pulls and runs containers for:

  • API Server

  • Controller Manager

  • Scheduler

  • etcd (cluster database)

  • CoreDNS

  • kube-proxy

  • Storage provisioner

  • Pause (infrastructure containers)

So these are NOT normal Docker containers
They are Kubernetes system components, initiated by kubelet.

🚢 So What is the minikube Container?

In this context (using the Docker driver), the minikube container is the single-node Kubernetes cluster itself.

It's not just a virtual machine; it is a KIC (Kubernetes in Container) image.

Here is a breakdown of what that container is and what it holds:


ComponentLocationDescription
The minikube ContainerYour Host OS's Docker EngineThis single container acts as the entire virtual machine (the "node") for your Kubernetes cluster.

Minikube often uses a VM (Virtual Machine) driver (like VirtualBox) as its default method. When it uses the Docker driver, it replaces the need for that VM. However, the container's purpose remains the same: it acts as a single, isolated operating system instance that hosts all Kubernetes processes, mimicking the isolation and functionality of a traditional VM-based node.

Control PlaneInside the ContainerThis includes the critical components: kube-apiserver, etcd, kube-scheduler, and kube-controller-manager.
Worker NodeInside the ContainerThis includes the kubelet and the Container Runtime (Docker, in your case) that run your workload Pods.
Your Pods/WorkloadsInside the ContainerWhen you deploy an Nginx application, that Nginx container will run inside the minikube container.
Let's see the image pulled by the installation.

[mahesh@devopsvm01 ~]$ docker images | grep -i minikube
gcr.io/k8s-minikube/kicbase   v0.0.48             c6b5532e987b   2 months ago   1.31GB
[mahesh@devopsvm01 ~]$

It means you have successfully pulled the KIC (Kubernetes In Container) Base Image used by Minikube's Docker driver.

In Traditional Minikube, The cluster runs inside a real Virtual Machine.

With the Docker Driver (My Setup): The cluster runs inside a Docker Container.

Minikube dashboard 

The Minikube dashboard is a web-based UI for Kubernetes. It lets you visually manage your cluster: view pods, deployments, services, namespaces, and more.

Run from your VM as the normal user (mahesh), and run below command

minikube dashboard

This will start the Kubernetes dashboard inside Minikube.

It will also open a browser on your local machine (or give you a URL if you’re on a VM without GUI).

The dashboard runs as a pod inside the kube-system namespace.








No comments:

Post a Comment

Building a Safer PostgreSQL CI/CD Pipeline with GitHub Actions: Dev → PR Review → Test Promotion

In my previous post, we explored a simple push-to-main deployment strategy . While functional, that model is not considered an industry best...