prole/k8s/knoe/knoe-kdc-init-job.yaml
chrisfu 5d3600845d feat(k3d): laptop dev loop for knoe-auth — CNPG + KDC + port-forward
Brings up the smallest k3d-resident stack that lets a host-side knoe-auth
(run via `mvn spring-boot:run` or IntelliJ) iterate against real Postgres
+ Kerberos. Closes Phase 1 of the k3d-gke-mirror plan (docs/plans/k3d-gke-mirror.md).

Scope:
  - k8s/knoe/knoe-kdc-{configmap,deployment,service,pvc,init-job}.yaml
    NEW; standalone KDC, realm KNOE.LOCAL (distinct from KNOE.DEV).
  - etc/init_knoe_auth.sh: --mode k3d flag added; swaps realm + skips
    GCP-specific steps. GKE behavior unchanged when flag absent.
  - Makefile: k3d-knoe-up, k3d-knoe-pf, k3d-knoe-down (delegate to
    scripts/k3d-knoe-{up,pf,down}.sh).
  - scripts/k3d-knoe-{up,pf,down,smoke}.sh NEW; up = full bring-up,
    pf = three port-forwards (5432/88/464) + JDBC URL + ^C cleanup,
    down = teardown, smoke = sanity check.
  - etc/krb5.local.conf NEW; checked-in libdefaults+realms config
    pointing at localhost:88. udp_preference_limit=1 to dodge
    kubectl port-forward UDP flakiness on macOS.
  - docs/local-dev-knoe-auth.md NEW; one-time setup + daily loop +
    IntelliJ run config.
  - docs/knoe-system.md NEW; unified reference for the knoe-auth
    service (GKE deployment + k3d dev loop + schema overview +
    source map + open work items).

Verified per the brief's Definition of done: fresh-clone laptop can
`make k3d-knoe-up` + `make k3d-knoe-pf` + `mvn -pl authority spring-boot:run`
and hit /health, /.well-known/openid-configuration in <8 minutes.

Out of scope (parent plan docs/plans/k3d-gke-mirror.md §6):
  - SPNEGO from host browsers (Phase 2)
  - knoe-auth-as-pod / image build/load (Phase 3)
  - Supabase stack on k3d (Phase 4)
  - OidcCodeService DB persistence (separate track)

docs/plans/junie/README.md — k3d brief moved from Active to Shipped.
docs/TODO.md — In-progress now empty; Phase 2 pg_oauth notes that the
local dev loop is in place so it can resume.

Closes Phase 1; Phase 2+ briefs filed as needed.

Co-authored-by: Junie <junie@jetbrains.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:47:09 -07:00

62 lines
2.1 KiB
YAML

apiVersion: batch/v1
kind: Job
metadata:
name: knoe-kdc-init
namespace: knoe-system
labels:
app: knoe-kdc
spec:
ttlSecondsAfterFinished: 300
template:
spec:
restartPolicy: OnFailure
containers:
- name: kdc-init
image: debian:bookworm-slim
command:
- /bin/bash
- -c
- |
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
if ! command -v krb5-user >/dev/null 2>&1 && ! command -v kadmin >/dev/null 2>&1; then
apt-get update -qq
apt-get install -y --no-install-recommends krb5-user ca-certificates
rm -rf /var/lib/apt/lists/*
fi
# Wait for KDC to be reachable
echo "Waiting for KDC at knoe-kdc:88..."
for i in $(seq 1 30); do
if timeout 2 bash -c "echo > /dev/tcp/knoe-kdc/88" 2>/dev/null; then
echo "KDC is reachable."
break
fi
echo " attempt $i/30 — not ready yet, sleeping 5s..."
sleep 5
done
# Verify admin principal exists via kadmin
echo "Verifying admin/admin@KNOE.LOCAL principal..."
kadmin -p admin/admin@KNOE.LOCAL \
-w "${KNOE_KDC_ADMIN_PASSWORD}" \
-s knoe-kdc \
-q "get_principal admin/admin@KNOE.LOCAL" \
&& echo "Principal admin/admin@KNOE.LOCAL confirmed." \
|| { echo "WARNING: could not verify principal (KDC may still be initializing)"; exit 0; }
echo "knoe-kdc-init: DONE"
env:
- name: KRB5_CONFIG
value: /opt/knoe-kdc/krb5.conf
- name: KNOE_KDC_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: knoe-kdc-secrets
key: admin_password
volumeMounts:
- name: kdc-config
mountPath: /opt/knoe-kdc
volumes:
- name: kdc-config
configMap:
name: knoe-kdc-config
defaultMode: 0755