domingo, 3 de abril de 2022

Criando seu próprio Kubernetes Cluster com Kind

Índice

 

Introdução

Com a crescente migração das empresas para o ambiente cloud, a necessidade de utilização de containers se tornou cada vez maior. Sistemas com arquiteturas mais complexas se tornam mais facies de manter e integrar através de ferramentas de contêineres como Docker. Contêineres trazem simplicidade quando pensamos em unidades, mas o que acontece quando temos que gerenciar o ciclo de vida de vários contêineres ao mesmo tempo? Nesse caso, precisamos de um orquestrador de contêineres e há diversas opções (AWS EKS, Open Shift, Nomad, Docker Swarm), porém vamos falar do mais popular de todos, Kubernetes.

Kubernetes

O Kubernetes é uma plataforma para gerenciamento de cargas de trabalho e serviços distribuídos em contêineres, que facilita tanto a configuração declarativa quanto a automação.

Para publicar um contêiner no kubernetes podemos utilizar a ferramenta kubectl que é a ferramenta oficial de linha de comando. Você pode encontrar mais detalhes neste link.

kubectl apply -f ./aplicacao.yaml

Os recursos que queremos publicar no kubernetes podem ser descritos em arquivos YAML como no exemplo abaixo

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Não vamos aprofundar muito no kubernetes pois não é o objetivo deste artigo.

Como testar arquivos do kubernetes?

Uma parte importante do ciclo de desenvolvimento são os testes. É muito importante que a gente consiga testar inclusive os arquivos que descrevem os recursos que vamos publicar no kuberntes.

O que é o Kind?

kind é uma ferramenta para executar clusters locais do Kubernetes usando “nós” em contêiner do Docker.

Isso significa que podemos iniciar um cluster kubernetes no docker instalado na máquina e assim conseguir testar nossos arquivos.

Como Funciona?

De maneira simples, o kind cria um container docker que irá representar o cluster kubernetes.



Mostrando na prática

Instalando o kind

Há diversas formas de instalar o kind e os detalhes podem ser vistos aqui.

Exemplo utilizando o brew para instalar no MAC:

brew install kind

Criando cluster

A forma mais simples é indo direto no comando create

kind create cluster

Também é possível criar a partir de um arquivo de configuração:

kind: Cluster
apiVersion: kind.x-k8s.io/v1
name: cluster-kind
kind create cluster --config cluster.yaml

Obtendo informações do cluster

O comando abaixo lista os clusteres que foram criados.

kind get clusters

O comando abaixo detalha um cluster específico

kubectl cluster-info --context cluster-kind

Deletando o cluster

Para deletar o cluster é tão simples quanto cirar:

kind delete cluster --name cluster-kind

Configurando ingress controller

Esse exemplo mostra como criar um Ingress Controller que será responsável por estabelecer uma conexão entre o ambiente local o cluster kubernetes.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: cluster-kind
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"    
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP

Agora basta criar o cluster

kind create cluster --config cluster.yaml

Publicando recursos no kubernetes local

Os comandos abaixo dependem da instalação do kubectl e como não é escopo detalhar o kubernetes, vou coloca-los apenas para fins de exemplo.

kind: Pod
apiVersion: v1
metadata:
  name: kind-app
  labels:
    app: kind-app
spec:
  containers:
  - name: kind-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=Hello World! This is a Kubernetes with kind App"
---
kind: Service
apiVersion: v1
metadata:
  name: kind-service
spec:
  selector:
    app: kind-app
  ports:
  # Default port used by the image
  - port: 5678
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kind-ingress
spec:
  rules:
  - http:
      paths:
      - pathType: Prefix
        path: "/kind"
        backend:
          service:
            name: kind-service
            port:
              number: 5678
---
kubectl apply -f kind-app.yml

Agora é só acessar o link http://localhost:5678/kind para ver o resultado

Outros recursos

Para aplicar outros recursos como config-map, secrets, deployments, cron-job, etc basta seguir a mesma ideia.

Conclusão

Isso foi uma introdução bem superficial ao kind, apenas para sentir o gostinho. Há muito mais para explorar. O mais importante é entender que o kind permite a realização de testes locais de todos os artefatos antes mesmo de executa-los no ambiente real.

Referência