Objetivo
Objetivo do Sistema e Visão Geral da Arquitetura
1. Objetivos Principais do Projeto { data-toc-label="1. Objetivos" }
- Centralização de Código e CI/CD: Instância privada do GitLab CE (VM dedicada, Omnibus) para alojar repositórios e executar pipelines automáticos através de runners Kubernetes.
- Orquestração de Contentores (HA): Cluster K3s com 3 nós master (via kube-vip) e 2 nós worker.
- Deployment GitOps: Infraestrutura e aplicações declaradas em Git e sincronizadas automaticamente no Kubernetes com ArgoCD.
- Single Sign-On (SSO): Authentik centraliza a autenticação (OIDC/OAuth2), distinguindo acessos internos de acessos via Cloudflare.
- Observabilidade: Métricas e logs centralizados com Prometheus, Grafana e Loki. O Promtail recolhe os logs da VM GitLab.
- Persistência de Dados: TrueNAS SCALE (192.168.1.28) fornece armazenamento NFS através de dois datasets:
- /mnt/storage/gitlab — Montado na VM GitLab (/var/opt/gitlab) para repositórios, registry, artefactos e backups.
- /mnt/storage/k8s-pvc — Exposto como NFS StorageClass, criado para todas as aplicações Kubernetes.
- Acesso Remoto Seguro: Cloudflare Tunnel expõe GitLab e Authentik sem abertura de portas no router. O túnel termina no Traefik Público (192.168.1.41), separado do Traefik Privado (192.168.1.40) para serviços privados(internos).
2. Visão Geral da Arquitetura
A. Fluxo de Tráfego
!!! info "Como o tráfego da internet e da rede local chega aos Ingress Controllers (Traefik) e é distribuído pelas aplicações."
subgraph Internet["Internet"]
ExtUser["Utilizador Remoto"]
CloudflareCDN["Cloudflare CDN\n(rede anycast)"]
end
subgraph LocalNet["Rede da Junta (192.168.1.0/24)"]
LocalUser["Utilizador Local"]
end
subgraph K3s_Ingress["K3s: Ingress & Tunnel"]
Cloudflared["cloudflared (pod)\nTúnel outbound"]
TraefikPub["Traefik Público\n(192.168.1.41)"]
TraefikPriv["Traefik Privado\n(192.168.1.40)"]
end
subgraph Servicos["Aplicações"]
GitLab["GitLab CE (VM)\ngitlab.fcidadeguimaraes.pt"]
Auth["Authentik (K8s)\nauth.fcidadeguimaraes.pt"]
ArgoCD["ArgoCD (K8s)\nargocd.fcidadeguimaraes.pt"]
Grafana["Grafana (K8s)\ngrafana.fcidadeguimaraes.pt"]
end
%% Acesso Externo
ExtUser --> CloudflareCDN
CloudflareCDN <-->|"Túnel encriptado"| Cloudflared
Cloudflared -->|"Encaminha"| TraefikPub
TraefikPub --> GitLab
TraefikPub --> Auth
%% Acesso Interno
LocalUser -->|".41"| TraefikPub
LocalUser -->|".40"| TraefikPriv
TraefikPriv --> ArgoCD
TraefikPriv --> Grafana
B. Orquestração
!!! info "Cluster K3s, deploy de aplicações acontece dentro dos workers"
subgraph Proxmox_Hypervisor["Proxmox VE (192.168.1.7)"]
subgraph K3s_HA_Cluster["Cluster K3s HA"]
VIP["kube-vip\n(192.168.1.20)"]
subgraph K8s_Masters["Masters HA"]
m1["k3s-m1 (.21)"]
m2["k3s-m2 (.22)"]
m3["k3s-m3 (.23)"]
end
subgraph K8s_Workers["Workers"]
w1["k3s-w1 (.31)"]
w2["k3s-w2 (.32)"]
end
end
GitLab_VM["VM dedicada:\nGitLab CE (.10)"]
end
VIP --> m1 & m2 & m3
m1 & m2 & m3 -->|Orquestração| w1 & w2
!!! important "Nota"
C. Dados, Integrações e Observabilidade { data-toc-label="C. Dados" }
!!! info "Ligação com o TrueNAS e envio de logs"
subgraph K3s["Serviços Kubernetes"]
ArgoCD["ArgoCD<br/>(GitOps)"]
Authentik["Authentik<br/>(SSO)"]
Runner["GitLab Runner"]
Monitoring["Prometheus<br/>Grafana<br/>Loki"]
end
GitLab["GitLab CE (VM)<br/>Promtail instalado"]
subgraph Storage["TrueNAS (192.168.1.28)"]
DatasetGitLab["Dataset<br/>/mnt/storage/gitlab"]
DatasetPVC["Dataset<br/>/mnt/storage/k8s-pvc"]
end
%% Autenticação
ArgoCD -->|OIDC / OAuth2| Authentik
GitLab -->|OIDC / OAuth2| Authentik
%% GitOps e CI/CD
ArgoCD -->|Monitoriza Repositórios| GitLab
Runner -->|Executa Jobs CI/CD| GitLab
%% Observabilidade
GitLab -->|Promtail → Loki| Monitoring
%% Armazenamento
GitLab -->|NFS| DatasetGitLab
D. Emissão Automática de Certificados (TLS) { data-toc-label="D. Certificados" }
!!! info "Fluxo do cert-manager a utilizar o desafio DNS-01 para obter certificados TLS válidos (Let's Encrypt) para serviços internos."
CertManager["cert-manager\n(Cluster K3s)"]
CFAPI["Cloudflare API"]
CertManager -->|"Desafio DNS-01"| CFAPI
CFAPI -.->|"Valida & Emite"| CertManager
2.2 Separação Público / Privado { data-toc-label="2.2 Público / Privado" }
| Serviço | Domínio | IP Traefik | Acessível de |
| GitLab CE | gitlab.fcidadeguimaraes.pt | .41 (Público) | Internet + Rede Local |
| Authentik SSO | auth.fcidadeguimaraes.pt | .41 (Público) | Internet + Rede Local |
| ArgoCD | argocd.fcidadeguimaraes.pt | .40 (Privado) | Rede Local |
| Grafana | grafana.fcidadeguimaraes.pt | .40 (Privado) | Rede Local |