Kubernetes Made Simple with K3S
Tags: kubernetes, k3s, tutorial
Published: 2020-07-27 16:47:03


Creating a Kubernetes Cluster from scratch seemed like a daunting task to me. And then I discovered the [lightweight Kubernetes distribution K3S](https://k3s.io/): Creating a cluster with an on-line command per Node! Here is the tutorial for you to follow along.

_This article originally appeared at [my blog](https://admantium.com/blog/kube01_setup_lightweight_kubernetes/)_.

## Required Hardware

For this tutorial, you need three different types of hardware.

- controller: Your laptop/PC to bootstrap the installation
- k3s-server: A node designated as the server
- k3s-nodes: Nodes designated as worker

For simplicity, I created cloud computing servers with the following specs.

- k3s-server: 1 CPU, 2 GB RAM
- k3s-node1: 2 CPUs, 4GB RAM
- k3s-node2: 2 CPUs, 4GB RAM

Be sure to have SSH access to each node.

## Prepare the Controller

Using MaxOsX, you execute:

```sh
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
curl -sLS https://get.k3sup.dev | sh
```

## Install K3S

Install K3S on the server node first.

```sh
k3sup install --ip $SERVER_IP --user $USER
```

```sh
cp ${pwd}kubeconfig ~/.kubeconfig
export KUBECONFIG=~/.kubeconfig
```

Then, install K3S on all worker nodes.

```sh
k3sup join --ip $NODE_IP --server-ip $SERVER_IP --user $USERNAME
```

If all goes well, try the `kubectl` command to see your nodes:

```sh
kubectl get node -o wide
NAME         STATUS   ROLES    AGE   VERSION        INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                       KERNEL-VERSION   CONTAINER-RUNTIME
k3s-node1    Ready    <none>   14h   v1.17.2+k3s1   49.12.45.26    <none>        Debian GNU/Linux 10 (buster)   4.19.0-8-amd64   containerd://1.3.3-k3s1
k3s-server   Ready    master   14h   v1.17.2+k3s1   49.12.45.6     <none>        Debian GNU/Linux 10 (buster)   4.19.0-8-amd64   containerd://1.3.3-k3s1
k3s-node2    Ready    <none>   14h   v1.17.2+k3s1   49.12.64.126   <none>        Debian GNU/Linux 10 (buster)   4.19.0-8-amd64   containerd://1.3.3-k3s1
```

With these steps, the basic Kubernetes installation is done. Did you check your stopwatch?

### Install Dashboard

Then install the dashboard.

```sh
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
```

Store the following configuration in a file called `dashboard_accounts.yml`.

```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
---
```

Then create these roles.

```sh
kubectl apply -f dashboard_accounts.yml
```

If all goes well, the final steps are to create a local proxy server and get the access token.

```sh
kubectl proxy&
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user-token | awk '{print $1}')
```

Then, access the dashboard in your browser on [localhost:8001/api](http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login).

![](https://admantium.com/images/blog/kube01_dashboard.png)

## Conclusion

This article showed you how to install Kubernetes with the lightweight distribution K3S. With simple one-line shell scripts, you have working cluster in a very short time. If you want to customize this installation, there are lots of [configuration options] you can apply, for example if your containers are executed with [containerd](https://containerd.io/) or Docker, or whether you want to use Nginx or [Traefik](https://docs.traefik.io/) as your ingress controller. In the next tutorials, I will show you how the setup TLS encryption for your services, and how to deploy a private Docker registry so you can run private Containers with your Kubernetes.