Skip to main content
O ChatCLI Operator vai além do gerenciamento de instâncias. Ele implementa uma plataforma AIOps completa que detecta anomalias autônomamente, correlaciona sinais, solicita análise de IA e executa remediação — tudo sem dependências externas além do provedor LLM. A plataforma suporta Deployments, StatefulSets, DaemonSets, Jobs e CronJobs, integra-se com Helm, ArgoCD e Flux para remediação GitOps-aware, analisa logs de aplicação com extração de stack traces (Java, Go, Python, Node.js), correlaciona métricas Prometheus com incidentes, e permite vincular repositórios de código-fonte para diagnóstico code-aware.

API Group e CRDs

O operator usa o API group platform.chatcli.io/v1alpha1 com 17 Custom Resource Definitions:
Para documentação detalhada de cada componente da plataforma AIOps, consulte as páginas dedicadas em AIOps Platform.

Instalação do Operator

Um único comando instala tudo: 17 CRDs + RBAC + Deployment + Service + Dashboard.
Instala direto do GHCR — não precisa clonar o repositório:
Para fixar uma versão específica:
O chart do operator (chatcli-operator) é separado do chart do server (chatcli). O operator gerencia os controllers e o dashboard AIOps. O server é deployado via Instance CR ou pelo chart chatcli com watcher habilitado.

Arquitetura da Plataforma AIOps

O que o Operator Gerencia

Além dos CRDs e reconcilers, o operator provê:
  • REST API Gateway (:8090) com 30+ endpoints para incidents, SLOs, approvals, analytics, clusters e audit
  • Web Dashboard embutido acessível em http://operator:8090/
  • Grafana dashboards pré-configurados disponíveis em deploy/grafana/ para importação automática via sidecar
  • 20+ métricas Prometheus cobrindo issues, remediações, SLOs, notificações e aprovações

Pipeline Autônomo

Máquina de Estados do Issue

Criar Secret com API Keys

Antes de criar um Instance, você precisa de um Secret com as API keys do provedor LLM. O Instance referência este Secret via apiKeys.namesem ele, o servidor não consegue chamar a IA.
O Secret deve existir no mesmo namespace do Instance CR. O nome do Secret deve corresponder ao campo apiKeys.name na spec do Instance. Sem esse Secret, o servidor inicia mas não consegue executar análises de IA nem remediações agênticas.

CRD: Instance

O Instance gerencia instâncias do servidor ChatCLI no cluster.

Especificação Completa

Campos do Spec

Raiz

AIOpsSpec

Configura o pipeline de remediação automatica. Todos os campos são opcionais com defaults sensiveis. Runbooks auto-gerados pela IA herdam o valor de maxRemediationAttempts desta configuração.
No modo agentico, o postmortem inclui o raciocinio completo da IA em cada step — qual ação foi escolhida, por que, e o resultado observado. Isso garante auditoria total das decisoes autonomas da IA.

FallbackSpec

Configura failover automático entre provedores LLM. Quando o provedor primário falha (rate limit, timeout, erro de servidor), o sistema tenta automaticamente o próximo provedor na cadeia.

FallbackProviderEntry

O provedor primário (spec.provider) é sempre tentado primeiro. Os provedores em fallback.providers são tentados na ordem listada quando o primário falha. O Secret em apiKeys deve conter as API keys de todos os provedores na cadeia.

WatcherSpec

WatchTargetSpec

Use name + kind para monitorar qualquer tipo de workload Kubernetes. Quando kind é omitido, assume Deployment. O campo legado deployment ainda funciona como alias para name. Exemplos:
O pipeline AIOps usará automaticamente ações de remediação específicas para cada tipo (ex: ScaleStatefulSet, RestartDaemonSet, SuspendCronJob) com base no kind detectado.

Recursos Criados pelo Instance

Balanceamento gRPC

