K3s multi-node install

3 MINUTE READ

Big picture

This tutorial gets you a multi node K3s cluster with Calico in approximately 10 minutes.

Value

K3s is a lightweight implementation of Kubernetes packeged as a single binary.

Before you begin

  • Make sure you have a linux host that meets the following requirements
    • x86-64 processor
    • 1CPU
    • 1GB Ram
    • 10GB free disk space
    • Ubuntu 16.04 (amd64), Ubuntu 18.04 (amd64), Ubuntu 20.04 (amd64)

Note: K3s supports ARM proccessors too, this tutorial was tested against x86-64 processor environment. For more detail please visit this link.

How to

Initializing master instance

K3s installation script can be modified by environment variables. Here you are providing some extra arguments in order to disable flannel and change the pod ip CIDR.

Note: Full list of arguments can be viewed at this link.

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-backend=none --cluster-cidr=192.168.0.0/16" sh -

Note: If 192.168.0.0/16 is already in use within your network you must select a different pod network CIDR by replacing 192.168.0.0/16 in the above command.

Enable remote access to your K3s instance

In order to setup remote access to your cluster first ensure you have installed kubectl on your system.

Note: If you are not sure how to install kubectl in your OS visit this link.

K3s stores a kubeconfig file in your server at /etc/rancher/k3s/k3s.yaml, copy all the content of k3s.yaml from your server into ~/.kube/config on the system that you like to have remote access to the cluster.

Add extra nodes to K3s cluster

In order to add additional nodes to your cluster you need two piece of information.

  • K3S_URL which is going to be your main node ip address.
  • K3S_TOKEN which is stored in /var/lib/rancher/k3s/server/node-token file in main Node (Step 1). Execute following command in your node instance and join it to the cluster.

Note: Remember to change serverip and mytoken.

   curl -sfL https://get.k3s.io | K3S_URL=https://serverip:6443 K3S_TOKEN=mytoken sh -

Install Calico

Install the Calico operator and custom resource definitions.

   kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml

Install Calico by creating the necessary custom resource. For more information on configuration options available in this manifest, see the installation reference.

   kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

Note: Before creating this manifest, read its contents and make sure its settings are correct for your environment. For example, you may need to change the default IP pool CIDR to match your pod network CIDR.

Install Calico by using the following command.

   kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Note: You can also view the YAML in a new tab.

You should see the following output.

    configmap/calico-config created
    customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
    customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
    clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
    clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
    clusterrole.rbac.authorization.k8s.io/calico-node created
    clusterrolebinding.rbac.authorization.k8s.io/calico-node created
    daemonset.apps/calico-node created
    serviceaccount/calico-node created
    deployment.apps/calico-kube-controllers created
    serviceaccount/calico-kube-controllers created

Check the installation

  1. Confirm that all of the pods are running using the following command.

    watch kubectl get pods --all-namespaces
    

    Wait until each pod shows the STATUS of Running.

    NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
    kube-system   calico-node-9hn9z                 1/1     Running   0          23m
    kube-system   local-path-provisioner-6d59f47c7-drznc     1/1     Running   0          38m
    kube-system   calico-kube-controllers-789f6df884-928lt   1/1     Running   0          23m
    kube-system   metrics-server-7566d596c8-qxlfz            1/1     Running   0          38m
    kube-system   coredns-8655855d6-blzl5                    1/1     Running   0          38m
    

    Press CTRL+C to exit watch.

  2. Confirm that you now have two nodes in your cluster with the following command.

    kubectl get nodes -o wide
    

    It should return something like the following.

    NAME         STATUS   ROLES    AGE   VERSION        INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
    k3s-master   Ready    master   40m   v1.18.2+k3s1   172.16.2.128   <none>        Ubuntu 18.04.3 LTS   4.15.0-101-generic   containerd://1.3.3-k3s2
    k3s-node1    Ready    <none>   30m   v1.18.2+k3s1   172.16.2.129   <none>        Ubuntu 18.04.3 LTS   4.15.0-101-generic   containerd://1.3.3-k3s2
    

Congratulations! You now have a multi node K3s cluster equipped with Calico and Traefik.

Next steps