Skip to content

Instantly share code, notes, and snippets.

@franciscojsc
Last active February 27, 2024 10:56
Show Gist options
  • Save franciscojsc/ddb4dce5a91708faac2d8d5d8543077a to your computer and use it in GitHub Desktop.
Save franciscojsc/ddb4dce5a91708faac2d8d5d8543077a to your computer and use it in GitHub Desktop.
Kind, crie seu cluster Kubernetes localmente com Docker

Kubernetes com a ferramenta Kind

Sumário

Kind

O Kind serve para realizar testes com Kubernetes utilizando o Docker, com ele pode subir vários nós (container) simulando um Cluster real, com velocidade para criar e apagar os cluster.

A ferramenta Kind, é descrita no site https://kind.sigs.k8s.io (2019, tradução nossa, grifo nosso) como:

O kind é uma ferramenta para executar clusters locais do Kubernetes usando 'nós' de contêiner do Docker.

O kind foi projetado principalmente para testar o Kubernetes 1.11+, visando inicialmente os testes de conformidade .

[...]

Para usar o kind, você também precisará instalar o Docker.

Docker

Docker é uma ferramenta muito útil para execução de aplicativos isolados em um Host, utiliza poucos recursos de máquina aproveitando o Kernel do Sistema Operacional, além de proposionar uma grande velocidade na implantação dos aplicativos em ambiente local ou em nuvem.

Para Costa (2017) o Docker é caracterizado por:

Docker surgiu em 2013 inicialmente como uma camada sobre a funcionalidade do Kernel do Linux chamada LXC (Linux Containers), que permite a execução de processos de maneira isolada e restrita. Posteriormente trocaram a LXC pela libcontainer, permitindo seu uso além do Linux.

A tecnologia de containers possibilita rodar processos, serviços e aplicativos de maneira isolada, ou seja, um não enxerga o outro, e de forma limitada, no qual cada um possui um limite dos recursos de hardware disponíveis como quantidade de memória e espaço em disco.

Containers são mais “leves” do que máquinas virtuais pois não precisam simular o hardware e não precisam carregar um sistema operacional completo antes de executar uma aplicação. Utilizam como base Imagens Docker que são arquivos compactados contendo um sistema de arquivos e a aplicação a ser executada.

Basicamente uma aplicação é empacotada na forma de uma Imagem Docker e cada instância em execução é chamada de container.

Na imagem abaixo retirada de https://docs.docker.com/engine/docker-overview/#docker-architecture pode-se observar a arquitetura do Docker.

Docker

Kubernetes

Conforme Costa (2017) a orquestração com Kubernetes:

Orquestração de containers é a capacidade de provisionar automaticamente a infraestrutura necessária para atender às solicitações das aplicações web por meio de de containers do Docker.

Kubernetes, também conhecido como k8s, é uma ferramenta open source criada pela Google e distribuída em 2014 para automatização de deploys e gerenciamento de containers. Com ele é possível criar um cluster de containers em clouds privadas ou públicas (AWS, Google Cloud, etc.).

De acordo com Machado (2018, grifo nosso) kubernetes é definido como:

Trata-se de um sistema de código aberto para orquestração de contêineres Docker. Em outras palavras, um sistema que faz o monitoramento de aplicações conteinerizadas. Seu principal objetivo é facilitar o monitoramento, abstraindo a complexidade que seria necessária com a criação de scripts para iniciar contêineres, monitorar e controlar o retorno de erros em caso de quedas ou falhas no sistema."

Para Arundel e Domingus (2019):

O Kubernetes é o sistema operacional do mundo nativo de nuvem e oferece uma plataforma confiável e escalável para executar cargas de trabalho em contêineres.

Kubernetes

O kubernetes possui um arquitetura organizada como observado na imagem acima, e possui algumas características como "Um master pode gerenciar um ou mais nodes, um node pode conter um ou mais pods, e um pod pode conter um ou mais contêineres" (MACHADO, 2018).

