Criando um cluster K8s local com Kind

Há vários casos em que é útil configurar um cluster Kubernetes local. Quando estamos aprendendo Kubernetes pela primeira vez, por exemplo, rodar a coisa toda localmente ajuda bastante. Ou talvez só queiramos testar alguma funcionalidade do Kubernetes sem impactar um cluster produtivo.

De um jeito ou de outro, precisamos escolher qual solução de cluster local usar, e temos várias a disposição:

Destas opções, a única que nunca testei foi o Microk8s. O Kind é bastante leve. Não tanto quanto o k3d, mas de longe, bem mais fácil de instalar e configurar. Neste artigo vamos focar no Kind.

Kind

O Kind foi criado originalmente para testar o próprio Kubernetes. Ele roda nós do Kubernetes em containers Docker, e é útil para desenvolvimento local e até para CI.

Instalação

Para instalar o Kind, é necessário ter instalados o Docker e o Go. O jeito mais fácil de instalar é rodando o seguinte comando no terminal:

go get sigs.k8s.io/kind@v0.10.0

O go get vai colocar o kind em $GOPATH/bin. Pode ser que seja necessário adicionar o diretório do Kind no $Path.

Na documentação do Kind, há outras formas instalar usando gerenciadores de pacotes, como através do Chocolatey no Windows ou do brew no Mac.

Uma vez instalado, estamos prontos para criar nosso primeiro cluster.

Criando nosso primeiro cluster

Criar um novo cluster é tão fácil quanto rodar o comando kind create cluster:

Print do log de instalação, indicando a criação dos nós, escrita da configuração, início do control plane, instalação de CNI e StorageClass

Também podemos criar outros clusters especificando o nome com o comando kind create cluster --name kind-2.

E agora podemos listar nossos clusters com o comando kind get clusters:

Print do console, mostrando que o comando imprimiu simplesmente kind

Listando os contêineres Docker com o comando docker ps, podemos conferir que o Kind subiu um Control Plane do Kubernetes dentro de um container:

Print do console, mostrando que o comando imprimiu simplesmente kind

Interagindo com um cluster Kind

Para interagir com um cluster Kind, basta especificar o nome do cluster como contexto no kubectl:

kubectl cluster-info --context kind-kind
kubectl cluster-info --context kind-kind-2

Para conseguir fazer deploy no cluster de uma aplicação, primeiro precisamos carregar a imagem base nos nós do cluster usando o comando kind load.

Para carregar uma imagem Docker, podemos usar o comando kind load docker-image minha-imagem-personalizada. Por padrão, a imagem será carregada em todos os clusters, a não se que especifiquemos o cluster com o argumento --name <nome-cluster>.

Alternativamente, podemos carregar um arquivo de imagens todo de uma vez usando o comando kind load image-archive /meu-arquivo-de-imagens.tar. Esses arquivos podem ser gerados através do comando docker save [OPTIONS] imagem [imagem2...].

Isso permite um workflow como este:

docker build -t my-custom-image:unique-tag ./my-image-dir
kind load docker-image my-custom-image:unique-tag
kubectl apply -f my-manifest-using-my-image:unique-tag

Trabalhando com um Docker Registry local

Existem duas formas de configurar um registro Docker local com o Kind. A primeira é executando um script disponibilizado na documentação:

#!/bin/sh
set -o errexit

# create registry container unless it already exists
reg_name='kind-registry'
reg_port='5000'
running="$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)"
if [ "${running}" != 'true' ]; then
  docker run \
    -d --restart=always -p "127.0.0.1:${reg_port}:5000" --name "${reg_name}" \
    registry:2
fi

# create a cluster with the local registry enabled in containerd
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:${reg_port}"]
    endpoint = ["http://${reg_name}:${reg_port}"]
EOF

# connect the registry to the cluster network
# (the network may already be connected)
docker network connect "kind" "${reg_name}" || true

# Document the local registry
# https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-registry-hosting
  namespace: kube-public
data:
  localRegistryHosting.v1: |
    host: "localhost:${reg_port}"
    help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF

Um jeito mais fácil, é utilizando a ferramenta ctlptl.

ctlptl

ctlptl (pruncioado “cattle paddle”) é uma CLI desenvolvida pelo time do Tilt para facilitar a configuração de clusters locais. Ele é compatível com Kind, Docker for Desktop e Minikube.

Pode ser instalado no Linux e Mac com Homebew:

brew install tilt-dev/tap/ctlptl

E no Windows usando o Scoop:

scoop bucket add tilt-dev https://github.com/tilt-dev/scoop-bucket
scoop install ctlptl

Uma vez instalado, podemos usá-lo para criar um cluster Kind:

ctlptl create cluster kind

Ou melhor ainda, um cluster com um registry Docker já configurado:

ctlptl create cluster kind --registry=ctlptl-registry
Saída do comando no console

Como pode ser visto na imagem acima, em adição ao processo de criação do cluster, o ctlptl também criou um registry Docker, e imprimiu ao final instruções de como usá-lo.

O registry foi criado seguindo a mesma linha do script mais acima, com a diferença que o ctlptl seleciona automaticamente uma porta disponível para o registry.

docker ps lista dois containers rodando; o control plane e o registro

Agora podemos listar os clusters através do ctlptl e conferir que o cluster e o repositório estão associados:

ctlptl get clusters
O comando lista o nome do cluster junto com o IP do Docker registry

E agora o cluster Kind está pronto para ser usado.

Se quisermos excluir o cluster, isso pode ser feito facilmente através do comando ctlptl delete cluster nome-cluster.

Outras opções para compartilhar:
comments powered by Disqus