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.


API Group e CRDs

O operator usa o API group platform.chatcli.io/v1alpha1 com 7 Custom Resource Definitions:

CRDShort NameDescrição
InstanceinstInstancia do servidor ChatCLI (Deployment, Service, RBAC, PVC)
AnomalyanomSinal bruto do K8s Watcher (restarts, OOM, falhas de deploy)
IssueissIncidente correlacionado agrupando múltiplas anomalias
AIInsightaiAnálise de causa raiz gerada por IA com ações sugeridas
RemediationPlanrpAções concretas para resolver o problema (runbook ou IA agêntica)
RunbookrbProcedimentos operacionais manuais (opcional)
PostMortempmRelatório de incidente auto-gerado após resolução agêntica

Instalação do Operator

Via Manifests

  # Instalar todos os CRDs
kubectl apply -f operator/config/crd/bases/

# Instalar RBAC e Manager
kubectl apply -f operator/config/rbac/role.yaml
kubectl apply -f operator/config/manager/manager.yaml
  

Via Docker Build

  cd operator
make docker-build IMG=ghcr.io/diillson/chatcli-operator:latest
make docker-push IMG=ghcr.io/diillson/chatcli-operator:latest
  

Arquitetura da Plataforma AIOps

graph TD
    subgraph "ChatCLI Server"
        W[K8s Watcher<br/>collectors] --> GA[GetAlerts RPC]
        AI_RPC[AnalyzeIssue RPC<br/>LLM call]
        AG_RPC[AgenticStep RPC<br/>observe-decide-act]
    end

    subgraph "Operator"
        WB[WatcherBridge<br/>polls cada 30s] -->|gRPC| GA
        WB -->|cria| ANOM[Anomaly CR]
        ANOM -->|AnomalyReconciler<br/>correlação| ISS[Issue CR]
        ISS -->|IssueReconciler<br/>cria| INSIGHT[AIInsight CR]
        INSIGHT -->|AIInsightReconciler<br/>gRPC| AI_RPC
        AI_RPC -->|análise + ações| INSIGHT
        ISS -->|cria| PLAN[RemediationPlan CR]
        PLAN -->|RemediationReconciler<br/>executa| ACTIONS[Scale / Restart / Rollback<br/>Patch / AdjustResources / DeletePod]
        PLAN -->|modo agêntico<br/>gRPC loop| AG_RPC
        AG_RPC -->|next action| PLAN
        ACTIONS -->|sucesso| RESOLVED[Issue Resolved]
        ACTIONS -->|falha| RETRY[Retry ou Escalate]
        RESOLVED -->|agêntico| PM[PostMortem CR]
    end

    style ANOM fill:#f9e2af,color:#000
    style ISS fill:#fab387,color:#000
    style INSIGHT fill:#89b4fa,color:#000
    style PLAN fill:#a6e3a1,color:#000
    style RESOLVED fill:#a6e3a1,color:#000
    style RETRY fill:#f38ba8,color:#000
    style PM fill:#cba6f7,color:#000

Pipeline Autônomo

FaseComponenteO que Faz
1. DetecçãoWatcherBridgeConsulta GetAlerts do servidor a cada 30s. Cria Anomaly CRs (dedup SHA256). Invalida dedup quando Issue atinge estado terminal.
2. CorrelaçãoAnomalyReconciler + CorrelationEngineAgrupa anomalias por recurso + janela temporal. Calcula risk score e severidade. Cria/atualiza Issue CRs com signalType.
3. AnaliseAIInsightReconciler + KubernetesContextBuilderColeta contexto K8s real (deployment, pods, eventos, revisões). Chama AnalyzeIssue RPC com contexto enriquecido.
4. RemediaçãoIssueReconcilerRunbook-first: (a) Runbook manual (tiered matching), (b) gera Runbook auto da IA, ou (c) remediação agêntica (IA atua step-by-step).
5. ExecuçãoRemediationReconcilerExecuta ações no cluster: ScaleDeployment, RestartDeployment, RollbackDeployment, PatchConfig, AdjustResources, DeletePod. Modo agêntico: IA decide cada ação via loop observe-decide-act.
6. ResoluçãoIssueReconcilerSucesso → Resolved (invalida dedup). Falha → re-análise com contexto de falha (estratégia diferente) → até maxAttempts → Escalated.
7. PostMortemIssueReconcilerResolução agêntica → PostMortem CR auto-gerado (timeline, causa raiz, lições aprendidas) + Runbook reutilizável dos passos bem-sucedidos.

