Objetivo

Last modified by tech on 2026/07/10 00:28

Objetivo do Sistema e Visão Geral da Arquitetura


1. Objetivos Principais do Projeto { data-toc-label="1. Objetivos" }

  1. 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.
  2. Orquestração de Contentores (HA): Cluster K3s com 3 nós master (via kube-vip) e 2 nós worker.
  3. Deployment GitOps: Infraestrutura e aplicações declaradas em Git e sincronizadas automaticamente no Kubernetes com ArgoCD.
  4. Single Sign-On (SSO): Authentik centraliza a autenticação (OIDC/OAuth2), distinguindo acessos internos de acessos via Cloudflare.
  5. Observabilidade: Métricas e logs centralizados com Prometheus, Grafana e Loki. O Promtail recolhe os logs da VM GitLab.
  6. 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.
  7. 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."

flowchart TD

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"

flowchart TD

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"

    Todos os serviços, menos o gitlab + promtail, estão dentro do cluster K3s

C. Dados, Integrações e Observabilidade { data-toc-label="C. Dados" }

!!! info "Ligação com o TrueNAS e envio de logs"

flowchart LR

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."

flowchart LR

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            |