K3s, which is only 40MB in size, provides a good choice for enterprises that want to save cost for development and testing. In a very simple way, this article will teach you to deploy a lightweight Kubernetes cluster in 5 minutes using k3s.
This article comes from: Rancher Labs
Kubernetes has changed how to deploy and manage containerized workloads on a large scale. Now developers are faced with the challenges of the complexity of the setup process and huge resource requirements. If you are plagued by insufficient memory and want to deploy a lightweight kubernetes cluster to reduce memory consumption, you must consider the lightweight kubernetes distribution, k3s, released by Rancher Labs. It packs all the files needed to install kubernetes into a 40MB binary file, which only needs 512MB RAM to run. It is very suitable for environments with limited resources, such as edge computing scenarios, IoT, etc.
In the actual scenario, in order to obtain the power of development and testing and save the cost, users hope to deploy Kubernetes with the least resource utilization and lower hardware specifications. k3s meets this demand. It can run clusters on any device with more than 512MB RAM, such as IoT devices or ARM driven devices.
Since k3s only needs a small amount of resources to run, this means that some features of Kubernetes have been removed:
-
Old, non default, alpha features
-
Most in tree plug-ins (cloud providers and storage plug-ins) are replaced with add ons
-
Using sqlite instead of etcd as the default storage mechanism
Deploy lightweight K8s cluster with k3s in 5 minutes
In this article, I'll use three servers running on Debian 10, each with 1GB of RAM and 1vcpu. One server is the master and the other two are the worker nodes.
$ openstack server list +--------------------------------------+-------------------+---------+-----------------------------------+-----------+-----------+ | ID | Name | Status | Networks | Image | Flavor | +--------------------------------------+-------------------+---------+-----------------------------------+-----------+-----------+ | 4df6a6dc-26e8-4ae0-8b6e-2f97daec0ef3 | k3s-master | ACTIVE | private=10.10.1.159 | Debian-10 | m1.tiny | | 5ca13239-b745-4f62-ab11-0a27949c9b35 | k3s-node02 | ACTIVE | private=10.10.1.142 | Debian-10 | m1.tiny | | a54997f2-4d94-4718-86ab-73609b328761 | k3s-node01 | ACTIVE | private=10.10.1.126 | Debian-10 | m1.tiny | +--------------------------------------+-------------------+---------+-----------------------------------+-----------+-----------+
I will add A record for each server in the / etc / hosts file.
sudo tee -a /etc/hosts<<EOF 10.10.1.159 k3s-master 10.10.1.126 k3s-node01 10.10.1.142 k3s-node02 EOF
Install k3s on the Master node
There are many ways to run k3s. The fastest way is to install it through the bash script provided. At the same time, the script provides a convenient way to install it to systemd or openrc.
curl -sfL https://get.k3s.io | sh -
Install output:
[INFO] Finding latest release [INFO] Using v0.8.1 as release [INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v0.8.1/sha256sum-amd64.txt [INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v0.8.1/k3s [INFO] Verifying binary download [INFO] Installing k3s to /usr/local/bin/k3s [INFO] Creating /usr/local/bin/kubectl symlink to k3s [INFO] Creating /usr/local/bin/crictl symlink to k3s [INFO] Creating /usr/local/bin/ctr symlink to k3s [INFO] Creating killall script /usr/local/bin/k3s-killall.sh [INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh [INFO] env: Creating environment file /etc/systemd/system/k3s.service.env [INFO] systemd: Creating service file /etc/systemd/system/k3s.service [INFO] systemd: Enabling k3s unit Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service. [INFO] systemd: Starting k3s
After the installation is complete, the service starts automatically.
$ systemctl status k3s ● k3s.service - Lightweight Kubernetes Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2019-09-17 19:20:00 UTC; 2min 24s ago Docs: https://k3s.io Process: 833 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS) Process: 836 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Main PID: 837 (k3s-server) Tasks: 98 Memory: 571.1M CGroup: /system.slice/k3s.service ├─ 837 /usr/local/bin/k3s server KillMode=process ├─ 851 containerd -c /var/lib/rancher/k3s/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/conta ├─1110 containerd-shim -namespace k8s.io -workdir /var/lib/rancher/k3s/agent/containerd/io.containerd.runtime.v1.linux/k8s.io/f6eeb59978 ├─1127 /pause ├─1207 containerd-shim -namespace k8s.io -workdir /var/lib/rancher/k3s/agent/containerd/io.containerd.runtime.v1.linux/k8s.io/0baf0ca181 ├─1225 /coredns -conf /etc/coredns/Corefile ├─1576 containerd-shim -namespace k8s.io -workdir /var/lib/rancher/k3s/agent/containerd/io.containerd.runtime.v1.linux/k8s.io/dcce4b7e17 ├─1594 /pause ├─1599 containerd-shim -namespace k8s.io -workdir /var/lib/rancher/k3s/agent/containerd/io.containerd.runtime.v1.linux/k8s.io/50816ffba8 ├─1617 /pause ├─1824 containerd-shim -namespace k8s.io -workdir /var/lib/rancher/k3s/agent/containerd/io.containerd.runtime.v1.linux/k8s.io/d0ff393609 ├─1842 /bin/sh /usr/bin/entry ├─1882 containerd-shim -namespace k8s.io -workdir /var/lib/rancher/k3s/agent/containerd/io.containerd.runtime.v1.linux/k8s.io/046779175f ├─1899 /bin/sh /usr/bin/entry ├─1904 containerd-shim -namespace k8s.io -workdir /var/lib/rancher/k3s/agent/containerd/io.containerd.runtime.v1.linux/k8s.io/93f0fe2361 └─1921 /traefik --configfile=/config/traefik.toml Sep 17 19:20:34 deb10 k3s[837]: E0917 19:20:34.714229 837 daemon_controller.go:302] kube-system/svclb-traefik failed with : error storing statu Sep 17 19:20:34 deb10 k3s[837]: E0917 19:20:34.719452 837 daemon_controller.go:302] kube-system/svclb-traefik failed with : error storing statu Sep 17 19:20:34 deb10 k3s[837]: I0917 19:20:34.726816 837 reconciler.go:207] operationExecutor.VerifyControllerAttachedVolume started for volum Sep 17 19:20:34 deb10 k3s[837]: I0917 19:20:34.726836 837 reconciler.go:207] operationExecutor.VerifyControllerAttachedVolume started for volum Sep 17 19:20:34 deb10 k3s[837]: I0917 19:20:34.726857 837 reconciler.go:207] operationExecutor.VerifyControllerAttachedVolume started for volum Sep 17 19:20:34 deb10 k3s[837]: I0917 19:20:34.726869 837 reconciler.go:207] operationExecutor.VerifyControllerAttachedVolume started for volum Sep 17 19:20:35 deb10 k3s[837]: I0917 19:20:35.529102 837 reconciler.go:181] operationExecutor.UnmountVolume started for volume "helm-traefik-t Sep 17 19:20:35 deb10 k3s[837]: I0917 19:20:35.542858 837 operation_generator.go:799] UnmountVolume.TearDown succeeded for volume "kubernetes.i Sep 17 19:20:35 deb10 k3s[837]: I0917 19:20:35.629277 837 reconciler.go:285] Volume detached for volume "helm-traefik-token-kjwrl" (UniqueName: Sep 17 19:20:36 deb10 k3s[837]: W0917 19:20:36.355273 837 pod_container_deletor.go:75] Container "2f0c4a787b13c029d65aa865c1b473f5a7497cb6f9b92
Write the kubeconfig file to / etc/rancher/k3s/k3s.yaml:
$ cat /etc/rancher/k3s/k3s.yaml cat: /etc/rancher/k3s/k3s.yaml: Permission denied debian@deb10:~$ sudo cat /etc/rancher/k3s/k3s.yaml apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJWakNCL3FBREFnRUNBZ0VBTUFvR0NDcUdTTTQ5QkFNQ01DTXhJVEFmQmdOVkJBTU1HR3N6Y3kxelpYSjIKWlhJdFkyRkFNVFUyT0RjME56azVOakFlRncweE9UQTVNVGN4T1RFNU5UWmFGdzB5T1RBNU1UUXhPVEU1TlRaYQpNQ014SVRBZkJnTlZCQU1NR0dzemN5MXpaWEoyWlhJdFkyRkFNVFUyT0RjME56azVOakJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQkM5aTMyUTdkVnhJaTFCVFNEOTRqYzJaZy9ESHFGc051b0Q4eWhSbjZsUlIKQWp5Q0p3UEZYQ3Y4QUdSMmFaK1lSempTYUJvM2M1LzMwQnZwKzY3OFNYeWpJekFoTUE0R0ExVWREd0VCL3dRRQpBd0lDcERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFvR0NDcUdTTTQ5QkFNQ0EwY0FNRVFDSUJwTXdOejAyZzUwCkExdEloU0Y1MFJqSVprVVVuNk8rODdLV25obWRUYkh5QWlBQnJqcDFxWU1HcWE0RmJ2Ym9rTm1kM3VOelVvQm8KeGxqTGlnWnZCN3ZEVGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== server: https://localhost:6443 name: default contexts: - context: cluster: default user: default name: default current-context: default kind: Config preferences: {} users: - name: default user: password: 2d99cae31c075743be704bb717ceaae8 username: admin
Other installed ones are:
-
kubectl
-
crictl
-
k3s-killall.sh
-
k3s-uninstall.sh
Install k3s on Worker node
To install k3s on the Woker node, we should pass the k3s'url along with the k3s'token or k3s'cluster'secret environment variable.
K3S_TOKEN is created in / var / lib / lancher / k3s / server / node token on the first node.
$ sudo cat /var/lib/rancher/k3s/server/node-token K1042e2f8e353b9409472c1e0cca8457abe184dc7be3f0805109e92c50c193ceb42::node:c83acbf89a7de7026d6f6928dc270028
So in order to install Kubernetes on the worker node, I will run:
k3s_url="https://k3s-master:6443" k3s_token="K1042e2f8e353b9409472c1e0cca8457abe184dc7be3f0805109e92c50c193ceb42::node:c83acbf89a7de7026d6f6928dc270028" curl -sfL https://get.k3s.io | K3S_URL=${k3s_url} K3S_TOKEN=${k3s_token} sh -
Install output:
[INFO] Finding latest release [INFO] Using v0.8.1 as release [INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v0.8.1/sha256sum-amd64.txt [INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v0.8.1/k3s [INFO] Verifying binary download [INFO] Installing k3s to /usr/local/bin/k3s [INFO] Creating /usr/local/bin/kubectl symlink to k3s [INFO] Creating /usr/local/bin/crictl symlink to k3s [INFO] Creating /usr/local/bin/ctr symlink to k3s [INFO] Creating killall script /usr/local/bin/k3s-killall.sh [INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh [INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env [INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service [INFO] systemd: Enabling k3s-agent unit Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service. [INFO] systemd: Starting k3s-agent
Log in to one of the master nodes and check the cluster status:
$ sudo kubectl config get-clusters NAME default $ sudo kubectl cluster-info Kubernetes master is running at https://localhost:6443 CoreDNS is running at https://localhost:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy $ sudo kubectl get nodes NAME STATUS ROLES AGE VERSION k3s-master Ready master 14m v1.14.6-k3s.1 k3s-node01 Ready worker 3m11s v1.14.6-k3s.1 k3s-node02 Ready worker 3m58s v1.14.6-k3s.1 $ sudo kubectl get namespaces NAME STATUS AGE default Active 16m kube-node-lease Active 16m kube-public Active 16m kube-system Active 16m $ sudo kubectl get endpoints -n kube-system NAME ENDPOINTS AGE kube-dns 10.42.0.2:53,10.42.0.2:53,10.42.0.2:9153 14m traefik 10.42.0.5:80,10.42.0.5:443 14m $ sudo kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-b7464766c-q9frk 1/1 Running 0 15m helm-install-traefik-8dhpk 0/1 Completed 0 15m svclb-traefik-9c2j8 2/2 Running 0 4m49s svclb-traefik-bf9zd 2/2 Running 0 4m2s svclb-traefik-v2fpx 2/2 Running 0 14m traefik-5c79b789c5-k589d 1/1 Running 0 14m
Use the crictl command to view running containers
# Master $ sudo crictl ps CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT POD ID acfafb50852d3 18471c10e6e4b 16 minutes ago Running traefik 0 bf8534452389f fee5ac7e88f2e 4a065d8dfa588 16 minutes ago Running lb-port-443 0 e7068ff7ab2f2 bbab5b07e5efb 4a065d8dfa588 16 minutes ago Running lb-port-80 0 e7068ff7ab2f2 65c5d1333ea04 2ee68ed074c6e 16 minutes ago Running coredns 0 435c51f4716fc # Workers $ sudo crictl ps CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT POD ID 7ad5c83d6466f 4a065d8dfa588 6 minutes ago Running lb-port-443 0 bf8d9fe57c3f3 c1380eabc0b33 4a065d8dfa588 6 minutes ago Running lb-port-80 0 bf8d9fe57c3f3
It's done! If you need more advanced configuration, please refer to the k3s documentation: