Skip to content

Quickstart ​

Krijg binnen ongeveer 15 minuten een Kubernetes-cluster draaiend op Hetzner.

Vereisten ​

  • Een Hetzner Cloud-account en een project-API-token met lees- en schrijfrechten (Hetzner Console → Security → API tokens):

    bash
    export HCLOUD_TOKEN="<jouw-token>"
  • De lok8s CLI lo, één statische Go-binary. Download hem van een lok8s-release, controleer hem met checksums.txt en installeer hem daarna. Kies het archief voor je systeem (linux of darwin, amd64 of arm64):

    bash
    V=v0.12.0; A=lo-linux-amd64.tar.gz
    curl -fsSLO "https://github.com/kernpilot/lok8s/releases/download/${V}/${A}"
    curl -fsSLO "https://github.com/kernpilot/lok8s/releases/download/${V}/checksums.txt"
    sha256sum --ignore-missing -c checksums.txt   # macOS: shasum -a 256 --ignore-missing -c checksums.txt
    tar -xzf "${A}" lo && mkdir -p "$HOME/.local/bin" && install -m 0755 lo "$HOME/.local/bin/lo"

    Maak daarna je project aan en installeer de vastgepinde KubeOne-toolchain in de map .bin/ ervan. Je systeem blijft onaangeroerd:

    bash
    mkdir my-project && cd my-project
    lo init project
    lo toolchain install --groups core,local,cloud

    Gebruik je al b? Deze twee installeren lo en dezelfde toolchain:

    bash
    b env add github.com/kernpilot/lok8s#kubeone
    b install
  • Een SSH-sleutelpaar (Ed25519 aanbevolen)

  • Een domein dat je beheert: het API-endpoint en de certificaatnamen van het cluster worden daarvan afgeleid. Je stelt het in bij stap 1; de referentieconfiguratie bevat example.com als plaatsaanduiding, niet als standaard.

1. Maak je clusterconfiguratie ​

lo houdt één map per cluster bij, vernoemd naar het domein van het cluster: clusters/<domein>/cluster.lok8s.yaml. Maak de map aan in je project en sla het bestand daar op:

bash
mkdir -p clusters/example.com
# plak het onderstaande bestand in clusters/example.com/cluster.lok8s.yaml
lo use example.com

lo use markeert het domein als actief, zodat elk volgend commando weet welk cluster je bedoelt.

yaml
# clusters/example.com/cluster.lok8s.yaml
apiVersion: cluster.lok8s.dev/v1beta1
kind: KubeOne
metadata:
  name: my-cluster
spec:
  kubernetes:
    version: "v1.35.5"
  cluster:
    # VERPLICHT: een domein dat je beheert; voor het API-endpoint en certificaten
    domain: example.com
  provider:
    name: hetzner
    # De machines, in de termen van Hetzner zelf: elk `server`-item wordt één
    # `hcloud server create`, en zijn sleutels zijn hcloud-flags. De rol komt
    # uit het label lok8s.dev/role.
    config:
      cluster_name: my-cluster
      sshUser: root
      sshPrivateKey: ~/.ssh/id_ed25519
      sshPublicKey: ~/.ssh/id_ed25519.pub
      ssh-key:
        - name: my-cluster
          public-key-from-file: ~/.ssh/id_ed25519.pub
      network:
        - name: my-cluster
          ip-range: 10.0.0.0/16
          "#subnets":
            - network-zone: eu-central
              type: cloud
              ip-range: 10.0.0.0/24
      server:
        # 1 control plane voor dev; voeg er twee toe voor HA
        - name: cp-1
          type: cpx32
          image: ubuntu-24.04
          # fsn1, nbg1 of hel1
          location: fsn1
          ssh-key: [0]
          network: 0
          label: lok8s.dev/cluster=my-cluster,lok8s.dev/role=control-plane
        - name: worker-1
          type: cpx32
          image: ubuntu-24.04
          location: fsn1
          ssh-key: [0]
          network: 0
          label: lok8s.dev/cluster=my-cluster,lok8s.dev/role=worker
        - name: worker-2
          type: cpx32
          image: ubuntu-24.04
          location: fsn1
          ssh-key: [0]
          network: 0
          label: lok8s.dev/cluster=my-cluster,lok8s.dev/role=worker

Het voorbeeld gebruikt cpx32 (4 vCPU’s, 8 GB RAM) voor elke server. Elk type met minstens evenveel vCPU’s en RAM dat je Hetzner-account op die locatie aanbiedt, werkt ook.

De voorraad verschilt per account en verandert per uur: weigert Hetzner een type, kies dan een ander type of een andere locatie (fsn1, nbg1 of hel1).

Wijzig domain (en de mapnaam) naar een domein dat je beheert vóór de volgende stap: niets in dit bestand kan het voor je raden. De drie SSH-paden gaan uit van een Ed25519-sleutel met de standaardnaam (~/.ssh/id_ed25519); heet de jouwe anders of staat hij elders, pas die dan ook aan.

2. Uitrollen ​

bash
lo provision

Dit maakt je control plane en worker nodes aan op Hetzner Cloud. De kubeconfig wordt weggeschreven naar .kubeconfig/my-cluster.yaml in je project, vernoemd naar metadata.name. Je ~/.kube/config blijft ongemoeid.

Uitrollen duurt doorgaans 10–15 minuten. Hetzner factureert de drie servers per uur tegen zijn gepubliceerde prijzen. Met lo destroy verwijder je op elk moment weer alles.

3. Verifiëren ​

kubectl wijst nog steeds naar de context die je eerder gebruikte, dus selecteer het nieuwe cluster expliciet; anders antwoordt get nodes voor je vorige:

bash
export KUBECONFIG=.kubeconfig/my-cluster.yaml
kubectl get nodes

Je zou je control plane en worker nodes in de status Ready moeten zien.

4. Registreren bij kubehz (optioneel) ​

Alleen deze stap vraagt een gratis kubehz-account; de vereisten hierboven zijn alles wat de cluster zelf nodig heeft. Aanmelden staat open voor de eerste 25 accounts, daarna alleen op uitnodiging (zie Dashboard & account).

Verbind je cluster met het kubehz-dashboard voor alleen-lezen gezondheidszichtbaarheid. Registratie is alleen uitgaand: kubehz krijgt nooit toegang tot je cluster.

bash
lo kubehz register

Dit meldt het cluster aan met de status Creating. Claim het vervolgens op app.kubehz.cloud om eigenaarschap te bewijzen en het aan je account te koppelen (register → claim → owned). Zie Registratie voor de details en wat het dashboard toont.

Volgende stappen ​

Documentstatus ​

AspectDetail
Statuslive: komt overeen met de uitgeleverde CLI-flow; de uitrolduur is een conservatieve grens, nog niet gemeten op deze topologie
Laatst gecontroleerd2026-09-05