Deploy Kubernetes using Minikube - caprivm/virtualization GitHub Wiki

caprivm ([email protected])

Description

This page shows how to install a Kubernetes Cluster, using the open source tool Minikube. The purpose is to deploy the Kubernetes cluster in a single-machine for experimental purposes only. The sizing used for this single-machine is:

Feature Value
OS Used Ubuntu 20.04 LTS
vCPU 8
RAM (GB) 16
Disk (GB) 140
Home user ubuntu

The contents of the page are:

Prerequisites

Before starting this guide, you should have installed the following tools. You can check the adjacent links if you haven't already:

Environment Variables

The list of environment variables used for this implementation are summarized in the following exports:

export HOST_IP=$(hostname -I | tr " " "\n" | head -n 1)
export MINIKUBE_IP=$(cat ~/.kube/config  | grep server | tr "\/" "\n" | tail -n 1 | tr ":" "\n" | head -n 1)

Install Minikube

You can use this dynamic guide to install Minikube on different operating systems and processor types. To install the latest minikube stable release on x86-64 Linux using binary download:

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Start Minikube using the Docker driver
minikube start --driver=docker
minikube config set driver docker   # <-- Make docker the default driver

If you already have kubectl installed, you can now use it to access your shiny new cluster:

kubectl get po -A
# NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE
# kube-system            coredns-558bd4d5db-2whdk                     1/1     Running   4          54d
# kube-system            etcd-minikube                                1/1     Running   4          54d
# kube-system            kube-apiserver-minikube                      1/1     Running   4          54d
# kube-system            kube-controller-manager-minikube             1/1     Running   4          54d
# kube-system            kube-proxy-gc2sl                             1/1     Running   4          54d
# kube-system            kube-scheduler-minikube                      1/1     Running   4          54d
# kube-system            storage-provisioner                          1/1     Running   8          54d
# kube-system            tiller-deploy-867946c76c-4shmg               1/1     Running   0          5d13h
# kubernetes-dashboard   dashboard-metrics-scraper-7976b667d4-vqmjp   1/1     Running   4          53d
# kubernetes-dashboard   kubernetes-dashboard-6fcdf4f6d-hw2qm         1/1     Running   6          53d
# metallb-system         controller-66bc445b99-68w6m                  1/1     Running   3          53d
# metallb-system         speaker-lrcw7                                1/1     Running   3          53d

Manage your cluster

To manage the cluster, you can use the following commands:

# Pause Kubernetes without impacting deployed applications
minikube pause
minikube unpause
# Halt the cluster
minikube stop
# Increase the default memory limit (requires a restart)
minikube config set memory 16384
# Enable the easily Kubernetes services
minikube addons list
minikube addons enable storage-provisioner      # <-- Enable a addons easily
minikube addons enable efk                      # <-- Enable a addons easily
# Create a second cluster running an older Kubernetes release
minikube start -p aged --kubernetes-version=v1.16.1
# Delete all of the minikube clusters
minikube delete --all

Remotely accessing Minikube cluster

To access the cluster remotely, it is suggested to install a reverse Proxy and make the authentication against the kube-API insecure. Follow the steps below:

NOTE: Perform this for testing purposes only. This is not suggested for a productive environment.

# In the same VM that Minikube was installed
sudo apt update
sudo apt install nginx

Edit the nginx configuration (/etc/nginx/nginx.conf) file:

#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}
+
+stream {
+        server {
+                listen $HOST_IP:51999;
+                #TCP traffic will be forwarded to the specified server
+                proxy_pass $MINIKUBE_IP:8443;
+        }
+}

Before we do anything, let’s test the new nginx settings:

sudo nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

Restart the nginx service:

sudo service nginx restart

Modify the ~/.kube/config file:

Edit the configuration file generated by Minikube (it is in the path ~/.kube/config) and use it for the remote access:

    apiVersion: v1
    clusters:
    - cluster:
-       certificate-authority: /home/ubuntu/.minikube/ca.crt
+       insecure-skip-tls-verify: true
        extensions:
        - extension:
            last-update: Wed, 13 Oct 2021 19:47:47 UTC
            provider: minikube.sigs.k8s.io
            version: v1.22.0
          name: cluster_info
-       server: https://$MINIKUBE_IP:8443
+       server: https://$HOST_IP:51999
      name: minikube
    contexts:
    - context:
        cluster: minikube
        extensions:
        - extension:
            last-update: Wed, 13 Oct 2021 19:47:47 UTC
            provider: minikube.sigs.k8s.io
            version: v1.22.0
          name: context_info
        namespace: default
        user: minikube
      name: minikube
    current-context: minikube
    kind: Config
    preferences: {}
    users:
    - name: minikube
      user:
