Instalação via Argo CD
Antes de começar, confirme que os pré-requisitos foram cumpridos.
Se o Argo CD ainda não estiver instalado, o Passo 4 abaixo (Opção A, deploy.sh --install) instala-o automaticamente — juntamente com o bootstrap do GitOps. Se já estiver instalado, use a Opção B (deploy.sh -c).
Para instalar os componentes manualmente, sem GitOps, consulte a instalação via Helm.
Visão geral
O Argo CD instala componentes a partir de ficheiros YAML chamados Applications. Cada componente do TDP — PostgreSQL, Kafka, Airflow, Trino, etc. — é representado por um ficheiro Application que instrui o Argo CD a transferir o chart correspondente do registry da Tecnisys e instalá-lo no cluster.
Esses ficheiros ficam num repositório Git. O Argo CD monitoriza esse repositório continuamente e sincroniza o estado do cluster com o que está declarado — sem precisar de executar comandos a cada mudança.
Diferença entre instalação com Argo CD e Helm
| Crit ério | Helm CLI | Argo CD (GitOps) |
|---|---|---|
| Rastreabilidade | Comandos manuais, sem histórico automático | Cada mudança fica registada no Git |
| Automação | Execução manual de cada chart | Sincronização automática contínua |
| Rollback | Requer reexecução de comandos | Um clique ou um comando |
| Visibilidade | Apenas via terminal | Interface web com estado em tempo real |
| Auditoria | Difícil | Completa, via histórico do Git |
Estrutura do repositório GitOps
A implementação atual utiliza uma estrutura de diretórios otimizada para GitOps:
tdp-gitops/
├── common/ # Recursos de bootstrap (AppProject, Secrets, App of Apps)
│ ├── argo-gitops-appproject.yaml
│ ├── argo-gitops-app-of-apps.yaml
│ ├── tdp-devops-repo-secret.yaml
│ └── tdp-registry-secret.yaml
├── available/ # Templates das Applications (com variáveis)
│ ├── tdp-postgresql/
│ │ ├── tdp-postgresql.yaml
│ │ └── values.yaml
│ ├── tdp-kafka/
│ └── ...
├── current/ # Manifests renderizados (com commit no git)
│ ├── common/
│ ├── tdp-postgresql/
│ └── ...
├── variables.env # Variáveis de ambiente (não fazer commit)
├── deploy.sh # Script de automação
└── README.md
Como funciona:
available/contém templates com variáveis (${VAR}) — nunca aplicados diretamente.deploy.shrenderizaavailable/+common/→current/substituindo as variáveis.current/tem commit no git e é monitorizado pelo App of Apps do Argo CD.common/contém os recursos de bootstrap (AppProject, Secrets, App of Apps).
Conceitos essenciais
Manifest: Um ficheiro YAML que descreve um recurso Kubernetes ou Argo CD. Neste contexto, cada manifest define uma Application do Argo CD — ou seja, instrui o Argo CD a instalar um determinado chart Helm.
Application: O objeto central do Argo CD. Orienta o Argo CD a transferir um determinado chart Helm do Registry e instalá-lo num determinado namespace do cluster. Cada componente do TDP é representado por uma Application separada.
Repository (no contexto do Argo CD): A origem dos artefactos que o Argo CD irá utilizar. Pode ser um repositório Git (onde ficam os manifests) ou um registry OCI1 (onde ficam os Helm Charts da Tecnisys).
Sincronização: O processo pelo qual o Argo CD compara o estado declarado nos manifests com o estado real do cluster e aplica as mudanças necessárias.
App of Apps: Um padrão que permite gerir todos os componentes com uma única Application raiz, que descobre e instala automaticamente todas as restantes.
Ordem de instalação
Quando o App of Apps é aplicado, o Argo CD tenta sincronizar todos os componentes ao mesmo tempo. Por isso, é importante que os componentes sem dependências estejam estáveis antes que os dependentes tentem estabelecer conexão a eles. A tabela abaixo indica essa ordem e as dependências de cada chart:
| Ordem | Chart | Componente | Versão | Dependências |
|---|---|---|---|---|
| 1 | tdp-postgresql | PostgreSQL | 17.5.0 | Nenhuma |
| 2 | tdp-kafka | Kafka (Strimzi) | 4.1.0 | tdp-crds (Strimzi CRDs) |
| 3 | tdp-hive-metastore | Hive Metastore | 4.0.0 | tdp-postgresql |
| 4 | tdp-deltalake | Delta Lake | 4.0.1 | Nenhuma |
| 5 | tdp-iceberg | Iceberg | 1.10.0 | Nenhuma |
| 6 | tdp-ozone | Apache Ozone | 2.0.0 | Nenhuma |
| 7 | tdp-ranger | Ranger | 2.7.0 | tdp-postgresql |
| 8 | tdp-nifi | NiFi | 1.28.0 | Nenhuma |
| 9 | tdp-spark | Spark | 4.0.2 | Nenhuma |
| 10 | tdp-trino | Trino | 478 | Nenhuma |
| 11 | tdp-airflow | Airflow | 3.0.2 | tdp-postgresql |
| 12 | tdp-jupyter | JupyterHub | 5.3.0 | tdp-postgresql |
| 13 | tdp-clickhouse | ClickHouse | 25.8.11.66 | tdp-crds (Altinity CRDs) |
| 14 | tdp-cloudbeaver | CloudBeaver | 25.3.0 | tdp-postgresql |
| 15 | tdp-openmetadata | OpenMetadata | 1.12.4 | tdp-postgresql |
| 16 | tdp-superset | Superset | 5.0.0 | tdp-postgresql |
A coluna Versão refere-se à versão do componente (ex.: Kafka 4.1.0, Airflow 3.0.2). A versão do chart Helm é 3.0.1 para todos os charts TDP.
Pré-requisitos
| Ferramenta | Obrigatório para |
|---|---|
kubectl (configurado para o cluster) | deploy, bootstrap |
envsubst (pacote gettext) | renderização de templates |
git | modo GitOps (push de current/) |
helm | bootstrap do Argo CD (--install) |
- Passos para Instalação
- Verificação da Instalação
- Resolução de Problemas
- Atualizar Versão dos Charts
- Comandos
- Vídeos
Passo 1 – Obter o repositório GitOps
Faça clone (ou fork) do repositório GitOps e entre na pasta:
git clone <GITOPS_REPO_URL>
cd tdp-gitops

