KubeOne op Hetzner
Zet een productie-Kubernetes-cluster op met KubeOne als provisioner.
Vereisten
- lok8s CLI geïnstalleerd
- hcloud CLI geïnstalleerd en geauthenticeerd
- Een SSH-sleutelpaar toegevoegd aan je Hetzner-project
- Hetzner Cloud API-token geëxporteerd als
HCLOUD_TOKEN
Clusterconfiguratie
Maak clusters/example.com/cluster.lok8s.yaml aan met kind: KubeOne (de map is vernoemd naar je domein) en voer daarna lo use example.com uit. De machines declareer je in de Hetzner-providerbeschrijving: één server-item per node, met de rol in het label lok8s.dev/role. Zie Eerste cluster voor elke sleutel.
# clusters/example.com/cluster.lok8s.yaml
apiVersion: cluster.lok8s.dev/v1beta1
kind: KubeOne
metadata:
name: production
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
config:
cluster_name: production
sshUser: root
sshPrivateKey: ~/.ssh/id_ed25519
sshPublicKey: ~/.ssh/id_ed25519.pub
ssh-key:
- name: production
public-key-from-file: ~/.ssh/id_ed25519.pub
network:
- name: production
ip-range: 10.0.0.0/16
"#subnets":
- network-zone: eu-central
type: cloud
ip-range: 10.0.0.0/24
server:
- name: cp-1
type: cx33
image: ubuntu-24.04
location: fsn1
ssh-key: [0]
network: 0
label: lok8s.dev/cluster=production,lok8s.dev/role=control-plane
- name: cp-2
type: cx33
image: ubuntu-24.04
location: fsn1
ssh-key: [0]
network: 0
label: lok8s.dev/cluster=production,lok8s.dev/role=control-plane
- name: cp-3
type: cx33
image: ubuntu-24.04
location: fsn1
ssh-key: [0]
network: 0
label: lok8s.dev/cluster=production,lok8s.dev/role=control-plane
- name: worker-1
type: cpx31
image: ubuntu-24.04
location: fsn1
ssh-key: [0]
network: 0
label: lok8s.dev/cluster=production,lok8s.dev/role=worker
- name: worker-2
type: cpx31
image: ubuntu-24.04
location: fsn1
ssh-key: [0]
network: 0
label: lok8s.dev/cluster=production,lok8s.dev/role=workerUitrollen
lo provisionDit doet het volgende:
- Hetzner Cloud-servers aanmaken voor control plane en workers
- Het privénetwerk opzetten
- Kubernetes installeren via KubeOne
- De kubeconfig wegschrijven naar
.kubeconfig/production.yamlin je project, vernoemd naarmetadata.name, modus0600. Je~/.kube/configblijft ongemoeid.
De configuratie hierboven vraagt Hetzner om vijf servers (3 voor het control plane en 2 workers), die per uur worden gefactureerd tegen de gepubliceerde prijzen van Hetzner voor die servertypes. Niets hiervan is onomkeerbaar: lo destroy verwijdert wanneer je maar wilt elke server die lok8s heeft aangemaakt.
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 cluster:
export KUBECONFIG=.kubeconfig/production.yaml
kubectl get nodes
# (AGE trimmed — VERSION is what to check)
# NAME STATUS ROLES VERSION
# cp-1 Ready control-plane v1.35.5
# cp-2 Ready control-plane v1.35.5
# cp-3 Ready control-plane v1.35.5
# worker-1 Ready <none> v1.35.5
# worker-2 Ready <none> v1.35.5HA-overwegingen
- Declareer drie
control-plane-servers voor productie - Control plane-nodes worden automatisch over fault domains verspreid
- Het privénetwerk (
network[].ip-range) isoleert clusterverkeer
Bootstrap-addons toevoegen
Cluster-infra-addons (CNI, CCM, cert-manager, monitoring, …) staan onder spec.bootstrap en worden bij het provisionen in volgorde toegepast:
bootstrap:
- cilium
- ccm
- monitoringVoer lo bootstrap uit om bootstrap-wijzigingen op een bestaand cluster toe te passen; het past spec.bootstrap opnieuw toe en slaat de reconcile van de infrastructuur over. lo provision doet beide en kun je ook veilig opnieuw uitvoeren.
Volgende stappen
- Registratie: registreren bij het kubehz-dashboard
- GitHub Actions: provisioning automatiseren in CI
- CAPI: alternatieve provisioner met Cluster API
Documentstatus
| Aspect | Detail |
|---|---|
| Status | active |
| Laatst herzien | 2026-09-05 |