Minimal K8s Cluster Using K0s
Table of Contents
Today I will show you the power of minimalism⌗
- at first we will talk about Kubernetes a bit
- then we will talk about what is k0s and comparing it to it’s alternatives
- next I will show you two simple example of making a cluster on a single node or using
k0sctl
Before reading this section you should have a bit knowledge about docker
Let’s talk about Kubernetes a bit⌗
K8s is a container orchestrator it’s like a conductor for containers to manage your cluster and for example decide witch container should go where.
in Kubernetes we are not interacting with containers directly we have lots of resources they have they own usage to fit in all of your scenarios. if you need a resource type that you need and it’s not inside kubernetes by default we have CustomResourceDefinitions
in K8s our tiniest resource is Pod
, this resource can contain one or more containers inside it.
but we are not going to create them most of the times we will apply Deployment
, StatefulSet
, DaemonSet
, etc.
I can’t talk about all of them here but if you don’t have a knowledge about them go and checkout Kubernetes Website
K0s⌗
k0s is a minimal kubernetes cluster they call it The Zero Friction Kubernetes made by mirantis the creator of Lens kubernetes IDE
instead of docker
k0s is using raw containerd
this will make it hard sometimes but images are fully compatible with each other because the manifest of images in all of the container runtimes are standard
I think it also give you an option to apply helm charts with it’s own CustomResourceDefinitions
so using containerd
makes it a lot smaller
but why not using normal Kubernetes?⌗
when you want a cluster to be easy to run and being small in size and work with low hardware usage a normal K8s cluster is not what we want they made K8s as minimal as possible by keeping it’s stability
For example a Raspberry Pi Cluster
what are the alternatives to K0s?⌗
I have tried all of them but K0s was more easy and more productive
Requirements?⌗
It works in everywhere but for more details check out this link
Let’s install a sample cluster⌗
- install any Linux-Based Operating System on your nodes
- then select one of the installation ways (Single Node, k0sctl, Raspberry Pi 4, Ansible, etc.)
Now I will show you
Single Node
andk0sctl
since they are recommended
the instructions below is from the official documents with a bit of my experience on top of that
- Single Node
you should run all of the commands as root user or using
sudo
at first we need to install k0s binary (it’s the only thing that we will install on nodes in everyway of installation) by running command below on our node:
curl -sSLf https://get.k0s.sh | sudo sh
Drink a coffee until installation finishes
confirm the installation by running k0s
command without any option it will show you help of the k0s command
k0s install
command is used when installing a node
run the command below to install it as a single node cluster
k0s install controller --single
to start it run the command below
k0s start
command below will show you status of the cluster
k0s status
k0s kubectl
is used for interacting with your cluster
if you want kubeconfig
file it’s in /var/lib/k0s/pki/admin.conf
- k0sctl
if you have production usage or automation on top of your installation you need this type of installation
the picture below will show you how k0sctl
works
first we need to install k0sctl command; just go to this link and grab a binary that is compatible with your Operating System and put it in one of the directories that is listed inside your $PATH
don’t install it inside you target nodes
first we need access to root user of the nodes (putting your ssh-key
should be enough) make sure you can access to all nodes without entering you ssh password.
next run the command below to create a sample file and then modify it
k0sctl init > k0sctl.yaml
open k0sctl.yaml
file with the editor that you love :)
the file will be something like this:
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s-cluster
spec:
hosts:
- role: controller
ssh:
address: 10.0.0.1 # replace with the controller's IP address
user: root
keyPath: ~/.ssh/id_rsa
- role: worker
ssh:
address: 10.0.0.2 # replace with the worker's IP address
user: root
keyPath: ~/.ssh/id_rsa
hosts
section is an array of your host add them as many as you wantkeyPath
is the address of your ssh private keyrole
can be one of:controller
- a controller hostcontroller+worker
- a controller host that will also run workloadssingle
- a single-node cluster host, the configuration can only contain one hostworker
- a worker host
sometimes
controller+worker
option will not make node to accept workloads I will show you how you can fix it later on
more info on the configuration file is here
when your configuration file is ready run the command below
k0sctl apply --config k0sctl.yaml
this will install and deploy your cluster
to access your cluster run the command below to get your kubeconfig
k0sctl kubeconfig > kubeconfig
this command will put it inside a file called kubeconfig
checkout your cluster status by running
kubectl --kubeconfig kubeconfig get all -A
and
kubectl --kubeconfig kubeconfig get nodes
if you specified controller+worker
but workloads are pending run the command below
kubectl --kubeconfig kubeconfig taint nodes controlplane node-role.kubernetes.io/master:NoSchedule-
some notes:
k0sctl
can only add more nodes to the cluster. It cannot remove existing nodes.- running
k0sctl apply
again command will just apply changes to the cluster.
recommended post-installation steps⌗
- installing
metallb
inside cluster - installing an
ingress controller
- deploy some great open-source projects and make your own cloud ;)