O gRPC usa conexões HTTP/2 persistentes que fixam em um único pod via kube-proxy, deixando réplicas extras ociosas.
  • 1 réplica (padrão): Service ClusterIP padrão
  • Múltiplas réplicas: Service headless (ClusterIP: None) é criado automaticamente, habilitando round-robin client-side via resolver dns:/// do gRPC
  • Keepalive: WatcherBridge faz ping a cada 30s (timeout de 5s) para detectar pods inativos rapidamente. O servidor aceita pings com intervalo mínimo de 20s (EnforcementPolicy.MinTime)
  • Transição: Ao escalar de 1 para 2+ réplicas (ou voltar), o operator deleta e recria o Service automaticamente (ClusterIP é imutável no Kubernetes)

RBAC Automático

  • Same namespace (todos os targets no mesmo namespace do Instance): Cria Role + RoleBinding por Instance
  • Cross-namespace (targets em namespace diferente do Instance, ou em múltiplos namespaces): Cria apenas ClusterRoleBinding por Instance, referenciando a ClusterRole compartilhada chatcli-watcher (pré-provisionada pelo Helm chart / kustomize)
  • Na deleção do CR, o ClusterRoleBinding é removido pelo finalizer; a ClusterRole compartilhada permanece (é propriedade do release)
A partir da v1.188.0, o operator não cria mais ClusterRole em runtime (hardening H5). As ClusterRoles compartilhadas — chatcli-watcher para o watcher e chatcli-role-{viewer,operator,admin,superadmin} para as platform roles — são instaladas pelo Helm chart do operator. O ServiceAccount do operator tem o verb bind restrito a esses nomes específicos via resourceNames, impedindo escalonamento de privilégio mesmo em caso de comprometimento.
Upgrade a partir de v1.105.0: clusters com Instances multi-namespace pré-existentes tinham um ClusterRoleBinding apontando para uma ClusterRole por-Instance (formato antigo). Como roleRef é imutável no Kubernetes, um helm upgrade direto travava o reconcile com cannot change roleRef. A partir de v1.188.0, o operator detecta o roleRef divergente no início de reconcileClusterRBAC, deleta o CRB obsoleto e recria apontando para chatcli-watcher — migração transparente, sem intervenção manual.

Imagem do Servidor e Auto-Resolução

A tag da imagem do servidor (spec.image.tag) segue três níveis de prioridade:
  1. Pin explícito em spec.image.tag — honrado literalmente (GitOps-friendly).
  2. Omitido — o operator resolve a partir do env var CHATCLI_OPERATOR_APP_VERSION, que o Helm chart injeta automaticamente a partir de .Chart.AppVersion. Efeito: helm upgrade chatcli-operator rola o servidor de todas as Instances que optaram por esse modo, sem patch manual.
  3. Fallbacklatest quando nenhum dos dois está presente (ex.: make deploy sem Helm).
Para ambientes que querem versionamento imutável, continue pinando spec.image.tag e gerencie o upgrade manual. Para ambientes que querem “helm upgrade = upgrade completo”, omita a tag.

Auto-Rollout em Mudanças de Configuração

O operator monitora mudanças em ConfigMaps e Secrets referenciados pelo Instance e dispara rolling updates automaticamente via hash annotations no PodTemplate:
Adicionar/remover targets no watcher.targets e aplicar o Instance causa rollout automático. Criar ou atualizar o Secret de API keys e renovar certificados TLS também disparam rollout automaticamente.

Observação de Secrets e ConfigMaps

O operator observa (Watches) Secrets no namespace do Instance. Quando um Secret referenciado em apiKeys.name ou server.tls.secretName é criado ou atualizado, o reconciler é acionado automaticamente — mesmo que o Secret não existisse quando o Instance foi criado.
  • ConfigMap e Secret envFrom: Marcados como optional: true, permitindo criar o Instance antes do Secret/ConfigMap
  • Ordem flexível de deploy: Namespace → Instance → Secret/ConfigMap (qualquer ordem após o namespace)

CRDs da Plataforma AIOps

Anomaly

Representa um sinal bruto detectado pelo WatcherBridge.

Campos do Anomaly Spec

Sinais Detectados (21 tipos)

Sinais do Watcher: Sinais adicionais (via Prometheus, webhooks ou detecção interna):

