Guia Completo: Instalando Argo CD com Traefik Ingress no MicroK8s
Objetivo: Implementar uma stack de GitOps moderna em uma VPS única, utilizando MicroK8s como cluster Kubernetes, Traefik como Ingress Controller para gerenciamento de rotas e certificados SSL, e o Argo CD como ferramenta de entrega contínua.
Data: 19 de Agosto de 2025
Pré-requisitos
Antes de começar, garanta que você tenha:
- Uma VPS limpa: Com o sistema operacional Ubuntu 22.04 LTS ou superior.
- Acesso root via SSH: Acesso total ao terminal do seu servidor.
- Um domínio configurado: Um nome de domínio que você possa gerenciar os registros DNS.
- Apontamentos de DNS: No painel do seu provedor de domínio, crie os seguintes registros do tipo
A, apontando para o IP público da sua VPS (ex:145.223.93.33):argocd.seu-dominio.com.brtraefik.seu-dominio.com.br(para o dashboard do Traefik)
Passo 1: Instalação e Configuração do MicroK8s
Primeiro, preparamos nosso cluster Kubernetes.
1.1. Instale o MicroK8s:
O MicroK8s é instalado via snap, o que cria um ambiente Kubernetes autocontido.
sudo snap install microk8s --classic
1.2. Configure as Permissões do Usuário:
Isso permite o uso dos comandos do MicroK8s sem precisar de sudo a todo momento.
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube
Importante: Saia da sua sessão SSH e conecte-se novamente para que as permissões tenham efeito.
exit
1.3. Habilite os Addons Essenciais: Após se reconectar, verifique o status e habilite os módulos de DNS, armazenamento e LoadBalancer.
# Verifica se o cluster está pronto
microk8s status --wait-ready
# Habilita DNS e o provisionador de armazenamento local
microk8s enable dns hostpath-storage
# Habilita o MetalLB para fornecer IPs externos aos serviços LoadBalancer
microk8s enable metallb
1.4. Configure o MetalLB: O MetalLB perguntará qual faixa de IPs ele deve gerenciar. Forneça o IP público da sua VPS.
Enter a range of IP addresses on your network (e.g. '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'):
# Digite seu IP aqui, no formato de faixa
145.223.93.33-145.223.93.33
1.5. Crie um Atalho para o kubectl:
Para facilitar, criamos um alias para o kubectl do MicroK8s.
sudo snap alias microk8s.kubectl kubectl
- Verificação: Rode
kubectl get nodes. A saída deve mostrar seu servidor com o statusReady.
Passo 2: Instalação do Traefik Ingress Controller
Com o cluster pronto, vamos instalar nosso gerenciador de rotas.
2.1. Crie os Diretórios:
mkdir -p /var/infra/traefik
mkdir -p /var/infra/argocd
2.2. Instale os CRDs do Traefik:
Este comando ensina ao Kubernetes sobre os recursos do Traefik, como IngressRoute.
kubectl apply -f [<https://raw.githubusercontent.com/traefik/traefik/v2.10/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml>](<https://raw.githubusercontent.com/traefik/traefik/v2.10/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml>)
2.3. Crie os Manifestos do Traefik:
Crie o arquivo de permissões /var/infra/traefik/traefik-rbac-fix.yaml com o seguinte conteúdo:
# (/var/infra/traefik/traefik-rbac-fix.yaml)
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik
namespace: traefik
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: traefik-role
rules:
- apiGroups: [""]
resources: ["services", "endpoints", "secrets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["extensions", "networking.k8s.io"]
resources: ["ingresses", "ingressclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: ["traefik.io"]
resources: ["middlewares", "ingressroutes", "traefikservices", "tlsoptions", "tlsstores", "ingressroutetcps", "ingressrouteudps", "serverstransports", "servertransporttcps"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: traefik-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: traefik-role
subjects:
- kind: ServiceAccount
name: traefik
namespace: traefik
Crie o arquivo principal de instalação /var/infra/traefik/traefik-complete.yaml com o seguinte conteúdo, substituindo pelo seu e-mail e domínio:
# (/var/infra/traefik/traefik-complete.yaml)
apiVersion: v1
kind: Namespace
metadata:
name: traefik
---
apiVersion: v1
kind: ConfigMap
metadata:
name: traefik-config
namespace: traefik
data:
traefik.yaml: |
api:
dashboard: true
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
providers:
kubernetesCRD: {}
certificatesResolvers:
letsencrypt:
acme:
email: "italo.barros@skyi.com.br" # <-- MUDE AQUI SE NECESSÁRIO
storage: /data/acme.json
httpChallenge:
entryPoint: web
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: traefik-cert-pvc
namespace: traefik
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: traefik
namespace: traefik
spec:
replicas: 1
selector:
matchLabels:
app: traefik
template:
metadata:
labels:
app: traefik
spec:
serviceAccountName: traefik
containers:
- name: traefik
image: traefik:v2.10
args:
- --configfile=/config/traefik.yaml
ports:
- name: web
containerPort: 80
- name: websecure
containerPort: 443
- name: admin
containerPort: 8080
volumeMounts:
- name: config
mountPath: /config
- name: certs
mountPath: /data
volumes:
- name: config
configMap:
name: traefik-config
- name: certs
persistentVolumeClaim:
claimName: traefik-cert-pvc
---
apiVersion: v1
kind: Service
metadata:
name: traefik
namespace: traefik
spec:
type: LoadBalancer
ports:
- name: web
port: 80
targetPort: 80
- name: websecure
port: 443
targetPort: 443
selector:
app: traefik
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
namespace: traefik
spec:
entryPoints:
- websecure
routes:
- match: Host(`traefik.skyi.com.br`) # <-- MUDE AQUI SE NECESSÁRIO
kind: Rule
services:
- name: api@internal
kind: TraefikService
tls:
certResolver: letsencrypt
2.4. Aplique os Manifestos do Traefik:
kubectl apply -f /var/infra/traefik/traefik-complete.yaml
kubectl apply -f /var/infra/traefik/traefik-rbac-fix.yaml
- Verificação: Aguarde um minuto e verifique se o pod está
Runninge se o serviço tem umEXTERNAL-IPcomkubectl get pods,svc -n traefik.
Passo 3: Instalação e Exposição do Argo CD
3.1. Crie o Manifesto de Rota do Argo CD:
Crie o arquivo /var/infra/argocd/argocd-ingress-route.yaml com este conteúdo:
# (/var/infra/argocd/argocd-ingress-route.yaml)
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: argocd
namespace: argocd
spec:
entryPoints:
- websecure
routes:
- match: Host(`argocd.skyi.com.br`) # <-- MUDE AQUI SE NECESSÁRIO
kind: Rule
services:
- name: argocd-server
port: 80
tls:
certResolver: letsencrypt
3.2. Instale o Argo CD:
kubectl create namespace argocd
kubectl apply -n argocd -f [<https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml>](<https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml>)
Aguarde alguns minutos para todos os pods ficarem no estado Running.
3.3. Configure o Argo CD para Funcionar com o Traefik: Este passo crucial desabilita o TLS interno do Argo CD.
kubectl patch configmap argocd-cmd-params-cm -n argocd -p '{"data": {"server.insecure": "true"}}'
3.4. Reinicie o Servidor do Argo CD: Para que a nova configuração tenha efeito.
kubectl delete pod -n argocd -l app.kubernetes.io/name=argocd-server
3.5. Crie a Rota Final:
kubectl apply -f /var/infra/argocd/argocd-ingress-route.yaml
Passo 4: Acesso ao Argo CD
- Acesse a URL:
Abra uma nova janela anônima e acesse
https://argocd.skyi.com.br. - Pegue a Senha Inicial:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echoO nome de usuário é
admin.