#!/bin/sh # Ensure script is sourced, not executed directly [[ "${BASH_SOURCE[0]}" == "${0}" ]] && echo "Error: init.sh must be sourced: source ./init.sh (or . ./init.sh)" && exit 1 BOOTSTRAP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" VERSION="release-2.28" # Note: release-2.28 is the final release line supporting Ubuntu 20.04 LTS echo "======================================================================================" echo "## [1/4] Checking / Cloning Kubespray ($VERSION)" echo "======================================================================================" if [ ! -d "$BOOTSTRAP_DIR/kubespray/.git" ]; then rm -rf "$BOOTSTRAP_DIR/kubespray" git clone --branch "$VERSION" --depth 1 https://github.com/kubernetes-sigs/kubespray.git "$BOOTSTRAP_DIR/kubespray" else echo "Existing kubespray checkout detected. Ensuring correct branch..." git -C "$BOOTSTRAP_DIR/kubespray" fetch origin "$VERSION" --depth 1 git -C "$BOOTSTRAP_DIR/kubespray" checkout "$VERSION" fi if [ -d "$BOOTSTRAP_DIR/patches" ]; then for p in "$BOOTSTRAP_DIR"/patches/*.patch; do if [ -f "$p" ]; then echo "## Applying patch $(basename "$p")..." git -C "$BOOTSTRAP_DIR/kubespray" apply --check "$p" 2>/dev/null && git -C "$BOOTSTRAP_DIR/kubespray" apply "$p" || echo "Patch $(basename "$p") already applied or skipped." fi done fi echo "======================================================================================" echo "## [2/4] Activating Python Virtualenv" echo "======================================================================================" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" pyenv virtualenvs --bare | grep -q "^infrapuzzle-bootstrap$" || pyenv virtualenv 3.10.8 infrapuzzle-bootstrap pyenv activate infrapuzzle-bootstrap python -m pip install -q -r "$BOOTSTRAP_DIR/kubespray/requirements.txt" echo "======================================================================================" echo "## [3/4] Syncing Inventory Configuration" echo "======================================================================================" rsync -a "$BOOTSTRAP_DIR/inventory/" "$BOOTSTRAP_DIR/kubespray/inventory/" # Helper function for re-syncing changes made in ./inventory to ephemeral ./kubespray/inventory sync-inventory() { rsync -av "$BOOTSTRAP_DIR/inventory/" "$BOOTSTRAP_DIR/kubespray/inventory/" } export -f sync-inventory 2>/dev/null || true alias sync-inventory="rsync -av '$BOOTSTRAP_DIR/inventory/' '$BOOTSTRAP_DIR/kubespray/inventory/'" echo "======================================================================================" echo "## [4/4] Environment Ready! Single-Node Cluster Upgrade Workflow" echo "======================================================================================" echo "" echo "Current directory changed to: $BOOTSTRAP_DIR/kubespray" cd "$BOOTSTRAP_DIR/kubespray" echo "" echo "=== PRE-UPGRADE CHECKLIST ===" echo "1. Verify SSH connection and sudo access:" echo " ssh moritz@136.243.23.215 'sudo kubectl get nodes -o wide'" echo "2. Take manual etcd snapshot before upgrading:" echo " ssh moritz@136.243.23.215 'sudo etcdctl --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/node-haumdaucher.pem --key=/etc/ssl/etcd/ssl/node-haumdaucher-key.pem snapshot save /var/backups/etcd/etcd-pre-upgrade-\$(date +%Y%m%d%H%M%S).db'" echo "" echo "=== TWO-PHASE UPGRADE WORKFLOW ===" echo "Phase 1: Reconcile Kubespray baseline (keeps current k8s version):" echo " ansible-playbook -i inventory/prod/inventory.ini cluster.yml" echo "" echo "Phase 2: Upgrade Kubernetes version (e.g. to 1.32.13):" echo " a) Update 'kube_version: ' in ../inventory/prod/group_vars/k8s_cluster/k8s-cluster.yml" echo " b) Sync inventory: sync-inventory" echo " c) Run in-place single-node upgrade:" echo " ansible-playbook -i inventory/prod/inventory.ini -e upgrade_cluster_setup=true cluster.yml" echo "" echo "=== POST-UPGRADE VERIFICATION ===" echo " kubectl version" echo " kubectl get nodes -o wide" echo " kubectl get pods -A | grep -v -E 'Running|Completed'" echo "======================================================================================"