Timoni — пакетный менеджер для Kubernetes от Stefan Prodan (автора Flux CD). Вместо Go-шаблонов и YAML использует язык CUE для описания, валидации и дистрибуции Kubernetes-приложений через OCI-реестры.

Зачем нужен Timoni, если есть Helm

Helm решает задачу пакетирования, но имеет фундаментальные ограничения: Go-шаблоны поверх YAML не дают типизации, валидация values требует сторонних инструментов (kubeconform), CRD нельзя шаблонизировать, а client-side apply создаёт проблемы при drift detection.

Timoni устраняет эти проблемы:

АспектHelmTimoni
ШаблонизацияGo templates + YAMLCUE (типизированный язык)
Валидация valuesВнешние инструментыВстроенная через CUE-схемы
ПрименениеClient-side applyServer-side apply (как Flux)
CRDТолько plain YAMLПолная шаблонизация
ДистрибуцияHelm-репо или OCIТолько OCI-реестры
ГруппировкаUmbrella chartsBundles (декларативные CUE-файлы)
Подпись/верификацияPGP (provenance)Cosign keyless
Drift detectionНетВстроенный
Обновление CRDИгнорирует измененияПолная поддержка

Основные концепции

Быстрый старт

Установка:

SH
brew install stefanprodan/tap/timoni
Нажмите, чтобы развернуть и увидеть больше

Деплой модуля:

SH
timoni -n test apply podinfo oci://ghcr.io/stefanprodan/modules/podinfo
Нажмите, чтобы развернуть и увидеть больше

Timoni скачает модуль из OCI-реестра, создаст namespace, применит ресурсы через server-side apply и дождётся готовности.

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

SH
timoni -n test status podinfo
Нажмите, чтобы развернуть и увидеть больше
PLAINTEXT
last applied 2024-01-20T19:51:17Z
module oci://ghcr.io/stefanprodan/modules/podinfo:6.5.4
digest sha256:1dba385f9d56f9a79e5b87344bbec1502bd11f056df51834e18d3e054de39365
ServiceAccount/test/podinfo Current - Resource is current
Service/test/podinfo Current - Service is ready
Deployment/test/podinfo Current - Deployment is available. Replicas: 1
Нажмите, чтобы развернуть и увидеть больше

Конфигурация через CUE values

Values задаются в .cue-файлах с полной типизацией:

CUE
values: {
    resources: requests: {
        cpu:    "100m"
        memory: "128Mi"
    }
    resources: limits: resources.requests
}
Нажмите, чтобы развернуть и увидеть больше

Применение с кастомными values:

SH
timoni -n test apply podinfo oci://ghcr.io/stefanprodan/modules/podinfo \
  --values qos-values.cue
Нажмите, чтобы развернуть и увидеть больше

Превью изменений перед апгрейдом:

SH
timoni apply --dry-run --diff -f bundle.cue
Нажмите, чтобы развернуть и увидеть больше

Bundles: группировка приложений

Bundle — декларативный CUE-файл для деплоя группы связанных инстансов. Аналог umbrella chart, но с типизацией, условиями и runtime-значениями.

Пример — Redis + podinfo с кешированием:

CUE
bundle: {
    apiVersion: "v1alpha1"
    name:       "podinfo"
    instances: {
        redis: {
            module: {
                url:     "oci://ghcr.io/stefanprodan/modules/redis"
                version: "7.2.4"
            }
            namespace: "podinfo"
            values: maxmemory: 256
        }
        podinfo: {
            module: url:     "oci://ghcr.io/stefanprodan/modules/podinfo"
            module: version: "6.5.4"
            namespace: "podinfo"
            values: caching: {
                enabled:  true
                redisURL: "tcp://redis:6379"
            }
        }
    }
}
Нажмите, чтобы развернуть и увидеть больше
SH
timoni bundle apply -f podinfo.bundle.cue
Нажмите, чтобы развернуть и увидеть больше

