Introdução ao Kubernetes com K3s/K0s para Homelab¶
Kubernetes (frequentemente abreviado como K8s) é uma plataforma de orquestração de containers open-source extremamente poderosa e flexível, originalmente desenvolvida pelo Google e agora mantida pela Cloud Native Computing Foundation (CNCF). Ele automatiza o deploy, o escalonamento, a manutenção e o gerenciamento de aplicações containerizadas em um cluster de máquinas (nós).
Embora o Kubernetes completo ("vanilla" K8s) possa ser complexo de configurar e consumir muitos recursos, tornando-o um pouco intimidador para um ambiente de homelab com recursos limitados, surgiram distribuições Kubernetes mais leves, como K3s e K0s. Essas distribuições são projetadas para serem mais fáceis de instalar e gerenciar, e requerem menos recursos, tornando-as ideais para ambientes de borda (edge), IoT, desenvolvimento e, crucialmente, para homelabs e aprendizado.
Requisitos de Recursos e Complexidade Adicional
Rodar Kubernetes, mesmo uma distribuição leve como K3s ou K0s, adicionará uma camada significativa de complexidade à sua infraestrutura de servidor doméstico em comparação com o setup Docker/Portainer que implementamos. Além disso, ele consumirá mais recursos do sistema (CPU e, especialmente, RAM).
* Com os 48GB de RAM do nosso host Proxmox, você tem mais margem, mas ainda precisará planejar cuidadosamente a alocação de recursos para as VMs que hospedarão seu cluster K3s/K0s.
* Pode ser necessário desligar outras VMs (como a ai-desktop-vm ou reduzir seus recursos) ou diminuir a alocação da core-services-vm se você decidir dedicar recursos significativos para um cluster Kubernetes.
* Considere começar com um cluster de nó único para aprendizado e expandir apenas se necessário e se os recursos permitirem.
1. Por que Considerar Kubernetes em um Homelab?¶
Mesmo que possa parecer um exagero para algumas necessidades de homelab, explorar Kubernetes oferece vários benefícios:
- Aprendizado de uma Tecnologia Chave da Indústria: Kubernetes é a plataforma de orquestração de containers dominante em ambientes de produção e nuvem. Aprender K8s no seu homelab pode ser extremamente valioso profissionalmente e abrir portas para novas oportunidades de carreira.
- Portabilidade e Padronização de Aplicações: Muitas aplicações modernas e projetos open-source são cada vez mais distribuídos como Helm charts (o gerenciador de pacotes para Kubernetes) ou manifestos YAML para Kubernetes. Isso facilita o deploy dessas aplicações em qualquer cluster K8s, incluindo o seu.
- Resiliência e Auto-Recuperação (Self-Healing): Kubernetes é projetado para manter o estado desejado das suas aplicações. Ele pode automaticamente:
- Reiniciar containers que falharam.
- Substituir pods (conjuntos de containers) que não estão respondendo.
- Mover cargas de trabalho para nós saudáveis em um cluster multi-nó, caso um nó falhe (requer configuração apropriada).
- Escalabilidade (Conceitual para Homelab): Embora você provavelmente não precise de escalabilidade massiva em casa, entender os conceitos de escalonamento horizontal de pods (aumentar/diminuir o número de réplicas de uma aplicação) e o auto-escalonamento (HPA - Horizontal Pod Autoscaler) é uma habilidade útil.
- Ecossistema Vibrante e Extensível: Existe uma vasta gama de ferramentas, plugins e integrações construídas em torno do Kubernetes para:
- Monitoramento (e.g., Prometheus, Grafana via
kube-prometheus-stack). - Logging (e.g., Fluentd/Fluent Bit com Elasticsearch/Loki).
- Service Mesh (e.g., Istio, Linkerd) para gerenciamento avançado de tráfego entre microsserviços.
- CI/CD (e.g., ArgoCD, Flux).
- Monitoramento (e.g., Prometheus, Grafana via
- Infraestrutura como Código (IaC) para Aplicações: Manifestos YAML do Kubernetes são uma forma de IaC para definir suas aplicações.
2. K3s e K0s: Distribuições Kubernetes Leves e Certificadas¶
Para tornar o Kubernetes mais acessível e menos intensivo em recursos, especialmente para casos de uso fora de grandes data centers, surgiram distribuições leves e certificadas pela CNCF (o que significa que são Kubernetes conformantes).
K3s (Desenvolvido pela Rancher, agora parte da SUSE)¶
- Leve e Compacto: Empacotado como um único binário com menos de 100MB.
- Totalmente Certificado pela CNCF: É uma distribuição Kubernetes 100% compatível, o que significa que aplicações projetadas para Kubernetes vanilla devem rodar sem problemas no K3s.
- Simplificado e Otimizado:
- Remove muitos componentes legados, alpha ou não essenciais do Kubernetes completo.
- Usa SQLite como o backend de armazenamento de dados padrão para o control plane (em vez do etcd, que é mais pesado), embora o etcd também seja suportado para setups HA.
- Substitui alguns componentes internos por alternativas mais leves.
- Fácil de Instalar e Operar:
- Um script de instalação simples (
curl ... | sh -) é geralmente suficiente para iniciar um cluster de nó único ou para adicionar nós worker. - Menor sobrecarga operacional.
- Um script de instalação simples (
- Baixo Consumo de Recursos: Requer significativamente menos RAM e CPU do que uma instalação K8s vanilla. Um nó de controle K3s pode rodar com apenas 512MB de RAM (embora mais seja recomendado para cargas de trabalho reais).
- Componentes "Batteries Included" (Opcionais):
- Pode vir com um Traefik Ingress Controller embutido e habilitado por padrão (você pode desabilitá-lo se quiser usar outro).
- Inclui um Service Load Balancer (Klipper LB) simples que pode alocar IPs de uma faixa para serviços do tipo
LoadBalancerem ambientes bare-metal/VM (útil se você não tem um provedor de nuvem). - Pode incluir um sistema de métricas básico.
- Ideal para: Homelabs, desenvolvimento local, ambientes de borda (edge computing), IoT, e pequenos clusters de produção.
K0s (Desenvolvido pela Mirantis)¶
- Filosofia Similar ao K3s: Também distribuído como um único binário, focado em simplicidade, conformidade com Kubernetes e redução de sobrecarga.
- Flexível e Customizável:
- Permite uma maior customização na escolha de componentes do cluster durante a instalação, como a CNI (Container Network Interface - e.g., Calico, Cilium, Flannel) e o backend de armazenamento para o control plane.
- Seguro por Padrão: Tem um forte foco em configurações seguras desde o início.
- Instalação e Gerenciamento: Utiliza uma ferramenta de linha de comando chamada
k0sctlpara gerenciar a instalação, configuração e upgrade do cluster. - Backend do Control Plane: Suporta SQLite (padrão para single-node), etcd (para multi-node HA), ou até mesmo um backend de armazenamento externo usando
kine(que permite usar PostgreSQL, MySQL, etc., como datastore para o Kubernetes API server). - Ideal para: Usuários que precisam de uma distribuição Kubernetes leve mas querem mais controle sobre a configuração dos componentes do cluster.
K3s ou K0s para Começar no Homelab?
Ambos são excelentes opções e muito capazes para um ambiente de homelab. * K3s é frequentemente citado como sendo um pouco mais fácil e rápido para iniciar um cluster de aprendizado rapidamente, especialmente um de nó único, devido ao seu script de instalação direto. * K0s oferece um pouco mais de flexibilidade e controle sobre a configuração inicial se você tiver requisitos específicos para componentes como a CNI ou o datastore do control plane. Para um primeiro contato e para seguir tutoriais, K3s pode ser uma escolha ligeiramente mais simples para começar.
3. Conceitos Fundamentais do Kubernetes (Revisão e Expansão)¶
Entender estes conceitos é absolutamente essencial antes de começar a trabalhar com Kubernetes:
-
Nó (Node): Uma máquina (física ou virtual, como nossas VMs Proxmox) que faz parte do seu cluster Kubernetes.
- Nó do Plano de Controle (Control Plane Node / Master Node):
Gerencia o estado geral do cluster. Armazena os dados de configuração do cluster (no etcd ou SQLite). Executa componentes críticos como o
kube-apiserver(a API do Kubernetes),kube-scheduler(que decide em qual nó um Pod deve rodar), ekube-controller-manager(que executa vários controladores para manter o estado desejado). Em clusters K3s/K0s de nó único, este nó também atua como worker. - Nó de Trabalho (Worker Node):
É onde suas aplicações (em containers dentro de Pods) realmente rodam. Cada nó worker executa:
kubelet: Um agente que se comunica com okube-apiserverdo control plane e gerencia os containers no seu nó.kube-proxy: Mantém as regras de rede nos nós para permitir a comunicação com os Pods e Services.- Um Container Runtime Interface (CRI) compatível, como
containerd(que é o padrão para K3s, K0s e Kubernetes moderno, substituindo o DockerShim).
- Nó do Plano de Controle (Control Plane Node / Master Node):
Gerencia o estado geral do cluster. Armazena os dados de configuração do cluster (no etcd ou SQLite). Executa componentes críticos como o
-
Pod:
- A menor e mais básica unidade de deploy no Kubernetes.
- Um Pod representa um grupo de um ou mais containers (como containers Docker) que são sempre co-localizados (rodam no mesmo nó), co-agendados, e rodam em um contexto compartilhado.
- Contexto Compartilhado: Containers dentro do mesmo Pod compartilham:
- O mesmo namespace de rede (o mesmo endereço IP dentro do cluster, podem se comunicar via
localhost). - Opcionalmente, os mesmos volumes de armazenamento (PersistentVolumes).
- O mesmo namespace de rede (o mesmo endereço IP dentro do cluster, podem se comunicar via
- Geralmente, um Pod contém um único container principal que executa sua aplicação, mas pode ter containers "sidecar" para tarefas auxiliares (e.g., coleta de logs, proxy, injeção de configuração).
- Pods são considerados efêmeros; eles podem ser destruídos e recriados (com um novo IP) pelo Kubernetes.
-
Deployment (Implantação):
- Um objeto Kubernetes que gerencia um conjunto de Pods replicados e define o estado desejado para eles.
- Você declara: "Eu quero 3 réplicas do meu Pod da aplicação X rodando a imagem Y". O Deployment (através de um ReplicaSet que ele cria) garante que esse número de réplicas esteja sempre rodando.
- Lida com atualizações de aplicações (e.g., rolling updates para atualizar para uma nova versão da imagem sem downtime) e rollbacks para versões anteriores.
-
Service (Serviço):
- Como os Pods são efêmeros e seus IPs podem mudar, o Service define uma abstração de rede estável para expor um conjunto de Pods (geralmente selecionados por
labels) como um serviço de rede único. - Um Service obtém um endereço IP virtual estável (ClusterIP) e um nome DNS interno ao cluster (e.g.,
meu-servico.meu-namespace.svc.cluster.local). Outros Pods no cluster podem acessar os Pods do serviço usando este IP/DNS estável. - Tipos de Service:
ClusterIP(Padrão): Expõe o serviço apenas em um IP interno ao cluster. Acessível apenas de dentro do cluster.NodePort: Expõe o serviço em uma porta estática (na faixa de 30000-32767) em cada um dos seus nós worker. Você pode acessar o serviço via<IP_DO_NÓ>:<NodePort>. Útil para acesso externo simples em desenvolvimento ou quando um LoadBalancer não está disponível.LoadBalancer: Expõe o serviço externamente usando um balanceador de carga de um provedor de nuvem (AWS, GCP, Azure). Para clusters bare-metal/VM como o nosso, isso requer uma implementação de balanceador de carga adicional, como:- MetalLB: Uma solução popular para fornecer serviços do tipo
LoadBalancerem clusters bare-metal, alocando IPs da sua rede LAN. - Klipper LB (ServiceLB): Um balanceador de carga mais simples incluído no K3s, que usa portas disponíveis nos nós do cluster para expor serviços
LoadBalancer.
- MetalLB: Uma solução popular para fornecer serviços do tipo
ExternalName: Mapeia um Service para um nome DNS externo (usando um CNAME).
- Como os Pods são efêmeros e seus IPs podem mudar, o Service define uma abstração de rede estável para expor um conjunto de Pods (geralmente selecionados por
-
Ingress:
- Gerencia o acesso HTTP e HTTPS externo aos Services dentro do seu cluster. Atua como um proxy reverso ou API gateway para seus serviços web.
- Para que um Ingress resource funcione, você precisa de um Ingress Controller rodando no seu cluster. O Ingress Controller é o software que realmente implementa as regras definidas nos seus Ingress resources.
- Exemplos de Ingress Controllers: Traefik (K3s pode vir com ele), Nginx Ingress Controller, Caddy Ingress Controller, HAProxy Ingress, etc.
- Regras de Roteamento: Você define Ingress resources (arquivos YAML) com regras para rotear tráfego baseado em:
- Host: (e.g.,
app1.meudominio.comvai paraservice-A,app2.meudominio.comvai paraservice-B). - Path: (e.g.,
meudominio.com/app1vai paraservice-A,meudominio.com/app2vai paraservice-B).
- Host: (e.g.,
- Terminação SSL/TLS: O Ingress Controller pode lidar com a terminação SSL/TLS (descriptografar tráfego HTTPS) e gerenciar certificados, muitas vezes integrando-se com
cert-managerpara certificados Let's Encrypt.
-
Namespace:
- Uma forma de dividir os recursos do seu cluster Kubernetes em múltiplos "clusters virtuais" isolados logicamente.
- Útil para organizar aplicações, separar ambientes (desenvolvimento, teste, produção em um mesmo cluster), ou para cenários multi-tenant.
- Recursos como Pods, Deployments, Services são criados dentro de um namespace específico (o namespace
defaulté usado se nenhum for especificado). Nomes de recursos devem ser únicos dentro de um namespace.
-
ConfigMap e Secret:
- ConfigMap: Usado para armazenar dados de configuração não sensíveis (e.g., arquivos de configuração de aplicações, variáveis de ambiente, argumentos de linha de comando) em formato chave-valor. Esses dados podem ser consumidos por Pods (montados como volumes ou injetados como variáveis de ambiente).
- Secret: Usado para armazenar dados sensíveis (e.g., senhas, tokens de API, chaves SSH, certificados TLS).
- Os dados em Secrets são armazenados codificados em base64 por padrão, o que NÃO é criptografia.
- Para segurança real, o backend de armazenamento do Kubernetes (etcd ou o datastore do K3s/K0s) deve ser configurado para criptografia em repouso (encryption at rest) para os Secrets. K3s e K0s têm mecanismos para isso.
- Secrets também podem ser consumidos por Pods como volumes montados ou variáveis de ambiente.
-
Armazenamento Persistente: PersistentVolume (PV), PersistentVolumeClaim (PVC) e StorageClass: Como os Pods (e seus containers) são efêmeros e podem ser destruídos/recriados, os dados que precisam persistir (e.g., bancos de dados, uploads de usuários) devem ser armazenados em volumes persistentes.
- PersistentVolume (PV): Representa um "pedaço" de armazenamento físico ou de rede que foi disponibilizado para o cluster. Pode ser provisionado manualmente por um administrador ou dinamicamente por um
StorageClass. - PersistentVolumeClaim (PVC): É uma requisição de armazenamento feita por um usuário ou uma aplicação (definida em um manifesto YAML). O PVC especifica o tamanho do armazenamento necessário, o modo de acesso (e.g., ReadWriteOnce, ReadOnlyMany, ReadWriteMany), e opcionalmente uma
StorageClass. - O Kubernetes tenta encontrar um PV existente que satisfaça as condições do PVC ou, se uma
StorageClasscom provisionamento dinâmico estiver configurada, ela tentará criar um PV automaticamente. - StorageClass: Define tipos de armazenamento disponíveis no cluster e como o provisionamento dinâmico de PVs deve ocorrer. Cada
StorageClassaponta para um "provisionador" de volume específico.- Exemplos de Provisionadores para Homelab/Bare-Metal:
- Local Path Provisioner (K3s/K0s podem incluir um): Usa diretórios no sistema de arquivos do nó worker para criar PVs. Simples, mas o PV fica preso àquele nó. Se o nó falhar, o acesso ao PV é perdido até que o nó volte.
- ZFS Local PV Provisioner (e.g., OpenEBS ZFS LocalPV): Se seus nós worker têm ZFS, este provisionador pode criar ZFS datasets ou ZVOLs dinamicamente para os PVs. Os dados ainda são locais ao nó.
- Longhorn (da Rancher): Uma solução de storage distribuído e replicado, nativa do Kubernetes. Cria volumes replicados entre os nós worker, oferecendo resiliência a falhas de nó. Pode ser mais complexo de configurar e consumir mais recursos.
- NFS CSI Driver (ou provisionador NFS externo): Permite usar seu servidor NFS existente (como o do nosso host Proxmox) para fornecer armazenamento para PVs. Os PVs seriam diretórios no seu compartilhamento NFS.
- Ceph (via Rook-Ceph ou Proxmox HCI): Se você tiver um cluster Ceph, ele pode fornecer storage persistente altamente disponível e escalável para Kubernetes.
- Exemplos de Provisionadores para Homelab/Bare-Metal:
- PersistentVolume (PV): Representa um "pedaço" de armazenamento físico ou de rede que foi disponibilizado para o cluster. Pode ser provisionado manualmente por um administrador ou dinamicamente por um
-
kubectl(Kubernetes Command-Line Tool):- A ferramenta de linha de comando principal e indispensável para interagir com qualquer cluster Kubernetes.
- Usada para:
- Aplicar manifestos YAML para criar/atualizar recursos (
kubectl apply -f meu_manifesto.yaml). - Inspecionar o estado de recursos (
kubectl get pods,kubectl describe deployment meu-deploy). - Ver logs de Pods (
kubectl logs nome_do_pod -c nome_do_container). - Executar comandos dentro de containers (
kubectl exec -it nome_do_pod -- /bin/bash). - Gerenciar contextos de cluster (se você trabalha com múltiplos clusters).
- Aplicar manifestos YAML para criar/atualizar recursos (
4. Roteiro Básico para Instalar um Cluster K3s Simples em VMs Proxmox (Exemplo Conceitual)¶
Este é um exemplo muito básico para ilustrar os passos gerais. Consulte sempre a documentação oficial do K3s para as instruções de instalação mais recentes e detalhadas.
Pré-requisitos: * Pelo menos uma VM Linux no Proxmox (e.g., Ubuntu Server 22.04). Para um cluster multi-nó, você precisará de mais VMs. * Recursos da VM: * Nó de Controle (Master): Pelo menos 1-2 vCPUs, 2-4GB RAM (K3s é leve, mas o control plane precisa de alguma margem). * Nó Worker: Pelo menos 1-2 vCPUs, 2GB+ RAM (depende das cargas de trabalho que você rodará). * As VMs devem ter endereços IP estáticos ou nomes DNS resolúveis dentro da sua LAN. * Se for um cluster multi-nó, as VMs precisam de conectividade de rede entre si (e com a internet para baixar imagens). * Acesso SSH à(s) VM(s).
Passo 1: Instalar K3s no Nó de Controle (Master)
- Conecte-se via SSH à VM que será seu nó de controle.
- Execute o script de instalação oficial do K3s. Este script detecta o sistema e instala o K3s como um serviço systemd.
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644 # A flag --write-kubeconfig-mode 644 torna o arquivo kubeconfig legível pelo usuário atual, # o que é conveniente para acesso imediato com kubectl na própria VM. # # Para instalar com opções, como desabilitar o Traefik Ingress embutido (se você planeja usar outro): # curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable=traefik" sh -s - --write-kubeconfig-mode 644 # # Para especificar um IP/Interface para o K3s escutar (se a VM tiver múltiplos IPs): # curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --node-ip=IP_DA_VM_PARA_K3S --flannel-iface=eth0" sh -s - - Verifique se o serviço K3s está rodando:
- Acessar o Cluster com
kubectl:- Na própria VM do K3s Control Plane:
O K3s instala um
kubectlembutido e configura o acesso. Você pode usar: - De uma Máquina de Controle Remota (seu desktop/laptop):
- Copie o arquivo
kubeconfig: O arquivo de configuração para acessar o cluster é criado em/etc/rancher/k3s/k3s.yamlno nó de controle K3s. Você precisa copiar este arquivo para sua máquina de controle, no diretório~/.kube/config(este é o local padrão quekubectlprocura). Copie o conteúdo YAML exibido. - Na sua máquina de controle:
Crie o diretório
~/.kubese não existir:mkdir -p ~/.kubeCrie/edite o arquivo~/.kube/confige cole o conteúdo YAML. Importante: No arquivokubeconfigcolado, localize a linhaserver: https://127.0.0.1:6443. Você precisará mudar127.0.0.1para o endereço IP real da sua VM do K3s control plane (e.g.,server: https://192.168.15.X:6443). Proteja o arquivo:chmod 600 ~/.kube/config - Instale
kubectlna sua máquina de controle se ainda não o tiver. Siga as instruções oficiais de instalação do kubectl (ou para macOS/Windows). - Teste a conexão da sua máquina de controle:
- Copie o arquivo
- Na própria VM do K3s Control Plane:
O K3s instala um
Passo 2: (Opcional) Adicionar Nós Worker ao Cluster K3s
Se você quiser um cluster multi-nó (requer mais VMs):
- Prepare uma nova VM Linux para ser o nó worker (com IP estático, conectividade de rede com o nó de controle).
- No Nó de Controle K3s, obtenha o token do cluster: Este token é usado para que os nós worker possam se juntar ao cluster de forma segura. Copie este token.
- Na VM que será o Nó Worker, execute o script de instalação do K3s como agente: Você precisa fornecer a URL do servidor K3s (o nó de controle) e o token.
- Verifique se o Novo Nó se Juntou ao Cluster: Na sua máquina de controle (ou no nó de controle K3s), execute: Você deverá ver ambos os nós (controle e worker) listados com status "Ready".
Passo 3: Configurar Armazenamento Persistente (StorageClass)
Para que suas aplicações no Kubernetes possam armazenar dados de forma persistente, você precisará de uma StorageClass e um provisionador de volume.
* Local Path Provisioner (Padrão no K3s): K3s geralmente vem com o "Local Path Provisioner" habilitado por padrão. Ele cria uma StorageClass chamada local-path. Quando um PersistentVolumeClaim (PVC) solicita esta StorageClass, ele provisiona um PersistentVolume (PV) usando um diretório no sistema de arquivos do nó worker onde o Pod está agendado (geralmente em /var/lib/rancher/k3s/storage/<NOME_DO_PV>).
* Simples para começar, mas tem limitações: Os dados são locais ao nó. Se o nó falhar, o acesso ao PV é perdido. Não é adequado para dados que precisam ser acessíveis de qualquer nó ou que exigem replicação.
* Outras Opções para Homelab (Mais Robustas):
* NFS CSI Driver: Se você tem seu servidor NFS no host Proxmox (como fizemos), você pode instalar o NFS Subdir External Provisioner (ou o driver CSI NFS mais moderno) no seu cluster K3s. Isso permite que PVs sejam criados como subdiretórios no seu compartilhamento NFS, tornando os dados acessíveis de qualquer nó.
* ZFS Local PV (e.g., OpenEBS ZFS LocalPV): Se suas VMs worker K3s têm acesso a storage ZFS, este provisionador pode criar ZFS datasets/ZVOLs dinamicamente para PVs. Os dados ainda são locais ao nó.
* Longhorn: Uma solução de storage distribuído e replicado, nativa do Kubernetes. Pode criar volumes replicados entre os nós worker, oferecendo resiliência. Mais complexo de configurar.
Passo 4: Instalar um Ingress Controller (se você desabilitou o Traefik padrão do K3s)
Se você desabilitou o Traefik Ingress embutido no K3s (e.g., com INSTALL_K3S_EXEC="server --disable=traefik"), você precisará instalar um Ingress Controller manualmente para gerenciar o acesso HTTP/S externo aos seus serviços.
* Opções Populares:
* Traefik (via Helm Chart): Você pode instalar a versão oficial do Traefik Proxy usando seu Helm chart.
* Nginx Ingress Controller: Uma implementação muito popular e robusta.
* Caddy Ingress Controller: Se você prefere o Caddy.
* A instalação geralmente envolve aplicar manifestos YAML ou usar Helm.
5. Exemplo: Deploy de uma Aplicação Simples no K3s (Nginx)¶
Suponha que você queira rodar um servidor web Nginx simples no seu cluster K3s.
-
Crie um arquivo de manifesto YAML (e.g.,
nginx-k3s.yaml):apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 2 # Queremos 2 instâncias (Pods) do Nginx selector: matchLabels: app: nginx # O Deployment gerencia Pods com esta label template: # Define o template do Pod metadata: labels: app: nginx # Os Pods terão esta label spec: containers: - name: nginx-container image: nginx:1.25-alpine # Imagem Docker do Nginx ports: - containerPort: 80 # Nginx escuta na porta 80 dentro do container --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx # Este Service seleciona Pods com a label app=nginx ports: - protocol: TCP port: 80 # Porta que o Service expõe DENTRO do cluster targetPort: 80 # Porta nos Pods para onde o tráfego é direcionado # type: ClusterIP # Padrão. Acessível apenas de dentro do cluster pelo IP do Service. # Para acesso externo simples em desenvolvimento/homelab: type: NodePort # Expõe o serviço em uma porta aleatória (30000-32767) em CADA nó do cluster. # Ou, se tiver um LoadBalancer como MetalLB ou o KlipperLB do K3s: # type: LoadBalancer -
Aplique o Manifesto ao Cluster K3s: Na sua máquina de controle (ou na VM do K3s control plane, usando
sudo k3s kubectl), execute: -
Verifique os Recursos Criados:
- Ver o Deployment:
kubectl get deployments - Ver os Pods (e em quais nós eles estão rodando):
kubectl get pods -o wide - Ver o Service:
kubectl get service nginx-serviceSetype: NodePort, a saída mostrará a porta mapeada (e.g.,80:3XXXX/TCP).
- Ver o Deployment:
-
Acessar o Nginx:
- Se
type: NodePort, você pode acessar o Nginx emhttp://<IP_DE_QUALQUER_NÓ_DO_CLUSTER>:<NodePort_MAPEADA>. - Se
type: LoadBalancere você tem MetalLB/KlipperLB configurado, use oEXTERNAL-IPmostrado porkubectl get service nginx-service. - Se você tem um Ingress Controller configurado, você criaria um recurso
Ingresspara expor onginx-serviceatravés de um hostname (e.g.,nginx.meudominio.com) com SSL.
- Se
Considerações Adicionais e Próximos Passos no Aprendizado de K8s¶
- Gerenciamento de Configuração e Deploy:
- Helm: O gerenciador de pacotes para Kubernetes. Permite instalar e gerenciar aplicações complexas (definidas em "charts") de forma fácil.
- Kustomize: Uma ferramenta para customizar manifestos YAML do Kubernetes sem "templating". Integrada ao
kubectl.
- Monitoramento e Logging no Kubernetes:
- Prometheus e Grafana: A stack
kube-prometheus-stack(um Helm chart) é a forma padrão de instalar um sistema de monitoramento completo para seu cluster K8s. - Logging: Fluentd, Fluent Bit, ou Promtail para coletar logs dos Pods e enviá-los para um backend como Elasticsearch ou Loki.
- Prometheus e Grafana: A stack
- Segurança no Kubernetes:
- RBAC (Role-Based Access Control): Define quem pode fazer o quê no cluster.
- NetworkPolicies: Controlam o tráfego de rede entre Pods (como um firewall para Pods).
- Pod Security Standards (ou as antigas PodSecurityPolicies): Definem restrições de segurança para Pods.
- Secrets Management: Uso de Secrets do Kubernetes e integração com soluções como HashiCorp Vault.
- Service Mesh (Avançado):
- Ferramentas como Istio ou Linkerd para gerenciamento avançado de tráfego, observabilidade e segurança entre microsserviços.
Explorar Kubernetes, mesmo em um ambiente leve como K3s ou K0s, é uma jornada de aprendizado contínua e recompensadora. Comece com um cluster de nó único, implante aplicações simples, entenda os conceitos básicos de Pods, Deployments e Services, e depois expanda gradualmente para armazenamento persistente, Ingress, e outros conceitos mais avançados.
Recursos Recomendados: * ➡️ Documentação Oficial do K3s * ➡️ Documentação Oficial do K0s * ➡️ Documentação Oficial do Kubernetes * Canais do YouTube como "Techno Tim", "NetworkChuck" (para iniciantes), "Just Me and Opensource" têm ótimos tutoriais sobre K3s em homelabs.