Minikube
Minimum system requirements for minikube
- 2 GB RAM or more
- 2 CPU / vCPUs or more
- 20 GB free hard disk space or more
- Docker / Virtual Machine Manager β KVM & VirtualBox. Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMWare are examples of container or virtual machine managers.
Pre-requisite
We will need 1 VM to create a single node kubernetes cluster using minikube
.
We are using following setting for this purpose:
- 1 Linux machine for master, ubuntu-22.04-x86_64 or your choice of Ubuntu OS image, cpu-su.2 flavor with 2vCPU, 8GB RAM, 40GB storage - also assign Floating IP to this VM.
- setup Unique hostname to the machine using the following command:
echo "<node_internal_IP> <host_name>" >> /etc/hosts
hostnamectl set-hostname <host_name>
For example,
echo "192.168.0.62 minikube" >> /etc/hosts
hostnamectl set-hostname minikube
Install Minikube on Ubuntu
Run the below command on the Ubuntu VM:
- SSH into minikube machine
-
Switch to root user:
sudo su
-
Update the repositories and packages:
apt-get update && apt-get upgrade -y
- Install
curl
,wget
, andapt-transport-https
apt-get update && apt-get install -y curl wget apt-transport-https
Very Important
Run the following step as non-root user i.e. ubuntu.
Download and install the latest version of Docker CE
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
- Configure the Docker daemon:
sudo usermod -aG docker $USER && newgrp docker
Install kubectl
-
Install kubectl binary
β’ kubectl: the command line util to talk to your cluster.
sudo snap install kubectl --classic
This outputs: kubectl 1.26.1 from Canonicalβ installed
- Now verify the kubectl version:
sudo kubectl version -o yaml
Install the container runtime i.e. containerd on master and worker nodes
To run containers in Pods, Kubernetes uses a container runtime.
By default, Kubernetes uses the Container Runtime Interface (CRI) to interface with your chosen container runtime.
- Install container runtime - containerd
The first thing to do is configure the persistent loading of the necessary
containerd
modules. This forwarding IPv4 and letting iptables see bridged
trafficis is done with the following command:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
- Ensure
net.bridge.bridge-nf-call-iptables
is set to1
in your sysctl config:
# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
- Apply sysctl params without reboot:
sudo sysctl --system
- Install the necessary dependencies with:
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
- The
containerd.io
packages in DEB and RPM formats are distributed by Docker. Add the required GPG key with:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
It's now time to Install and configure containerd:
sudo apt update -y
sudo apt install -y containerd.io
containerd config default | sudo tee /etc/containerd/config.toml
# Reload the systemd daemon with
sudo systemctl daemon-reload
# Start containerd
sudo systemctl restart containerd
sudo systemctl enable --now containerd
You can verify containerd
is running with the command:
sudo systemctl status containerd
Installing minikube
- Install minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb
OR, install minikube using wget
:
wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
cp minikube-linux-amd64 /usr/bin/minikube
chmod +x /usr/bin/minikube
- Verify the Minikube installation:
minikube version
minikube version: v1.29.0
commit: ddac20b4b34a9c8c857fc602203b6ba2679794d3
- Install conntrack: Kubernetes 1.26.1 requires conntrack to be installed in root's path:
sudo apt-get install -y conntrack
- Start minikube: As we are already stated in the beginning that we would be using docker as base for minikue, so start the minikube with the docker driver,
minikube start --driver=docker --container-runtime=containerd
Note
- To check the internal IP, run the
minikube ip
command. - By default, Minikube uses the driver most relevant to the host OS. To
use a different driver, set the
--driver
flag inminikube start
. For example, to use others or none instead of Docker, runminikube start --driver=none
. To persistent configuration so that you to run minikube start without explicitly passing i.e. in global scope the--vm-driver docker
flag each time, run:minikube config set vm-driver docker
. - Other start options:
minikube start --force --driver=docker --network-plugin=cni --container-runtime=containerd
- In case you want to start minikube with customize resources and want installer
to automatically select the driver then you can run following command,
minikube start --addons=ingress --cpus=2 --cni=flannel --install-addons=true --kubernetes-version=stable --memory=6g
Output would like below:
Perfect, above confirms that minikube cluster has been configured and started successfully.
- Run below minikube command to check status:
minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
- Run following kubectl command to verify the cluster info and node status:
kubectl cluster-info
Kubernetes control plane is running at https://192.168.0.62:8443
CoreDNS is running at https://192.168.0.62:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 5m v1.26.1
- To see the kubectl configuration use the command:
kubectl config view
The output looks like:
- Get minikube addon details:
minikube addons list
The output will display like below:
If you wish to enable any addons run the below minikube command,
minikube addons enable <addon-name>
- Enable minikube dashboard addon:
minikube dashboard
π Enabling dashboard ...
βͺ Using image kubernetesui/metrics-scraper:v1.0.7
βͺ Using image kubernetesui/dashboard:v2.3.1
π€ Verifying dashboard health ...
π Launching proxy ...
π€ Verifying proxy health ...
http://127.0.0.1:40783/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
- To view minikube dashboard url:
minikube dashboard --url
π€ Verifying dashboard health ...
π Launching proxy ...
π€ Verifying proxy health ...
http://127.0.0.1:42669/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
- Expose Dashboard on NodePort instead of ClusterIP:
-- Check the current port for kubernetes-dashboard
:
kubectl get services -n kubernetes-dashboard
The output looks like below:
kubectl edit service kubernetes-dashboard -n kubernetes-dashboard
-- Replace type: "ClusterIP" to "NodePort":
-- After saving the file:
Test again: kubectl get services -n kubernetes-dashboard
Now the output should look like below:
So, now you can browser the K8s Dashboard, visit http://<Floating-IP>:<NodePort>
i.e. http://140.247.152.235:31881 to view the Dashboard.
Deploy A Sample Nginx Application
-
Create a deployment, in this case Nginx: A Kubernetes Pod is a group of one or more Containers, tied together for the purposes of administration and networking. The Pod in this tutorial has only one Container. A Kubernetes Deployment checks on the health of your Pod and restarts the Pod's Container if it terminates. Deployments are the recommended way to manage the creation and scaling of Pods.
-
Let's check if the Kubernetes cluster is up and running:
kubectl get all --all-namespaces
kubectl get po -A
kubectl get nodes
kubectl create deployment --image nginx my-nginx
- To access the deployment we will need to expose it:
kubectl expose deployment my-nginx --port=80 --type=NodePort
To check which NodePort is opened and running the Nginx run:
kubectl get svc
The output will show:
OR,
minikube service list
|----------------------|---------------------------|--------------|-------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|----------------------|---------------------------|--------------|-------------|
| default | kubernetes | No node port |
| default | my-nginx | 80 | http:.:31081|
| kube-system | kube-dns | No node port |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port |
| kubernetes-dashboard | kubernetes-dashboard | 80 | http:.:31929|
|----------------------|---------------------------|--------------|-------------|
OR,
kubectl get svc my-nginx
minikube service my-nginx --url
Once the deployment is up, you should be able to access the Nginx home page on the allocated NodePort from the node's Floating IP.
Go to browser, visit http://<Floating-IP>:<NodePort>
i.e. http://140.247.152.235:31081/ to check the nginx default page.
For your example,
Deploy A Hello Minikube Application
- Use the kubectl create command to create a Deployment that manages a Pod. The Pod runs a Container based on the provided Docker image.
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080
- View the port information:
kubectl get svc hello-minikube
minikube service hello-minikube --url
Go to browser, visit http://<Floating-IP>:<NodePort>
i.e. http://140.247.152.235:31293/ to check the hello minikube default page.
For your example,
Clean up
Now you can clean up the app resources you created in your cluster:
kubectl delete service my-nginx
kubectl delete deployment my-nginx
kubectl delete service hello-minikube
kubectl delete deployment hello-minikube
Managing Minikube Cluster
- To stop the minikube, run
minikube stop
- To delete the single node cluster:
minikube delete
- To Start the minikube, run
minikube start
- Remove the Minikube configuration and data directories:
rm -rf ~/.minikube
rm -rf ~/.kube
- If you have installed any Minikube related packages, remove them:
sudo apt remove -y conntrack
- In case you want to start the minikube with higher resource like 8 GB RM and 4 CPU then execute following commands one after the another.
minikube config set cpus 4
minikube config set memory 8192
minikube delete
minikube start