Máquina de Estados do Issue

stateDiagram-v2
    [*] --> Detected
    Detected --> Analyzing : AIInsight criado
    Analyzing --> Remediating : Via Runbook (manual ou auto-gerado)
    Analyzing --> Remediating : Via modo agêntico (sem Runbook/AI actions)
    Remediating --> Resolved : Remediação bem-sucedida (invalida dedup)
    Remediating --> Analyzing : Retry (re-análise com failure context)
    Remediating --> Escalated : Max tentativas (invalida dedup)
    Resolved --> [*]
    Escalated --> [*]

    note right of Resolved : Resolução agêntica gera\nPostMortem CR + Runbook

CRD: Instance

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

Especificação Completa

  apiVersion: platform.chatcli.io/v1alpha1
kind: Instance
metadata:
  name: chatcli-prod
  namespace: chatcli          # O namespace deve existir antes de criar o Instance
spec:
  replicas: 1
  provider: CLAUDEAI       # OPENAI, CLAUDEAI, GOOGLEAI, XAI, STACKSPOT, OLLAMA
  model: claude-sonnet-4-5

  image:
    repository: ghcr.io/diillson/chatcli
    tag: latest
    pullPolicy: IfNotPresent

  server:
    port: 50051
    tls:
      enabled: true
      secretName: chatcli-tls
    token:
      name: chatcli-auth
      key: token

  watcher:
    enabled: true
    interval: "30s"
    window: "2h"
    maxLogLines: 100
    maxContextChars: 32000
    targets:
      - deployment: api-gateway
        namespace: production
        metricsPort: 9090
        metricsFilter: ["http_requests_*", "http_request_duration_*"]
      - deployment: auth-service
        namespace: production
        metricsPort: 9090
      - deployment: worker
        namespace: batch

  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 500m
      memory: 512Mi

  persistence:
    enabled: true
    size: 1Gi
    storageClassName: standard

  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    seccompProfile:
      type: RuntimeDefault

  apiKeys:
    name: chatcli-api-keys
  

Campos do Spec

Raiz

CampoTipoObrigatórioPadrãoDescrição
replicasint32Não1Número de réplicas do servidor
providerstringSimProvedor LLM
modelstringNãoModelo LLM
imageImageSpecNãoConfiguração da imagem
serverServerSpecNãoConfiguração do servidor gRPC
watcherWatcherSpecNãoConfiguração do K8s Watcher
resourcesResourceRequirementsNãoRequests/limits de CPU e memória
persistencePersistenceSpecNãoPersistência de sessões
securityContextPodSecurityContextNãononroot/1000Security context do pod
apiKeysSecretRefSpecNãoSecret com API keys

WatcherSpec

CampoTipoObrigatórioPadrãoDescrição
enabledboolNãofalseAtiva o watcher
targets[]WatchTargetSpecNãoLista de deployments (multi-target)
deploymentstringNãoDeployment único (legado)
namespacestringNãoNamespace do deployment (legado)
intervalstringNão"30s"Intervalo de coleta
windowstringNão"2h"Janela de observação
maxLogLinesint32Não100Max linhas de log por pod
maxContextCharsint32Não32000Budget de contexto LLM

WatchTargetSpec

CampoTipoObrigatórioPadrãoDescrição
deploymentstringSimNome do deployment
namespacestringSimNamespace do deployment
metricsPortint32Não0Porta Prometheus (0 = desabilitado)
metricsPathstringNão/metricsPath do endpoint Prometheus
metricsFilter[]stringNãoFiltros glob para métricas

Recursos Criados pelo Instance

RecursoNomeDescrição
Deployment<name>Pods do servidor ChatCLI
Service<name>Service gRPC (headless automático quando réplicas > 1 para LB client-side)
ConfigMap<name>Variáveis de ambiente (provider, model, etc.)
ConfigMap<name>-watch-configYAML multi-target (se targets definido)
ServiceAccount<name>Identity para RBAC
Role/ClusterRole<name>-watcherPermissões K8s do watcher
RoleBinding/CRB<name>-watcherBinding da SA ao Role
PVC<name>-sessionsPersistência (se habilitada)

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

  • Single-namespace (todos os targets no mesmo namespace): Cria Role + RoleBinding
  • Multi-namespace (targets em namespaces diferentes): Cria ClusterRole + ClusterRoleBinding automaticamente
  • Na deleção do CR, cluster-scoped resources são limpos pelo finalizer

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:

AnnotationFonteQuando Muda
chatcli.io/watch-config-hashConfigMap <name>-watch-configTargets do watcher alterados
chatcli.io/configmap-hashConfigMap <name>Variáveis de ambiente atualizadas
chatcli.io/secret-hashSecret referenciado em apiKeys.nameAPI keys criadas ou atualizadas
chatcli.io/tls-hashSecret referenciado em server.tls.secretNameCertificados TLS renovados

Isso significa que:

  • Adicionar/remover targets no watcher.targets e aplicar o Instance causa rollout automático
  • Criar ou atualizar o Secret de API keys após o Instance já estar rodando causa rollout automático
  • Renovar certificados TLS causa rollout automático

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.

  apiVersion: platform.chatcli.io/v1alpha1
kind: Anomaly
metadata:
  name: watcher-highrestartcount-api-gateway-1234567890
  namespace: production
spec:
  signalType: pod_restart    # pod_restart | oom_kill | pod_not_ready | deploy_failing | error_rate | latency_spike
  source: watcher            # watcher | prometheus | manual
  severity: warning          # critical | high | medium | low | warning
  resource:
    kind: Deployment
    name: api-gateway
    namespace: production
  description: "HighRestartCount on api-gateway: container app restarted 8 times"
  detectedAt: "2026-02-16T10:30:00Z"
status:
  correlated: true
  issueRef:
    name: api-gateway-pod-restart-1771276354
  

Campos do Anomaly Spec

CampoTipoDescrição
signalTypeAnomalySignalTypeTipo do sinal detectado
sourceAnomalySourceOrigem da detecção (watcher, prometheus, manual)
severityIssueSeveritySeveridade do sinal
resourceResourceRefRecurso K8s afetado (kind, name, namespace)
descriptionstringDescrição legível do problema
detectedAtTimeTimestamp da detecção

Sinais Detectados pelo Watcher

AlertType (Server)SignalType (Anomaly)Descrição
HighRestartCountpod_restartPod com muitos restarts (CrashLoopBackOff)
OOMKilledoom_killContainer terminado por falta de memória
PodNotReadypod_not_readyPod não está no estado Ready
DeploymentFailingdeploy_failingDeployment com Available=False

Issue

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

  apiVersion: platform.chatcli.io/v1alpha1
kind: Issue
metadata:
  name: api-gateway-pod-restart-1771276354
  namespace: production
spec:
  severity: high
  source: watcher
  signalType: pod_restart        # Propagated from Anomaly for tiered Runbook matching
  description: "Correlated incident: pod_restart on api-gateway"
  resource:
    kind: Deployment
    name: api-gateway
    namespace: production
  riskScore: 65
  correlatedAnomalies:
    - name: watcher-highrestartcount-api-gateway-1234567890
    - name: watcher-oomkilled-api-gateway-1234567891
status:
  state: Analyzing          # Detected | Analyzing | Remediating | Resolved | Escalated | Failed
  remediationAttempts: 0
  maxRemediationAttempts: 3
  detectedAt: "2026-02-16T10:30:00Z"
  conditions:
    - type: Analyzing
      status: "True"
      reason: AIInsightCreated
  

Estados do Issue

EstadoDescrição
DetectedIssue recém-criado, aguardando análise
AnalyzingAIInsight criado, aguardando resposta da IA (ou re-análise com failure context)
RemediatingRemediationPlan em execução
ResolvedRemediação bem-sucedida (dedup invalidado para detecção de recorrência)
EscalatedMax tentativas atingido ou sem ações disponíveis (dedup invalidado)
FailedFalha terminal

AIInsight

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

  apiVersion: platform.chatcli.io/v1alpha1
kind: AIInsight
metadata:
  name: api-gateway-pod-restart-1771276354-insight
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  provider: CLAUDEAI
  model: claude-sonnet-4-5