Passo 2 – Configurar variáveis de ambiente
Copie o ficheiro de referência e edite com os seus valores:
cp variables.env variables.env.local
vim variables.env.local
Variáveis obrigatórias em variables.env.local:
# Namespace onde o Argo CD está instalado
ARGOCD_NAMESPACE=argocd
# Namespace alvo dos pods TDP
TDP_NAMESPACE=<NAMESPACE>
# Namespace onde as Applications Argo CD são criadas
TDP_PROJECT_NAMESPACE=<NAMESPACE>
# Nome da Application "App of Apps"
TDP_APPLICATIONS=argo-gitops-tdp-project
# URL deste repositório git (usado pelo Argo CD para monitorizar current/)
GIT_REPO_URL=<GITOPS_REPO_URL>
GIT_REPO_USER=<GIT_USERNAME>
GIT_REPO_TOKEN_OR_PASS=<GIT_TOKEN>
# Helm OCI registry com os charts TDP
HELM_CHART_REPO_URL=registry.tecnisys.com.br/tdp/charts
HELM_CHART_VERSION=<TDP_K8S_RELEASE>
# Servidor Kubernetes (usar predefinido para in-cluster)
KUBERNETES_SERVER=https://kubernetes.default.svc
# Credenciais do Helm OCI registry
TECNISYS_HELM_REGISTRY_USER=<REGISTRY_USERNAME>
TECNISYS_HELM_REGISTRY_TOKEN=<REGISTRY_CLI_SECRET>
Use em HELM_CHART_VERSION a versão da release atual: 3.0.1.
variables.env.local está no .gitignore — nunca faça commit de tokens ou palavras-passe.
Passo 3 – Configurar o Argo CD para gerir Applications em namespace separado
As Applications ficam no namespace <NAMESPACE> (definido em TDP_PROJECT_NAMESPACE), não no namespace argocd.
Configure o Argo CD para gerir esse namespace através do parâmetro application.namespaces — consulte Configuração do Argo CD → Application namespaces.
Passo 4 – Bootstrap do Argo CD
O script deploy.sh automatiza a instalação do Argo CD e o bootstrap do GitOps.
Opção A: Bootstrap completo — instala o Argo CD (recomendado)
Instala o Argo CD (tdp-crds + tdp-argo) via Helm OCI, aguarda os pods prontos, renderiza os templates e aplica os recursos comuns:
./deploy.sh --install -v variables.env.local
O que é executado:
helm registry login→ autentica no OCI registryhelm upgrade --install tdp-crds→ instala os CRDs do Argo CDhelm upgrade --install tdp-argo→ instala o Argo CDkubectl rollout status→ aguardaargocd-servereapplication-controllerenvsubstem todos os templates → preenchecurrent/kubectl applynos ficheiros decurrent/common/:argo-gitops-appproject.yaml— AppProject TDPtdp-devops-repo-secret.yaml— credencial git para o Argo CDtdp-registry-secret.yaml— credencial do Helm OCI registryargo-gitops-app-of-apps.yaml— Application "App of Apps"

