Este repositório centraliza as configurações de infraestrutura, segurança, rede e manifestos de aplicações hospedadas no cluster MicroK8s.
configCluster/
├── README.md
├── deploy.sh # Script de deploy automatizado do cluster
├── base/ # Recursos globais e de infraestrutura
│ ├── cluster-issuer.yaml # Cert-Manager (Let's Encrypt SSL)
│ ├── namespaces.yaml # Criação e isolamento dos namespaces
│ └── quotas/
│ └── guest-apps-quota.yaml # Quotas aplicadas APENAS nos convidados
└── apps/ # Manifestos de cada aplicação
├── terminalWeb/ # Aplicação principal terminalWeb
│ ├── deployment.yaml # Deployment, Service e Ingress
│ ├── rbac.yaml # Permissões da aplicação no seu namespace
│ └── network-policy.yaml # Isolamento de rede dos pods MPI
├── anatox/ # Aplicação Anatox
│ └── ingress.yaml # Ingress com subdomínio anatox.clusterlups...
└── exemplo-nova-app/ # Template pronto para novas aplicações
└── deployment.yaml
Como a universidade trabalha com entradas individuais de DNS (sem domínio wildcard), o fluxo para cada aplicação é possuir uma entrada de DNS própria solicitada à equipe de redes da UFPel (NTI), apontando sempre para o mesmo IP do servidor do cluster:
-
Estrutura dos domínios:
- Domínio Principal (terminalWeb):
clusterlups.inf.ufpel.edu.br-> Aponta para o IP do cluster (hospeda a aplicação principal com suporte a WebSockets e timeouts estendidos). - Subdomínios Individuais (Aplicações Convidadas):
<app>.clusterlups.inf.ufpel.edu.brou<app>.inf.ufpel.edu.br-> Apontam para o mesmo IP do cluster.- Exemplo:
anatox.clusterlups.inf.ufpel.edu.br.
- Exemplo:
- Domínio Principal (terminalWeb):
-
Como o MicroK8s resolve múltiplos domínios na mesma máquina:
- Todas as requisições chegam no mesmo IP e nas mesmas portas HTTP/HTTPS (80/443) do servidor.
- O Ingress Controller (NGINX) lê o cabeçalho HTTP
Host:da requisição:- Se for
clusterlups.inf.ufpel.edu.br-> Envia para o serviço doterminalWeb(terminal-web-service). - Se for
anatox.clusterlups.inf.ufpel.edu.br-> Envia para os serviços do Anatox.
- Se for
- Não há conflito de portas nem de rotas, mantendo total separação de tráfego.
O ClusterIssuer configurado em base/cluster-issuer.yaml usa o método http01:
- Ao criar uma aplicação com Ingress contendo a annotation
cert-manager.io/cluster-issuer: "letsencrypt-prod", o Cert-Manager resolve o desafio HTTP-01 e gera um certificado TLS gratuito e válido individualmente para aquele domínio/subdomínio. - O processo de emissão e renovação é 100% automático.
microk8s enable dns
microk8s enable ingress
microk8s enable cert-manager
microk8s enable registryO repositório inclui o script deploy.sh, que aplica a base e varre a pasta apps/ de forma ordenada (ignorando pastas de templates como exemplo-*):
# Aplica a infraestrutura base e todas as aplicações em apps/:
./deploy.sh
# Ou aplica a base e apenas uma aplicação específica:
./deploy.sh terminalWeb
# Verifica o status consolidado de pods, namespaces e ingresses:
./deploy.sh --statusCaso prefira executar cada manifesto individualmente:
# Cria os namespaces isolados (terminal-web, anatox, app-exemplo, etc.):
microk8s kubectl apply -f base/namespaces.yaml
# Aplica o emissor global de certificados SSL (Let's Encrypt):
microk8s kubectl apply -f base/cluster-issuer.yaml
# Aplica quotas e limit ranges para as aplicações convidadas:
# (IMPORTANTE: o namespace 'terminal-web' NÃO possui ResourceQuota para permitir
# elasticidade irrestrita e Cloud Bursting no modelo BRYOC)
microk8s kubectl apply -f base/quotas/guest-apps-quota.yamlOs segredos devem ser criados dentro do namespace da aplicação (terminal-web):
microk8s kubectl create secret generic terminal-web-secrets \
--namespace terminal-web \
--from-env-file=/caminho/para/.envmicrok8s kubectl apply -f apps/terminalWeb/rbac.yaml
microk8s kubectl apply -f apps/terminalWeb/network-policy.yaml
microk8s kubectl apply -f apps/terminalWeb/deployment.yamlQuando outra pessoa ou equipe de pesquisa for hospedar uma aplicação ("convidada"):
- Garantir o namespace dedicado:
- Adicione o namespace em
base/namespaces.yamle aplique, ou crie manualmente:microk8s kubectl create namespace nome-da-app
- Adicione o namespace em
- Definir quotas de recursos para o convidado:
- No arquivo
base/quotas/guest-apps-quota.yaml, adicione as regras deResourceQuotaeLimitRangepara o namespacenome-da-app. Isso evita que a aplicação monopolize a máquina ou afete o Cloud Bursting doterminalWeb. - Aplique a alteração:
microk8s kubectl apply -f base/quotas/guest-apps-quota.yaml
- No arquivo
- Solicitar o subdomínio à equipe de redes da UFPel:
- Exemplo:
nome-da-app.clusterlups.inf.ufpel.edu.brapontando para o IP do servidor MicroK8s.
- Exemplo:
- Copiar o modelo pronto:
- Copie a pasta
apps/exemplo-nova-app/paraapps/nome-da-app/.
- Copie a pasta
- Ajustar as configurações em
deployment.yaml:- O campo
namespace: nome-da-app - A imagem do container (
image: ...) e portas - O subdomínio no Ingress (
host: nome-da-app.clusterlups.inf.ufpel.edu.br) e osecretName: nome-da-app-tls
- O campo
- Aplicar no cluster:
microk8s kubectl apply -f apps/nome-da-app/deployment.yaml
Pronto! Em instantes a aplicação estará no ar com HTTPS configurado automaticamente.