Timoni применит инстансы по порядку, дождётся готовности каждого и отследит дрифт.

Интеграции

GitHub Actions

Timoni предоставляет action для CI/CD — lint, build, push модулей в реестр:

YAML
name: Release module
on:
  push:
    tags: ['*']

permissions:
  contents: read
  packages: write

jobs:
  push:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Timoni
        uses: stefanprodan/timoni/actions/setup@main
      - name: Lint
        run: timoni mod lint ./my-module
      - name: Push
        run: |
          timoni mod push ./my-module \
            oci://ghcr.io/${{ github.repository_owner }}/my-module \
            --version ${{ github.ref_name }} \
            --creds ${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}
Нажмите, чтобы развернуть и увидеть больше

Поддерживается подпись через Cosign keyless — достаточно добавить --sign=cosign к timoni mod push.

GitOps с Flux CD

Timoni может использоваться как templating engine для Flux. Схема: Timoni собирает манифесты, Flux CLI пушит OCI-артефакт, Flux в кластере подхватывает изменения.

SH
timoni -n apps build podinfo oci://ghcr.io/stefanprodan/modules/podinfo \
  --values ./staging-values.cue | \
flux push artifact oci://registry.internal/podinfo:staging \
  --source="http://github.com/stefanprodan/podinfo" \
  --revision="6.3.4" \
  --path=-
Нажмите, чтобы развернуть и увидеть больше

На стороне кластера Flux забирает артефакт по таймеру:

YAML
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: OCIRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 1m
  url: oci://registry.internal/podinfo
  ref:
    tag: staging
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  targetNamespace: apps
  interval: 1h
  prune: true
  wait: true
  sourceRef:
    kind: OCIRepository
    name: podinfo
Нажмите, чтобы развернуть и увидеть больше

Flux AIO — установка Flux через Timoni

Flux All-In-One — легковесный дистрибутив Flux, упакованный как Timoni-модуль. Оптимизирован для edge-кластеров, serverless (EKS Fargate, GKE Autopilot) и bare-metal без CNI.

Установка Flux через bundle:

CUE
bundle: {
    apiVersion: "v1alpha1"
    name:       "flux-aio"
    instances: {
        "flux": {
            module: url: "oci://ghcr.io/stefanprodan/modules/flux-aio"
            namespace: "flux-system"
            values: {
                controllers: {
                    helm: enabled:         true
                    kustomize: enabled:    true
                    notification: enabled: true
                }
                hostNetwork:     false
                securityProfile: "privileged"
            }
        }
    }
}
Нажмите, чтобы развернуть и увидеть больше
SH
timoni bundle apply -f flux-aio.cue
Нажмите, чтобы развернуть и увидеть больше

Доступны дополнительные модули:

Helm-интероперабельность

Timoni не отвергает Helm — через модуль flux-helm-release можно оркестрировать деплой Helm-чартов:

CUE
bundle: {
    apiVersion: "v1alpha1"
    name:       "flux-aio"
    instances: {
        "flux": {
            module: url: "oci://ghcr.io/stefanprodan/modules/flux-aio"
            namespace: "flux-system"
            values: {
                hostNetwork:     true
                securityProfile: "privileged"
            }
        }
        "cilium": {
            module: url: "oci://ghcr.io/stefanprodan/modules/flux-helm-release"
            namespace: "flux-system"
            values: {
                repository: url: "https://helm.cilium.io"
                chart: {
                    name:    "cilium"
                    version: "*"
                }
                helmValues: {
                    operator: replicas: 1
                    ipam: mode:         "kubernetes"
                }
                sync: targetNamespace: "kube-system"
            }
        }
    }
}
Нажмите, чтобы развернуть и увидеть больше

Когда выбрать Timoni

Timoni имеет смысл, если:

Когда оставаться на Helm:

Ссылки

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/timoni-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D0%B9-%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80-%D0%B4%D0%BB%D1%8F-kubernetes-%D0%BD%D0%B0-cue/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша