Setting up Kubernetes with Minikube on an Elastic Metal Server
- Kubernetes
- Minikube
- Elastic-Metal
Kubernetes is a powerful open-source platform designed for managing containerized workloads and services, boasting a rapidly expanding ecosystem. It orchestrates computing, networking, and storage infrastructure to streamline user workloads efficiently. Originally released by Google in 2014, Kubernetes offers declarative configuration and automation capabilities, making it a preferred choice for modern software development and deployment.
With Kubernetes, you gain access to several features, serving as:
- a robust container platform
- an efficient microservices platform
- a portable cloud platform, and much more.
Minikube is a valuable tool that simplifies Kubernetes development and testing workflows by running a single-node Kubernetes cluster within a virtual machine on your local computer or cloud server.
Minikube provides support for various essential Kubernetes features, including:
- DNS resolution
- NodePort services
- ConfigMaps and Secrets management
- Dashboard visualization
- Compatibility with multiple container runtimes: Docker, rkt, CRI-O, and containerd
- Integration with Container Network Interface (CNI)
- Ingress configuration for routing external traffic to Kubernetes services.
Before you start
To complete the actions presented below, you must have:
- A Scaleway account logged into the console
- Owner status or IAM permissions allowing you to perform actions in the intended Organization
- An SSH key
- An Elastic Metal server running on Ubuntu Bionic Beaver (18.04)
Downloading and Installing Minikube
- Check if the CPU of your server supports hardware virtualization. The output of the following command shall not be empty:
egrep --color 'vmx|svm' /proc/cpuinfo
- Minikube relies on a Hypervisor to run the Kubernetes VM. This tutorial uses KVM (Kernel Virtual Machine), but it is also possible to run Minikube on VirtualBox.
apt-get install qemu qemu-kvm libvirt-bin virtinst curl
- Download the Minikube binary and make it executable:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
- Download and install the KVM driver for Minikube:
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 && chmod +x docker-machine-driver-kvm2
- Copy the binary file to
/usrlocal/bin/
to make it available system-wide, then remove the downloaded binary:cp docker-machine-driver-kvm2 /usr/local/bin/ && rm docker-machine-driver-kvm2 - Download and install
kubectl
, a CLI tool to manage Kubernetes:curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl - Copy the binary file to
/usrlocal/bin/
to make it available system-wide, then remove the downloaded binary:cp kubectl /usr/local/bin && rm kubectl
Using Minikube
-
Start Minikube:
minikube start --vm-driver=kvm2An output informs you about the status of Minikube:
😄 minikube v1.31.1 on linux (amd64)✨ Automatically selected the docker driver. Other choices: virtualbox, ssh📌 Using Docker Desktop driver with root privileges👍 Starting control plane node minikube in cluster minikube🚜 Pulling base image ...💾 Downloading Kubernetes v1.27.3 preload ...🔥 Creating docker container (CPUs=2, Memory=4000MB) ...🐳 Preparing Kubernetes v1.27.3 on Docker 24.0.4 ...▪ Generating certificates and keys ...▪ Booting up control plane ...▪ Configuring RBAC rules ...🔗 Configuring bridge CNI (Container Networking Interface) ...▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5🔎 Verifying Kubernetes components...🌟 Enabled addons: storage-provisioner🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default -
Check the health status of
minikube
:minikube statusminikubetype: Control Planehost: Runningkubelet: Runningapiserver: Runningkubeconfig: Configured -
Start a deployment that manages a pod. The pod runs a container based on the provided Docker image:
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080Once the deployment is created, a message confirms the step:
deployment.apps/hello-node created -
Check the running pods and configured deployments:
kubectl get deploymentsNAME READY UP-TO-DATE AVAILABLE AGEhello-node 1/1 1 1 98sExpose the pod to the public internet using the
kubectl expose
commandkubectl expose deployment hello-node --type=LoadBalancer --port=8080The
--type=LoadBalancer
flag indicates that you want to expose your service outside of the cluster. -
View the service you created in the previous step:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEhello-node LoadBalancer 10.102.149.85 <pending> 8080:32112/TCP 2skubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11m -
Run the following command to open a browser window that serves the app and shows the app’s response:
minikube service hello-node -
Delete the
hello-node
service:kubectl delete services hello-node -
Delete the deployment:
kubectl delete deployment hello-nodeA confirmation displays:
deployment.extensions "hello-node" deleted -
Stop Minikube:
minikube stopA confirmation displays:
✋ Stopping node "minikube" ...🛑 Powering off "minikube" via SSH ...🛑 1 node stopped.
For more information regarding Minikube and Kubernetes, check out the official documentation and the Minikube GitHub repository.