Opção B: Apenas o GitOps — Argo CD já instalado
Se o Argo CD já estiver instalado, apenas renderize e aplique os recursos comuns:
./deploy.sh -c -v variables.env.local

Passo 5 – Fazer commit e publicar current/ no Git
O App of Apps lê current/ diretamente do repositório git. Os ficheiros têm de estar publicados:
git add current/
git commit -m "chore: render gitops manifests"
git push origin main
O App of Apps criará automaticamente todas as Applications presentes em current/ com selfHeal: true.

Passo 6 – Acompanhar a sincronização
Verificar o estado
# Application App-of-Apps (namespace argocd)
kubectl get application -n argocd
# Applications criadas (namespace dos componentes TDP)
kubectl get application -n <NAMESPACE>
# Pods no namespace dos componentes
kubectl get pods -n <NAMESPACE>
# Palavra-passe inicial do admin Argo CD
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath='{.data.password}' | base64 -d && echo

Via interface web
Aceda à interface do Argo CD:
kubectl get ingress -n argocd
# ou
kubectl get httproute -n argocd

Navegue para a Application configurada em TDP_APPLICATIONS e acompanhe o progresso.
Compreender o manifest de Application
Cada componente usa um template parametrizado. Exemplo (renderizado):
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: tdp-postgresql
namespace: <NAMESPACE>
labels:
tecnisys.io/cluster: tdp
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: <NAMESPACE>
source:
repoURL: registry.tecnisys.com.br/tdp/charts
targetRevision: <TDP_K8S_RELEASE>
chart: tdp-postgresql
helm:
valueFiles:
- values.yaml
destination:
server: https://kubernetes.default.svc
namespace: <NAMESPACE>
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- RespectIgnoreDifferences=true
ignoreDifferences:
- group: ""
kind: Secret
jqPathExpressions:
- ".data"
Campos importantes:
metadata.namespace— namespace onde a Application é criada (TDP_PROJECT_NAMESPACE)spec.project— AppProject que define as permissões (TDP_NAMESPACE)spec.source.repoURL— registry OCI dos charts TDPspec.source.chart— nome do chartspec.destination.namespace— namespace onde os pods são criados (TDP_NAMESPACE)syncPolicy.automated— sincronização automáticaignoreDifferences— ignora mudanças em Secrets (evita flapping de palavras-passe)
Personalização de componentes
Cada componente tem um values.yaml em available/<componente>/:
# Editar os valores do componente
vim available/tdp-postgresql/values.yaml
# Rerenderizar
./deploy.sh -v variables.env.local -p
# Fazer commit e publicar
git add current/tdp-postgresql/
git commit -m "chore: update postgresql values"
git push origin main
deploy.sh: referência completa
./deploy.sh [OPÇÕES] [COMPONENTES...]
| Flag | Descrição |
|---|---|
--install | Primeira instalação: helm login → tdp-crds → tdp-argo → aguarda ready → renderiza → aplica common |
-v FILE | Usar um ficheiro de variáveis personalizado (predefinido: variables.env) |
-p | Renderizar available/ → current/ apenas (sem aplicar) |
-c | Aplicar apenas os recursos comuns (current/common/) via kubectl |
-a | Renderizar + aplicar componentes via kubectl (não aplica common) |
-h | Mostrar ajuda |
Exemplos:
# Primeira instalação completa (instala Argo CD + bootstrap)
./deploy.sh --install -v variables.env.local
# Rerenderizar templates e publicar (modo GitOps)
./deploy.sh -p -v variables.env.local
git add current/ && git commit -m "chore: render" && git push
# Reaplicar apenas os recursos comuns (AppProject, Secrets, App of Apps)
./deploy.sh -c -v variables.env.local
# Deploy direto de um componente (sem git push)
./deploy.sh -a tdp-postgresql -v variables.env.local
# Deploy direto de múltiplos componentes
./deploy.sh -a tdp-postgresql tdp-trino -v variables.env.local
- Passo 1 – Obter repo
- Passo 4 – Bootstrap completo
- Passo 4 – Bootstrap manual
- Passo 5 – Commit e push
- Passo 6 – Estado
- Passo 6 – Interface web
Verificação da instalação
- Comandos
- Vídeos
Verificar o estado das Applications
argocd app list

