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.