DEV Community

Cover image for Kind: uma jornada empolgante com k8s em seu GNU/Linux!
Guto Ribeiro
Guto Ribeiro

Posted on

2

Kind: uma jornada empolgante com k8s em seu GNU/Linux!

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
Enter fullscreen mode Exit fullscreen mode
  • Adicionando permissão de execução ao binário
chmod +x ./kind
Enter fullscreen mode Exit fullscreen mode
  • Movendo o binário para um path que esteja na variável path do S.O.:
sudo mv ./kind /usr/local/bin/kind
Enter fullscreen mode Exit fullscreen mode

Instalação do 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
Enter fullscreen mode Exit fullscreen mode

Ou passando um name para o cluster, sim você consegue criar mais de um cluster inclusive:

kind create cluser --name euterpe
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Quando tiver mais de um cluster, é necessário indicar ao kubectl o context. Exemplo:

kubectl cluster-info --context kind
kubectl cluster-info --context euterpe
Enter fullscreen mode Exit fullscreen mode

Para excluir um cluster criado pelo kind:

kind delete cluster -n euterpe
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Alguns pontos sobre o arquivo:

  1. Está sendo definido um cluster com 3 nodes, um control-plane e 2 workers. Isso é definido nas linhas que contém "- role: ";
  2. 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.
  3. Através dos trechos "kubeadmConfigPatches" e "extraPortMappings", possibilita-se o uso de ingress controller no cluster local, como por exemplo, o Nginx Ingress Controller.
  4. 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
Enter fullscreen mode Exit fullscreen mode

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á:

Kind - Cluster criado

Checando os nodes:

kubectl get nodes
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay