☸️ Kubernetes Instalação no Windows
🐋 Docker Desktop · Windows

Docker Desktop +
Kubernetes no Windows

O Docker Desktop para Windows inclui um cluster Kubernetes de nó único pronto a usar — activas com um toggle nas Preferências e tens kubectl configurado automaticamente. O caminho mais simples para aprender K8s no Windows.

Docker Desktop WSL 2 Hyper-V kubectl K8s integrado PowerShell Windows Terminal Dashboard Ingress Helm
Windows 10 (22H2+) / 11
RAM mínima 8 GB (16 GB recomendado)
Disco livre 20 GB
Virtualização BIOS habilitada
Backend WSL 2 ou Hyper-V

01 Porquê usar Docker Desktop para K8s?

A opção mais integrada para Windows — sem configuração adicional

O Docker Desktop é a forma oficial e recomendada de usar Docker e Kubernetes no Windows. Inclui tudo o que precisas num único instalador: Docker Engine, Docker Compose, kubectl e um cluster Kubernetes de nó único — activado com um simples toggle.

🔘

Um toggle, um cluster

Não há configuração manual. Nas Preferências do Docker Desktop, activas o K8s e em 2-3 minutos tens um cluster completo a funcionar.

zero configuração
🔗

kubectl automático

O Docker Desktop instala e configura o kubectl automaticamente. O contexto docker-desktop é criado no teu ~/.kube/config.

pronto a usar
🖼️

Imagens partilhadas

As imagens Docker que construes localmente estão imediatamente disponíveis no cluster K8s — sem push para registry.

sem push
🪟

Integrado no Windows

Interface gráfica na system tray, integração com WSL 2, Windows Terminal e PowerShell. Parece nativo no Windows.

experiência nativa
🔄

Compose + K8s

Podes usar Docker Compose para desenvolvimento e depois converter para manifests K8s com kompose — mesmo projecto, dois ambientes.

compatível
📦

Extensions

O Docker Desktop tem um marketplace de extensões — Portainer, Lens, Snyk, Kubernetes Dashboard e muito mais, instaladas com 1 clique.

extensível

Comparação com alternativas no Windows

FerramentaFacilidadeRecursosMulti-nóIdeal para
Docker Desktop K8s ⭐ Muito fácil Baixo (1 nó) Iniciantes, desenvolvimento diário
minikube Fácil Baixo (1 nó) ✗ (com flags) Lab, addons avançados (Ingress)
kind Médio Muito baixo CI/CD local, testes multi-nó
k3s (WSL 2) Médio Muito baixo Produção edge, IoT
Rancher Desktop Fácil Baixo (1 nó) Alternativa open-source ao Docker Desktop
ℹ️
Licenciamento do Docker Desktop: O Docker Desktop é gratuito para uso pessoal, educativo e em organizações com menos de 250 funcionários e receita inferior a 10 M USD. Acima destes valores, requer uma subscrição paga. Para uso em laboratório e aprendizagem, é sempre gratuito.

02 Requisitos do Sistema

Verificar antes de instalar — evita problemas

Requisitos de hardware e software

✅ Requisitos mínimos
  • Windows 10 versão 22H2 (64-bit) ou Windows 11
  • 8 GB de RAM (4 GB para Docker, 2 GB para K8s)
  • 20 GB de espaço livre em disco
  • Processador com suporte a virtualização (Intel VT-x / AMD-V)
  • BIOS/UEFI com virtualização activada
  • WSL 2 ou Hyper-V activado
🚀 Recomendado para K8s
  • Windows 11 (melhor integração WSL 2)
  • 16 GB de RAM (ou mais)
  • SSD com 50+ GB livres
  • 4+ núcleos de CPU
  • WSL 2 como backend (mais rápido que Hyper-V)
  • Windows Terminal instalado

Verificar se a virtualização está activa

PowerShell — verificar pré-requisitos
# Verificar se a virtualização está activa no processador
Get-ComputerInfo -Property HyperVRequirementVirtualizationFirmwareEnabled
# Resultado esperado: HyperVRequirementVirtualizationFirmwareEnabled : True

# Verificar versão do Windows
Get-ComputerInfo -Property WindowsVersion, OsArchitecture
# OsArchitecture deve ser: 64-bit