Monitoramento de Nodes

O watcher monitora automaticamente a saude dos nodes onde os pods dos targets estão rodando. A cada ciclo de coleta, ele:
  1. Identifica os nodes via label selector dos pods do target
  2. Coleta as 5 condições oficiais do Kubernetes: Ready, DiskPressure, MemoryPressure, PIDPressure, NetworkUnavailable
  3. Coleta métricas de CPU/memória do node (via metrics server)
  4. Conta pods ativos vs capacidade do node
  5. Verifica se o node está cordoned (unschedulable)
As informações de node são incluidas no contexto enviado a IA para análise, permitindo que a root cause seja correlacionada com problemas de infraestrutura (ex.: “OOMKill causado por MemoryPressure no node X”).

Issue

Incidente correlacionado que agrupa anomalias e gerencia o ciclo de vida da remediação.

Estados do Issue

AIInsight

Análise de causa raiz gerada por IA com ações sugeridas para remediação automática.

Campos do AIInsight Status

SuggestedAction

RemediationPlan

Plano concreto de remediação gerado automaticamente a partir de Runbook ou ações da IA.

Rollback Automático e Proteção de Estado

O operator implementa um sistema de rollback automático que garante que remediações malsucedidas não deixem o cluster em estado pior do que antes. Antes de executar qualquer ação, o estado completo do recurso é capturado em um snapshot estruturado restaurável.
1

Snapshot Pré-Remediação

Antes da primeira ação, o RollbackEngine captura um ResourceSnapshot estruturado com: replicas, imagens dos containers, CPU/memory requests e limits, estado do HPA (min/max replicas), e estado do node (schedulable/unschedulable). Funciona para Deployments, StatefulSets, DaemonSets, Nodes e HPAs.
2

Checkpoint por Ação

Em planos com múltiplas ações, um ActionCheckpoint é capturado antes de cada ação individual. Isso permite saber exatamente qual ação modificou o quê e em que ponto o plano falhou.
3

Rollback Automático em Falha de Ação

Se qualquer ação falha durante a execução, o operator automaticamente restaura o recurso para o estado do PreflightSnapshot. Replicas, imagens, resources requests/limits e estado do HPA são revertidos. O plano transiciona para estado RolledBack (não Failed).
4

Rollback em Timeout de Verificação

Se todas as ações executam com sucesso mas o recurso não fica healthy dentro de 90 segundos (verification timeout), o operator também executa rollback automático para o estado pré-remediação.
5

Verificação Pós-Falha

Após o rollback, o operator verifica se o recurso voltou ao estado healthy (PostFailureHealthy). Essa informação é registrada no status do plano para auditoria e decisão sobre retry.
O que é capturado no snapshot: Exemplo de RemediationPlan com rollback executado:
O rollback automático restaura o estado anterior à remediação, não resolve o problema original. Após o rollback, o IssueReconciler avalia se há tentativas restantes e dispara re-análise com contexto de falha — a IA recebe o que falhou e sugere uma estratégia diferente.
Fluxo completo em caso de falha: Campos de status adicionados ao RemediationPlan:

Tipos de Ação (54 tipos)

Workload: GitOps: Autoscaling: Infraestrutura: Storage: Security: Networking: Advanced:

ExecDiagnostic Allowlist

A ação ExecDiagnostic faz match exato de string contra um allowlist de comandos read-only. Qualquer variação (flags diferentes, host alternativo, etc.) é rejeitada com command "..." not in approved diagnostic commands whitelist. Comandos aprovados por padrão (~90): Extender via env var CHATCLI_ALLOWED_DIAGNOSTIC_COMMANDS (comma-separated, lido uma vez na inicialização):
Cada entrada é matching exato. nslookup <outro-host> não funciona — é rejeitado. Se precisar de um host específico, adicione a string completa ao env var.
A IA recebe esse allowlist no prompt de remediação (server/handler_analysis.go) e é instruída a escolher o comando certo por sintoma: memory.events para OOM, cpu.stat para throttling, getent/dig para DNS, pprof para apps Go travadas, nc -zv para dependência externa.
StatefulSet: DaemonSet: Job: CronJob:

