KnightX — logotipo oficialKnightX
Voltar para o inícioKnightX Blog

Argocd com MicroK8s numa VPS

KubernetesDevOpsCI/CD

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:

  1. Uma VPS limpa: Com o sistema operacional Ubuntu 22.04 LTS ou superior.
  2. Acesso root via SSH: Acesso total ao terminal do seu servidor.
  3. Um domínio configurado: Um nome de domínio que você possa gerenciar os registros DNS.
  4. 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.br
      • traefik.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 status Ready.

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á Running e se o serviço tem um EXTERNAL-IP com kubectl 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

  1. Acesse a URL: Abra uma nova janela anônima e acesse https://argocd.skyi.com.br.
  2. Pegue a Senha Inicial:
      kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
      

      O nome de usuário é admin.