Verificar uma Application específica
argocd app get tdp-postgresql

Verificar os Pods no cluster
kubectl get pods -n <NAMESPACE>

Todos os pods devem apresentar o estado Running com todas as réplicas prontas.
Verificar os Serviços
kubectl get svc -n <NAMESPACE>

Verificar os Volumes Persistentes
kubectl get pvc -n <NAMESPACE>

Todos os Persistent Volume Claims devem apresentar o estado Bound.
- argocd app list
- argocd app get
- kubectl get pods
- kubectl get svc
- kubectl get pvc
Resolução de problemas
Application em OutOfSync ou Degraded
Se uma Application apresentar o estado OutOfSync ou Degraded:
-
Verifique os detalhes da Application:
Terminal inputargocd app get <componente> -
Verifique os eventos e logs dos pods:
Terminal inputkubectl describe pod <pod-name> -n <NAMESPACE>
kubectl logs <pod-name> -n <NAMESPACE> -
Tente sincronizar manualmente:
Terminal inputargocd app sync <componente>

Erro de acesso ao registry OCI
Se o Argo CD apresentar erro ao tentar transferir um chart:
-
Verifique se o secret do registry foi aplicado:
Terminal inputkubectl get secret tdp-helm-oci-tdp -n argocd -o yaml -
As credenciais podem ter expirado. Reaplique os recursos comuns:
Terminal input./deploy.sh -c -v variables.env.local -
Verifique a conectividade do cluster com o registry:
Terminal inputkubectl run test-dns --rm -it --image=busybox -n <NAMESPACE> -- \
sh -c "nslookup registry.tecnisys.com.br"
Componentes com dependência do PostgreSQL a falhar
Se Airflow, Superset, Ranger, OpenMetadata ou CloudBeaver apresentarem falhas:
-
Verifique se o PostgreSQL está operacional:
Terminal inputkubectl get pods -n <NAMESPACE> | grep tdp-postgresql -
Se o PostgreSQL ainda não estiver
Running, aguarde. OselfHealdo Argo CD reconcilia os componentes dependentes automaticamente. -
Para forçar a reconciliação manualmente:
Terminal inputargocd app sync tdp-airflow
Application no namespace errado
As Applications devem estar no namespace <NAMESPACE> (definido em TDP_PROJECT_NAMESPACE), não em argocd. Confirme que o argocd-cm tem application.namespaces configurado para o namespace do projeto (ver Passo 3).
Debug de sincronização
# Ver os eventos da Application
kubectl describe application <componente> -n <NAMESPACE>
# Logs do application controller
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=100
# Forçar reconciliação
kubectl annotate application <componente> -n <NAMESPACE> \
argocd.argoproj.io/refresh=hard --overwrite
Rollback de uma Application
O Argo CD mantém um histórico de sincronizações. Para reverter:
-
Via interface web: selecione a Application → History and Rollback → escolha a revisão → Rollback.
-
Via CLI:
Terminal input# Listar o histórico
argocd app history <componente>
# Reverter para uma revisão específica
argocd app rollback <componente> <revision-id>
Ao realizar rollback de um componente que depende do PostgreSQL, verifique se a versão da base de dados é compatível com a versão do componente a ser revertido.
Atualizar versão dos charts
# 1. Atualizar HELM_CHART_VERSION em variables.env.local
vim variables.env.local
# 2. Rerenderizar
./deploy.sh -v variables.env.local -p
# 3. Fazer commit
git add current/
git commit -m "chore: bump chart version"
git push origin main
Após o push, o Argo CD deteta a mudança em current/ e atualiza os componentes automaticamente.
Compatibilidade ArgoCD
Todos os charts TDP foram ajustados para compatibilidade total com o Argo CD:
- Single-source: as Applications usam apenas a fonte OCI (sem multi-source).
- ignoreDifferences: Secrets ignorados para evitar flapping de palavras-passe.
- Check-or-reuse: credenciais reutilizadas quando já existem (sem rotação em sync).
- Namespace separado: Applications em
TDP_PROJECT_NAMESPACE. - Sync waves: ordenação correta de recursos dependentes.
Componentes com ajustes específicos para Argo CD:
- tdp-jupyter: correção da rotação de palavra-passe no
db-create-job - tdp-trino: remoção de hooks elimináveis (PVC/Job)
- tdp-hive-metastore: correção da rotação de palavra-passe + security context
- tdp-superset: correção do
randAlphaNumdo PostgreSQL (Bitnami) - tdp-clickhouse: cleanup job desativado por omissão
- tdp-airflow: remoção de lookup em secrets
Segurança
variables.env.localestá no.gitignore— nunca faça commit de tokens ou palavras-passe.- Use Kubernetes Secrets para dados sensíveis em runtime.
- Rode os tokens do git e do registry regularmente.
- O
TDP_PROJECT_NAMESPACEdeve ter RBAC restrito. - Os Secrets do registry e do git são versionados como templates em
common/(preenchidos a partir devariables.env.local).
Componentes disponíveis
| Componente | Descrição | Dependências |
|---|---|---|
tdp-postgresql | PostgreSQL | — |
tdp-trino | Trino SQL engine | — |
tdp-airflow | Apache Airflow | PostgreSQL |
tdp-clickhouse | ClickHouse | — |
tdp-cloudbeaver | CloudBeaver UI | PostgreSQL |
tdp-deltalake | Delta Lake | — |
tdp-hive-metastore | Hive Metastore | PostgreSQL |
tdp-iceberg | Apache Iceberg | — |
tdp-jupyter | JupyterHub | — |
tdp-kafka | Apache Kafka (Strimzi) | — |
tdp-nifi | Apache NiFi | — |
tdp-openmetadata | OpenMetadata | PostgreSQL |
tdp-ozone | Apache Ozone S3 | — |
tdp-ranger | Apache Ranger | — |
tdp-spark | Apache Spark | — |
tdp-superset | Apache Superset | PostgreSQL |
Footnotes
-
OCI (Open Container Initiative) é o padrão moderno para armazenar não apenas imagens de contentor, mas também pacotes Helm. Por isso, ao registar o registry, é necessário marcar a opção Enable OCI — sem ela, o Argo CD tentará tratar o endereço como um repositório Helm convencional baseado em
index.yamle a conexão falhará. ↩