You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-up to #18, this time for the deploy-flyte-kind-vm skill (the cloud-VM variant). I deployed Flyte-on-kind to a DigitalOcean droplet and it worked end-to-end (test runs completed all task pods against Supabase + R2), but a few VM-specific things were rough or undocumented — mostly around browser/SDK access from the user's machine to the VM. The storage config gaps from #18 also apply here since this skill hands off to deploy-flyte-kind.
1. Browser console on a VM isn't covered by the base (no-auth) path
The base deploy installs no ingress controller, so the console is unreachable the same way as #18 — but on a VM you can't just kubectl port-forward the console and browse localhost. What works cleanly:
Install Traefik (the skill only does this in the optional auth section) with service.type=NodePort, ports.web.nodePort=30080, ports.websecure.nodePort=30443 — matching the kind host-port mappings the skill already creates (30080→80, 30443→443).
Because kind maps the droplet's host port 80 → Traefik, the console is then reachable directly at http://<droplet-ip>/v2 (firewall already scoped to your IP) — no tunnel at all. Or tunnel it: ssh -N -L 8080:localhost:80 root@<ip>.
Suggest adding a short "Access the console from a VM (no auth)" recipe covering the Traefik install + the two routes + direct public-IP access.
2. SDK can be tunnel-free too — the skill only shows the SSH tunnel
Step 4 documents the SDK access as an SSH tunnel + kubectl port-forward only. Once Traefik is routing /flyteidl2.* (item 1), the SDK can point straight at the VM's public IP and drop the tunnel entirely:
gRPC rides Traefik's web entrypoint over h2c on port 80 and works (verified a full run with every SSH tunnel stopped). Worth mentioning as the lower-friction option for evaluation, with the caveat that it's plain HTTP over the public internet (firewall-scoped to your IP).
3. Run URLs are advertised as localhost:8080 regardless of host
flyte run prints URL: http://localhost:8080/v2/... even when deploying to a VM. On a VM those links are dead — the user has to manually swap the host to <droplet-ip>. Would be good to (a) note this in the skill, and/or (b) file upstream to make the console base URL configurable so VM deploys advertise the right host.
4. -N pitfall on the SDK tunnel
The Step 4 tunnel that runs a remote command — ssh -L 8090:localhost:8090 root@<ip> kubectl -n flyte port-forward ... — must not include -N: -N tells SSH not to execute the remote command, so kubectl port-forward never starts and the forward gets connection refused. The skill's example is correct (no -N), but a one-line warning would save people who add it out of habit. (Conversely, the pure console tunnel in item 1 does want -N since there's no remote command.)
5. doctl prerequisite / non-interactive auth
Minor: the skill assumes doctl is installed and authenticated. Worth noting brew install doctl and that auth can be done non-interactively with doctl auth init -t <token> (handy when a token is pasted rather than entered at the prompt). Also that the SSH key must be imported to DO first (doctl compute ssh-key import <name> --public-key-file ~/.ssh/id_ed25519.pub) and its ID passed to droplet create.
Suggested skill improvements
Add a "Console + SDK access from a VM" section: Traefik install + the two unified-origin IngressRoutes, then both (a) direct public-IP access http://<ip>/v2 and (b) tunnel-free SDK endpoint: dns:///<ip>:80.
Note the localhost:8080 run-URL host mismatch on VMs (and consider an upstream ask to make the console base URL configurable).
Summary
Follow-up to #18, this time for the
deploy-flyte-kind-vmskill (the cloud-VM variant). I deployed Flyte-on-kind to a DigitalOcean droplet and it worked end-to-end (test runs completed all task pods against Supabase + R2), but a few VM-specific things were rough or undocumented — mostly around browser/SDK access from the user's machine to the VM. The storage config gaps from #18 also apply here since this skill hands off todeploy-flyte-kind.Setup: droplet
s-4vcpu-8gb/ nyc1, Ubuntu 24.04, kind + flyte-binary v2.0.27, Supabase (session pooler) + Cloudflare R2, flyte SDK 2.5.8.VM-specific issues / gaps
1. Browser console on a VM isn't covered by the base (no-auth) path
The base deploy installs no ingress controller, so the console is unreachable the same way as #18 — but on a VM you can't just
kubectl port-forwardthe console and browselocalhost. What works cleanly:service.type=NodePort,ports.web.nodePort=30080,ports.websecure.nodePort=30443— matching the kind host-port mappings the skill already creates (30080→80,30443→443).IngressRoutes for a unified origin (the console frontend calls the API same-origin — see flyte-deploy-kind: local kind + R2 deploy needs task-pod storage creds, runs.storagePrefix override, and console-origin fix #18):PathPrefix('/flyteidl2.')→flyte-http:8090(schemeh2c), and/→flyte-console:80.http://<droplet-ip>/v2(firewall already scoped to your IP) — no tunnel at all. Or tunnel it:ssh -N -L 8080:localhost:80 root@<ip>.Suggest adding a short "Access the console from a VM (no auth)" recipe covering the Traefik install + the two routes + direct public-IP access.
2. SDK can be tunnel-free too — the skill only shows the SSH tunnel
Step 4 documents the SDK access as an SSH tunnel +
kubectl port-forwardonly. Once Traefik is routing/flyteidl2.*(item 1), the SDK can point straight at the VM's public IP and drop the tunnel entirely:gRPC rides Traefik's
webentrypoint over h2c on port 80 and works (verified a full run with every SSH tunnel stopped). Worth mentioning as the lower-friction option for evaluation, with the caveat that it's plain HTTP over the public internet (firewall-scoped to your IP).3. Run URLs are advertised as
localhost:8080regardless of hostflyte runprintsURL: http://localhost:8080/v2/...even when deploying to a VM. On a VM those links are dead — the user has to manually swap the host to<droplet-ip>. Would be good to (a) note this in the skill, and/or (b) file upstream to make the console base URL configurable so VM deploys advertise the right host.4.
-Npitfall on the SDK tunnelThe Step 4 tunnel that runs a remote command —
ssh -L 8090:localhost:8090 root@<ip> kubectl -n flyte port-forward ...— must not include-N:-Ntells SSH not to execute the remote command, sokubectl port-forwardnever starts and the forward getsconnection refused. The skill's example is correct (no-N), but a one-line warning would save people who add it out of habit. (Conversely, the pure console tunnel in item 1 does want-Nsince there's no remote command.)5.
doctlprerequisite / non-interactive authMinor: the skill assumes
doctlis installed and authenticated. Worth notingbrew install doctland that auth can be done non-interactively withdoctl auth init -t <token>(handy when a token is pasted rather than entered at the prompt). Also that the SSH key must be imported to DO first (doctl compute ssh-key import <name> --public-key-file ~/.ssh/id_ed25519.pub) and its ID passed todroplet create.Suggested skill improvements
http://<ip>/v2and (b) tunnel-free SDKendpoint: dns:///<ip>:80.localhost:8080run-URL host mismatch on VMs (and consider an upstream ask to make the console base URL configurable).-Nwarning on the SDK tunnel command.doctlsetup notes (install,-ttoken auth, ssh-key import).FLYTE_AWS_*env vars andruns.storagePrefixoverride (required for tasks to run).Happy to send a PR bundling #18 + this into the two skill docs.
Teardown was clean:
doctl compute droplet delete flyte-kind+ firewall + ssh-key; Supabase/R2 untouched.