Timoni: uma nova forma de gerenciar aplicações no Kubernetes

Por Gaspar Barancelli Junior em 10 de janeiro de 2025
Imagem ilustrativa sobre o post Timoni: uma nova forma de gerenciar aplicações no Kubernetes

Introdução

Nos últimos anos, o Kubernetes se tornou o principal orquestrador de contêineres, e diversas ferramentas nasceram para facilitar o gerenciamento de recursos na plataforma. O Helm se destacou como o “gerenciador de pacotes oficial” do Kubernetes, usando templates em Go (charts). Porém, surge agora uma abordagem alternativa que vale a pena conhecer: o Timoni.

Neste artigo, apresento um guia rápido de como usar o Timoni, comparando-o ao Helm e mostrando exemplos práticos de acordo com a documentação oficial do Timoni.

O que é Timoni?

O Timoni é um “app manager” para Kubernetes que utiliza a linguagem CUE para descrever recursos e configurações de maneira mais simples, validada e com alto poder de composição. Enquanto o Helm baseia-se em templates de Go, o Timoni adota o CUE, o que torna a descrição de recursos mais próxima de uma linguagem de configuração do que de um sistema de templating.

Principais diferenças entre Timoni e Helm

Característica Helm Timoni

Linguagem

Go Templates (charts)

CUE (módulos)

Validação

Baseada na API do Kubernetes após renderização

Embutida no CUE (antes de enviar ao cluster)

Abordagem

Criação de charts e instâncias (releases)

Criação de módulos e instâncias

Curva de aprendizado

Familiar para quem já conhece Go templates

Exige aprender CUE, mas com vantagens de composição

GitOps

Integrado com fluxos GitOps, mas exige alguma adaptação

Desenvolvido pela equipe do Flux, nativamente orientado a GitOps

Timoni na prática: Guia Rápido

Nesta seção, vou seguir o Quickstart do Timoni para ilustrar como instalar, configurar e remover instâncias. Os comandos listados aqui são diretamente retirados da documentação oficial.

1. Pré-requisitos

  • Um cluster Kubernetes configurado

  • O Timoni instalado em um sistema com acesso de escrita em /tmp

Para instalar o Timoni via Homebrew (no macOS):

brew install stefanprodan/tap/timoni

Para outros métodos, consulte o guia de instalação do Timoni.

2. Instalando um módulo no Kubernetes

No Timoni, um módulo é semelhante a um chart do Helm, enquanto uma instância do Timoni equivale a uma “release” do Helm.

Por exemplo, para instalar a última versão estável do podinfo no namespace test, você pode usar:

timoni -n test apply podinfo oci://ghcr.io/stefanprodan/modules/podinfo
Exemplo de saída
pulling oci://ghcr.io/stefanprodan/modules/podinfo:latest
using module timoni.sh/podinfo version 6.5.4
installing podinfo in namespace test
Namespace/test created
ServiceAccount/test/podinfo created
Service/test/podinfo created
Deployment/test/podinfo created
waiting for 3 resource(s) to become ready...
all resources are ready

O comando timoni apply faz o pull do módulo do registry, cria os recursos no Kubernetes e aguarda até que eles fiquem prontos.

3. Listando e inspecionando as instâncias

Após instalar, você pode listar todas as instâncias com:

timoni list -A
Exemplo de saída
NAME    NAMESPACE   MODULE                                      VERSION  LAST APPLIED             BUNDLE
podinfo test        oci://ghcr.io/stefanprodan/modules/podinfo  6.5.4    2024-01-20T19:51:17Z     -

Para verificar o status dos recursos gerenciados pela instância:

timoni -n test status podinfo
Exemplo de saída
last applied 2024-01-20T19:51:17Z
module oci://ghcr.io/stefanprodan/modules/podinfo:6.5.4
digest sha256:1dba385f9d56f9a79e5b87344bbec1502bd11f056df51834e18d3e054de39365
container image ghcr.io/curl/curl-container/curl-multi:master
container image ghcr.io/stefanprodan/podinfo:6.5.4
ServiceAccount/test/podinfo Current - Resource is current
Service/test/podinfo Current - Service is ready
Deployment/test/podinfo Current - Deployment is available. Replicas: 1

Para informações mais detalhadas (URL do módulo, versão etc.):

timoni -n test inspect podinfo
Exemplo de saída
digest: sha256:1dba385f9d56f9a79e5b87344bbec1502bd11f056df51834e18d3e054de39365
name: timoni.sh/podinfo
repository: oci://ghcr.io/stefanprodan/modules/podinfo
version: 6.5.4

4. Configurando uma instância (valores CUE)

Para personalizar uma instância, você pode criar um arquivo de valores em CUE. Por exemplo, para definir a QoS como garantida (limit = requests), crie o arquivo qos-values.cue:

values: {
    resources: requests: {
        cpu:    "100m"
        memory: "128Mi"
    }
    resources: limits: resources.requests
}

Para aplicar essa configuração ao módulo podinfo, execute:

timoni -n test apply podinfo oci://ghcr.io/stefanprodan/modules/podinfo \
  --values qos-values.cue

Isso faz um upgrade da instância, ajustando os recursos conforme os valores especificados.

Tip
Para visualizar as mudanças antes de aplicá-las, use --dry-run --diff.

5. Desinstalando uma instância

Para remover uma instância e todos os recursos do cluster Kubernetes:

timoni -n test delete podinfo

Por padrão, o Timoni aguarda até todos os recursos serem removidos. Se desejar pular esta etapa, use --wait=false.

Bundles: gerenciando múltiplas instâncias

Para aplicações mais complexas em produção, é recomendado agrupar múltiplas instâncias em Bundles do Timoni.

Um Bundle é um arquivo CUE que define um conjunto de instâncias com seus valores e referências de módulos. Por exemplo, para criar um Redis (mestre e réplica) e um podinfo conectado ao Redis, poderíamos ter o arquivo podinfo.bundle.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"
                version: "6.5.4"
            }
            namespace: "podinfo"
            values: caching: {
                enabled:  true
                redisURL: "tcp://redis:6379"
            }
        }
    }
}

Para aplicar o Bundle no cluster:

timoni bundle apply -f podinfo.bundle.cue

Liste as instâncias de um Bundle específico:

timoni list -A --bundle podinfo

E para remover todas as instâncias definidas no Bundle:

timoni bundle delete -f podinfo.bundle.cue

Conclusão

O Timoni oferece uma maneira moderna de descrever e gerenciar aplicativos no Kubernetes, tirando proveito das vantagens da linguagem CUE. Se você está acostumado a usar o Helm, talvez perceba que o Timoni simplifica a validação e reuso de configurações, proporcionando uma experiência mais próxima de infra as code do que templates as code.

  • Helm: Enraizado na comunidade, maduro, baseado em Go templates.

  • Timoni: Focado em CUE, altamente declarativo, validado e integrado ao ecossistema GitOps do Flux.

Para quem busca desenvolver arquiteturas mais modulares e gerenciáveis, sem abrir mão da segurança e rastreabilidade em Git, o Timoni é uma excelente opção para experimentar. A curva de aprendizado em CUE compensa pelos benefícios de padronização e robustez que a linguagem traz.

Quer saber mais? Confira a documentação oficial e teste você mesmo no seu cluster Kubernetes!

// Compartilhe esse Post

💫
🔥 NOVO APP

Domine o Inglês em 30 dias!

Inteligência Artificial + Repetição Espaçada • Método cientificamente comprovado

✅ Grátis para começar 🚀 Resultados rápidos
×