my-homelab-configs/scripts/control-plane

93 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
KUBECONFIG_PATH="${KUBECONFIG:-${LAB_KUBECONFIG_PATH:-/home/jv/.kube/config}}"
CONTROL_PLANE_NODE="${LAB_CONTROL_PLANE_NODE:-debian}"
TAINT_KEY="${LAB_CONTROL_PLANE_TAINT_KEY:-node-role.kubernetes.io/control-plane}"
TAINT_EFFECT="${LAB_CONTROL_PLANE_TAINT_EFFECT:-NoSchedule}"
usage() {
cat <<EOF
Usage: ./jeannie control-plane {status|taint|untaint|pods}
status Show node taints and non-system pods currently scheduled on ${CONTROL_PLANE_NODE}.
taint Add ${TAINT_KEY}:${TAINT_EFFECT} to keep normal app/data-plane pods off the control plane.
untaint Remove ${TAINT_KEY}:${TAINT_EFFECT} from the control plane.
pods List non-system pods currently scheduled on ${CONTROL_PLANE_NODE}.
Environment:
LAB_CONTROL_PLANE_NODE=${CONTROL_PLANE_NODE}
EOF
}
require_kubectl() {
if ! command -v kubectl >/dev/null 2>&1; then
echo "kubectl is required." >&2
exit 1
fi
if [ ! -s "$KUBECONFIG_PATH" ]; then
echo "kubeconfig is missing: $KUBECONFIG_PATH" >&2
exit 1
fi
if ! kubectl --kubeconfig "$KUBECONFIG_PATH" get node "$CONTROL_PLANE_NODE" >/dev/null 2>&1; then
echo "control-plane node not found: ${CONTROL_PLANE_NODE}" >&2
echo "Set LAB_CONTROL_PLANE_NODE if the node has a different name." >&2
exit 1
fi
}
show_taints() {
kubectl --kubeconfig "$KUBECONFIG_PATH" get node "$CONTROL_PLANE_NODE" \
-o jsonpath='{range .spec.taints[*]}{.key}{"="}{.value}{":"}{.effect}{"\n"}{end}' |
sed '/^$/d' || true
}
show_non_system_pods() {
kubectl --kubeconfig "$KUBECONFIG_PATH" get pods -A \
--field-selector "spec.nodeName=${CONTROL_PLANE_NODE}" \
-o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,STATUS:.status.phase' --no-headers |
awk '$1 !~ /^(kube-system|calico-system|tigera-operator)$/ { print }'
}
case "${1:-status}" in
status)
require_kubectl
echo "Node: ${CONTROL_PLANE_NODE}"
echo
echo "Taints:"
if ! show_taints | sed 's/^/ /'; then
true
fi
echo
echo "Non-system pods currently on control plane:"
if ! show_non_system_pods | sed 's/^/ /'; then
true
fi
;;
taint)
require_kubectl
kubectl --kubeconfig "$KUBECONFIG_PATH" taint node "$CONTROL_PLANE_NODE" "${TAINT_KEY}:${TAINT_EFFECT}" --overwrite
echo
echo "Current taints:"
show_taints | sed 's/^/ /'
;;
untaint)
require_kubectl
kubectl --kubeconfig "$KUBECONFIG_PATH" taint node "$CONTROL_PLANE_NODE" "${TAINT_KEY}:${TAINT_EFFECT}-" || true
echo
echo "Current taints:"
show_taints | sed 's/^/ /'
;;
pods)
require_kubectl
show_non_system_pods
;;
-h|--help|help)
usage
;;
*)
usage >&2
exit 1
;;
esac