Helm-чарты в конфиге k0s: Flannel, Traefik, cert-manager, Prometheus

Published: 2026-04-10

Одна из недооценённых возможностей k0s — объявление Helm-чартов прямо в /etc/k0s/k0s.yaml. Вместо запуска helm install после старта кластера достаточно перечислить чарты в spec.extensions.helm — k0s сам применит их при запуске.


Как это работает

Контроллер k0s включает Helm-контроллер. При чтении конфигурации он создаёт ресурсы Chart в kube-system для каждой записи в extensions.helm.charts. Helm-контроллер устанавливает или обновляет чарт — точно как HelmRelease в FluxCD, но без самого FluxCD.

yamlspec:
  extensions:
    helm:
      concurrencyLevel: 5
      repositories:
        - name: flannel
          url: https://flannel-io.github.io/flannel
        - name: traefik
          url: https://traefik.github.io/charts
        - name: jetstack
          url: https://charts.jetstack.io
        - name: prometheus-community
          url: https://prometheus-community.github.io/helm-charts
      charts:
        - name: flannel
          chartname: flannel/flannel
          namespace: kube-flannel
          order: 1
        - name: traefik
          chartname: traefik/traefik
          namespace: traefik
          order: 2
        - name: cert-manager
          chartname: jetstack/cert-manager
          namespace: cert-manager
          order: 3
        - name: kube-prometheus-stack
          chartname: prometheus-community/kube-prometheus-stack
          namespace: monitoring
          order: 4

order управляет порядком установки:

  • 1 — Flannel (CNI). Без сети ничто не перейдёт в Running.
  • 2 — Traefik. Нужна сеть.
  • 3 — cert-manager. Его вебхук должен быть готов до создания Certificate.
  • 4 — Prometheus. Нужно всё вышеперечисленное.

Flannel

Flannel — CNI. Бэкенд vxlan: оборачивает трафик подов в UDP-датаграммы, работает без специальной маршрутизации ядра. Pod CIDR: 10.244.0.0/16.

yamlvalues: |
  podCidr: "10.244.0.0/16"
  flannel_backend_type: "vxlan"

Ни Calico, ни Cilium: нода одна, управлять маршрутизацией между нодами не нужно.


Traefik

yamlvalues: |
  hostNetwork: true
  service:
    type: ClusterIP
  ports:
    web:
      redirectTo:
        port: websecure
  ingressRoute:
    dashboard:
      enabled: false
  providers:
    kubernetesCRD:
      enabled: true
    kubernetesIngress:
      enabled: true

hostNetwork: true — Traefik привязывается напрямую к портам 80 и 443 хоста без облачного LoadBalancer. ClusterIP — NodePort не нужен. HTTP сразу редиректится на HTTPS.

Дашборд отключён — не нужен и раскрывает внутреннюю информацию о маршрутизации.


cert-manager

yamlvalues: |
  installCRDs: true
  global:
    leaderElection:
      namespace: cert-manager

installCRDs: true — Certificate, ClusterIssuer и связанные CRD устанавливаются как часть чарта. Без этого их нужно применять отдельно до установки, что нарушает подход с единым конфигом.

После готовности cert-manager создать ClusterIssuer для Let's Encrypt:

yamlapiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-prod-key
    solvers:
      - http01:
          ingress:
            class: traefik

Prometheus (kube-prometheus-stack)

yamlvalues: |
  prometheus:
    prometheusSpec:
      retention: 7d
      storageSpec:
        emptyDir:
          medium: ""
          sizeLimit: 5Gi
  alertmanager:
    enabled: false
  prometheus-pushgateway:
    enabled: false
  grafana:
    enabled: true

emptyDir на 5 ГБ — на VPS с ограниченным диском PVC для Prometheus не оправдан. При перезапуске пода теряется недавняя история, но для персонального мониторинга это приемлемо.

alertmanager: false и pushgateway: false экономят память. kube-state-metrics и node-exporter включены — метрики уровня подов и нод, видимые в Grafana и Beszel.


Проверка статуса чартов

bashk0s kubectl get charts.helm.k0sproject.io -A

Пример вывода:

NAMESPACE    NAME                   VERSION   STATUS
kube-system  flannel                0.26.0    deployed
kube-system  traefik                32.1.0    deployed
kube-system  cert-manager           v1.16.0   deployed
kube-system  kube-prometheus-stack  68.0.0    deployed

Статус: deployed, pending-install, failed. С этой команды стоит начинать диагностику.

Подробности по конкретному чарту:

bashk0s kubectl describe chart.helm.k0sproject.io cert-manager -n kube-system

Обновление чартов

Изменить поле version: в /etc/k0s/k0s.yaml:

yaml- name: traefik
  chartname: traefik/traefik
  version: "33.0.0"

Перезапустить k0scontroller:

bashk0s stop
k0s start

Или перечитать конфиг без полного перезапуска:

bashk0s config update /etc/k0s/k0s.yaml

Ограничения

  • Нет helm diff перед применением — k0s применяет вслепую при старте
  • Нет UI для rollback — ручной helm rollback в namespace чарта
  • Нет поддержки OCI-registry чартов (до k0s v1.30)
  • Values только inline в k0s.yaml — отдельные values-файлы не поддерживаются

Для сложных чартов с большим количеством values управление inline YAML становится громоздким. В таком случае лучше перейти на FluxCD HelmReleases.