status:
  analysis: "High restart count caused by OOMKilled. Container memory limit (512Mi) is insufficient for the current workload pattern."
  confidence: 0.87
  recommendations:
    - "Increase memory limit to 1Gi"
    - "Investigate possible memory leak in the application"
    - "Monitor GC pressure metrics"
  suggestedActions:
    - name: "Restart deployment"
      action: RestartDeployment
      description: "Restart pods to reclaim leaked memory immediately"
    - name: "Scale up replicas"
      action: ScaleDeployment
      description: "Add more replicas to distribute memory pressure"
      params:
        replicas: "4"
  generatedAt: "2026-02-16T10:31:00Z"
  

Campos do AIInsight Status

CampoTipoDescrição
analysisstringAnálise de causa raiz gerada pela IA
confidencefloat64Nível de confiança da análise (0.0-1.0)
recommendations[]stringRecomendações legiveis para humanos
suggestedActions[]SuggestedActionAções estruturadas para remediação automática
generatedAtTimeQuando a análise foi gerada

SuggestedAction

CampoTipoDescrição
namestringNome legível da ação
actionstringTipo da ação: ScaleDeployment, RestartDeployment, RollbackDeployment, PatchConfig
descriptionstringExplicação do motivo desta ação
paramsmap[string]stringParâmetros da ação (ex: replicas: "4")

RemediationPlan

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

  apiVersion: platform.chatcli.io/v1alpha1
kind: RemediationPlan
metadata:
  name: api-gateway-pod-restart-1771276354-plan-1
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  attempt: 1
  strategy: "Attempt 1 (AI-generated): High restart count caused by OOMKilled"
  actions:
    - type: RestartDeployment
    - type: ScaleDeployment
      params:
        replicas: "4"
  safetyConstraints:
    - "No delete operations"
    - "No destructive changes"
    - "Rollback on failure"
status:
  state: Completed           # Pending | Executing | Completed | Failed | RolledBack
  result: "Deployment restarted and scaled to 4 replicas successfully"
  startedAt: "2026-02-16T10:31:30Z"
  completedAt: "2026-02-16T10:32:15Z"
  

Tipos de Ação

TipoDescriçãoParâmetros
ScaleDeploymentAjusta o número de réplicasreplicas
RestartDeploymentRollout restart do deployment
RollbackDeploymentDesfaz rollout (anterior, saudável ou revisão específica)toRevision (optional: previous, healthy, ou número)
PatchConfigAtualiza chaves de um ConfigMapconfigmap, key=value
AdjustResourcesAjusta CPU/memória requests/limits de containersmemory_limit, memory_request, cpu_limit, cpu_request, container
DeletePodRemove pod mais doente (CrashLoop > restarts)pod (optional — auto-seleciona o mais doente)
CustomAção personalizada (bloqueada por safety checks)

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.

Runbook manual:

  apiVersion: platform.chatcli.io/v1alpha1
kind: Runbook
metadata:
  name: high-error-rate-deployment
  namespace: production
spec:
  description: "Standard procedure for high error rate incidents on Deployments"
  trigger:
    signalType: error_rate
    severity: high
    resourceKind: Deployment
  steps:
    - name: Scale up
      action: ScaleDeployment
      description: "Increase replicas to absorb the error spike"
      params:
        replicas: "4"
    - name: Rollback
      action: RollbackDeployment
      description: "Revert to previous stable version if scaling doesn't help"
  maxAttempts: 3
  

Runbook auto-gerado pela IA (criado automaticamente quando não há manual):

  apiVersion: platform.chatcli.io/v1alpha1
kind: Runbook
metadata:
  name: auto-pod-restart-high-deployment
  labels:
    platform.chatcli.io/auto-generated: "true"
    platform.chatcli.io/source-issue: "api-gateway-pod-restart-1771276354"
spec:
  description: "Auto-generated: High restart count caused by OOMKilled..."
  trigger:
    signalType: pod_restart
    severity: high
    resourceKind: Deployment
  steps:
    - name: Restart deployment
      action: RestartDeployment
    - name: Scale up replicas
      action: ScaleDeployment
      params:
        replicas: "4"
  maxAttempts: 3
  

Auto-generated Runbooks são reutilizados para futuras Issues com o mesmo trigger, evitando chamadas desnecessárias ao LLM.

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:

  apiVersion: platform.chatcli.io/v1alpha1
