O Kind (Kubernetes IN Docker) é uma ferramenta que permite criar e executar clusters Kubernetes localmente usando containers Docker como nodes. Oferece uma maneira rápida e leve para construir um ambiente para desenvolvimento, testes e aprendizado. O Kind é especialmente útil para quem deseja simular estes ambientes multi-nodes de Kubernetes em uma única máquina.
Table of contents
Open Table of contents
Pré-requisitos
- Ambiente Linux (como Debian 11 - 12)
- Recomendado 2 CPUs e 2 GB de RAM
- Conhecimentos básicos de Linux e comandos de terminal
- Acesso de administrador (sudo)
Criação da VM
- Configure uma máquina virtual com:
- CPU: 2 cores
- Memória: 2048 MB
- Sistema Operacional: Debian 12 - qualquer distro Linux
- Armazenamento: 40 GB
- Rede: 1 placa em modo Bridge (para acesso SSH)
- Inicialmente em modo NAT caso precise fazer login na rede
- Usuário: Crie um usuário não-root - exemplo:
suporte
- Sistema de Arquivos: EXT4
Faça a instalação do sistema operacional com pacotes mínimos e apenas com interface de linha de comando
Particionamento Recomendado
O particionamento adequado ajuda na segurança e no gerenciamento de recursos, fiz dessa forma
Ponto de Montagem | Tamanho | Opções de Montagem |
---|---|---|
/ | 5 GB | defaults |
swap | 2 GB | - |
/home | 1 GB | nodev,nosuid,noexec |
/var/log | 1 GB | defaults |
/tmp | 2 GB | nodev,nosuid |
/var/lib/docker | Restante - ≈ 30 GB | defaults |
Nota:
/var/lib/docker
deve receber o espaço restante, pois armazenará as imagens de contêiner e volumes. Em ambientes de produção, este diretório terá o maior consumo de espaço
Configuração Inicial do Sistema
- Após a instalação do sistema operacional:
-
Entre como administrador
root
-
Atualize o sistema
apt update && apt upgrade -y
- Instale e configure o servidor SSH
apt install openssh-server lynx -y
- Configure o SSH para maior segurança (opcional, mas recomendado)
- Antes, crie uma cópia de segurança
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bkp
nano /etc/ssh/sshd_config
- Adicione a seguinte linha - ou descomente e altere o valor
#PermitRootLogin prohibit-password
PermitRootLogin yes
- Habilite o serviço
systemctl enable ssh
- Reinicie o serviço
systemctl restart ssh
- Caso a placa de rede estiver em modo NAT
- Desligue a máquina e altere para modo Bridge
- Após isso, entre como
root
, digitelynx 8.8.8.8
e logue na rede
- Verifique o IP da VM digitando com
ip a
- Acesse remotamente a VM via SSH
ssh root@<IP-MAQUINA>
💡 Dica: Agora você pode acessar a máquina e abrir os arquivos via VSCode. Instale a extensão
Remote SSH
, adicione o host com o usuário root - pra fazer instalação do vscode-server na máquina e tals.
Instalação de Dependências
- Caso não esteja, acesse o usuário administrador com
su -
- Instale os pacotes necessários
apt install apt-transport-https ca-certificates \
net-tools tcpdump wget curl gnupg lsb-release \
git htop -y
Instalação do Docker
- O Docker é o requisito principal para executar o Kind
# Adicione a chave GPG oficial do Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Adicione o repositório do Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instale o Docker
apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
# Inicie e habilite o serviço Docker
systemctl enable docker --now
# Adicione seu usuário ao grupo docker (evita o uso constante de sudo)
usermod -aG docker suporte
Importante: Após adicionar seu usuário ao grupo docker, faça logout e login novamente para que as alterações tenham efeito, ou execute:
newgrp docker
Instalação do kubectl
- O kubectl é a ferramenta de linha de comando para interagir com clusters Kubernetes
# Obtenha a versão estável mais recente e instale o kubectl
KUBECTL_VERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)
curl -LO "https://dl.k8s.io/release/$KUBECTL_VERSION/bin/linux/amd64/kubectl"
curl -LO "https://dl.k8s.io/release/$KUBECTL_VERSION/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256) kubectl" | sha256sum --check
# Torne o binário executável e mova-o para o PATH
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
rm kubectl
rm kubectl.sha256
# Verifique a instalação
kubectl version --client
Instalação do Kind
- Instale o Kind de acordo com a arquitetura do seu sistema
# Detecte a arquitetura e Baixe a versão adequada do Kind
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64
else
echo "Arquitetura não suportada: $ARCH"
exit 1
fi
# Torne o binário executável e mova-o para o PATH
install -o root -g root -m 0755 kind /usr/local/bin/kind
rm kind
# Verifique a instalação
kind --version
Criação do Cluster
-
Verifique seu endereço IP com
ip a
-
Crie um arquivo de configuração para o Kind
- Antes, crie uma pasta para organização
mkdir -p k8s
- Crie o aquivo
kind.yml
nano k8s/kind.yml
- Adicione a seguinte configuração do Cluster (ajuste conforme necessário)
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
- Crie o cluster
kind create cluster --config ./k8s/kind.yml --name bsi-devops
- Verifique se o cluster foi criado corretamente
kubectl cluster-info --context kind-bsi-devops
Criação do Pod
- Crie a pasta
config
mkdir -p config
- Coloque a configuração do Pod dentro da pasta recém-criada
nano config/pod.yml
apiVersion: v1
kind: Pod
metadata:
name: bsi-hello
labels:
app: bsi-hello
spec:
containers:
- name: bsi-hello
image: eduardosilvasc/bsi-hello:latest
- Pode aplicar a configuração para a criação do Pod
kubectl apply -f config/pod.yml
- Agora, faça o mapeamento de porta para todas as interfaces de rede disponíveis
kubectl port-forward pod/bsi-hello 9000:9000 --address 0.0.0.0
- É necessário usar a flag
--address
, porque estamos em modo Bridge - Ou seja, só daria para acessar a aplicação executando dentro da VM um
curl http://localhost:9000
- Com esse mapeamento, aí conseguimos acessar na máquina hospedeira
- Agora testa aí, abre o navegador e acesse o IP da VM na porta
9000
Criação do Deployment
- Crie o arquivo
deploy.yml
nano config/deploy.yml
- Por fim, adicione o seguinte conteúdo
apiVersion: apps/v1
kind: Deployment
metadata:
name: bsi-hello
labels:
app: bsi-hello
spec:
replicas: 3
selector:
matchLabels:
app: bsi-hello
template:
metadata:
labels:
app: bsi-hello
spec:
containers:
- name: bsi-hello
image: eduardosilvasc/bsi-hello:latest
- Para aplicar o Deployment, use o comando abaixo
kubectl apply -f config/deploy.yml
- Execute o comando a seguir para expor o deployment
kubectl expose deployment bsi-hello --port 9000 --type NodePort
- Veja o serviço rodando
kubectl get svc bsi-hello
Criação do Service
- Caso não tenha feito o
kubectl expose
, crie o arquivoservice.yml
- Se o deployment já estiver exposto, pule para o comando
kubectl port-foward
- Nesse caso em
svc/bsi-hello
somente, sem o sufixo-service
- Se o deployment já estiver exposto, pule para o comando
nano config/service.yml
apiVersion: v1
kind: Service
metadata:
name: bsi-hello-service
spec:
selector:
app: bsi-hello
ports:
- protocol: TCP
port: 9000
targetPort: 9000
name: bsi-hello-service
- Para aplicar o Service, use o comando abaixo
kubectl apply -f config/service.yml
- Faça o mapeamento de portas
kubectl port-forward svc/bsi-hello-service 9000:9000 --address 0.0.0.0
Gerenciamento do Cluster (OPCIONAL)
Exportar configuração do cluster
- Para acessar o cluster de outras máquinas
kind get kubeconfig --name bsi-devops > kind-bsconfig
- Você pode então copiar este arquivo para sua máquina local e usá-lo
export KUBECONFIG=/caminho/para/kind-config
kubectl get nodes
Testar o cluster
- Para validar a configuração - caso queira - implante uma outra aplicação de teste, como Nginx
# Criar um deployment de teste
kubectl create deployment nginx --image=nginx
# Expor o deployment
kubectl expose deployment nginx --port=80 --type=NodePort
# Verificar o serviço
kubectl get svc nginx
Remover o cluster
- Quando não precisar mais do cluster
kind delete cluster --name bsi-devops
- Ao conferir a remoção do cluster, dirá que não existe mais esse contexto
$ kubectl cluster-info --context kind-bsi-devops
error: context "kind-bsi-devops" does not exist
Persistência de Dados
- Para persistir dados entre reinicializações do cluster e compartilhar o recurso entre Pods:
- Configure volumes no manifesto do Kind
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraMounts:
- hostPath: /caminho/na/maquina/host
containerPath: /caminho/no/container
- Pode usar este volume em suas apps Kubernetes
Troubleshooting
-
Erro de permissão ao usar Docker: Execute o comando a seguir
newgrp docker
- Ou reinicie a sessão
-
Cluster não inicia: Verifique os logs
docker logs kind-cluster-control-plane
-
Problemas de rede: Verifique a configuração de rede do Docker
docker network inspect kind
-
Problemas de recursos: Verifique a utilização de recursos
htop
Conclusão
Com isso, é possível configurar um ambiente básico Kubernetes local usando Kind. Este ambiente já é suficiente pra desenvolvimento, testes e aprendizado de Kubernetes sem a necessidade de infraestrutura complexa.
Algumas infos pra saber mais:
- Documentação oficial do Kind: https://kind.sigs.k8s.io/docs/
- Kubernetes / kubectl oficial: https://kubernetes.io/docs/reference/kubectl/
- Docker: https://docs.docker.com/