Requisitos
Requisitos Funcionais
RF1 — Convenção de Nomenclatura
- Todo namespace Kubernetes segue o padrão
{project}-{env}-{service} - Todo namespace carrega todas as 9 labels obrigatórias:
project,env,service,team,backstage.io/domain,backstage.io/system,backstage.io/component,argocd/app,argocd/app-set - Nomes de entidades Backstage são agnósticos de ambiente:
{system}-{service}para Components,{provider}-{project}-{env}-{type}-{name}para Resources - Nomes de Applications ArgoCD seguem
{system}-{service}-{env}
RF2 — Repositórios GitOps
- Um repositório
platform-gitopsde propriedade da equipe de plataforma contendo AppProjects, ApplicationSets, XRDs/Compositions do Crossplane, RBAC e templates do Backstage - Um repositório
{domain}-gitopspor domínio contendo manifestos k8s, Claims do Crossplane e entidades do catálogo Backstage - Um repositório de aplicação
{app}-repopor serviço contendo o código-fonte,Dockerfile, TechDocs e pipelines de CI - Repositórios de domínio são criados automaticamente pelo template
create-domaindo Backstage, e repositórios de aplicação pelocreate-service
RF3 — Entrega via ArgoCD
- Todo domínio tem um AppProject que restringe repositórios de origem e namespaces de destino
- Serviços são implantados via geradores de matriz ApplicationSet (serviços × clusters)
- Applications em Prod exigem sync manual — aplicado via
syncWindowsetemplatePatch - Sync windows negam deploys automatizados em prod nas noites de dias úteis e fins de semana
ignoreDifferencesdo ArgoCD em/spec/replicasevita sobrescrever decisões do HPA- Claims do Crossplane são implantados via ApplicationSets com gerador git-directory
RF4 — Catálogo Backstage
- Entidades Domain, System, Component, Resource, Group e User para todo ativo da plataforma
backstage.io/kubernetes-label-selectorem todo Component exibe saúde em todos os clusters com uma única annotationargocd/app-selectorem todo Component exibe o status de sincronização por ambientebackstage.io/kubernetes-label-selectorem todo Resource exibe o status READY/SYNCED do Claim Crossplane- Catálogo registrado via entidades de Location em
catalog-info.yamlpor repositório de domínio
RF5 — Provisionamento de Recursos de Nuvem (Crossplane)
- Recursos de nuvem declarados como Claims do Crossplane em
{domain}-gitops/crossplane/claims/{env}/ - Namespaces de infra
{domain}-{env}-infraisolados dos namespaces de aplicação deletionPolicy: Orphancomo padrão em todos os Claims de produção- Segredos de conexão escritos no namespace de infra após o provisionamento
- Provedores suportados: GCP, AWS, Azure, IBM
- Tipos de recursos suportados: clusters (GKE/EKS/AKS/IKS), bancos de dados (Cloud SQL/RDS/PostgreSQL/Cosmos), filas (Pub/Sub/SQS/Service Bus/Event Streams), armazenamento (GCS/S3/Blob/COS), cache (Memorystore/ElastiCache/Redis), registries, secret stores
RF6 — RBAC e Controle de Acesso
- RoleBindings do Kubernetes usam sujeitos de Grupo apenas (nunca sujeitos de Usuário individuais para acesso rotineiro)
- Quatro papéis de plataforma:
viewer,developer,lead,platform-engineer - Papel
developer: nenhum RoleBinding criado para namespaces de prod - Papel
platform-engineer: ClusterRoleBinding para namespacesplatform-* - Papéis de projeto ArgoCD:
readonly,developer(sync apenas em dev/staging),domain-admin - RBAC aplicado exclusivamente via templates Backstage (
create-group,create-user)
RF7 — Templates Scaffolder do Backstage
| Template | Gatilho | Saída |
|---|---|---|
create-domain | Onboarding de nova área de produto | Entidade Domain, repositório {domain}-gitops, AppProject |
create-system | Adição de novo agrupamento de produto | Entidade System, ApplicationSet, base para TechDocs |
create-service | Adição de nova carga de trabalho | Novo {app}-repo (CI/CD, TechDocs), manifestos k8s por ambiente, entidade Component, elemento do AppSet |
create-resource | Solicitação de infraestrutura de nuvem | Claims Crossplane por ambiente, entidades Resource |
create-secret | Criptografia de dados sensíveis | Manifestos SealedSecret enviados de forma segura para o domain-gitops |
create-group | Onboarding de nova equipe | Entidade Group, bindings RBAC, papéis ArgoCD |
create-user | Onboarding de novo engenheiro | Entidade User, bindings RBAC, usuário ArgoCD |
Todos os templates usam EntityPicker para garantir integridade referencial — uma entidade filha não pode ser criada sem que seu pai já exista no catálogo.
RF8 — CI de Validação de Convenção
- Todo repositório de domínio contém
.github/workflows/validate-conventions.yamlgerado pelocreate-domain - Verificações: validação de schema kubeconform, padrão de nomenclatura de namespaces via
validate-namespaces.sh, todas as 9 labels obrigatórias, requests/limits de recursos em todos os containers, dry-run diff do ArgoCD contra o cluster de dev - Violações de convenção reprovam o PR — o merge é bloqueado
Requisitos Não-Funcionais
RNF1 — Confiabilidade
- ArgoCD: 99,9% de uptime no cluster de gerenciamento
- Backstage: 99,5% de uptime; funcionalidade degradada aceitável durante interrupções
- Crossplane: loop de reconciliação contínua — drift corrigido em até 5 minutos após a detecção
RNF2 — Performance
- Carregamento de página do catálogo Backstage: < 2 segundos (p95)
- Latência de sync do ArgoCD: < 60 segundos do push até a atualização do namespace
- Tempo de execução do template
create-service: < 3 minutos de ponta a ponta
RNF3 — Segurança
- Nenhum segredo em texto plano no Git — Sealed Secrets self-service via template
create-secret - Isolamento de rede aplicado por NetworkPolicy em todo namespace (negar tudo por padrão)
- Padrões de segurança de Pod:
runAsNonRoot,readOnlyRootFilesystem,allowPrivilegeEscalation: false - Sync windows de prod: syncs automatizados negados fora do horário comercial
- Autenticação OIDC para Backstage, ArgoCD e Headlamp
RNF4 — Escalabilidade
- A plataforma deve suportar 20+ domínios, 100+ sistemas, 500+ serviços sem mudanças arquiteturais
- O gerador de matriz ApplicationSet escala linearmente — nenhuma criação manual de Application necessária
- O gerador git-directory do Crossplane descobre novos Claims automaticamente sem mudanças no ApplicationSet
RNF5 — Observabilidade
- Todos os serviços de plataforma instrumentados com métricas Prometheus
- Logs enviados ao Loki central via Alloy em cada cluster
- Plugin k8s do Backstage exibe saúde dos pods e eventos recentes por componente por ambiente
- Status READY/SYNCED do Claim Crossplane exibido nas páginas de Resource do Backstage
RNF6 — Experiência do Desenvolvedor
- P1 (Engenheiro de Produto) pode criar um novo serviço sem nenhuma interação com a equipe de plataforma
- Todo conhecimento necessário está codificado em templates — nenhuma documentação externa necessária durante o fluxo normal
- CI de validação de convenção fornece mensagens de erro acionáveis