# Verificar RAM disponível (em GB)
(Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB | Round

# Verificar estado do WSL
wsl --status
Versão Padrão: 2
Distribuição predefinida: Ubuntu

# Ver espaço livre no disco C:
Get-PSDrive C | Select-Object @{N="Livre_GB";E={[math]::Round($_.Free/1GB,1)}}
⚠️
Virtualização desactivada na BIOS? Se a virtualização não estiver activa, o Docker Desktop não consegue iniciar. Reinicia o PC, entra na BIOS/UEFI (normalmente F2, F10 ou DEL no arranque) e procura "Intel Virtualization Technology", "Intel VT-x", "AMD-V" ou "SVM Mode" — activa esta opção e guarda.

Activar WSL 2 (se ainda não estiver activo)

PowerShell (como Administrador) — activar WSL 2
# Passo 1: Activar funcionalidade WSL
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# Passo 2: Activar funcionalidade Virtual Machine Platform
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

# Passo 3: Reiniciar o PC
# Após reiniciar:

# Passo 4: Definir WSL 2 como versão padrão
wsl --set-default-version 2
A operação foi concluída com êxito.

# Passo 5: Instalar Ubuntu (ou outra distro)
wsl --install -d Ubuntu
A instalar: Ubuntu
Ubuntu instalado.

# Verificar: WSL 2 a funcionar
wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Running         2

03 Instalar o Docker Desktop

Download, instalação e primeira configuração

1

Descarregar o instalador

Vai a docker.com/products/docker-desktop e clica em "Download for Windows". O ficheiro chama-se Docker Desktop Installer.exe (~590 MB). Escolhe a versão AMD64 para processadores Intel/AMD (a maioria dos PCs) ou ARM64 para Surface Pro X e outros ARM.

2

Executar o instalador

Faz duplo clique no instalador. Na janela de configuração, deixa ambas as opções marcadas: "Use WSL 2 instead of Hyper-V" (recomendado) e "Add shortcut to desktop". Clica em OK e aguarda — pode demorar 3-5 minutos.

3

Reiniciar quando pedido

Após a instalação, o instalador pode pedir para reiniciar o PC. É normal — o Docker Desktop precisa de activar componentes do sistema (WSL 2 integration, Hyper-V).

4

Aceitar os termos de serviço

Na primeira abertura, o Docker Desktop mostra os Termos de Serviço. Lê e aceita. Não precisas de criar conta Docker para usar a versão básica — clica em "Continue without signing in" se preferires.

5

Verificar que está a funcionar

O ícone da baleia 🐋 aparece na system tray (barra de tarefas, canto inferior direito). Quando ficar verde/sólido, o Docker Engine está pronto. Abre o Windows Terminal ou PowerShell e testa:

docker run hello-world — deves ver a mensagem "Hello from Docker!"

PowerShell — verificar Docker após instalação
# Verificar versão do Docker
docker --version
Docker version 27.3.1, build ce12230

# Ver informação completa do engine
docker info
Client:
 Docker Engine - Community: 27.3.1
 OS/Arch: linux/amd64
 Context: desktop-linux

# Testar com hello-world
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

# Verificar versão do kubectl (já instalado pelo Docker Desktop)
kubectl version --client
Client Version: v1.31.2
💡
Instalar via winget (alternativa): Se preferes instalar a partir da linha de comandos sem abrir o browser, usa o winget (incluído no Windows 11 e Windows 10 21H1+):
winget install Docker.DockerDesktop

04 WSL 2 — O Motor por Baixo

Perceber como o Docker Desktop usa o WSL 2 no Windows

O WSL 2 (Windows Subsystem for Linux, versão 2) é a tecnologia da Microsoft que corre um kernel Linux real dentro do Windows — com performance quase nativa. O Docker Desktop usa o WSL 2 como backend para correr o Docker Engine e o cluster Kubernetes.

ARQUITECTURA DOCKER DESKTOP NO WINDOWS COM WSL 2

  ┌─────────────────────────────────────────────────────────────────────┐
  │  WINDOWS 11 / 10                                                   │
  │                                                                     │
  │  ┌──────────────────────┐    ┌──────────────────────────────────┐  │
  │  │  Docker Desktop GUI   │    │  Windows Terminal / PowerShell  │  │
  │  │  (system tray)       │    │  docker, kubectl, helm           │  │
  │  └──────────┬───────────┘    └──────────────┬───────────────────┘  │
  │             │                               │                       │
  │  ┌──────────▼───────────────────────────────▼───────────────────┐  │
  │  │  WSL 2 — Kernel Linux (Hyper-V leve, separado das VMs)        │  │
  │  │                                                               │  │
  │  │  ┌─────────────────────────┐  ┌───────────────────────────┐  │  │
  │  │  │  docker-desktop (distro)│  │  Ubuntu / Debian (distro)  │  │
  │  │  │  Docker Engine          │  │  Acesso a docker e kubectl │  │  │
  │  │  │  Kubernetes cluster     │  │  via integração WSL 2      │  │  │
  │  │  │  ┌────┐ ┌────┐ ┌────┐  │  └───────────────────────────┘  │  │
  │  │  │  │Pod │ │Pod │ │Pod │  │                                   │  │
  │  │  │  └────┘ └────┘ └────┘  │  ┌───────────────────────────┐  │  │
  │  │  └─────────────────────────┘  │  Ficheiros Windows        │  │  │
  │  │                                │  /mnt/c/Users/...         │  │  │
  │  └───────────────────────────────────────────────────────────┘  │  │
  └─────────────────────────────────────────────────────────────────────┘

Configurar limites de memória do WSL 2

Por defeito, o WSL 2 pode usar até 50% da RAM do sistema. Se tiveres 8 GB, o WSL 2 (e portanto o Docker + K8s) pode usar 4 GB. Em PCs com menos RAM, pode ser vantajoso limitar:

%USERPROFILE%\.wslconfig — limitar recursos do WSL 2
# Ficheiro: C:\Users\TeuNome\.wslconfig
# Cria este ficheiro se não existir

[wsl2]
# Limitar memória (recomendado: metade da RAM disponível para K8s)
memory=6GB           # máximo de RAM para WSL 2 (ajusta ao teu PC)
processors=4          # número de vCPUs disponíveis
swap=2GB              # swap file para WSL 2
swapFile=C:\\Temp\\wsl-swap.vhdx

# Desactivar compressão de memória (melhora performance)
pageReporting=true

# Usar o servidor DNS do Windows (evita problemas de resolução)
dnsTunneling=true
networkingMode=mirrored    # WSL 2 partilha o IP do Windows (WSL 2.0+)
PowerShell — criar .wslconfig e aplicar
# Criar o ficheiro .wslconfig (ajusta os valores ao teu PC)
$config = @"
[wsl2]
memory=6GB
processors=4
swap=2GB
"@

$config | Out-File -FilePath "$env:USERPROFILE\.wslconfig" -Encoding utf8

# Reiniciar o WSL 2 para aplicar (fecha o Docker Desktop primeiro!)
wsl --shutdown
# Abre o Docker Desktop novamente

# Verificar memória actual do WSL 2
wsl -d docker-desktop -- free -h
              total        used        free
Mem:           5.8Gi       1.2Gi       4.6Gi
💡
Integração WSL 2 com distros Linux: Com o Docker Desktop activo, podes usar docker e kubectl directamente dentro do Ubuntu/Debian no WSL 2 — sem instalar nada adicional. Activa em Docker Desktop → Settings → Resources → WSL Integration → activa as distros que queres.

05 Activar o Kubernetes no Docker Desktop

O toggle que muda tudo — passo a passo com imagens da interface

Com o Docker Desktop instalado e a funcionar, activar o Kubernetes é uma questão de clicar num toggle. O Docker Desktop cria um cluster de nó único com todos os componentes do Control Plane dentro do mesmo processo WSL 2.

Passo a passo — activar K8s

1

Abrir as Definições do Docker Desktop

Clica no ícone 🐋 da baleia na system tray → Settings (ou usa o atalho Ctrl+, com o Docker Desktop em foco). Podes também abrir o Docker Desktop e clicar no ícone de engrenagem ⚙️ no canto superior direito.

2

Navegar para a secção Kubernetes

No menu lateral esquerdo das Settings, clica em "Kubernetes". Esta secção está separada da secção Docker Engine — é específica do cluster K8s integrado.

3

Activar o toggle "Enable Kubernetes"

Clica no toggle azul ao lado de "Enable Kubernetes". O toggle fica azul (activo). Deixa as outras opções por defeito para começar.

4

Clicar em "Apply & Restart"

Clica no botão "Apply & Restart" no canto inferior direito. Uma janela de confirmação aparece — clica "Install". O Docker Desktop vai descarregar as imagens K8s (primeira vez: ~500 MB) e iniciar o cluster.

5

Aguardar a inicialização (2-5 minutos)

O ícone da baleia mostra um indicador de loading circular. Quando parar e o ícone ficar estável, o K8s está pronto. Na barra inferior do Docker Desktop aparece o estado: "Kubernetes running" com um ponto verde.

6

Verificar no terminal

Abre o PowerShell ou Windows Terminal e executa kubectl get nodes. Deves ver o nó docker-desktop com estado Ready.

Docker Desktop — Settings → Kubernetes
Kubernetes
⎔ Enable Kubernetes ● Running

Show system containers (advanced) Mostra containers internos do K8s no Docker
Enable GPU support (experimental) Para workloads GPU/CUDA no cluster

Kubernetes version: v1.31.2  ·  Context: docker-desktop Reset Kubernetes Cluster

Apply & Restart aplica as alterações e reinicia o Docker Engine + Kubernetes.
PowerShell — verificar cluster K8s activo
# Ver o nó do cluster
kubectl get nodes
NAME             STATUS   ROLES           AGE    VERSION
docker-desktop   Ready    control-plane   5m     v1.31.2

# Ver o contexto activo (deve ser docker-desktop)
kubectl config current-context
docker-desktop

# Ver todos os contextos disponíveis
kubectl config get-contexts
CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE
*         docker-desktop   docker-desktop   docker-desktop
          minikube         minikube         minikube

# Ver componentes do Control Plane a funcionar
kubectl get pods -n kube-system
NAME                                     READY   STATUS    RESTARTS
coredns-5dd5756b68-jk9xt                 1/1     Running   0
coredns-5dd5756b68-lqzhr                 1/1     Running   0
etcd-docker-desktop                      1/1     Running   0
kube-apiserver-docker-desktop            1/1     Running   0
kube-controller-manager-docker-desktop   1/1     Running   0
kube-scheduler-docker-desktop            1/1     Running   0

Opções da secção Kubernetes

OpçãoO que fazRecomendação
Enable Kubernetes Liga/desliga o cluster K8s integrado. Quando desligado, os containers Docker continuam a funcionar normalmente. Activa quando precisares — desactiva para poupar RAM quando não usas
Show system containers Mostra os containers internos do Kubernetes (etcd, apiserver, scheduler...) na lista de containers do Docker Desktop. Desactivado — os containers internos poluem a lista
Enable GPU support Permite que os Pods acedam à GPU NVIDIA do host. Requer NVIDIA Container Toolkit. Só activar se trabalhares com ML/CUDA no K8s
Reset Kubernetes Cluster Elimina todo o estado do cluster (Pods, Deployments, Services, ConfigMaps...) e recomeça do zero. Não afecta imagens Docker locais. Útil quando o cluster fica inconsistente ou para limpar após laboratórios
💡
Poupar RAM quando não usas K8s: O cluster K8s consome ~1-2 GB de RAM mesmo sem Pods a correr. Quando não precisas de K8s, desactiva o toggle — o Docker Engine continua a funcionar normalmente para containers, Compose, etc.

06 kubectl no Windows

Configurar o terminal, aliases e autocompletion

O Docker Desktop instala o kubectl automaticamente em C:\Program Files\Docker\Docker\resources\bin\kubectl.exe e adiciona-o ao PATH. Podes usá-lo directamente no PowerShell, Windows Terminal ou Command Prompt.

Configurar o Windows Terminal para K8s

PowerShell — configurar aliases e autocompletion
# Adicionar ao teu perfil PowerShell (abre com: notepad $PROFILE)
# Ou executa directamente para testar primeiro:

# ── Alias para kubectl ────────────────────────────────────────────────
Set-Alias -Name k -Value kubectl

# ── Autocompletion do kubectl no PowerShell ───────────────────────────
kubectl completion powershell | Out-String | Invoke-Expression

# ── Função para mostrar contexto no prompt ───────────────────────────
function prompt {
  $ctx = kubectl config current-context 2>/dev/null
  $ns  = kubectl config view --minify -o jsonpath='{.contexts[0].context.namespace}' 2>/dev/null
  if (-not $ns) { $ns = "default" }
  Write-Host "[k8s: $ctx/$ns] " -NoNewline -ForegroundColor Cyan
  Write-Host "PS " -NoNewline
  $PWD.Path + "> "
}

# ── Guardar no perfil permanentemente ───────────────────────────────
$profileContent = @'
Set-Alias -Name k -Value kubectl
kubectl completion powershell | Out-String | Invoke-Expression
'@
$profileContent >> $PROFILE

Comandos kubectl essenciais no contexto Windows

ComandoO que faz no contexto Docker Desktop
🔀 Gerir contextos (múltiplos clusters)
kubectl config get-contextsLista todos os clusters: docker-desktop, minikube, GKE, AKS, etc.
kubectl config use-context docker-desktopMudar para o cluster local do Docker Desktop. Fundamental quando usas múltiplos clusters.
kubectl config use-context minikubeMudar para o minikube se também o tiveres instalado.
kubectl config set-context --current --namespace=devDefine o namespace padrão para o contexto actual — evita escrever -n dev em todos os comandos.
🔍 Ver recursos
kubectl get allLista Pods, Services, Deployments e ReplicaSets do namespace actual.
kubectl get pods -ALista Pods de todos os namespaces — inclui os do sistema K8s.
kubectl describe pod <nome>Informação detalhada — essencial para diagnosticar Pods que não arrancam.
kubectl logs -f <pod>Seguir logs em tempo real. No PowerShell, Ctrl+C para parar.
🔧 Depuração específica Windows
kubectl exec -it <pod> -- shTerminal dentro do Pod. Usa sh (em vez de bash) em imagens alpine.
kubectl port-forward svc/<nome> 8080:80Expõe um Service localmente. Abre http://localhost:8080 no browser do Windows.
kubectl cp <pod>:/caminho ./localCopia ficheiros do Pod para o Windows. Útil para extrair logs ou ficheiros.
ℹ️
kubectl no WSL 2 (Ubuntu): Também podes usar kubectl directamente dentro do Ubuntu no WSL 2 — o Docker Desktop partilha o contexto automaticamente. Se não estiver disponível, instala com: sudo snap install kubectl --classic ou via apt. O ficheiro ~/.kube/config no WSL 2 é partilhado com o Windows.

07 Primeiro Deploy no Cluster Local

Do zero a uma aplicação web acessível em localhost

Uma das maiores vantagens do Docker Desktop K8s é que as imagens Docker locais estão imediatamente disponíveis no cluster — não precisas de fazer push para nenhum registry. Vamos deployar uma aplicação Node.js.

Construir e deployar uma imagem local

PowerShell — build local + deploy no K8s do Docker Desktop
# 1. Criar uma app Node.js simples
New-Item -ItemType Directory -Name minha-app
Set-Location minha-app

# Criar server.js
@'
const http = require('http')
const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'})
  res.end(`Olá do Kubernetes! Pod: ${process.env.HOSTNAME}\n`)
})
server.listen(3000, () => console.log('Servidor na porta 3000'))
'@ | Out-File -FilePath server.js -Encoding utf8

