Skip to content

Instantly share code, notes, and snippets.

@CHIP0K
Last active May 20, 2025 11:42
Show Gist options
  • Save CHIP0K/1b16853688733f99d228f6c4edae4dcd to your computer and use it in GitHub Desktop.
Save CHIP0K/1b16853688733f99d228f6c4edae4dcd to your computer and use it in GitHub Desktop.
k3s cluster demo

K3s кластер deмо

Оточення

# master
k3s-node-fra1-01 pub_net: eth0:164.92.228.17 priv_net: eth1:10.114.0.97
# workers
k3s-node-fra1-02 pub_net: eth0:142.93.162.154 priv_net: eth1:10.114.0.94
k3s-node-fra1-03 pub_net: eth0:165.22.19.3 priv_net: eth1:10.114.0.95
# all nodes
apt update && apt upgrade -y

swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab

# Встанови curl та інші утиліти
apt update && apt install -y curl

# Встанови iptables legacy (якщо iptables-nft дає проблеми)
update-alternatives --set iptables /usr/sbin/iptables-legacy

Main k3s-node-fra1-01

# Встановлюємо необхідні змінні
export PUBLIC_NODE_IP=$(hostname -I | awk '{print $1}')
export LOCAL_NODE_IP=$(hostname -I | awk '{print $3}')
export K3S_KUBECONFIG_MODE="600"
                           
# Встановлюємо k3s
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=" --node-ip=${LOCAL_NODE_IP} \
                                --node-external-ip=${PUBLIC_NODE_IP} \
                                --advertise-address=${LOCAL_NODE_IP} \
                                --tls-san=${PUBLIC_NODE_IP}" sh -s -

# Перевіряємо статус k3s, та перевіряємо що сервіс enabled, якщо ні то включаємо systemctl enable k3s
systemctl status k3s
systemctl enable k3s

# Для зручності роботи з kubectl, налаштовуємо kubectl
mkdir -p ~/.kube
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
chown $(id -u):$(id -g) ~/.kube/config
echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
source ~/.bashrc

# Перевіряємо kubectl
kubectl get nodes

# отримаємо токен для підключення до кластеруі збережемо його для подальшого використання
K3S_TOKEN=$(cat /var/lib/rancher/k3s/server/node-token)
echo $K3S_TOKEN

Налаштовуємо workers k3s-node-fra1-02 та k3s-node-fra1-03

# Підключаємося до k3s-node-fra1-02 та k3s-node-fra1-03
ssh k3s-node-fra1-02
ssh k3s-node-fra1-03

# Встановлюємо необхідні змінні
export PUBLIC_NODE_IP=$(hostname -I | awk '{print $1}')
export LOCAL_NODE_IP=$(hostname -I | awk '{print $3}')
export K3S_TOKEN="K10c62c728b6779dfba2cd979f4dc2fe456b5ab8b36e77ce8e97481fe9059519d5d::server:e98ed9b87e16f3b94c6a692ed81ca9b4"
export K3S_URL=https://10.114.0.97:6443
export K3S_KUBECONFIG_MODE="600"

# Встановлюємо k3s
curl -sfL https://get.k3s.io | 
    K3S_URL=${K3S_URL} \
    K3S_TOKEN=${K3S_TOKEN} \
    INSTALL_K3S_EXEC="--node-ip=${LOCAL_NODE_IP} --node-external-ip=${PUBLIC_NODE_IP}" sh -s - 
# Повертаємось на master k3s-node-fra1-01
kubectl label node k3s-node-fra1-02 node-role.kubernetes.io/worker=worker
kubectl label node k3s-node-fra1-03 node-role.kubernetes.io/worker=worker

Monitoring

# встановлюємо локальний helm для демо буду використовувати k3s-node-fra1-01
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

# додаємо репозиторій prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# встановлюємо prometheus
helm upgrade --install prometheus-stack prometheus-community/kube-prometheus-stack \
  --create-namespace \
  --namespace monitoring \
  --version 72.5.0

Grafana

# отримуємо пароль для доступу до grafana
kubectl --namespace monitoring get secrets prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo

# прокидуємо порт 3000
export POD_NAME=$(kubectl --namespace monitoring get pod -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=prometheus-stack" -oname)
kubectl --namespace monitoring port-forward $POD_NAME 3000

Прокидуємо порт на локальну машину

ssh -L 3000:localhost:3000 root@k3s-node-fra1-01

# або
scp -L root@k3s-node-fra1-01:~/.kube/config ~/.kube/config
sed -i 's/https:\/\/127.0.0.1:6443/https:\/\/164.92.228.17:6443/g' ./kube-config
export POD_NAME=$(kubectl --kubeconfig=./kube-config --namespace monitoring get pod -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=prometheus-stack" -oname)
kubectl --kubeconfig=./kube-config -n monitoring port-forward $POD_NAME 3000
трішки зачекаємо щоб зібрались метрики
перейдемо на `http://localhost:3000`
логін admin
пароль отримали раніше 

Script installation k3s cluster

  1. Run prerequisites on all nodes:
bash k3s_prerequisites.sh
  1. On the master node:
bash k3s_master_install.sh
# After install, copy the contents of ~/k3s_node_token.txt and note the master private IP (e.g., 10.114.0.97)
  1. On each worker node:
export K3S_TOKEN='<token-from-master>'
export K3S_URL='https://<master-private-ip>:6443'
bash k3s_worker_install.sh
#!/bin/bash
# k3s_master_install.sh - Install k3s master node
set -euo pipefail
export PUBLIC_NODE_IP="${PUBLIC_NODE_IP:-$(hostname -I | awk '{print $1}')}"
export LOCAL_NODE_IP="${LOCAL_NODE_IP:-$(hostname -I | awk '{print $2}')}"
export K3S_KUBECONFIG_MODE="600"
echo "[INFO] Installing k3s master..."
curl -sfL https://get.k3s.io | \
INSTALL_K3S_EXEC="--node-ip=${LOCAL_NODE_IP} \
--node-external-ip=${PUBLIC_NODE_IP} \
--advertise-address=${LOCAL_NODE_IP} \
--tls-san=${PUBLIC_NODE_IP}" sh -s -
sudo systemctl enable --now k3s
echo "[INFO] Configuring kubectl for current user..."
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown "$(id -u):$(id -g)" ~/.kube/config
chmod 600 ~/.kube/config
if ! grep -q "KUBECONFIG=~/.kube/config" ~/.bashrc; then
echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
fi
if ! grep -q "alias k=kubectl" ~/.bashrc; then
echo 'alias k=kubectl' >> ~/.bashrc
fi
echo "[INFO] Cluster nodes:"
kubectl get nodes
echo "[INFO] Saving join token to ~/k3s_node_token.txt"
sudo cat /var/lib/rancher/k3s/server/node-token > ~/k3s_node_token.txt
chmod 600 ~/k3s_node_token.txt
#!/bin/bash
# k3s_prerequisites.sh - Prepare any node for k3s installation
set -euo pipefail
log_file="/var/log/k3s_prerequisites.log"
exec > >(tee -a "$log_file") 2>&1
echo "[INFO] Disabling swap..."
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
echo "[INFO] Updating system and installing curl..."
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl
echo "[INFO] Setting iptables to legacy mode..."
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
echo "[INFO] Prerequisites complete."
#!/bin/bash
# k3s_worker_install.sh - Install k3s worker node
set -euo pipefail
export PUBLIC_NODE_IP="${PUBLIC_NODE_IP:-$(hostname -I | awk '{print $1}')}"
export LOCAL_NODE_IP="${LOCAL_NODE_IP:-$(hostname -I | awk '{print $2}')}"
export K3S_TOKEN="${K3S_TOKEN:?K3S_TOKEN must be set (from master node)}"
export K3S_URL="${K3S_URL:?K3S_URL must be set (e.g. https://10.114.0.97:6443)}"
export K3S_KUBECONFIG_MODE="600"
echo "[INFO] Installing k3s worker..."
curl -sfL https://get.k3s.io | \
K3S_URL="${K3S_URL}" \
K3S_TOKEN="${K3S_TOKEN}" \
INSTALL_K3S_EXEC="--node-ip=${LOCAL_NODE_IP} --node-external-ip=${PUBLIC_NODE_IP}" sh -s -
sudo systemctl enable --now k3s-agent
echo "[INFO] Worker node joined the cluster."

Comments are disabled for this gist.