Exemplos de RemediationPlan com Novas Ações

Runbook (Manual ou Auto-gerado)

Procedimentos operacionais. Runbooks manuais têm prioridade sobre tudo. Quando não há Runbook manual, a IA gera automaticamente um Runbook CR reutilizável a partir das ações sugeridas.

RemediationPlan (Agentic Mode)

Quando não há Runbook manual nem ações sugeridas pela IA, o operator cria um plano agêntico. A IA atua como um agente com skills Kubernetes em um loop observe-decide-act:
Safety Guards: Maximum of 10 steps (configurable via agenticMaxSteps), timeout of 10 minutes. If an action fails, the observation reports “FAILED: error” and the loop continues — the AI receives the feedback and adapts.
Na resolução agêntica: O operator gera automaticamente:
  1. PostMortem CR com timeline, causa raiz, impacto, lições aprendidas
  2. Runbook CR reutilizável com os passos bem-sucedidos (label source=agentic)

PostMortem (Auto-generated)

Relatório de incidente gerado automaticamente após qualquer resolução de remediação (standard ou agêntica). Contém o histórico completo do incidente: detecção, análise, ações executadas, resolução, além de métricas, correlação git, cascade chain, trending de incidentes recorrentes e campo de feedback do desenvolvedor.

Campos do PostMortem Status

Matching de Runbooks (Tiered)

Prioridade de Remediação

SourceRepository (Code-Aware Diagnostics)

Vincula um workload Kubernetes ao seu repositório de código-fonte. Quando configurado, a IA recebe contexto de código durante análise de incidentes: commits recentes correlacionados ao timestamp, trechos de código referenciados em stack traces, e arquivos de configuração (Dockerfile, values.yaml).
Validação de entrada (hardening): spec.url aceita apenas as formas https://, ssh:// ou git@host:path, e spec.branch é restrito a [A-Za-z0-9._/-] sem - inicial — fechando o vetor de injeção de argumento no git (ex.: --upload-pack). Leitura de trechos referenciados em stack traces é confinada ao clone do repositório via os.Root (sem traversal nem escape por symlink). URLs ou branches fora do padrão fazem o sync falhar com erro explícito no status.
O que o operator faz com o SourceRepository:
  1. Clone shallow do repositório (depth 50) e sync periódico (configurável via syncIntervalMinutes)
  2. Indexa linguagens detectadas, entrypoints (main.go, app.py, index.ts, etc.), config files (Dockerfile, values.yaml, Chart.yaml)
  3. Correlação temporal: encontra commits nos 30 min antes do incidente
  4. Commit suspeito: identifica o commit mais provável de ter causado o problema (score por proximidade temporal + volume de mudanças)
  5. Extração de código: quando stack traces referenciam arquivos (ex: handler.go:42), extrai trechos com contexto de 5 linhas antes/depois
  6. Feed para IA: todo o contexto é incluído no prompt de análise
O repositório é clonado localmente no operator pod. Para repos privados, crie um Secret com a chave correspondente ao authType escolhido e referencie em secretRef. O operator suporta repos HTTPS (token/basic) e SSH (ssh-key).

Correlation Engine

O motor de correlação agrupa anomalias em issues usando:

Risk Scoring

Cada tipo de sinal tem um peso: O risk score é a soma dos pesos das anomalias correlacionadas (máximo 100).

Classificação de Severidade

Agrupamento

  • Anomalias no mesmo recurso (deployment + namespace) dentro da mesma janela temporal são agrupadas no mesmo Issue
  • Incident ID deterministico: hash do recurso + tipo de sinal (evita duplicatas)

WatcherBridge

