Sumário
- Kind
- Docker
- Kubernetes
- Instalação das ferramentas
- Hello World Kind
- Kind com multi-nós
- Kind com WORDPRESS e MYSQL
- Kind com PHP
- Referências
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 é 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.
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.
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).
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
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
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
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
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.