K3s part 2: Create a single node cluster
To start testing with k3s, keep it simple, only create one node. You can add more nodes later. You can deploy it anywhere you like, just follow the documentation. Abbreviated notes are below for generic hosts, and detailed instructions for DigitalOcean droplets.
Install k3s on a generic host
If you already have a provisioned Linux server, or Virtual Machine, you can install k3s on it, with a single command.
Before installing, you should know that pods will store data in volumes created
in the directory /var/lib/rancher/k3s/storage
. You should create this
directory prior to install, and optionally mount whatever storage volume you
want to have available, on that path. Otherwise, this directory will live on the
root filesystem, which might be too small.
You need to add options to the k3s installer command, so as to not start Traefik. Traefik will be installed later by yourself, using an updated version, rather than the one that is bundled with k3s. The k3s installer command is:
## Example k3s install command to run on any server:
curl -sfL https://get.k3s.io | sh -s - server --disable traefik
You can also use k3sup from your workstation, to install k3s on any machine you have SSH access to, and this will automatically download the key to your workstation:
SSH_IP_ADDRESS=x.x.x.x
KUBE_CONFIG=${HOME}/.kube/config
mkdir -p ${HOME}/.kube
k3sup install --ip ${SSH_IP_ADDRESS} --local-path ${KUBE_CONFIG} \
--k3s-extra-args '--disable traefik'
Create k3s Droplet on DigitalOcean
-
Create a Debian (
10 x64
) droplet on DigitalOcean- $20/mo 4GB RAM (tested configuration, 2GB might work minimally.)
- Optional: Add a block storage volume for pod data.
- You choose how much space you need for all of your pods.
- If you don’t add a volume, pod storage will live on the root filesystem
of the droplet. (
/var/lib/rancher/k3s/storage
)
- Enter the following script into the
User data
section of the droplet creation screen:
#!/bin/bash VOLUME=/dev/sda mkdir -p /var/lib/rancher/k3s/storage umount ${VOLUME} if (blkid ${VOLUME}); then yes | mkfs.ext4 ${VOLUME} echo "${VOLUME} /var/lib/rancher/k3s/storage " \ "ext4 defaults,nofail,discard 0 0" | sudo tee /etc/fstab mount ${VOLUME} fi apt-get update -y apt-get install -y curl ufw ## UFW firewall rules ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw allow 6443/tcp ufw allow 2222/tcp ufw enable systemctl enable --now ufw ## k3s install curl -sfL https://get.k3s.io | sh -s - server --disable traefik cat /etc/rancher/k3s/k3s.yaml | \ sed "s/127.0.0.1/$(hostname -I | cut -d ' ' -f 1)/g" \ > /etc/rancher/k3s/k3s.external.yaml && \ chmod 0600 /etc/rancher/k3s/k3s.external.yaml
-
Assign your workstation’s ssh client key to the droplet, to allow remote management. Click
New SSH Key
if you haven’t uploaded one yet. -
Choose a hostname, like
k3s-flux
. -
Confirm the details and click
Create Droplet
. -
Note that the script has already installed k3s for you, and mounted the storage volume, so you don’t need to do anything else on the server, it’s ready to go.
-
Assign a floating IP address to your new droplet.
-
Create wildcard DNS names pointing to your droplet’s floating IP address (
*.k3s.example.com
). To use that link, requires that your domain uses DigitalOcean nameservers, tied to your account. Alternatively, you may set this up with any DNS provider that you use instead.
Download Cluster API Key
To access the cluster from your workstation, you must download the API key from
the k3s server. If you used k3sup
to create your cluster, you can skip this,
k3sup did it for you. Otherwise, set a temporary variable for the the floating
IP address of the server, and the desired path to store the cluster key.
FLOATING_IP=X.X.X.X
export KUBECONFIG=${HOME}/.kube/config
Download the key from the cluster. If you installed on DigitalOcean this will work for you:
mkdir -p ${HOME}/.kube
ssh ${FLOATING_IP} -l root -o StrictHostKeyChecking=no \
cat /etc/rancher/k3s/k3s.external.yaml > ${KUBECONFIG}
(If you installed to a generic host, you must copy /etc/rancher/k3s/k3s.yaml
from the server, to your client, and edit the 127.0.0.1
IP address replacing
it to be the public IP address of the server node, NOT the floating IP, which
the cluster key is not signed for.)
- Test kubectl access with the key:
kubectl get node -o wide
(It should print the node status as Ready
once k3s finishes initialization. The name of the node displayed, should be the same hostname you created on the droplet page.)
If you set KUBECONFIG
to anything other than the default
($HOME/.kube/config
) you should add it to your ~/.bashrc
file.
export KUBECONFIG=${HOME}/.kube/config
You can discuss this blog on Matrix (Element): #blog-rymcg-tech:enigmacurry.com
This blog is copyright EnigmaCurry and dual-licensed CC-BY-SA and MIT. The source is on github: enigmacurry/blog.rymcg.tech and PRs are welcome. ❤️