Instalação das ferramentas

Instale o kind

curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-$(uname)-amd64 && \
chmod +x ./kind && \
sudo mv ./kind /usr/local/bin/kind

Instale o auto-completar do kind:

echo 'source <(kind completion bash)' >>~/.bashrc &&\
source ~/.bashrc

Instale o kubectl:

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl &&\
chmod +x ./kubectl && \
sudo mv ./kubectl /usr/local/bin/kubectl && \
kubectl version

Instale o auto-completar do kubectl:

echo 'source <(kubectl completion bash)' >>~/.bashrc &&\
source ~/.bashrc

Instale o Docker:

sudo curl -fsSL https://get.docker.com | sh && \
sudo usermod -aG docker $USER && \
sudo newgrp docker && \
sudo systemctl enable docker && \
sudo systemctl start docker && \
sudo systemctl status docker && \
sudo docker --version

Hello World Kind

Crie o cluster:

kind create cluster --name kind

Exporte o arquivo kubeconfig:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"

Informações do cluster:

kubectl cluster-info

Visualize seus clusters:

kind get clusters

Execute a aplicação:

kubectl run demo --image=franciscojsc/myhello --port=9999 --labels app=demo

Redirecione a porta do host para o porta do pod com o port-forward:

kubectl port-forward deploy/demo 9999:8888

Visualize o status:

kubectl get pods --selector app=demo

Delete o cluster:

kind delete cluster --name kind

Kind com multi-nós

Crie o arquivo config.yaml:

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

Crie o cluster utilizando o arquivo config.yaml:

kind create cluster --config config.yaml 

Exporte o arquivo kubeconfig:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"

Informações do cluster:

kubectl cluster-info

Visualize os nós do cluster:

kubectl get nodes

Para destruir o cluster:

kind delete cluster --name kind

Kind com WORDPRESS e MYSQL

Será utilizados os tutoriais disponíveis em https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume e https://itnext.io/starting-local-kubernetes-using-kind-and-docker-c6089acfc1c0 como referências, para executar o Wordpress com Mysql em um cluster kubernetes com a ferramenta Kind.

De acordo com o tutorial do site https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume, o Worpress e Mysql utilizam:

Both applications use PersistentVolumes and PersistentVolumeClaims to store data.

A PersistentVolume (PV) is a piece of storage in the cluster that has been manually provisioned by an administrator, or dynamically provisioned by Kubernetes using a StorageClass. A PersistentVolumeClaim (PVC) is a request for storage by a user that can be fulfilled by a PV. PersistentVolumes and PersistentVolumeClaims are independent from Pod lifecycles and preserve data through restarting, rescheduling, and even deleting Pods.

Crie o cluster:

kind create cluster --name kind

Exporte o arquivo kubeconfig:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"

Crie um diretório para os arquivos que serão utilizados:

mkdir kind-wp && \
cd kind-wp

Crie o arquivo com o nome kustomization.yaml:

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
resources:
    - mysql-deployment.yaml
    - wordpress-deployment.yaml
EOF

Realize o download do arquivo mysql-deployment.yaml:

curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml

Realize o download do arquivo wordpress-deployment.yaml:

curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml

Aplique as configurações dos arquivos ao cluster:

cd kind-wp
kubectl apply -k ./

Verifique o status do cluster:

kubectl get secrets
kubectl get pvc
kubectl get pods
kubectl get services wordpress

Redirecione a porta, para permitir acesso ao service:

kubectl port-forward svc/wordpress 8080:80

Acesse a url http://localhost:8080 e visualize a aplicação em execução.

Para destruir o cluster:

kind delete cluster --name kind

Kind com PHP

Será utilizado o tutorial disponível em https://king.host/blog/2018/05/como-usar-kubernetes-na-pratica como referência, para executar um container PHP e exibir informações do php em uma página web, utilizando a ferramenta Kind.

Crie o cluster:

kind create cluster --name kind

exporte o arquivo kubeconfig:

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"

