Skip to content

EarthAkkharawat/sds-project

Repository files navigation

sds-project

Kubernetes cluster at the edge deployed on Raspberry Pi, utilizing the lightweight k3s, and orchestrated with the assistance of k3sup

Contents

How to set up Kubernetes cluster

List of hardwares 🖥️

  • Master Nodes

    • 2x Ubuntu 22.04 live-server installed VM
  • Worker Nodes

    • 4x Raspberry Pi 4
  • Networking

    • TL-WR841N Router
    • 4x LAN Cable

Prerequisites 📝

Install k3sup

via curl

curl -sLS https://get.k3sup.dev | sh
sudo install k3sup /usr/local/bin/

via brew

brew install k3sup

Config static IP via DHCP

In these project, I setup router as WISP mode, for receiving internet hotspot from my phone, and distribute it to all nodes, so that they can access internet.

Following this Documents to do on your own.

Then, you can continue reserving static IP for each node, by matching thier MAC address to IP address.

VM configuration

Nothing special, just make sure you have IP address on Bridged mode network, so they can acccess to internet and communicate with each other in the same network as Raspberry Pi.

Raspberry Pi configuration

hostname

change hostname via GUI, as every node must have unique hostname.

sudo raspi-config
Sudo with no password

permit user pi to not use password when using sudo by

sudo visudo

then append these below lines at the end of file,

pi ALL=(ALL) NOPASSWD: ALL
bootup

Enable container features in the kernel, by editing /boot/cmdline.txt

Add the following to the end of the line:

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

then, reboot it.

sudo reboot

SSH-key management (Optional)

for coveninence, we will use ssh-copy-id to copy ssh-key to all nodes, since k3sup does not support password input or variable.

So, your need to copy all ssh-key in every instances to local, the machine that run k3sup.

ssh-copy-id <user>@<ip>

if it's error, then you need to generate ssh-key first.

ssh-keygen

Provision Cluster 🚀

Config node.json likes,

[
  {
    "hostname": "master1",
    "ip": "192.168.0.104"
  },
  {
    "hostname": "master2",
    "ip": "192.168.0.105"
  },
  {
    "hostname": "jindamanee",
    "ip": "192.168.0.100"
  },
  {
    "hostname": "cream",
    "ip": "192.168.0.101"
  },
  {
    "hostname": "earth",
    "ip": "192.168.0.102"
  },
  {
    "hostname": "singto",
    "ip": "192.168.0.103"
  }
]

Run k3sup plan via makefile.

make plan

Customize your bootstrap.sh, since k3sup plan api does not satisfy our setup, then run it.

./bootstrap.sh

More detail on Customizing bootstrap.sh, you can use my Makefile as a reference. there is a top-level controller config, called server-args , that acheive these below.

  • Detecting toleration of worker node from 5 min -> 10 s
  • Taint master node to not allow application's pod to be scheduled on it, since they are ARM image.

If nothing failed, then copy kubeconfig to local, for monitoring cluster.

export KUBECONFIG=`pwd`/kubeconfig
kubectl get node -o wide

Finish, you can deploy application now :)

Debugging or Troubleshooting 🔧

View logs output

for master nodes

sudo systemctl status k3s

for worker nodes

sudo systemctl status k3s-agent
Uninstalling

remove k3s over whole cluster

/usr/local/bin/k3s-killall.sh

Uninstall server, master node

/usr/local/bin/k3s-uninstall.sh

Uninstall agent, worker node

/usr/local/bin/k3s-agent-uninstall.sh

How to deploy application

Build Docker images of each services and push them to Docker Hub using these specific names. This process utilizes GitHub Actions for the automation of build processes and the pushing of images to the Docker Hub repository. The source code of configuration files for a GitHub Actions workflow are in .github -> workflows

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published