#!/usr/bin/env bash # Bootstrap the first K3s server (embedded etcd) on raspberry.prole.org using k3sup. # This script is idempotent: re-running will upgrade/ensure k3s is present. # Requirements: # - k3sup installed locally (https://github.com/alexellis/k3sup) # - SSH access to the target host # - The target host must have ports 6443/tcp, 10250/tcp open locally set -euo pipefail # Configurable via env vars; provide sensible defaults : "${K3S_FIRST_SERVER_HOST:=raspberry.prole.org}" : "${K3S_FIRST_SERVER_USER:=pi}" : "${K3S_SSH_KEY:=$HOME/.ssh/id_rsa}" : "${K3S_VERSION:=}" # Extra args to pass directly to k3s server K3S_EXTRA_ARGS_DEFAULT="--cluster-init" : "${K3S_EXTRA_ARGS:=${K3S_EXTRA_ARGS_DEFAULT}}" echo "[info] Installing first K3s server on ${K3S_FIRST_SERVER_HOST} (user=${K3S_FIRST_SERVER_USER})" if ! command -v k3sup >/dev/null 2>&1; then echo "[error] k3sup is not installed. See https://github.com/alexellis/k3sup" >&2 exit 1 fi K3SUP_ARGS=(install \ --ip "${K3S_FIRST_SERVER_HOST}" \ --user "${K3S_FIRST_SERVER_USER}" \ --ssh-key "${K3S_SSH_KEY}" \ --k3s-extra-args "${K3S_EXTRA_ARGS}" ) if [[ -n "${K3S_VERSION}" ]]; then K3SUP_ARGS+=(--k3s-version "${K3S_VERSION}") fi # Create/merge kubeconfig in ~/.kube/config with context named after host K3SUP_ARGS+=(--local-path "$HOME/.kube/config" --context "k3s-${K3S_FIRST_SERVER_HOST}") set -x k3sup "${K3SUP_ARGS[@]}" set +x echo "[ok] First K3s server installed with embedded etcd and context 'k3s-${K3S_FIRST_SERVER_HOST}'"