Introdução
Durante o desenvolvimento e/ou testes de aplicações desenhadas para execução em ambientes baseados no orquestrador Kubernetes, surge a necessidade de se ter um cluster disponível. Nem sempre isso está acessível de forma prática e rápida.
Existem várias formas e ferramentas que possibilitam executar um cluster k8s localmente. Aqui vou falar um pouco sobre o Kind (Kubernetes in Docker).
O kind de forma resumida é uma forma de executar nodes kubernetes dentro de contêineres docker. Os nodes do cluster, na prática são containers docker.
Cenário
Para deixar tudo alinhado, meu ambiente de trabalho é baseado em GNU/Linux, distribuição Dedian Like. Entretanto, o Kind também tem suporte para Windows e Mac. Assim, apesar de aqui ser demonstrado tudo baseado no meu cenário, isso pode perfeitamente ser adaptado para a sua realidade, basta seguir a documentação oficial.
Pré-requisitos:
Para execução desse tutorial:
- Distribuição Linux (Debian Like, Ubuntu, por exemplo).
- Docker (é compatível também com Podman). Para melhor entendimento, recomenda-se ter conhecimento básico prévio sobre:
- Contêineres de aplicação
- Docker
- Kubernetes
Instalação
Para instalar o kind existem várias maneiras. Aqui será demonstrado conforme a documentação oficial, mais especificamente através do método Installing from Release Binaries.
Etapas:
- Download do binário (Aqui demonstrado para arquitetura AMD64/x86_64)
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.22.0/kind-linux-amd64
- Adicionando permissão de execução ao binário
chmod +x ./kind
- Movendo o binário para um path que esteja na variável path do S.O.:
sudo mv ./kind /usr/local/bin/kind
Alguns esclarecimentos:
No primeiro comando, o trecho [ $(uname -m) = x86_64 ] é uma condição que está validando se a arquitetura do sistema operacional é x86_64. Ou seja, ele valida se a saída do uname -m que está dentro de um subshell "$()" é igual a "x86_64", sendo igual, retornará sucesso.
Como após a condição, temos um "&&", a segunda parte só executada se a primeira teve como saída sucesso. É isso que significa o "&&" em uma linha de comando shell, explicando: comando1 && comando2, só será executado o comando2 se o comando1 teve sucesso. No caso aqui, se arquitetura do S.O. for diferente do esperado, nem será realizado o download do binário.
No terceiro comando, caso queira consultar o path do seu S.O. para entender melhor para onde mover, basta digitar no terminal echo $PATH. No caso do Ubuntu, pode-se mover para /usr/local/bin que é um caminho padrão para instalação de binários adicionais no sistema.
Criando o primeiro cluster
Para criar um cluster é trivial:
kind create cluster
Ou passando um name para o cluster, sim você consegue criar mais de um cluster inclusive:
kind create cluser --name euterpe
Quando o nome não é passado como parâmetro, será criado um cluster com o nome kind.
O nome é importante, pois será o context usado no config que é usado pelo comando kubectl.
Caso queira listar os clusters criados com o kind:
kind get clusters
Quando tiver mais de um cluster, é necessário indicar ao kubectl o context. Exemplo:
kubectl cluster-info --context kind
kubectl cluster-info --context euterpe
Para excluir um cluster criado pelo kind:
kind delete cluster -n euterpe
Deve-se indicar o nome do cluster que quer excluir com a opção "-n" caso tenha mais de um cluster criado.
Agora a coisa vai ficar séria!
Está tudo muito bem, mas nada demais até aqui. Agora, vamos criar um cluster com algumas customizações.
Usando o kind, a forma de fazer isso é via um arquivo de configuração que é passado no momento da criação do cluster.
Etapas:
- Criar um arquivo de configuração do cluster no formato yaml (config.yaml):
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: euterpe
nodes:
- role: control-plane
image: kindest/node:v1.27.11@sha256:681253009e68069b8e01aad36a1e0fa8cf18bb0ab3e5c4069b2e65cafdd70843
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- role: worker
image: kindest/node:v1.27.11@sha256:681253009e68069b8e01aad36a1e0fa8cf18bb0ab3e5c4069b2e65cafdd70843
extraMounts:
- hostPath: /opt/kind-data/worker01
containerPath: /mnt/data
- role: worker
image: kindest/node:v1.27.11@sha256:681253009e68069b8e01aad36a1e0fa8cf18bb0ab3e5c4069b2e65cafdd70843
extraMounts:
- hostPath: /opt/kind-data/worker02
containerPath: /mnt/data
Alguns pontos sobre o arquivo:
- Está sendo definido um cluster com 3 nodes, um control-plane e 2 workers. Isso é definido nas linhas que contém "- role: ";
- Está sendo definida uma versão específica de k8s, através do que é definido em "image: ". Ou seja, através da imagem do container que será usado, é definida a versão do k8s. Mais informações aqui.
- Através dos trechos "kubeadmConfigPatches" e "extraPortMappings", possibilita-se o uso de ingress controller no cluster local, como por exemplo, o Nginx Ingress Controller.
- Nos nodes workers, foi definida uma opção "extraMounts", que permite montagem de volume entre os nodes e o host hospedeiro (seu computador). Isso ajuda em alguns cenários de persistência e transferência de dados.
- Criando o cluster a partir do arquivo de configuração criado, por exemplo, config.yaml (o nome pode ser qualquer um):
kind create cluster --config config.yaml
Lembre-se que, para que o comando acima funcione, no terminal deverás estar dentro do diretório que contém o arquivo config.yaml. Se não, poderá ser passado o caminho completo do arquivo.
Se tudo deu certo, a saída no terminal será:
Checando os nodes:
kubectl get nodes
Saída:
NAME STATUS ROLES AGE VERSION
euterpe-control-plane Ready control-plane 32s v1.27.11
euterpe-worker Ready <none> 9s v1.27.11
euterpe-worker2 Ready <none> 15s v1.27.11
Pronto, seu cluster local está pronto!
Considerações
Mas por que usar o kind?
Algumas razões para eu preferir o kind:
- suporte a clusters de vários nós (incluindo HA);
- suporte a construção de versões de lançamento do Kubernetes;
- suporte para Linux, macOS e Windows;
- é um instalador Kubernetes em conformidade com certificação CNCF.
- facilidade de uso, visto que é tudo via container, pode facilmente criar e excluir. Ideal para testes rápidos em ambiente de desenvolvimento local.
O kind oferece uma experiência excelente para iniciar clusters mais próximos de ambientes "reais" com kubernetes.
É possível usar o kind em esteiras de CI/CD para ainda na pipeline subir um cluster com kind e fazer testes em seus manifestos ou charts helm. Assim, é possível validar QA e também testes de segurança, com a aplicação implantada inicialmente em um kind dentro de sua pipeline (github actions, gitlab ci/cd, etc).
Há mais aplicações e utilidades do kind em seu ambiente, tenho certeza.
Top comments (0)