Permissions
All VM actions are scoped to
krn:vks:supervisor:<supervisor>:vm:<vm>; the pool actions are scoped to krn:vks:supervisor:<supervisor>:cilium:*.
Find out what to publish first
Withqemu-guest-agent connected, Celum can list what the guest is actually listening on — port, protocol, and the process holding the socket. Each entry is flagged as exposable or not.
Publishing through a LoadBalancer
This is the L4 path: a Service named<vm>-lb selecting the VM, given an address from the project’s LoadBalancer range.
- Expose the VM
- Add a single port
Publishes a set of ports at once, replacing what was there. With no ports specified, Celum picks defaults from the detected guest OS:
Detection reads the guest OS the agent reports — without the agent it falls through to the non-Windows default.
Opening the guest firewall
Publishing a port through Kubernetes does not open it inside the guest. For guests runningufw, Celum can open a single port for you. The command is built server-side from the validated port and protocol — you never supply a shell string.
Two different firewalls are in play. A published port that still refuses connections is usually blocked by the guest’s own firewall, not by Kubernetes.
Publishing through a Gateway
The L7 alternative. Instead of consuming a LoadBalancer address per VM, the port is routed through a Gateway with TLS terminated by cert-manager and HTTP redirected to HTTPS — the same path platform services use. The backing Service is a separate ClusterIP named<vm>-gw, so it never burns a LoadBalancer address and stays distinct from <vm>-lb. You can name a Gateway explicitly; otherwise the VM’s own project gateway is used, created if it does not exist yet, falling back to the platform’s shared gateway.
Choosing between the two
The VM Identity Network
A VM’s pod address is volatile — it changes when the VM restarts or migrates. An identity address is a routable address that stays with the VM across live migration.How pools work
A VM identity pool is a Cilium LoadBalancer IP pool that is deliberately disabled for normal allocation and labelled as an identity pool. Disabling it guarantees Cilium never hands its addresses out to Services, while the BGP bridge still advertises the pool’s aggregate to the fabric. The per-VM addresses themselves stay node-internal, which is what lets a VM keep its address when it lands on a different node.Claiming an address
A VM claims an address at creation time — see Create a VM. The claim is allocated before the VM object exists, so a bad or exhausted pool fails cleanly.Stale claims
If a pool is later resized so that an already-claimed address falls outside the new range, that VM’s claim is marked stale. A stale address is no longer advertised, so the VM becomes unreachable on it and must be re-addressed.Checking connectivity
When something is unreachable, the connectivity check runs four probes inside the guest and reports each independently — which is usually enough to tell you which layer is broken:All four probes run through the guest agent. Without it the check is unavailable — the endpoint returns
404 rather than a failure result.What commonly goes wrong
Related
Create a VM
Network mode and identity network are set at creation.
Projects
Where a VM’s LoadBalancer range, egress identity, and isolation come from.
Console & access
Reaching a VM that is not published at all.
VM lifecycle
Migration, and what a project move leaves behind.