-       client-certificate: /home/ubuntu/.minikube/profiles/minikube/client.crt
+       client-certificate-data: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJeE1EZ3lOVEUyTVRreE1Wb1hEVEl5TURneU5qRTJNVGt4TVZvd01URVhNQlVHQTFVRQpDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGakFVQmdOVkJBTVREVzFwYm1scmRXSmxMWFZ6WlhJd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEZHNSTGsrdGljdGRub0hNSEhkT3BWNkV2VnNiV04KKy9PcFlSTFFoMCtwejQ3OXBhVUJPSXBqMkw1cE1iV1ZTcDYzMzRWdUJ2YnRnS0dSUTkrbVFqUzhxTHdwalRBSApmZzEyNEZLUk9Sa2MyYVEzMXFVRFcxci9lNHB4VEQyWUZXdUltSTUzYXNHbUNDZThseUlKMVRUK2pVMGROMjl6Ckpud0dBcG5VYmpJM3FUVFZLZ1cwREZxaDR1TWphTEY2cnl2NXVhaCtpM20rNEw3a3VZQVhlRjR3Q29ZeUdCTW4KUDdkelBQbXhCWVd2R3Z0VFVZME1BblJhLy96NjF2LzljTHIyQ2MxVGdQOGxOWTRSSHZ0S09XTHkwT3lhNlRsdApkYUNNcTlQVkM3Z01uUkRJMzFkeXRSSU1NYUNKaXRpMS85bEM5YkhsVUVOK1hRSjdTWFFpd1FXYkFnTUJBQUdqCllEQmVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JSUkFUODZHUXRlYkE5VENDRFZ1QW5SdjFNagpDekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBV0NqK2lvdzVzbUllYzZVTVV5d3A2SXM0REtCQmxQTlNENWZPCjJKZlJCcFc5OEIyaWdxZG1NTG1tSjU2STAxNmJ0WWQvZDQzRUFKNHM5Q2k1MHVLeGlsSmIwSlZpNnRJT3FzUEgKd3ZvUkNQOGFCY3E3K1RkQnlxQXpwMENDaWVNVjNnVWx6OFV4TnNZQUlyWEZJT2F2d0FrRUlNeUs2MHM3SnlyTgpZMTExdEFwUzFYSjM3TnVsY1JGQ1RRZTFLbGthSUp4RW5NT0x0V2xzY21Zd3BHRzlIUGR4R29LYkxyZEZoUnNQCmMxQnBSb1pnM0FCU296cnpkVzFmZ0VUaTFLc2xrNmt2djRZUFNkc1JPeFhmSFpzZjhib1hTY25XQXJZOThRUVgKZi95VU9Oc1dkeHFXcyszbk5UVWtSanZLdS9mY0lUMEtQZDRpSnBtdGhDcndiVElHZ0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
-       client-key: /home/ubuntu/.minikube/profiles/minikube/client.key
+       client-key-data: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBM2JFUzVQclluTFhaNkJ6QngzVHFWZWhMMWJHMWpmdnpxV0VTMElkUHFjK08vYVdsCkFUaUtZOWkrYVRHMWxVcWV0OStGYmdiMjdZQ2hrVVBmcGtJMHZLaThLWTB3QjM0TmR1QlNrVGtaSE5ta045YWwKQTF0YS8zdUtjVXc5bUJWcmlKaU9kMnJCcGdnbnZKY2lDZFUwL28xTkhUZHZjeVo4QmdLWjFHNHlONmswMVNvRgp0QXhhb2VMakkyaXhlcThyK2Jtb2ZvdDV2dUMrNUxtQUYzaGVNQXFHTWhnVEp6KzNjeno1c1FXRnJ4cjdVMUdOCkRBSjBXdi84K3RiLy9YQzY5Z25OVTREL0pUV09FUjc3U2psaTh0RHNtdWs1YlhXZ2pLdlQxUXU0REowUXlOOVgKY3JVU0RER2dpWXJZdGYvWlF2V3g1VkJEZmwwQ2UwbDBJc0VGbXdJREFRQUJBb0lCQVFDU21JcGZBb1dFc3pnQwpKaW41eEJWRmM1UGFIbVpwR21lWTVNazFQWlR2UElKWXRsVnpoamoxSjVsYUpIWG4zKzB1dDg4YTM5NGZWWVVCCmN6bU1UcEZqQTgxUlNMeXU1NnJ0cGc3VFcwZUE3V2FMU2hQYU1XbnVNWHB0eXpXYndPWlg4RkdkSStvajZaYWwKUGVkVFN6cDg3V0ZGNWFkOEpNRzBrN20zWUpzeWRDVk9PelRlclNoUzRvQ2NRWXE5cmNzY2RyOFN1QmhNcFNWUApwejcxbFZSeXUwcUticEZGa25DNnp6UTlnSTFpZGtGd2pwL2NlQ2JTbjd0TjByYXBqVlkveno5WkU3N0lveDJSCjlJaXA1R09TZHVlbnpaS1JIZnB0VkV6Qi9MRFhwWUNlZFpsWWd6cElBSVhQTGY5eUQ5c2h5ZlEvOHRxTUFHV3UKc2VydFNWcTVBb0dCQVBqZ3RVVzhHRlRtek5kYUZ2Ry82dm9VSzNKaUtSc2ZYUW1VZEZWNXlWZEpCS283UDBIcQowZFdoSUtyMENJZWN6ZzQxL2FrbVc5dW4rbWw4TXpUMWJQZytld3EvVGhyRDZOVWc1WGl1YlZ6aWFZWlVTanVYCk55dUgzMS9MYXJ1MThFaDlvaXNDbzhrZ2orcC90cnk5dk5MVVBTRWo2ZlBRY0pBdGZJbHVGYXBGQW9HQkFPUUoKTXZkL01yNjFXR2tSZkpING5JMlFJR1M3elBpQVI5REQ5WkhBS1lxOUlYQTA5ZDdqQWdKVG1MeURhWDJVQWNCNwpIYVhkZHB4U1hYSXhTLzNhNzlsQWlWOHRPVngrb3FvNUgrd240VHZTQldrSlI0aUxwby92bmZnVVV2bndNZVkvCjMwcXVrdlJ3dU0yc3dZY0doUjZiV1dzRzNKbVB2bjJMZE1palE5NWZBb0dCQUxDL2JSMTBRdGR3L2dMbTBTcXAKQUtqUDBEY3dyVDY4M0dja1RpWXlFcUp4a2VXUHBCSWRRUjUxaXV5OTJKenU2SXZCSGorVnBXRHUvL0VRS3BHdQp4cy9hRjZuL1NPbkxQankyV3lHRXh0aFRWMXYxMnE1TmF2bjRTZFFQYytLUmlHOERBanVIYVdnNlB0cnNEb3dtCk44YUd3azhaNFZtdEszUEpTZ3VUNmNEOUFvR0FiS1c1WTlSMTRBbFZJMUpTa05YcitVTFhQRWVDUkZBU1ozUkcKTjNoZ0VwdEVLRXNEYm51b1JHV0NHeWRkaHBpVE1SczNxQVJaYytlR1lGYitodWZlYVJ0bm1ESmE1eWZxNXNHcQo1UUNuUHJJMUk3TnBJclN1Mmx0blg0Q0hmRkFsNWpjK2N6MjBCTVVFTi9KOGpwSGJzUmFCUnc0UTR4VnF4RFJDCm95bXV0MjhDZ1lFQXh4OGg5R2JlMVlJYmYvTjE1ZzdjUWhSd3FuWUdsYVVseGVNSXN6OGIweWlFTzhuL2lHVmoKZlI0aFhyVkNEczFqU3pkb3EvUkJCRkd1VEs1eDZ1NVBpVGlwc2RHRk94QUgwTy94QnBjakNqT1RBRGpXWDNDRwp4VFN5ejc3bjhJdTQzbHlTZzJhaStGZDBiOHMxc296TEJ6SXJ1cnhZcEo2L2N2WWdzNlQvSzMwPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo="