# Criar Dockerfile
@'
FROM node:20-alpine
WORKDIR /app
COPY server.js .
EXPOSE 3000
CMD ["node", "server.js"]
'@ | Out-File -FilePath Dockerfile -Encoding utf8

# 2. Construir imagem Docker local
docker build -t minha-app:1.0 .
Successfully built a1b2c3d4e5f6
Successfully tagged minha-app:1.0

# IMPORTANTE: A imagem já está disponível no K8s do Docker Desktop!
# Não precisas de docker push

Manifest YAML completo — Deployment + Service

minha-app.yaml — Deployment + Service para Docker Desktop K8s
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minha-app
  labels:
    app: minha-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: minha-app
  template:
    metadata:
      labels:
        app: minha-app
    spec:
      containers:
        - name: app
          image: minha-app:1.0
          imagePullPolicy: Never   # CRÍTICO: usa imagem local, não faz pull
          ports:
            - containerPort: 3000
          resources:
            requests:
              memory: "32Mi"
              cpu: "50m"
            limits:
              memory: "64Mi"
              cpu: "100m"
---
apiVersion: v1
kind: Service
metadata:
  name: minha-app-svc
spec:
  type: LoadBalancer          # No Docker Desktop, expõe em localhost!
  selector:
    app: minha-app
  ports:
    - port: 80
      targetPort: 3000
