Jump toUpdate content

Setting up Kubernetes with Minikube on a Bare Metal Server

Reviewed on 10 May 2021Published on 27 May 2019
  • compute
  • networking
  • storage

Kubernetes is an open-source platform for managing containerized workloads and services with a rapidly growing ecosystem. Kubernetes orchestrates computing, networking, and storage infrastructure on behalf of user workloads. The tool facilitates both: declarative configuration and automation and was released to the public by Google in 2014.

Kubernetes has several features. It can be thought of as:

  • a container platform
  • a microservices platform
  • a portable cloud platform and a lot more.

Minikube runs a single-node Kubernetes cluster inside a VM on your computer or cloud server for developing and testing applications.

Minikube supports Kubernetes features such as:

  • DNS
  • NodePorts
  • ConfigMaps and Secrets
  • Dashboards
  • Container Runtime: Docker, rkt, CRI-O and containerd
  • Enabling CNI (Container Network Interface)
  • Ingress
Requirements:

Downloading and Installing Minikube

  1. 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
  2. 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
  3. Download the Minikube binary and make it executable:

    curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
  4. Copy the binary file to /usrlocal/bin/ to make it available system-wide, then remove the downloaded binary:

    cp minikube /usr/local/bin && rm minikube
  5. 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
  6. 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
  7. 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
  8. 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

  1. Start Minikube:

    minikube start --vm-driver=kvm2

    An output informs you about the status of Minikube:

    ```
    😄 minikube v1.1.0 on linux (amd64)
    2019/05/27 15:11:47 No matching credentials were found, falling back on anonymous
    🔥 Creating kvm2 VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
    🐳 Configuring environment for Kubernetes v1.14.2 on Docker 18.09.6
    💾 Downloading kubeadm v1.14.2
    💾 Downloading kubelet v1.14.2
    🚜 Pulling images ...
    🚀 Launching Kubernetes ...
    ⌛ Verifying: apiserver proxy etcd scheduler controller dns
    🏄 Done! kubectl is now configured to use "minikube"
    ```
  2. Check the health status of minikube:

    minikube status
    host: Running
    kubelet: Running
    apiserver: Running
    kubectl: Correctly Configured: pointing to minikube-vm at 192.168.39.101
  3. Start an Echoserver deployment:

    kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.14 --port=8080

    Once the deployment is created, a message confirms the step:

    deployment.apps/hello-minikube created
  4. Check the running pods and configured deployments:

    kubectl get pods

    NAME READY STATUS RESTARTS AGE
    hello-minikube-56cdb79778-qj7sd 1/1 Running 0 3m47s
    kubectl get deployments
    NAME             READY   UP-TO-DATE   AVAILABLE   AGE
    hello-minikube 1/1 1 1 5m59s

    Expose an echoserver deployment with NodePort

    kubectl expose deployment hello-minikube --type=NodePort
  5. curl the service created by running the following command:

    curl $(minikube service hello-minikube --url)

    A response similar to this example is shown:

    Hostname: hello-minikube-56cdb79778-qj7sd

    Pod Information:
    -no pod information available-

    Server values:
    server_version=nginx: 1.13.3 - lua: 10008

    Request Information:
    client_address=172.17.0.1
    method=GET
    real path=/
    query=
    request_version=1.1
    request_scheme=http
    request_uri=http://192.168.39.101:8080/

    Request Headers:
    accept=*/*
    host=192.168.39.101:30090
    user-agent=curl/7.58.0

    Request Body:
    -no body in request-
  6. Delete the hello-minikube service:

    kubectl delete services hello-minikube
  7. Delete the deployment:

    kubectl delete deployment hello-minikube

    A confirmation displays:

    deployment.extensions "hello-minikube" deleted
  8. Stop Minikube:

    minikube stop

    A confirmation displays:

    ✋  Stopping "minikube" in kvm2 ...
    🛑 "minikube" stopped.

For more information regarding Minikube and Kubernetes, check out the official documentation and the Minikube GitHub repository.