The information in the client-certificate-data and the client-key-data can be obtained using:

cat /home/ubuntu/.minikube/profiles/minikube/client.crt | base64 | tr "\n" " " | sed 's/ //g'
cat /home/ubuntu/.minikube/profiles/minikube/client.key | base64 | tr "\n" " " | sed 's/ //g'

Save this file and pass it for remote access to the Kubernetes cluster. For example, if the file was saved with the name minikube_admin.conf you may use:

kubectl --kubeconfig minikube_admin.conf get pods -A
# NAMESPACE              NAME                                         READY   STATUS    RESTARTS   AGE
# kube-system            coredns-558bd4d5db-2whdk                     1/1     Running   4          54d
# kube-system            etcd-minikube                                1/1     Running   4          54d
# kube-system            kube-apiserver-minikube                      1/1     Running   4          54d
# kube-system            kube-controller-manager-minikube             1/1     Running   4          54d
# kube-system            kube-proxy-gc2sl                             1/1     Running   4          54d
# kube-system            kube-scheduler-minikube                      1/1     Running   4          54d
# kube-system            storage-provisioner                          1/1     Running   8          54d
# kube-system            tiller-deploy-867946c76c-4shmg               1/1     Running   0          5d13h
# kubernetes-dashboard   dashboard-metrics-scraper-7976b667d4-vqmjp   1/1     Running   4          53d
# kubernetes-dashboard   kubernetes-dashboard-6fcdf4f6d-hw2qm         1/1     Running   6          53d
# metallb-system         controller-66bc445b99-68w6m                  1/1     Running   3          53d
# metallb-system         speaker-lrcw7                                1/1     Running   3          53d
⚠️ **GitHub.com Fallback** ⚠️