Fazer testes de Kubernetes Operators tem seus desafios, não é mesmo? Mas e se eu te dissesse que existe uma ferramenta de código que pode te ajudar muito nessa missão. Pois hoje eu vou te apresentar ao KUbernetes Test TooL, ou simplesmente KUTTL.
Neste artigo vamos acompanhar o que é KUTTL, detalhes sobre a sua instalação e configuração, além de um exemplo de caso de teste utilizando essa ferramenta no macOs / Linux.
O que é o KUTTL?
KUbernetes Test TooL (KUTTL) é uma ferramenta open source de teste que facilita o teste de Kubernetes Operators. Para utilizá-la não é necessário conhecimento de nenhuma linguagem de programação específica, sendo todos os testes escritos em formato YAML de forma declarativa.
As possibilidades de configuração de testes são inúmeras. É uma ferramenta de fácil utilização, possui documentação detalhada e foi criada pelo time de desenvolvimento do KUDO, o que passa confiança à ferramenta. Confira
A documentação oficial do KUTTL é muito boa e vamos utilizá-la em alguns pontos desse tutorial. Inclusive, o site oficial da ferramenta também é bastante interessante.
Agora vamos acompanhar como fazer as primeiras configurações do KUTTL.
Pré-requisitos para instalar o KUTTL
É necessário ter um cluster Kubernetes configurado ou ter o Kind instalado.
Configure um cluster Kubernetes de versão 1.13 ou posterior no caso de necessitar rodar os testes em um cluster já configurado.
Tenha instalado também o kubectl de versão 1.13 ou posterior.
Instalação do krew
O krew é um gerenciador de plugins do kubectl necessário para a instalação do KUTTL. Para instalá-lo rode o seguinte comando no seu terminal:
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
Adicione a linha <export PATH=”${KREW_ROOT:-$HOME/.krew}/bin:$PATH”> no arquivo $HOME/.krew/bin para atualizar o PATH do krew e reinicie o terminal para aplicar as alterações.
Instalação do KUTTL
Para instalar o KUTTL rode o seguinte comando no seu terminal:
kubectl krew install kuttl
Para facilitar asserções de teste instale também o plugin de assert. Para isso rode o seguinte comando:
kubectl krew install assert
Configurações para os testes
Agora que já vimos as principais informações para configurar o KUTTL é chegada a hora de fazer as configurações próprias para os testes.
A seguir, além do passo a passo dos testes, eu vou abordar alguns conceitos importantes para esse tutorial.
Configuração dos diretórios de teste
Rode o seguinte comando para criar o diretório da suíte de testes:
mkdir -p tests/integration
Cada pasta criada dentro do diretório “integration” irá representar um único teste.
Configuração da suíte de teste
Para informar as configurações da suíte de testes crie o arquivo kuttl-test.yaml na raiz do projeto. O arquivo deve conter basicamente o diretório de testes e o tipo relacionado ao escopo de testes:
apiVersion: kuttl.dev/v1beta1
kind: TestSuite
startKIND: true
kindContainers:
- my-operator-image:latest
testDirs:
- tests/integration/
timeout: 120
A criação desse arquivo é opcional. Caso não seja criado, os argumentos devem ser passados por meio de linha de comando na execução dos testes, por exemplo:
kubectl kuttl test –start-kind=true ./tests/integration
Caso tenha criado o arquivo e utilize também argumentos na linha de comando, os argumentos irão sobrescrever as instruções do arquivo de configuração.
Para mais informações sobre as possibilidades de configuração do KUTTL acesse a documentação de referência.
Neste contexto vamos usar o arquivo de configuração como o criado acima, onde o KUTTL irá se encarregar de criar um cluster utilizando o kind e aplicar a imagem docker do operator a ser testado.
O KUTTL criará também um namespace exclusivo para cada caso de teste, possibilitando rodá-los em paralelo e com isolamento entre eles, porém caso necessite, também é possível configurar um namespace específico para seus testes.
Escrita de caso de teste
Crie uma pasta com o nome do teste no diretório /tests/integration, nesse caso vamos nomear o teste de my-frist-test.
- Escrita de um TestStep
O TestStep é um objeto que pode ser usado para especificar as configurações dos steps de teste. Os nomes de cada arquivo YAML deve conter em seu nome o prefixo com o index do step dentro da pasta do caso de teste, por exemplo:
tests/integration/my-first-test/00-pod.yaml
tests/integration/my-first-test/00-assert.yaml
tests/example/my-first-test/01-staging.yaml
O índex serve para identificar a ordem em que os steps e asserts serão executados, onde os steps de mesmo índex são executados primeiro antes do assert de mesmo índex.
Neste exemplo vamos criar o arquivo 00-pod.yaml do tipo Deployment com o conteúdo abaixo:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Você pode consultar e personalizar as opções de configurações do TestStep na documentação de referência.
- Escrita de um TestAssert
O TestAssert é um objeto que é usado para especificar as configurações de um step de assert onde é possível comparar objetos específicos pelo nome ou qualquer objeto comparando um estado definido. O TestAssert deve ser criado na pasta de teste como um arquivo YAML, e assim como um step de teste deve seguir o mesmo padrão de nomenclatura do TestStep.
Neste exemplo vamos criar o arquivo 00-assert.yaml com o seguinte conteúdo:
apiVersion: kuttl.dev/v1beta1
kind: TestAssert
status:
phase: Running
commands:
- command: kubectl assert exist-enhanced deployment test -n $NAMESPACE --field-selector status.readyReplicas=4
Neste assert vamos comparar se o deployment criado no cluster contém o número de réplicas especificado no arquivo 00-pod.yaml.
Assim como asserts também é possível criar steps de erros esperados, consulte a documentação de referência para saber mais.
Execução dos testes
Para executar o teste criado, basta executar o seguinte comando:
kubectl kuttl test
Caso queira gerar o arquivo de report após a execução dos testes utilize o argumento –report <xml/json>
O resultado dos testes no console será apresentado da seguinte forma:
=== CONT kuttl
harness.go:399: run tests finished
harness.go:508: cleaning up
harness.go:517: collecting cluster logs to kind-logs-1647000814
harness.go:563: removing temp folder: "/var/folders/dk/9t1ln8yd4q128cmny92mnr880000gn/T/kuttl973159101"
harness.go:569: tearing down kind cluster
--- PASS: kuttl (114.64s)
--- PASS: kuttl/harness (0.00s)
--- PASS: kuttl/harness/my-first-test (44.47s)
Encerrando…
Espero que com esse artigo você tenha conseguido compreender as características e vantagens de usar o KUTTL. Com ele, seus testes de Kubernetes Operators nunca mais serão os mesmos.
E você, já conhecia o KUTTL? Conta pra gente nos comentários se já usava ou se está pensando em adotar agora.