k3s-server (Managed Controlplane)¶
Agent-lose k3s-Controlplane als Workload auf einem Host-Cluster. Ein Pod stellt kube-apiserver, controller-manager, scheduler und (Default) embedded etcd bereit. Worker joinen von außen mit demselben Bootstrap-Token.
| Block | cargo.ayedo.cloud/ayedo/k8s/k3s-server |
| Kind | k8sapp / flavor k3s |
| Image | rancher/k3s (Tag über config.image, Default folgt app_version) |
| HA | nein — Single-Pod, supports_ha: false |
| API-Orchestrierung | K8sControlplane |
Vollständige Block-Doku und Beispiele: polycrate block examples k3s-server bzw. README im Block.
Die Polycrate API steuert denselben Block (Block Rollout, IPAM, DNS api.{workspace}.k8s.{zone}, Join-Tab). CLI und API sind austauschbar — kein anderer Cluster-Typ.
Architektur¶
Host-Cluster Namespace
├── Deployment k3s-server (replicas=1, Recreate)
│ ├── controlplane k3s server --disable-agent
│ ├── pod-data-handler kubeconfig + metrics-tls Secrets
│ └── audit-log Audit-NDJSON → stdout → VictoriaLogs
├── PVC /var/lib/rancher/k3s (TLS, etcd, kubeconfig)
├── Secret token / kubeconfig / metrics-tls
├── Service und/oder Gateway+TLSRoute / Ingress
├── NetworkPolicy
└── VMPodScrape (optional)
Agent, Flannel, Traefik, ServiceLB, kube-proxy und Cloud-Controller sind im Pod aus. CoreDNS und metrics-server bleiben an (Pending, bis Worker joinen).
Features¶
- Embedded etcd (Default), optional SQLite oder externer Datastore
- Secrets encryption at rest (
secretbox, Lifecycle-Actions) - API Audit Logging (Default an) + Sidecar
- PSA / EventRateLimit (CIS-aligned Hardening)
- OIDC am kube-apiserver
- etcd-Snapshots auf der PVC, optional S3 (
k3s.etcd.snapshots.s3) - Metriken (etcd, apiserver, controller-manager, scheduler) via VMPodScrape
- Air-gap: Image, Pull-Secrets, Sidecar überschreibbar
- Actions:
install,uninstall,status,benchmark,secrets-encryption-*
API-Exposure (genau ein Pfad)¶
ingress.enabled oder loadbalancer.enabled — nicht beides.
| Pfad | Config | Client-URL |
|---|---|---|
| Envoy Gateway (empfohlen) | ingress.type: gateway | https://api.<cluster_domain>:443 |
| NGINX (TLS-Passthrough) | ingress.type: nginx | wie Gateway, braucht enable_ssl_passthrough |
| Dedicated LoadBalancer | loadbalancer.mode: cluster, provider: cilium | metallb | :6443 an der LB-IP |
k3s.cluster_domain (API-Default {workspace}.k8s.{zone}) setzt --cluster-domain und leitet den API-Host api.<cluster_domain> ab, wenn kein Hostname gesetzt ist.
CIDR-Allowlist: api_access.whitelist_cidrs (NGINX-Annotation oder Host-NetworkPolicy).
Cilium-LB: Network Access · Ingress & Edge.
Quick Start (CLI)¶
Host-Cluster braucht eine StorageClass. Envoy: Block envoy mit default_gateway.enabled.
blocks:
- name: k3s-server
from: cargo.ayedo.cloud/ayedo/k8s/k3s-server:0.3.0
kubeconfig:
from: k8s
config:
namespace: k3s-cp
persistence:
storage_class: ceph-block
loadbalancer:
enabled: false
ingress:
enabled: true
type: gateway
k3s:
cluster_domain: "my-ws.k8s.example.com"
token: "replace-me-token-min-10-chars"
DNS: api.my-ws.k8s.example.com → Envoy shared VIP.
Über die Polycrate API¶
- Region mit Host-Cluster / Workspace
- Kubernetes → Controlplanes → New (
K8sControlplane) - API setzt Block-Config (Token,
cluster_domain, Exposure,delete_namespace: false) - Block Rollout führt
installaus - Outcome: verknüpftes
K8sCluster; Tab Join mit Token undK3S_URL
Uninstall löscht den Org-Namespace nicht (delete_namespace: false).
Worker Join¶
curl -sfL https://get.k3s.io | \
K3S_URL=https://api.<cluster_domain>:6443 \
K3S_TOKEN=<token> sh -s - \
--kubelet-arg "cloud-provider=external" \
--node-label "role=worker"
Token = k3s.token bzw. Join-Tab. Bei Gateway-Edge nutzen Clients oft Port 443 (kubeconfig), Join gegen den vom Block dokumentierten API-Port.
Day-2¶
| Aktion | Wie |
|---|---|
| Status | polycrate run k3s-server status oder Controlplane-Detail in der API |
| Audit-Logs | polycrate logs --block k3s-server --query 'kubernetes.container_name:"audit-log"' |
| Secrets-Key rotieren | polycrate run k3s-server secrets-encryption-rotate |
| etcd-Snapshots | PVC unter server/db/snapshots; optional S3-Folder (geteilt mit Velero-Prefix) |
| Leaf-Certs | Auto-Renew beim k3s-Start; CA manuell k3s certificate rotate-ca |
| Uninstall | polycrate run k3s-server uninstall oder Soft-Delete am K8sControlplane |