Crie o arquivo para o objeto pod com o nome aplicacao.yaml:

apiVersion: v1   #versão da API do Kubernetes 
kind: Pod        #Tipo do objeto que será criado
metadata: 
 name: aplicacao #Nome de identificação para o objeto pod
spec:            #Características do objeto
 containers:
   - name: container-aplicacao
     image: php:5.6-apache
     ports:
       - containerPort: 80

Crie o objeto pod:

kubectl create -f aplicacao.yaml

Redirecione a porta 8080 do host para a porta 80 do container:

kubectl port-forward pod/aplicacao 8080:80

Apague o pod:

kubectl delete pods aplicacao

Visualize os pods:

kubectl get pods

Crie o arquivo para o objeto deployment com o nome deployment.yaml:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: aplicacao-deployment
spec:
  template:
    metadata:
      labels:
        name: aplicacao-pod  
    spec:
      containers:
        - name: container-aplicacao  
          image: php:5.6-apache  
          ports:  
            - containerPort: 80

Crie o objeto deployment:

kubectl create -f deployment.yaml 

Apague o pod:

kubectl delete pods aplicacao

Visualize os pods:

kubectl get pods

Crie o arquivo para o objeto service com o nome servico-aplicacao.yaml:

apiVersion:  v1
kind:  Service
metadata:
  name:  servico-aplicacao
spec:
  type: LoadBalancer
  ports:
    - port:  80
  selector:
    name:  aplicacao-pod

Crie o objeto service:

kubectl create -f servico-aplicacao.yaml 

Visualize os Services:

kubectl get services

Redirecione a porta 8080 do host para a porta 80 do container:

kubectl port-forward deploy/aplicacao-deployment  8080:80

Recupere a identificação do pod:

kubectl get pods

Entre no container do pod, subtituindo id-of-pod-here pelo id do pod:

kubectl exec -it id-of-pod-here bash

Adicione o conteúdo a seguir dentro do container:

echo "<?php phpinfo(); ?>" > index.php

Acesse a url http:localhost:8080 e visualize as informações do PHP.

Para destruir o cluster:

kind delete cluster --name kind

Referências

KIND. The Kubernetes Authors, 28 ago. 2019, 15h35m45s. Disponível em: https://kind.sigs.k8s.io. Acesso em: 30 set. 2019.

MACHADO, Iago. Kubernetes: uma introdução. KING HOST, 7 maio de 2018. Disponível em: https://king.host/blog/2018/05/introducao-ao-kubernetes. Acesso em: 30 set. 2019.

MACHADO, Iago. Kubernetes: uma introdução. KING HOST, 29 maio de 2018. Disponível em: https://king.host/blog/2018/05/como-usar-kubernetes-na-pratica. Acesso em: 30 set. 2019.

ARUNDEL, John; DOMINGUS, Justin. DevOps nativo de nuvem com Kubernetes: Como construir, implantar e escalar aplicações modernas na nuvem. São Paulo: Novatec, 2019. 384 p. Tradução de: Lúcia A. Kinoshita.

FUJIMOTO, Youichi. Starting local Kubernetes using kind and Docker. ITNEXT, 13 abr. 2019. Disponível em: https://itnext.io/starting-local-kubernetes-using-kind-and-docker-c6089acfc1c0. Acesso em: 2 out. 2019.

Example: Deploying WordPress and MySQL with Persistent Volumes. KUBERNETES, 25 jun. 2019. Disponível em: https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume. Acesso em: 2 out. 2019.

COSTA, Gustavo. AS DIFERENÇAS ENTRE DOCKER, KUBERNETES E OPENSHIFT. CONCRETE, 26 jun. 2017. Disponível em: https://www.concrete.com.br/2017/06/26/docker-kubernetes-e-openshift. Acesso em: 3 out. 2019.

Docker overview. DOCKER, Docker Docs. Disponível em: https://docs.docker.com/engine/docker-overview. Acesso em: 6 out. 2019.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment