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
:
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
:
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:
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
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.
Agora podemos listar os clusters através do ctlptl
e conferir que o cluster e o repositório estão associados:
ctlptl get clusters
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
.