BeyondTrust/POV

← Back to dashboard

k3s

Audience: operator · Profile: both · Read this when: you are building an on-prem cluster with the dashboard, or working with one of the k3s clusters it creates for you in the OT demo cell or the Workload Lab.

Part of Kubernetes.

k3s is the self-managed Kubernetes the dashboard builds wherever there is no cloud control plane to lean on. It is a single binary with a bundled CNI, and it has two properties the dashboard depends on:

The dashboard creates k3s in three places.

Where What it is Built by
On-prem clusters A cluster on your own hosts, registered as cloud=local Config Management plays in examples/playbooks/k3s/
The OT demo cell The plant IPC's single-node cluster, and the DMZ broker's The ot-sim image bake, air-gapped
The Workload Lab The SPIRE lab's Kubernetes deployment mode, and the k3s node a lab links to The SPIRE lab's own runs

On-prem clusters

The dashboard's Terraform modules are cloud-only and Rancher is import-only, so an on-prem cluster is built with the hosts: all, become: true plays in examples/playbooks/k3s/, run from Config Management one host at a time:

  1. k3s-open-ports.yml on every node (6443/tcp, 8472/udp, 10250/tcp, plus etcd for HA).
  2. k3s-server-init.yml on the first server. It gives you server_url and the node token.
  3. k3s-join.yml on each remaining node, as agent (the default) or as another server.
  4. k3s-status.yml on a server, to confirm every node registered.
  5. k3s-kubeconfig.yml on a server, to collect the admin kubeconfig for registration.
  6. k3s-dex-auth.yml on each server. People reach an on-prem cluster only through Dex, so this step is required, not optional.

Then register the cluster on the Kubernetes page with that kubeconfig, as cloud=local. From there it is a Config Management target like any other, with one difference: its runs execute in a sibling container on the dashboard host, because an on-prem API address is reachable from your LAN and not from an in-cloud runner. That host needs a docker CLI and a route to the cluster.

Things to know before relying on it:

The full play reference, including the node token and kubeconfig routed through Password Safe, is in the playbooks README.

The OT demo cell and its DMZ broker

The OT demo cell is a plant IPC running single-node k3s: its PLC simulators and the FUXA HMI are Deployments in the ot-sim namespace, and its API on :6443 is one more endpoint PRA can broker, as the ot-<cell>-k3s tunnel. Docker stays on the cell beside it. The cell's DMZ broker runs the same k3s, carrying the Entitle agent and an OpenFaaS function runtime and nothing else.

Both are baked by provisioners/ot/ot-sim-debian.sh, and both boot with no egress: the bake fetches the pinned k3s binary and its air-gap image bundle, and every workload image is a tarball k3s imports at start. See The cell runs on k3s.

The Workload Lab's SPIRE lab

The SPIRE lab uses k3s twice:

k3s-spiffe-auth.yml, k3s-dex-auth.yml and k3s-dashboard-auth.yml share one AuthenticationConfiguration. Each replaces only its own entry, so any of them can be run, re-run or undone without touching the others.

See also