Loading repository data…
Loading repository data…
Zer0Kau / repository
Este projeto implementa uma automação completa de infraestrutura como código (IaC) para criar um cluster Kubernetes de alta disponibilidade usando MicroK8s em ambiente Proxmox VE
Este projeto implementa uma automação completa de infraestrutura como código (IaC) para criar um cluster Kubernetes de alta disponibilidade usando MicroK8s em ambiente Proxmox VE. A solução inclui:
graph TB
subgraph "Proxmox VE Host"
subgraph "Cluster Kubernetes HA"
K1[k8s-1<br/>Master + Worker<br/>8GB RAM / 2 CPU]
K2[k8s-2<br/>Master + Worker<br/>8GB RAM / 2 CPU]
K3[k8s-3<br/>Master + Worker<br/>8GB RAM / 2 CPU]
end
subgraph "Serviços Implantados"
VM[VictoriaMetrics<br/>:8428]
GF[Grafana<br/>:32000]
NE[Node Exporter<br/>:9100]
MG[MongoDB ReplicaSet<br/>:32017]
end
end
subgraph "Ferramentas de Automação"
PK[Packer<br/>Template Builder]
TF[Terraform<br/>VM Provisioner]
AN[Ansible<br/>Configuration Manager]
end
PK --> K1
TF --> K1
TF --> K2
TF --> K3
AN --> K1
AN --> K2
AN --> K3
K1 <--> K2
K2 <--> K3
K3 <--> K1
# Ubuntu/Debian
sudo apt update && sudo apt install -y \
terraform \
ansible \
packer \
git \
ssh
# Verificar versões
terraform version # >= 1.0
ansible --version # >= 2.9
packer version # >= 1.7
git clone https://github.com/SEU_USUARIO/NOME_DO_REPO_PUBLICO.git
cd NOME_DO_REPO_PUBLICO
No Proxmox, crie um token de API:
# Via web interface: Datacenter > API Tokens > Add
# Ou via CLI:
pveum user add terraform@pve --password <senha>
pveum acl modify / --users terraform@pve --roles PVEAdmin
# Copie o arquivo de exemplo
cp packer/credentials.pkr.hcl.example packer/credentials.pkr.hcl
# Edite com suas credenciais:
vi packer/credentials.pkr.hcl
Conteúdo do packer/credentials.pkr.hcl:
# Suas credenciais do Proxmox
proxmox_api_url = "https://SEU_IP_PROXMOX:8006/api2/json"
proxmox_api_token_id = "terraform@pve!token_name"
proxmox_api_token_secret = "sua-chave-secreta-aqui"
target_node = "nome-do-seu-no-proxmox"
ssh_public_key = "ssh-rsa AAAA... usuario@hostname"
# Copie o arquivo de exemplo
cp terraform/sekret.tfvars.example terraform/sekret.tfvars
# Edite com suas credenciais:
vi terraform/sekret.tfvars
Conteúdo do terraform/sekret.tfvars:
proxmox_api_token_id = "terraform@pve!token_name"
proxmox_api_token_secret = "sua-chave-secreta-aqui"
proxmox_api_url = "https://SEU_IP_PROXMOX:8006/api2/json"
ssh_public_key = "ssh-rsa AAAA... usuario@hostname"
target_node = "nome-do-seu-no-proxmox"
# Copie o arquivo de exemplo
cp ansible/sekrets.yml.example ansible/sekrets.yml
# Configure as senhas dos serviços
vi ansible/sekrets.yml
Conteúdo do ansible/sekrets.yml:
vault_grafana_password: "admin123"
vault_grafana_node_port: 32000
vault_mongodb_admin_password: "MongoAdmin123!"
vault_mongodb_app_password: "AppUser123!"
Para maior segurança, criptografe o arquivo:
ansible-vault encrypt ansible/sekrets.yml
# Digite uma senha para o vault quando solicitado
# Certifique-se de que sua chave SSH está carregada
ssh-add ~/.ssh/id_rsa
# Teste conectividade com Proxmox
ssh root@SEU_IP_PROXMOX
cd packer/ubuntu-server
# Validar configuração
packer validate -var-file="../credentials.pkr.hcl" ubuntu-server.pkr.hcl
# Construir template (tempo: ~15-20 minutos)
packer build -var-file="../credentials.pkr.hcl" ubuntu-server.pkr.hcl
O que acontece:
ubuntu-server criado no Proxmoxcd ../../terraform
# Inicializar Terraform
terraform init
# Planejar implantação, caso vá apagar alguma VM existente, crie um novo workspace (veja a documentação do terraform)
terraform plan -var-file="sekret.tfvars"
# Aplicar configuração (tempo: ~10-15 minutos)
terraform apply -var-file="sekret.tfvars"
O que acontece:
cd ../ansible
# Testar conectividade
ansible all -i inventory.ini -m ping
# Configurar cluster MicroK8s (tempo: ~15-20 minutos)
ansible-playbook -i inventory.ini setup_microk8s.yml --ask-vault-pass
O que acontece:
# Deploy da stack de monitoramento (tempo: ~10-15 minutos)
ansible-playbook -i inventory.ini deploy_monitoring.yml --ask-vault-pass
O que acontece:
monitoring criado# Deploy do banco MongoDB (tempo: ~10-15 minutos)
ansible-playbook -i inventory.ini deploy_mongodb.yml --ask-vault-pass
O que acontece:
mongodb criadoPara executar todas as etapas em sequência, você pode criar um playbook principal:
# Criar arquivo de automação completa
cat > ansible/deploy_full_stack.yml << 'EOF'
- import_playbook: setup_microk8s.yml
- import_playbook: deploy_monitoring.yml
- import_playbook: deploy_mongodb.yml
EOF
# Executar stack completa (tempo: ~45-60 minutos)
ansible-playbook -i inventory.ini deploy_full_stack.yml --ask-vault-pass
Alternativa com script bash:
#!/bin/bash
set -e
echo "🏗️ Etapa 1: Construindo template com Packer..."
cd packer/ubuntu-server
packer build -var-file="../credentials.pkr.hcl" ubuntu-server.pkr.hcl
echo "🚀 Etapa 2: Provisionando VMs com Terraform..."
cd ../../terraform
terraform apply -var-file="sekret.tfvars" -auto-approve
echo "⚙️ Etapa 3: Configurando cluster com Ansible..."
cd ../ansible
sleep 60 # Aguardar VMs inicializarem
ansible-playbook -i inventory.ini setup_microk8s.yml --ask-vault-pass
echo "📊 Etapa 4: Implantando monitoramento..."
ansible-playbook -i inventory.ini deploy_monitoring.yml --ask-vault-pass
echo "💾 Etapa 5: Implantando MongoDB..."
ansible-playbook -i inventory.ini deploy_mongodb.yml --ask-vault-pass
echo "✅ Stack completa implantada com sucesso!"
Problema: O Docker Hub limita pulls de imagens para contas gratuitas (100 pulls/6h).
Sintomas:
Failed to pull image "docker.io/library/mongo:7.0": rpc error: desc = failed to pull and unpack image "docker.io/library/mongo:7.0": failed to copy: httpReadSeeker: failed open: failed to do request: Get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256:...": dial tcp: lookup production.cloudflare.docker.com: no such host
Soluções:
# Em deploy_monitoring.yml, as imagens já usam quay.io
image: quay.io/prometheus/node-exporter:v1.8.2
image: victoriametrics/victoria-metrics:v1.127.0
# No cluster, fazer login
microk8s kubectl create secret docker-registry dockerhub-secret \
--docker-server=https://index.docker.io/v1/ \
--docker-username=SEU_USUARIO \
--docker-password=SUA_SENHA \
--docker-email=SEU_EMAIL
# Configurar registry local no Proxmox
docker run -d -p 5000:5000 --name registry registry:2
Problema: MicroK8s 1.30 inclui Helm 3.9.1, mas charts modernos requerem 3.14+.
Solução: Os playbooks usam manifests diretos em vez de charts quando necessário.
Problema: Resolução DNS inconsistente pode causar falhas de pull.
Solução: O playbook configura CoreDNS com múltiplos upstream:
forward . 8.8.8.8 8.8.4.4 1.1.1.1
Arquivo: terraform/variables.tf
variable "k8s_memory" {
description = "RAM por VM K8s (MB)"
default = 8192 # Altere para 4096 se tiver menos RAM
}
variable "k8s_cores" {
description = "CPUs por VM K8s"
default = 2 # Altere para 1 se tiver menos CPU
}
Arquivo: terraform/variables.tf
variable "network_bridge" {
default = "vmbr0" # Altere para sua bridge
}
variable "nameserver" {
default = "1.1.1.1" # Altere para seu DNS
}
MicroK8s:
# Em ansible/setup_microk8s.yml
shell: snap install microk8s --classic --channel=1.30/stable
MongoDB:
# Em ansible/deploy_mongodb.yml
replicaCount: 3 # Altere número de réplicas
Arquivo: terraform/variables.tf
variable "k8s_disk" {
description = "Disco por VM K8s (GB)"
default = "50G" # Altere conforme necessário
}
Arquivo: packer/ubuntu-server/ubuntu-server.pkr.hcl
locals {
disk_storage = "local-lvm" # Altere para seu storage pool
}
# Obter IP do k8s-1
kubectl get nodes -o wide
# Acessar via browser
http://IP_DO_K8S-1:32000
Credenciais padrão:
adminansible/sekrets.yml