PowerShell — aplicar e testar o deploy
# Aplicar o manifest
kubectl apply -f minha-app.yaml
deployment.apps/minha-app created
service/minha-app-svc created

# Verificar que os 3 Pods estão a correr
kubectl get pods -w
NAME                         READY   STATUS              RESTARTS   AGE
minha-app-7d9f5b4c8-2xk9r   0/1     ContainerCreating   0          3s
minha-app-7d9f5b4c8-8mn4p   0/1     ContainerCreating   0          3s
minha-app-7d9f5b4c8-kq7zt   0/1     ContainerCreating   0          3s
minha-app-7d9f5b4c8-2xk9r   1/1     Running             0          8s
minha-app-7d9f5b4c8-8mn4p   1/1     Running             0          9s
minha-app-7d9f5b4c8-kq7zt   1/1     Running             0          10s

# Ver o Service (LoadBalancer no Docker Desktop expõe em localhost)
kubectl get service minha-app-svc
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
minha-app-svc    LoadBalancer   10.100.42.137   localhost     80:32441/TCP   15s

# Testar no PowerShell
Invoke-WebRequest -Uri http://localhost | Select-Object -ExpandProperty Content
Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r

# Executar 5 vezes — nota que o nome do Pod muda (load balancing!)
1..5 | ForEach-Object {
  (Invoke-WebRequest http://localhost).Content
}
Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r
Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-8mn4p
Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-kq7zt
Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r
Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-8mn4p
💡
imagePullPolicy: Never — porquê é crítico: por defeito, o K8s tenta fazer pull da imagem do Docker Hub. Se usas imagePullPolicy: Never, o K8s usa exclusivamente a imagem local. Sem esta linha, o K8s tenta descarregar minha-app:1.0 do Docker Hub e falha com ImagePullBackOff.
🌐
LoadBalancer em localhost: Ao contrário do minikube (que precisa de minikube tunnel), o Docker Desktop K8s expõe automaticamente os Services do tipo LoadBalancer em localhost. Sem configuração adicional, consegues aceder à app em http://localhost:80.

08 Kubernetes Dashboard

Interface visual para gerir o cluster sem linha de comandos

O Kubernetes Dashboard é uma interface web que permite ver e gerir todos os recursos do cluster — Pods, Deployments, Services, logs — sem precisar do kubectl. É ideal para aprendizagem e para visualizar o estado geral.

Instalar o Dashboard via kubectl

PowerShell — instalar e aceder ao Kubernetes Dashboard
# 1. Instalar o Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
...vários recursos criados...
deployment.apps/kubernetes-dashboard created

# 2. Criar conta de administrador para o Dashboard
kubectl apply -f - <<'EOF'
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

# 3. Gerar token de acesso
kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6Ii...   # copia este token!

# 4. Iniciar o proxy para aceder ao Dashboard
kubectl proxy
Starting to serve on 127.0.0.1:8001

# 5. Abrir no browser (em outro terminal ou abre o URL directamente):
# http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
# Cola o token gerado no passo 3

Alternativa: Instalar via Docker Desktop Extensions

1

Abrir o Marketplace de Extensions

No Docker Desktop, clica em "Extensions" no menu lateral → "Browse" ou pesquisa no marketplace integrado.

2

Instalar "Kubernetes Visualizer" ou "Portainer"

Procura "Kubernetes" no marketplace. O Portainer é uma alternativa popular ao Dashboard oficial — instala e tem uma UI ainda mais completa e fácil de usar.

3

Aceder via Docker Desktop

Após instalar, a extension aparece no menu lateral do Docker Desktop — acedes com 1 clique, sem precisar de correr kubectl proxy.

💡
Lens — IDE para Kubernetes: O Lens (lens.app) é uma aplicação desktop gratuita para Windows que funciona como um IDE completo para Kubernetes. Liga-se ao cluster do Docker Desktop automaticamente e oferece uma experiência muito superior ao Dashboard oficial — muito recomendado para quem usa K8s diariamente.

09 Configurar Ingress no Docker Desktop

Rotear tráfego HTTP para múltiplos serviços em localhost

O Ingress permite expor múltiplos serviços com um único ponto de entrada — em vez de portas diferentes, usas paths ou hosts diferentes. No Docker Desktop, o Ingress Controller Nginx é instalado manualmente (não há addon como no minikube).

Instalar o Nginx Ingress Controller

PowerShell — instalar Nginx Ingress Controller
# Opção 1: Instalar via manifest oficial
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.0/deploy/static/provider/cloud/deploy.yaml

# Aguardar o controller estar pronto (1-2 minutos)
kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=120s
pod/ingress-nginx-controller-86b4d9985-jk4x2 condition met

# Opção 2: Instalar via Helm (recomendado para produção)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace

# Verificar — o EXTERNAL-IP deve ser localhost
kubectl get service -n ingress-nginx
NAME                                 TYPE           EXTERNAL-IP   PORT(S)
ingress-nginx-controller             LoadBalancer   localhost     80:32080/TCP,443:32443/TCP

Criar Ingress para múltiplos serviços

ingress-local.yaml — roteamento por path em localhost
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-local
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: localhost         # no Docker Desktop, localhost funciona
      http:
        paths:
          - path: /app
            pathType: Prefix
            backend:
              service:
                name: minha-app-svc
                port:
                  number: 80
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-svc
                port:
                  number: 80
PowerShell — testar o Ingress
kubectl apply -f ingress-local.yaml

# Testar o roteamento por path
Invoke-WebRequest http://localhost/app | Select-Object StatusCode, Content
StatusCode Content
---------- -------
200        Olá do Kubernetes! Pod: minha-app-7d9f5b4c8-2xk9r

# Para usar hosts personalizados (ex: app.local, api.local)
# Adiciona ao C:\Windows\System32\drivers\etc\hosts (como Administrador):
127.0.0.1   app.local
127.0.0.1   api.local

10 Helm no Windows com Docker Desktop

Instalar e usar o gestor de pacotes Kubernetes no Windows

PowerShell — instalar Helm no Windows
# Opção 1: via winget (recomendado — Windows 10/11)
winget install Helm.Helm

# Opção 2: via Chocolatey
choco install kubernetes-helm

# Opção 3: via Scoop
scoop install helm

# Verificar instalação
helm version
version.BuildInfo{Version:"v3.16.2", GitCommit:"13654a52..."}

# Adicionar repositórios essenciais
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
Hang tight while we grab the latest from your chart repositories...
Update Complete. Happy Helming!

Instalar aplicações com Helm no Docker Desktop K8s

PowerShell — exemplos práticos de Helm
# ── Instalar WordPress (MySQL + Apache + WordPress) ───────────────────
helm install meu-wordpress bitnami/wordpress \
  --set wordpressPassword=segredo123 \
  --set service.type=LoadBalancer
# Abre http://localhost no browser após 2-3 minutos

# ── Instalar PostgreSQL ───────────────────────────────────────────────
helm install meu-postgres bitnami/postgresql \
  --set auth.postgresPassword=segredo \
  --set primary.persistence.size=1Gi

# Ligar ao PostgreSQL via port-forward
kubectl port-forward svc/meu-postgres-postgresql 5432:5432
# Agora liga com psql ou DBeaver em localhost:5432

# ── Instalar Redis ────────────────────────────────────────────────────
helm install meu-redis bitnami/redis --set auth.enabled=false
kubectl port-forward svc/meu-redis-master 6379:6379

# ── Ver releases instaladas ───────────────────────────────────────────
helm list
NAME             NAMESPACE  STATUS    CHART                   APP VERSION
meu-wordpress    default    deployed  wordpress-23.1.21       6.6.2
meu-postgres     default    deployed  postgresql-16.2.3       16.4.0

# ── Remover uma release (liberta recursos) ───────────────────────────
helm uninstall meu-wordpress

11 Docker Compose → Kubernetes

Converter ficheiros Compose em manifests K8s com Kompose

Se já tens aplicações definidas em docker-compose.yml, podes convertê-las automaticamente para manifests Kubernetes com a ferramenta Kompose. É uma forma excelente de migrar de Compose para K8s sem escrever YAML do zero.

PowerShell — instalar e usar Kompose
# Instalar Kompose via winget
winget install Kubernetes.Kompose

# Ou via Chocolatey
choco install kubernetes-kompose

# Verificar
kompose version
1.35.0 (HEAD)

# ── Converter docker-compose.yml para manifests K8s ──────────────────
kompose convert -f docker-compose.yml

INFO Kubernetes file "api-deployment.yaml" created
INFO Kubernetes file "api-service.yaml" created
INFO Kubernetes file "db-deployment.yaml" created
INFO Kubernetes file "db-service.yaml" created
INFO Kubernetes file "db-persistentvolumeclaim.yaml" created

# Aplicar todos os manifests gerados de uma vez
kubectl apply -f .

# Alternativa: converter e aplicar directamente sem gerar ficheiros
kompose up -f docker-compose.yml
⚠️
Kompose como ponto de partida: Os ficheiros gerados pelo Kompose precisam normalmente de ajustes manuais — faltam resources, as probes de saúde, as anotações corretas e às vezes a configuração de volumes. Usa os ficheiros como base e revisa-os antes de usar em produção.

Workflow de migração Compose → K8s

📄
Compose
docker-compose.yml existente
🔄
Kompose
kompose convert
✏️
Rever
Adicionar resources e probes
🧪
Testar
kubectl apply local
📦
Helm Chart
Empacotar para reutilizar
🚀
Produção
GKE / AKS / EKS

12 Resolução de Problemas

Os erros mais comuns no Windows e como resolvê-los

Sintoma / ErroCausa provávelSolução
🔴 Docker Desktop não inicia
"WSL 2 installation is incomplete" WSL 2 não está instalado ou actualizado Executa wsl --update no PowerShell como admin e reinicia
"Hardware virtualization not enabled" VT-x / AMD-V desactivado na BIOS Reinicia, entra na BIOS (F2/F10/DEL) e activa Intel VT-x ou AMD-V
Docker Desktop trava no logo Processo anterior não terminou correctamente Task Manager → terminar processos Docker → reiniciar Docker Desktop
🟡 Pods com problemas
Pod: ImagePullBackOff K8s tenta descarregar imagem local do Docker Hub Adiciona imagePullPolicy: Never para imagens locais
Pod: CrashLoopBackOff Container falha repetidamente ao iniciar kubectl logs <pod> --previous para ver o erro antes do crash
Pod: Pending indefinidamente Falta de recursos (CPU/RAM) ou PVC não vinculado kubectl describe pod <nome> → ver secção Events no final
Pod: OOMKilled Container ultrapassou o limite de memória (limits.memory) Aumenta o limits.memory no Deployment ou reduz o consumo da app
🔵 Rede e acesso
Service LoadBalancer com EXTERNAL-IP: <pending> Sem suporte a LoadBalancer (só acontece fora do Docker Desktop) No Docker Desktop isto não deve acontecer. Se sim, usa kubectl port-forward
Não consegue aceder ao serviço em localhost Firewall do Windows a bloquear Windows Defender Firewall → Permitir Docker Desktop. Ou usa kubectl port-forward
kubectl: "Unable to connect to the server" Cluster K8s não está a correr ou contexto errado Verifica ícone Docker Desktop (verde?) → kubectl config use-context docker-desktop
⚙️ Performance e recursos
PC fica lento com Docker Desktop + K8s WSL 2 a consumir demasiada RAM Cria .wslconfig com memory=4GB · Desactiva K8s quando não usas
Disco a encher rapidamente Imagens e volumes a acumular docker system prune -a · Docker Desktop → Settings → Resources → Disk

Comandos de diagnóstico rápido

PowerShell — diagnóstico completo do ambiente
# ── Verificar tudo de uma vez ─────────────────────────────────────────
docker info                                     # estado do Docker Engine
kubectl cluster-info                           # endpoint do Control Plane
kubectl get nodes                               # estado do nó
kubectl get pods -A                             # todos os Pods (sistema + apps)
kubectl top nodes                               # CPU e RAM do nó

# ── Diagnóstico de Pod específico ────────────────────────────────────
kubectl describe pod <nome-do-pod>             # eventos e condições
kubectl logs <nome-do-pod> --previous          # logs da execução anterior
kubectl exec -it <nome-do-pod> -- sh         # terminal dentro do Pod

# ── Verificar recursos disponíveis ───────────────────────────────────
kubectl describe node docker-desktop
# Procura a secção "Allocated resources" — vê o que está consumido

# ── Limpar tudo e recomeçar ───────────────────────────────────────────
# (Docker Desktop → Settings → Kubernetes → Reset Kubernetes Cluster)
# ou via CLI:
kubectl delete all --all                        # elimina apps mas mantém K8s

# ── Ver consumo de memória do WSL 2 ──────────────────────────────────
Get-Process -Name "*wsl*", "*docker*" |
  Select-Object Name, @{N="RAM_MB";E={[math]::Round($_.WorkingSet/1MB,0)}} |
  Sort-Object RAM_MB -Descending

13 Boas Práticas no Windows

Tirar o máximo partido do Docker Desktop K8s no Windows

Performance

Guardar código em WSL 2, não no Windows

Os ficheiros em /home/user/projecto (WSL 2) são muito mais rápidos do que em /mnt/c/Users/ (Windows). Para projectos K8s, trabalha sempre dentro do WSL 2.

Performance

Configurar .wslconfig

Limita a RAM do WSL 2 com .wslconfig para evitar que o Docker + K8s consuma toda a memória do PC. Com 16 GB, define memory=8GB.

Organização

Usar namespaces por projecto

Cria um namespace por projecto: kubectl create namespace loja. Usa -n loja nos comandos ou define como padrão no contexto.

Organização

Scripts de setup repetíveis

Cria scripts PowerShell que instalam tudo de raiz: setup.ps1 que aplica todos os manifests, instala Helm charts e configura Ingress. Partilha com a equipa.

Dev Workflow

imagePullPolicy: Never para imagens locais

Sempre que uses imagens locais (build local com docker build), adiciona imagePullPolicy: Never — poupa tempo e evita erros ImagePullBackOff.

Dev Workflow

Usar Skaffold para hot-reload

O Skaffold (skaffold.dev) monitoriza alterações no código, faz build da imagem e atualiza o Deployment automaticamente — como hot-reload mas para K8s.

Segurança

Não expor portas desnecessárias

Em desenvolvimento, usa kubectl port-forward em vez de Services LoadBalancer para cada app. Mais seguro e evita conflitos de portas entre projectos.

Segurança

Nunca usar o cluster local em produção

O Docker Desktop K8s é de nó único, sem alta disponibilidade, sem backup automático. É apenas para desenvolvimento. Para produção, usa GKE, AKS, EKS ou k3s em VPS.

Ferramentas

Instalar k9s — TUI para K8s

O k9s é uma interface de terminal interactiva para K8s. winget install k9s — substitui vários comandos kubectl com uma interface navegável no terminal.

Ferramentas

Windows Terminal + Temas

Instala o Windows Terminal da Microsoft Store e configura um perfil para WSL 2 Ubuntu. Muito mais prático do que o PowerShell ou CMD para trabalhar com K8s.

Stack de ferramentas recomendada para Windows + K8s

FerramentaPropósitoInstalar
Docker Desktop Docker Engine + K8s integrado winget install Docker.DockerDesktop
Windows Terminal Terminal moderno com tabs e suporte WSL 2 winget install Microsoft.WindowsTerminal
kubectl CLI do Kubernetes (já incluído no Docker Desktop) Incluído no Docker Desktop
Helm Gestor de pacotes K8s winget install Helm.Helm
k9s TUI interactiva para K8s — navegar recursos, logs, exec winget install k9s
Lens IDE desktop para Kubernetes (GUI completa) k8slens.dev ou winget install Mirantis.Lens
Kompose Converter docker-compose.yml → manifests K8s winget install Kubernetes.Kompose
Skaffold Hot-reload automático de imagens no K8s durante desenvolvimento winget install Google.Skaffold
VS Code + extensão Kubernetes Editar YAML com validação, ver recursos no painel lateral Extensão "Kubernetes" da Microsoft no VS Code
🎯
Script de instalação completa: Podes instalar todas as ferramentas acima com um único comando PowerShell (como Administrador):
winget install Docker.DockerDesktop Helm.Helm k9s Mirantis.Lens Kubernetes.Kompose Google.Skaffold Microsoft.WindowsTerminal