# Persiapan cluster — membobol 3 tembok browser

Situs ini statis dan bicara ke API Kubernetes **langsung dari `fetch()` browser**.
Browser memasang tiga tembok yang tidak bisa dinego dari sisi situs — ketiganya
harus dibuka dari sisi **cluster/laptop-mu**, sekali saja.

| # | Tembok | Kenapa ada | Obatnya |
|---|--------|-----------|---------|
| 1 | Client certificate | `fetch()` tidak bisa menyodorkan client cert (auth bawaan kubeconfig k3s) | ServiceAccount + **token** |
| 2 | CORS | API server tidak mengizinkan origin asing | `kube-apiserver-arg: cors-allowed-origins` |
| 3 | Trust TLS | Sertifikat API k3s ditandatangani CA internal — browser menolak & tidak bisa di-skip | import `server-ca.crt` ke OS |

---

## 1. Token read-only (`belajar-ro`)

```bash
kubectl apply -f belajar-ro.yaml
./buat-kubeconfig.sh > /tmp/kubeconfig-browser.yaml   # JANGAN commit / simpan sembarangan
cat /tmp/kubeconfig-browser.yaml                      # -> tempel ke halaman Lab
```

Kartu aksesnya baca-saja dan **sengaja tidak bisa membaca Secret** — lab modul 08
membuktikannya dengan 403.

## 2. CORS di k3s

Edit `/etc/rancher/k3s/config.yaml` di node server (buat kalau belum ada),
ganti `USERNAME` dengan akun GitHub-mu:

```yaml
kube-apiserver-arg:
  - "cors-allowed-origins=https://USERNAME\\.github\\.io$,http://localhost(:[0-9]+)?$,http://127\\.0\\.0\\.1(:[0-9]+)?$"
```

Lalu:

```bash
systemctl restart k3s
```

Nilainya **regex** (titik di-escape). Entri localhost berguna saat situs dibuka
dari `python3 -m http.server`. Restart k3s aman untuk pod yang sedang jalan
(containerd terpisah) — hanya API-nya yang kedip beberapa detik.

Tes cepat CORS (dari laptop, tunnel nyala):

```bash
TOKEN=... # dari langkah 1
curl -sk -H "Origin: https://USERNAME.github.io" -H "Authorization: Bearer $TOKEN" \
  -i https://127.0.0.1:6443/version | grep -i access-control
# muncul "Access-Control-Allow-Origin" = tembok 2 terbuka
```

## 3. Percayai CA k3s (macOS)

```bash
scp root@NODE:/var/lib/rancher/k3s/server/tls/server-ca.crt ~/Downloads/k3s-server-ca.crt
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/Downloads/k3s-server-ca.crt
```

Lalu **tutup total browser (⌘Q) dan buka lagi**. Tes: buka `https://127.0.0.1:6443/version`
di tab baru — kalau gemboknya tidak merah (walau 401/403, itu normal), tembok 3 terbuka.

> Ini CA **API server k3s** — beda file dengan CA internal cert-manager yang
> mungkin sudah kamu import untuk domain `*.staging...`.

---

## Catatan jalur & gotcha

- **Server `https://127.0.0.1:6443`** berarti tunnel SSH-mu
  (`ssh -fN -L 6443:127.0.0.1:6443 root@NODE`) **wajib nyala** saat lab.
  Sertifikat k3s memang memuat `127.0.0.1` di SAN-nya, jadi aman.
- **Private Network Access (Chrome/Brave):** situs publik (github.io) yang
  menembak alamat privat/lokal bisa diblokir kebijakan PNA browser terbaru.
  Kalau semua tembok sudah terbuka tapi tetap `failed to fetch`: buka situs ini
  secara lokal saat praktik — `python3 -m http.server 8000` di folder repo,
  lalu `http://localhost:8000` (origin localhost sudah diizinkan di regex CORS
  langkah 2). GitHub Pages tetap berguna sebagai etalase/bacaan.
- **Token = kunci.** Siapa pun yang memegangnya bisa membaca isi cluster
  (minus Secret). Simpan selayaknya password; cabut kapan saja:
  `kubectl -n kube-system delete secret belajar-ro-token` (lalu buat lagi bila perlu).
