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
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
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
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
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!