kind: RemediationPlan
metadata:
  name: api-gateway-pod-restart-plan-1
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  attempt: 1
  strategy: "Agentic AI remediation"
  agenticMode: true
  agenticMaxSteps: 10
  agenticHistory:
    - stepNumber: 1
      aiMessage: "High restart count with OOMKilled. Scaling up to reduce memory pressure."
      action:
        type: ScaleDeployment
        params:
          replicas: "5"
      observation: "SUCCESS: ScaleDeployment executed successfully"
    - stepNumber: 2
      aiMessage: "Pods still restarting. Adjusting memory limits."
      action:
        type: AdjustResources
        params:
          memory_limit: "1Gi"
          memory_request: "512Mi"
      observation: "SUCCESS: AdjustResources executed successfully"
    - stepNumber: 3
      aiMessage: "All pods running stable. Issue resolved."
status:
  state: Completed
  agenticStepCount: 3
  agenticStartedAt: "2026-02-16T10:31:00Z"
  

Safety Guards:

  • Máximo de 10 steps (configurável via agenticMaxSteps)
  • Timeout de 10 minutos
  • Se ação falha, a observação é “FAILED: error” e o loop continua — a IA recebe o feedback e adapta

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 resolução por remediação agêntica. Contém o histórico completo do incidente: detecção, análise, ações executadas e resolução.

  apiVersion: platform.chatcli.io/v1alpha1
kind: PostMortem
metadata:
  name: pm-api-gateway-pod-restart-1771276354
  namespace: production
spec:
  issueRef:
    name: api-gateway-pod-restart-1771276354
  resource:
    kind: Deployment
    name: api-gateway
    namespace: production
  severity: high
status:
  state: Open              # Open | InReview | Closed
  summary: "OOMKilled containers caused cascading restarts on api-gateway"
  rootCause: "Memory limit (512Mi) insufficient for current workload pattern"
  impact: "Service degradation for 5 minutes, 30% error rate increase"
  timeline:
    - timestamp: "2026-02-16T10:30:00Z"
      type: detected
      detail: "Issue detected: pod_restart on api-gateway"
    - timestamp: "2026-02-16T10:31:00Z"
      type: action_executed
      detail: "ScaleDeployment to 5 replicas"
    - timestamp: "2026-02-16T10:31:35Z"
      type: action_executed
      detail: "AdjustResources memory_limit=1Gi"
    - timestamp: "2026-02-16T10:32:10Z"
      type: resolved
      detail: "All pods stable, issue resolved"
  lessonsLearned:
    - "Memory limits should account for peak workload patterns"
    - "Set up HPA to auto-scale on memory pressure"
  preventionActions:
    - "Configure HPA with min 3 replicas for api-gateway"
    - "Set memory limit to 1Gi across all environments"
  duration: "2m10s"
  generatedAt: "2026-02-16T10:32:10Z"
  

Campos do PostMortem Status

CampoTipoDescrição
statePostMortemStateEstado: Open, InReview, Closed
summarystringResumo do incidente gerado pela IA
rootCausestringCausa raiz determinada pela IA
impactstringImpacto do incidente
timeline[]TimelineEventLinha do tempo (detected, analyzed, action_executed, resolved)
actionsExecuted[]ActionRecordAções executadas com resultado
lessonsLearned[]stringLições aprendidas
preventionActions[]stringAções preventivas sugeridas
durationstringDuração total do incidente
generatedAtTimeQuando o PostMortem foi gerado

Matching de Runbooks (Tiered)

  Tier 1: SignalType + Severity + ResourceKind (match exato, preferido)
Tier 2: Severity + ResourceKind (fallback quando signal não bate)
  

Prioridade de Remediação

  1. Runbook manual existente (match tiered)
2. Runbook auto-gerado pela IA (materializado como CR reutilizável)
3. Remediação agêntica por IA (loop observe-decide-act, gera PostMortem + Runbook)
4. Escalonamento (apenas quando agêntico falha após max tentativas)
  

Correlation Engine

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

Risk Scoring

Cada tipo de sinal tem um peso:

SinalPeso
oom_kill30
error_rate25
deploy_failing25
latency_spike20
pod_restart20
pod_not_ready20

O risk score é a soma dos pesos das anomalias correlacionadas (maximo 100).

Classificação de Severidade

Risk ScoreSeveridade
>= 80Critical
>= 60High
>= 40Medium
< 40Low

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

Minimo (sem AIOps)

  apiVersion: platform.chatcli.io/v1alpha1
kind: Instance
metadata:
  name: chatcli-simple
spec:
  provider: OPENAI
  apiKeys:
    name: chatcli-api-keys
  

AIOps Completo

  apiVersion: platform.chatcli.io/v1alpha1
kind: Instance
metadata:
  name: chatcli-aiops
spec:
  provider: CLAUDEAI
  apiKeys:
    name: chatcli-api-keys
  server:
    port: 50051
  watcher:
    enabled: true
    interval: "15s"
    maxContextChars: 32000
    targets:
      - deployment: api-gateway
        namespace: production
        metricsPort: 9090
        metricsFilter: ["http_*", "grpc_*"]
      - deployment: auth-service
        namespace: production
        metricsPort: 9090
      - deployment: worker
        namespace: batch
      - deployment: ml-inference
        namespace: ml
        metricsPort: 8080
  resources:
    requests:
      cpu: 200m
      memory: 256Mi
    limits:
      cpu: "1"
      memory: 1Gi
  persistence:
    enabled: true
    size: 5Gi
  

Runbook Manual (opcional)

  apiVersion: platform.chatcli.io/v1alpha1
kind: Runbook
metadata:
  name: oom-kill-runbook
  namespace: production
spec:
  description: "Procedure for OOMKilled containers"
  trigger:
    signalType: oom_kill
    severity: critical
    resourceKind: Deployment
  steps:
    - name: Restart pods
      action: RestartDeployment
      description: "Restart to reclaim leaked memory"
    - name: Scale up
      action: ScaleDeployment
      description: "Add replicas to distribute memory pressure"
      params:
        replicas: "5"
  maxAttempts: 2
  

Secret de API Keys

  apiVersion: v1
kind: Secret
metadata:
  name: chatcli-api-keys
type: Opaque
stringData:
  ANTHROPIC_API_KEY: "sk-ant-xxx"
  # OPENAI_API_KEY: "sk-xxx"
  # GOOGLE_AI_API_KEY: "xxx"
  

Status e Monitoramento

Verificar Instâncias

  kubectl get instances
  
  NAME            READY   REPLICAS   PROVIDER    AGE
chatcli-aiops   true    1          CLAUDEAI    5m
  

Verificar Issues Ativos

  kubectl get issues -A
  
  NAME                                    SEVERITY   STATE         RISK   AGE
api-gateway-pod-restart-1771276354      high       Remediating   65     2m
worker-oom-kill-3847291023              critical   Analyzing     90     30s
  

Verificar Insights da IA

  kubectl get aiinsights -A
  
  NAME                                           ISSUE                                   PROVIDER   CONFIDENCE   AGE
api-gateway-pod-restart-1771276354-insight      api-gateway-pod-restart-1771276354      CLAUDEAI   0.87         1m
  

Verificar Planos de Remediação

  kubectl get remediationplans -A
  
  NAME                                          ISSUE                                   ATTEMPT   STATE       AGE
api-gateway-pod-restart-1771276354-plan-1      api-gateway-pod-restart-1771276354      1         Completed   1m
  

Verificar PostMortems

  kubectl get postmortems -A
  
  NAME                                          ISSUE                                   SEVERITY   STATE   AGE
pm-api-gateway-pod-restart-1771276354         api-gateway-pod-restart-1771276354      high       Open    30s
  

Verificar Anomalias

  kubectl get anomalies -A
  
  NAME                                               SIGNAL        SOURCE    SEVERITY   AGE
watcher-highrestartcount-api-gateway-1234567890     pod_restart   watcher   warning    3m
watcher-oomkilled-worker-9876543210                 oom_kill      watcher   critical   1m
  

Desenvolvimento

  cd operator

# Build
go build ./...

# Testes (96 funções, 125 com subtests)
go test ./... -v

# Docker (deve ser construído a partir do root do repositório)
docker build -f operator/Dockerfile -t myregistry/chatcli-operator:dev .

# Instalar CRDs no cluster
kubectl apply -f config/crd/bases/

# Deploy o operator
make deploy IMG=myregistry/chatcli-operator:dev
  

Próximo Passo