#!/usr/bin/env bash # Makes a scoped kubeconfig for knotless-run from a tenant admin # kubeconfig: a ServiceAccount, a namespaced Role for Jobs, pods, exec, # logs, events and NetworkPolicies, and a 24-hour token. # # The token is written only into the output kubeconfig, mode 0600. It is # not printed. Re-run this before the 24 hours are up. # # Environment: # ADMIN_KUBECONFIG tenant admin kubeconfig # OUT scoped kubeconfig to write # NAMESPACE namespace (default knotless-runs) # SERVICE_ACCOUNT service account (default knotless-runner) set -euo pipefail ADMIN_KUBECONFIG=${ADMIN_KUBECONFIG:-$HOME/.tmp/knotless-runner-k8s/tenant/knotless-poc.kubeconfig.yaml} OUT=${OUT:-$HOME/.tmp/knotless-runner-k8s/tenant/knotless-runner.kubeconfig.yaml} NAMESPACE=${NAMESPACE:-knotless-runs} SERVICE_ACCOUNT=${SERVICE_ACCOUNT:-knotless-runner} admin() { kubectl --kubeconfig "$ADMIN_KUBECONFIG" "$@"; } admin create namespace "$NAMESPACE" --dry-run=client -o yaml | admin apply -f - >/dev/null admin -n "$NAMESPACE" create serviceaccount "$SERVICE_ACCOUNT" --dry-run=client -o yaml | admin apply -f - >/dev/null admin apply -f - >/dev/null < "$tmp" mv "$tmp" "$OUT" chmod 0600 "$OUT" trap - EXIT if [ "$(kubectl --kubeconfig "$OUT" auth can-i create jobs -n "$NAMESPACE")" != yes ]; then echo "scoped-kubeconfig: the token cannot create Jobs" >&2 exit 1 fi if [ "$(kubectl --kubeconfig "$OUT" auth can-i get nodes)" != no ]; then echo "scoped-kubeconfig: the token is not scoped: it can read nodes" >&2 exit 1 fi printf '%s\n' "$OUT"