O WatcherBridge e o componente que conecta o servidor ChatCLI ao operator:
  • Polling: Consulta GetAlerts do servidor a cada 30 segundos
  • Descoberta: Localiza o servidor via Instance CRs (primeiro Instance com endpoint gRPC pronto)
  • Dedup: Hash SHA256 do tipo+deployment+namespace (sem componente temporal — um problema contínuo gera apenas uma Anomaly). TTL de 2 horas
  • Invalidação de dedup: Quando Issue atinge estado terminal (Resolved/Escalated), entradas de dedup para o recurso são removidas, permitindo detecção imediata de recorrência
  • Poda: Remove hashes expirados automaticamente (> 2h)
  • Criação: Converte alertas em Anomaly CRs com nomes K8s válidos

Exemplos de Uso

Status e Monitoramento

Desenvolvimento

Segurança

O Operator implementa múltiplas camadas de segurança por padrão, seguindo o princípio de fail-closed (negar por padrão):

Autenticação da REST API

A API REST opera em modo fail-closed por padrão — não há modo dev sem autenticação. Toda requisição deve incluir um header X-API-Key válido com role mapeada (viewer/operator/admin). As API keys são carregadas com a seguinte ordem de prioridade e recarregadas automaticamente a cada 30 segundos:
  1. Secret chatcli-operator-secrets (prioridade) — campo api-keys com lista YAML {key, role, description}
  2. ConfigMap chatcli-operator-config (fallback) — mesmo campo api-keys
  3. Rejeita a requisição (ou aceita em dev-mode se CHATCLI_OPERATOR_DEV_MODE=true)
Dois Secrets distintos no projeto — não confunda com as LLM keys do servidor (chatcli-api-keys consumido pelo chatcli server via Instance.spec.apiKeys.name). Tabela comparativa em Segurança — Autenticação.O Secret chatcli-operator-secrets precisa estar no mesmo namespace que o pod do operator (o controller resolve via POD_NAMESPACE env / arquivo do ServiceAccount, com fallback chatcli-system). Se você fez helm install --namespace <X>, crie o Secret em <X>.
Alterações nas API keys — tanto no Secret quanto no ConfigMap — são detectadas automaticamente a cada 30s. Nenhum restart do operator é necessário.

Allowlist de Tipos de Recurso

O Operator classifica tipos de recurso Kubernetes em duas categorias:
Pods, Deployments, StatefulSets, DaemonSets, Services, ConfigMaps, Ingresses, Jobs, CronJobs, ReplicaSets, Endpoints, PersistentVolumeClaims, HorizontalPodAutoscalers, NetworkPolicies, ServiceAccounts, Namespaces, Events.

Scrubbing de Logs

Antes de enviar logs de aplicação ao LLM para análise, o Operator remove 18 padrões sensíveis, incluindo:
  • Tokens JWT/Bearer, API keys, senhas
  • Endereços de e-mail, IPs internos, URLs com credenciais
  • Números de cartão de crédito, SSNs, certificados PEM

TLS e RBAC

  • TLS 1.3 obrigatório em todas as conexões do servidor ChatCLI
  • ClusterRoles com privilégio mínimo (read-only por padrão)
  • NetworkPolicy configurável para restringir tráfego de rede ao namespace do Operator
  • Hardening H5 — RBAC sem escalonamento em runtime: o operator nunca cria ou altera ClusterRole/ClusterRoleBinding em runtime. As ClusterRoles compartilhadas (chatcli-watcher, chatcli-role-*) são pré-provisionadas pelo Helm chart, e o SA do operator tem o verb bind restrito a esses nomes via resourceNames. Um operator comprometido não consegue referenciar uma ClusterRole mais privilegiada em um novo ClusterRoleBinding.

Auditoria

  • AuditEvent CRD para trilha de auditoria imutável (append-only)
  • Logs estruturados com Request ID para correlação
  • Integração com CHATCLI_AUDIT_LOG_PATH via extraEnv
Em modo strict, o agent security bloqueia qualquer operação de escrita no cluster que não esteja na allowlist. Isso é recomendado para ambientes de produção.

Próximo Passo

AIOps Platform

Deep-dive na arquitetura AIOps

K8s Watcher

Detalhes de coleta e budget

Modo Servidor

RPCs GetAlerts e AnalyzeIssue

Monitoramento K8s

Receita: Monitoramento K8s com IA