commit b0d7a8eb4ec53fa613cd53742ab2f47d9a739574 Author: Pavel Basov Date: Mon Dec 15 20:35:51 2025 +0100 Initial commit: Add tinkerbell-k0s cluster templates diff --git a/tinkerbell-k0s-hcp/Chart.yaml b/tinkerbell-k0s-hcp/Chart.yaml new file mode 100644 index 0000000..056653c --- /dev/null +++ b/tinkerbell-k0s-hcp/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: tinkerbell-k0s-standalone +description: K0s cluster on Tinkerbell infrastructure +type: application +version: 0.1.0 +appVersion: "1.33.4" diff --git a/tinkerbell-k0s-hcp/templates/cluster.yaml b/tinkerbell-k0s-hcp/templates/cluster.yaml new file mode 100644 index 0000000..7f1d481 --- /dev/null +++ b/tinkerbell-k0s-hcp/templates/cluster.yaml @@ -0,0 +1,24 @@ +apiVersion: cluster.x-k8s.io/v1beta1 +kind: Cluster +metadata: + name: {{ .Release.Name }} + namespace: {{ .Release.Namespace }} +spec: + clusterNetwork: + pods: + cidrBlocks: + {{- toYaml .Values.clusterNetwork.pods.cidrBlocks | nindent 8 }} + services: + cidrBlocks: + {{- toYaml .Values.clusterNetwork.services.cidrBlocks | nindent 8 }} + controlPlaneEndpoint: + host: {{ .Values.controlPlaneEndpoint.host | default .Values.k0smotron.externalAddress | quote }} + port: {{ .Values.k0smotron.service.apiPort }} + controlPlaneRef: + apiVersion: controlplane.cluster.x-k8s.io/v1beta1 + kind: K0smotronControlPlane + name: {{ .Release.Name }}-cp + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: TinkerbellCluster + name: {{ .Release.Name }} diff --git a/tinkerbell-k0s-hcp/templates/k0smotroncontrolplane.yaml b/tinkerbell-k0s-hcp/templates/k0smotroncontrolplane.yaml new file mode 100644 index 0000000..1bf1764 --- /dev/null +++ b/tinkerbell-k0s-hcp/templates/k0smotroncontrolplane.yaml @@ -0,0 +1,55 @@ +apiVersion: controlplane.cluster.x-k8s.io/v1beta1 +kind: K0smotronControlPlane +metadata: + name: {{ .Release.Name }}-cp + namespace: {{ .Release.Namespace }} +spec: + version: {{ .Values.k0s.version }} + replicas: {{ .Values.controlPlaneNumber }} + {{- with .Values.k0smotron.persistence }} + persistence: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if .Values.k0smotron.externalAddress }} + externalAddress: {{ .Values.k0smotron.externalAddress }} + {{- end }} + {{- with .Values.k0smotron.etcd }} + etcd: + {{- toYaml . | nindent 4 }} + {{- end }} + service: + type: {{ .Values.k0smotron.service.type }} + apiPort: {{ .Values.k0smotron.service.apiPort }} + konnectivityPort: {{ .Values.k0smotron.service.konnectivityPort }} + {{- with .Values.k0smotron.service.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- if .Values.k0smotron.k0sConfig }} + k0sConfig: + apiVersion: k0s.k0sproject.io/v1beta1 + kind: ClusterConfig + metadata: + name: k0s + spec: + telemetry: + enabled: {{ .Values.k0s.telemetry.enabled }} + {{- with .Values.k0s.api }} + api: + {{- with .extraArgs }} + extraArgs: + {{- toYaml . | nindent 10 }} + {{- end }} + {{- end }} + network: + provider: {{ .Values.k0s.network.provider }} + podCIDR: {{ index .Values.clusterNetwork.pods.cidrBlocks 0 }} + serviceCIDR: {{ index .Values.clusterNetwork.services.cidrBlocks 0 }} + {{- if eq .Values.k0s.network.provider "calico" }} + calico: + mode: {{ .Values.k0s.network.calico.mode }} + {{- if .Values.k0s.network.calico.ipAutodetectionMethod }} + ipAutodetectionMethod: {{ .Values.k0s.network.calico.ipAutodetectionMethod }} + {{- end }} + {{- end }} + {{- end }} diff --git a/tinkerbell-k0s-hcp/templates/k0sworkerconfigtemplate.yaml b/tinkerbell-k0s-hcp/templates/k0sworkerconfigtemplate.yaml new file mode 100644 index 0000000..e7b9b69 --- /dev/null +++ b/tinkerbell-k0s-hcp/templates/k0sworkerconfigtemplate.yaml @@ -0,0 +1,15 @@ +{{- if gt (int .Values.workersNumber) 0 }} +apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 +kind: K0sWorkerConfigTemplate +metadata: + name: {{ .Release.Name }}-worker + namespace: {{ .Release.Namespace }} +spec: + template: + spec: + version: {{ .Values.k0s.version }} + {{- if .Values.worker.args }} + args: + {{- toYaml .Values.worker.args | nindent 8 }} + {{- end }} +{{- end }} diff --git a/tinkerbell-k0s-hcp/templates/machinedeployment.yaml b/tinkerbell-k0s-hcp/templates/machinedeployment.yaml new file mode 100644 index 0000000..a494b44 --- /dev/null +++ b/tinkerbell-k0s-hcp/templates/machinedeployment.yaml @@ -0,0 +1,34 @@ +{{- if gt (int .Values.workersNumber) 0 }} +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + name: {{ .Release.Name }}-worker + namespace: {{ .Release.Namespace }} + labels: + cluster.x-k8s.io/cluster-name: {{ .Release.Name }} + pool: worker +spec: + clusterName: {{ .Release.Name }} + replicas: {{ .Values.workersNumber }} + selector: + matchLabels: + cluster.x-k8s.io/cluster-name: {{ .Release.Name }} + pool: worker + template: + metadata: + labels: + cluster.x-k8s.io/cluster-name: {{ .Release.Name }} + pool: worker + spec: + clusterName: {{ .Release.Name }} + version: {{ .Values.k0s.version | replace "+k0s.0" "" | replace "+k0s.1" "" }} + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + kind: K0sWorkerConfigTemplate + name: {{ .Release.Name }}-worker + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: TinkerbellMachineTemplate + name: {{ .Release.Name }}-worker +{{- end }} diff --git a/tinkerbell-k0s-hcp/templates/tinkerbellcluster.yaml b/tinkerbell-k0s-hcp/templates/tinkerbellcluster.yaml new file mode 100644 index 0000000..ab434a2 --- /dev/null +++ b/tinkerbell-k0s-hcp/templates/tinkerbellcluster.yaml @@ -0,0 +1,9 @@ +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: TinkerbellCluster +metadata: + name: {{ .Release.Name }} + namespace: {{ .Release.Namespace }} +spec: + controlPlaneEndpoint: + host: {{ .Values.controlPlaneEndpoint.host | default .Values.k0smotron.externalAddress | quote }} + port: {{ .Values.k0smotron.service.apiPort }} diff --git a/tinkerbell-k0s-hcp/templates/tinkerbellmachinetemplate-worker.yaml b/tinkerbell-k0s-hcp/templates/tinkerbellmachinetemplate-worker.yaml new file mode 100644 index 0000000..7e010d9 --- /dev/null +++ b/tinkerbell-k0s-hcp/templates/tinkerbellmachinetemplate-worker.yaml @@ -0,0 +1,24 @@ +{{- if gt (int .Values.workersNumber) 0 }} +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: TinkerbellMachineTemplate +metadata: + name: {{ .Release.Name }}-worker + namespace: {{ .Release.Namespace }} +spec: + template: + spec: + bootOptions: + bootMode: {{ .Values.worker.bootMode }} + {{- if and (eq .Values.worker.bootMode "isoboot") .Values.worker.isoURL }} + isoURL: {{ .Values.worker.isoURL }} + {{- end }} + hardwareAffinity: + required: + - labelSelector: + matchLabels: + {{- toYaml .Values.worker.hardwareAffinity.matchLabels | nindent 16 }} + {{- if .Values.worker.templateOverride }} + templateOverride: | + {{- .Values.worker.templateOverride | nindent 8 }} + {{- end }} +{{- end }} diff --git a/tinkerbell-k0s-hcp/values.yaml b/tinkerbell-k0s-hcp/values.yaml new file mode 100644 index 0000000..c5a7f6d --- /dev/null +++ b/tinkerbell-k0s-hcp/values.yaml @@ -0,0 +1,60 @@ +# Cluster parameters +controlPlaneNumber: 1 # @schema description: The number of control plane replicas (pods); type: integer; minimum: 1; maximum: 5 +workersNumber: 1 # @schema description: The number of worker nodes; type: integer; minimum: 0 + +clusterIdentity: # @schema description: Cluster identity reference, auto-populated; type: object + name: "" # @schema description: Cluster identity secret name, auto-populated; type: string + +# Cluster network configuration +clusterNetwork: # @schema description: Cluster network configuration; type: object + pods: # @schema description: Pod network configuration; type: object + cidrBlocks: # @schema description: Pod CIDR blocks; type: array + - 10.244.0.0/16 + services: # @schema description: Service network configuration; type: object + cidrBlocks: # @schema description: Service CIDR blocks; type: array + - 10.96.0.0/12 + +# Control plane endpoint (optional override) +controlPlaneEndpoint: # @schema description: Control plane endpoint configuration; type: object + host: "" # @schema description: Optional fixed host (defaults to k0smotron.externalAddress); type: string + +# Worker machine configuration +worker: # @schema description: Worker machine configuration; type: object + bootMode: netboot # @schema description: Boot mode; type: string; enum: [netboot, isoboot] + isoURL: "" # @schema description: ISO URL for isoboot mode; type: string + hardwareAffinity: # @schema description: Hardware affinity for workers; type: object + matchLabels: # @schema description: Labels to match; type: object + tinkerbell.org/role: worker + templateOverride: "" # @schema description: Tinkerbell workflow template override; type: string + args: # @schema description: Arguments to pass to k0s worker; type: array + - --enable-cloud-provider + +# K0smotron hosted control plane parameters +k0smotron: # @schema description: K0smotron hosted control plane parameters; type: object + externalAddress: "" # @schema description: External address for NodePort/ClusterIP (management cluster node IP); type: string + persistence: # @schema description: Persistence configuration for control plane; type: object + type: emptyDir # @schema description: Persistence type (emptyDir, hostPath, pvc); type: string; enum: [emptyDir, hostPath, pvc] + etcd: # @schema description: Etcd configuration; type: object + persistence: # @schema description: Etcd persistence configuration; type: object + storageClass: "" # @schema description: Storage class for etcd PVC (required for local storage); type: string + size: 1Gi # @schema description: Size of etcd volume; type: string + service: # @schema description: Service configuration for control plane; type: object + type: NodePort # @schema description: Service type; type: string; enum: [LoadBalancer, NodePort, ClusterIP] + apiPort: 30443 # @schema description: API port (use 30000-32767 for NodePort); type: integer + konnectivityPort: 30132 # @schema description: Konnectivity port (use 30000-32767 for NodePort); type: integer + annotations: {} # @schema description: Service annotations; type: object + k0sConfig: true # @schema description: Enable custom k0s configuration; type: boolean + +# K0s parameters +k0s: # @schema description: K0s parameters; type: object + version: v1.33.4+k0s.0 # @schema description: K0s version; type: string + api: # @schema description: Kubernetes API server parameters; type: object + extraArgs: # @schema description: Extra arguments for API server; type: object + kubelet-preferred-address-types: "ExternalIP,Hostname,InternalDNS,ExternalDNS" + network: # @schema description: Network configuration for K0s; type: object + provider: calico # @schema description: Network provider; type: string; enum: [calico, kuberouter, custom] + calico: # @schema description: Calico configuration; type: object + mode: vxlan # @schema description: Calico backend mode; type: string; enum: [vxlan, ipip, bird] + ipAutodetectionMethod: first-found # @schema description: Method for detecting node IP; type: string + telemetry: # @schema description: Telemetry configuration; type: object + enabled: false # @schema description: Enable telemetry; type: boolean diff --git a/tinkerbell-k0s-standalone/Chart.yaml b/tinkerbell-k0s-standalone/Chart.yaml new file mode 100644 index 0000000..056653c --- /dev/null +++ b/tinkerbell-k0s-standalone/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: tinkerbell-k0s-standalone +description: K0s cluster on Tinkerbell infrastructure +type: application +version: 0.1.0 +appVersion: "1.33.4" diff --git a/tinkerbell-k0s-standalone/templates/cluster.yaml b/tinkerbell-k0s-standalone/templates/cluster.yaml new file mode 100644 index 0000000..82e333b --- /dev/null +++ b/tinkerbell-k0s-standalone/templates/cluster.yaml @@ -0,0 +1,24 @@ +apiVersion: cluster.x-k8s.io/v1beta1 +kind: Cluster +metadata: + name: {{ .Release.Name }} + namespace: {{ .Release.Namespace }} +spec: + clusterNetwork: + pods: + cidrBlocks: + {{- toYaml .Values.clusterNetwork.pods.cidrBlocks | nindent 8 }} + services: + cidrBlocks: + {{- toYaml .Values.clusterNetwork.services.cidrBlocks | nindent 8 }} + controlPlaneEndpoint: + host: {{ .Values.controlPlaneEndpoint.host | quote }} + port: {{ .Values.controlPlaneEndpoint.port }} + controlPlaneRef: + apiVersion: controlplane.cluster.x-k8s.io/v1beta1 + kind: K0sControlPlane + name: {{ .Release.Name }}-cp + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: TinkerbellCluster + name: {{ .Release.Name }} diff --git a/tinkerbell-k0s-standalone/templates/k0scontrolplane.yaml b/tinkerbell-k0s-standalone/templates/k0scontrolplane.yaml new file mode 100644 index 0000000..99c5f97 --- /dev/null +++ b/tinkerbell-k0s-standalone/templates/k0scontrolplane.yaml @@ -0,0 +1,39 @@ +apiVersion: controlplane.cluster.x-k8s.io/v1beta1 +kind: K0sControlPlane +metadata: + name: {{ .Release.Name }}-cp + namespace: {{ .Release.Namespace }} +spec: + replicas: {{ .Values.controlPlaneNumber }} + version: {{ .Values.k0s.version }} + k0sConfigSpec: + args: + {{- toYaml .Values.k0s.args | nindent 6 }} + k0s: + apiVersion: k0s.k0sproject.io/v1beta1 + kind: ClusterConfig + metadata: + name: k0s + spec: + telemetry: + enabled: {{ .Values.k0s.telemetry.enabled }} + api: + extraArgs: + {{- toYaml .Values.k0s.api.extraArgs | nindent 12 }} + network: + provider: {{ .Values.k0s.network.provider }} + podCIDR: {{ index .Values.clusterNetwork.pods.cidrBlocks 0 }} + serviceCIDR: {{ index .Values.clusterNetwork.services.cidrBlocks 0 }} + {{- if eq .Values.k0s.network.provider "calico" }} + calico: + mode: {{ .Values.k0s.network.calico.mode }} + {{- if .Values.k0s.network.calico.ipAutodetectionMethod }} + ipAutodetectionMethod: {{ .Values.k0s.network.calico.ipAutodetectionMethod }} + {{- end }} + {{- end }} + machineTemplate: + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: TinkerbellMachineTemplate + name: {{ .Release.Name }}-cp + namespace: {{ .Release.Namespace }} diff --git a/tinkerbell-k0s-standalone/templates/k0sworkerconfigtemplate.yaml b/tinkerbell-k0s-standalone/templates/k0sworkerconfigtemplate.yaml new file mode 100644 index 0000000..e7b9b69 --- /dev/null +++ b/tinkerbell-k0s-standalone/templates/k0sworkerconfigtemplate.yaml @@ -0,0 +1,15 @@ +{{- if gt (int .Values.workersNumber) 0 }} +apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 +kind: K0sWorkerConfigTemplate +metadata: + name: {{ .Release.Name }}-worker + namespace: {{ .Release.Namespace }} +spec: + template: + spec: + version: {{ .Values.k0s.version }} + {{- if .Values.worker.args }} + args: + {{- toYaml .Values.worker.args | nindent 8 }} + {{- end }} +{{- end }} diff --git a/tinkerbell-k0s-standalone/templates/machinedeployment.yaml b/tinkerbell-k0s-standalone/templates/machinedeployment.yaml new file mode 100644 index 0000000..a494b44 --- /dev/null +++ b/tinkerbell-k0s-standalone/templates/machinedeployment.yaml @@ -0,0 +1,34 @@ +{{- if gt (int .Values.workersNumber) 0 }} +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + name: {{ .Release.Name }}-worker + namespace: {{ .Release.Namespace }} + labels: + cluster.x-k8s.io/cluster-name: {{ .Release.Name }} + pool: worker +spec: + clusterName: {{ .Release.Name }} + replicas: {{ .Values.workersNumber }} + selector: + matchLabels: + cluster.x-k8s.io/cluster-name: {{ .Release.Name }} + pool: worker + template: + metadata: + labels: + cluster.x-k8s.io/cluster-name: {{ .Release.Name }} + pool: worker + spec: + clusterName: {{ .Release.Name }} + version: {{ .Values.k0s.version | replace "+k0s.0" "" | replace "+k0s.1" "" }} + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + kind: K0sWorkerConfigTemplate + name: {{ .Release.Name }}-worker + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: TinkerbellMachineTemplate + name: {{ .Release.Name }}-worker +{{- end }} diff --git a/tinkerbell-k0s-standalone/templates/tinkerbellcluster.yaml b/tinkerbell-k0s-standalone/templates/tinkerbellcluster.yaml new file mode 100644 index 0000000..c411b8a --- /dev/null +++ b/tinkerbell-k0s-standalone/templates/tinkerbellcluster.yaml @@ -0,0 +1,9 @@ +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: TinkerbellCluster +metadata: + name: {{ .Release.Name }} + namespace: {{ .Release.Namespace }} +spec: + controlPlaneEndpoint: + host: {{ .Values.controlPlaneEndpoint.host | quote }} + port: {{ .Values.controlPlaneEndpoint.port }} diff --git a/tinkerbell-k0s-standalone/templates/tinkerbellmachinetemplate-cp.yaml b/tinkerbell-k0s-standalone/templates/tinkerbellmachinetemplate-cp.yaml new file mode 100644 index 0000000..8f208a9 --- /dev/null +++ b/tinkerbell-k0s-standalone/templates/tinkerbellmachinetemplate-cp.yaml @@ -0,0 +1,22 @@ +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: TinkerbellMachineTemplate +metadata: + name: {{ .Release.Name }}-cp + namespace: {{ .Release.Namespace }} +spec: + template: + spec: + bootOptions: + bootMode: {{ .Values.controlPlane.bootMode }} + {{- if and (eq .Values.controlPlane.bootMode "isoboot") .Values.controlPlane.isoURL }} + isoURL: {{ .Values.controlPlane.isoURL }} + {{- end }} + hardwareAffinity: + required: + - labelSelector: + matchLabels: + {{- toYaml .Values.controlPlane.hardwareAffinity.matchLabels | nindent 16 }} + {{- if .Values.controlPlane.templateOverride }} + templateOverride: | + {{- .Values.controlPlane.templateOverride | nindent 8 }} + {{- end }} diff --git a/tinkerbell-k0s-standalone/templates/tinkerbellmachinetemplate-worker.yaml b/tinkerbell-k0s-standalone/templates/tinkerbellmachinetemplate-worker.yaml new file mode 100644 index 0000000..7e010d9 --- /dev/null +++ b/tinkerbell-k0s-standalone/templates/tinkerbellmachinetemplate-worker.yaml @@ -0,0 +1,24 @@ +{{- if gt (int .Values.workersNumber) 0 }} +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: TinkerbellMachineTemplate +metadata: + name: {{ .Release.Name }}-worker + namespace: {{ .Release.Namespace }} +spec: + template: + spec: + bootOptions: + bootMode: {{ .Values.worker.bootMode }} + {{- if and (eq .Values.worker.bootMode "isoboot") .Values.worker.isoURL }} + isoURL: {{ .Values.worker.isoURL }} + {{- end }} + hardwareAffinity: + required: + - labelSelector: + matchLabels: + {{- toYaml .Values.worker.hardwareAffinity.matchLabels | nindent 16 }} + {{- if .Values.worker.templateOverride }} + templateOverride: | + {{- .Values.worker.templateOverride | nindent 8 }} + {{- end }} +{{- end }} diff --git a/tinkerbell-k0s-standalone/values.yaml b/tinkerbell-k0s-standalone/values.yaml new file mode 100644 index 0000000..c81660f --- /dev/null +++ b/tinkerbell-k0s-standalone/values.yaml @@ -0,0 +1,60 @@ +# Cluster parameters +controlPlaneNumber: 1 # @schema description: The number of control plane nodes; type: integer; minimum: 1; maximum: 5 +workersNumber: 1 # @schema description: The number of worker nodes; type: integer; minimum: 0 + +clusterIdentity: # @schema description: Cluster identity reference, auto-populated; type: object + name: "" # @schema description: Cluster identity secret name, auto-populated; type: string + +# Cluster network configuration +clusterNetwork: # @schema description: Cluster network configuration; type: object + pods: # @schema description: Pod network configuration; type: object + cidrBlocks: # @schema description: Pod CIDR blocks; type: array + - 10.244.0.0/16 + services: # @schema description: Service network configuration; type: object + cidrBlocks: # @schema description: Service CIDR blocks; type: array + - 10.96.0.0/12 + +# Control plane endpoint +controlPlaneEndpoint: # @schema description: Control plane endpoint configuration; type: object + host: "" # @schema description: Control plane VIP address; type: string + port: 6443 # @schema description: Control plane API port; type: integer + +# Control plane machine configuration +controlPlane: # @schema description: Control plane machine configuration; type: object + bootMode: netboot # @schema description: Boot mode; type: string; enum: [netboot, isoboot] + isoURL: "" # @schema description: ISO URL for isoboot mode; type: string + hardwareAffinity: # @schema description: Hardware affinity for control plane; type: object + matchLabels: # @schema description: Labels to match; type: object + tinkerbell.org/role: control-plane + templateOverride: "" # @schema description: Tinkerbell workflow template override; type: string + +# Worker machine configuration +worker: # @schema description: Worker machine configuration; type: object + bootMode: netboot # @schema description: Boot mode; type: string; enum: [netboot, isoboot] + isoURL: "" # @schema description: ISO URL for isoboot mode; type: string + hardwareAffinity: # @schema description: Hardware affinity for workers; type: object + matchLabels: # @schema description: Labels to match; type: object + tinkerbell.org/role: worker + templateOverride: "" # @schema description: Tinkerbell workflow template override; type: string + args: # @schema description: Arguments to pass to k0s worker; type: array + - --enable-cloud-provider + +# K0s parameters +k0s: # @schema description: K0s parameters; type: object + version: v1.33.4+k0s.0 # @schema description: K0s version; type: string + args: # @schema description: Arguments to pass to k0s controller; type: array + - --enable-worker + - --no-taints + - --enable-dynamic-config + - --disable-components=konnectivity-server + api: # @schema description: Kubernetes API server parameters; type: object + extraArgs: # @schema description: Extra arguments for API server; type: object + anonymous-auth: "true" + kubelet-preferred-address-types: "ExternalIP,InternalIP,Hostname" + network: # @schema description: Network configuration for K0s; type: object + provider: calico # @schema description: Network provider; type: string; enum: [calico, kuberouter, custom] + calico: # @schema description: Calico configuration; type: object + mode: vxlan # @schema description: Calico backend mode; type: string; enum: [vxlan, ipip, bird] + ipAutodetectionMethod: first-found # @schema description: Method for detecting node IP; type: string + telemetry: # @schema description: Telemetry configuration; type: object + enabled: false # @schema description: Enable telemetry; type: boolean