- Linux
- Terminal
- VSCode
- Docker
- Git
- ASDF
- kubectl
- kubectx
- k3d
Primeiro certifique-se de ter os pré requisitos instalados e configurados em sua máquina.
Abra o terminal e clone este repositório público utilizando o git
git clone https://github.com/RLGHISLENI/rotten-potatoes.git
Navegue até a pasta fonte do projeto
cd rotten-potatoes/src
Abra o VSCode para poder editar os arquivos Dockerfile e .dockerignore
code .
Realize as alterações necessárias no projeto e nos arquivos docker e salve suas alterações.
Execute o build para atualizar a imagem docker.
ATENÇÃO: Incremente a versão denominada :v[n], onde [n] é o número da versão atual mais 1. Por exemplo :v2
docker image build -t rlghisleni/rotten-potatoes:v[n] .
Atualize a versão :latest da imagem
docker tag rlghisleni/rotten-potatoes:v[n] rlghisleni/rotten-potatoes:latest
Liste as imagens para visualizar a nova versão da imagem criada
docker images
Abra o terminal de comandos e execute o comando abaixo:
docker run -d -p 8080:8080 --name=rotten-potatoes rlghisleni/rotten-potatoes:latest
Liste os containers em execução e verifique se rlghisleni/rotten-potatoes consta na relação.
docker container ls
Abra o navegador de sua preferência na url http://localhost:8080/ e o projeto será apresentado.
Mantenha este container PARADO pois ele será utilizado através do cluster kubernetes mapeando a mesma porta 8080.
Para iniciar a executar do container em sua máquina, utilize o comando abaixo
docker container start rotten-potatoes
Para para a execução do container em sua máquina, utilize o comando abaixo
docker container stop rotten-potatoes
Realize o login na conta do DockerHub, informando o usuário e senha para se autenticar a plataforma.
docker login
Envie a nova versão da imagem alterada para o servidor Registry
docker push rlghisleni/rotten-potatoes:v[n]
Envie também a imagem latest atualizada
docker push rlghisleni/rotten-potatoes:latest
Abra o terminal e utilize o k3d para criar o cluster kubernetes como descrito abaixo
k3d cluster create meucluster --agents 1 --servers 1 -p "8080:30000@loadbalancer"
Importante:
A string meucluster
representa o nome do seu cluster kubernetes, portando você pode utilizar o nome que melhor se adequar a sua realidade.
Os parâmentros agents
e servers
podem ser dimencionados conforme sua necessidade e poder computacional.
O parâmetro -p
realiza o bind da porta 8080
para a porta 30000
definida na instância do service como porta externa de entrada ao node kubernetes.
A instrução @loadbalancer
define que será utilizado o balanceamento de carga a partir da execução do container de proxy criado pelo k3d.
Navegue até a pasta k8s
contida no projeto e a partir do terminal execute o comando abaixo para realizar a criação dos pods, replicasets, service e deployment da aplicação
kubectl apply -f deployment.yaml
Pronto, sua aplicação está no ar utilizando todo o poder dos containers docker e sendo orquestrada pelo kubernetes.
Abra o navegador de sua preferência na url http://localhost:8080/ e o projeto será apresentado.
# Exibe cada objeto em execução
kubectl get nodes
kubectl get pods
kubectl get service
kubectl get replicaset
kubectl get deployment
# Exibe todos objeto em execução
kubectl get all
# Exibe os pods de sistema em execução
kubectl get pods --namespace kube-system
# Exibe os pods filtrando pela label infomada
kubectl get pods -l app=web
# Exibe informações sobre o cluster
kubectl cluster-info
# Exibe todos os recursos disponíveis e suas versões
kubectl api-resources
# Exibe uma descrição completa sobre o pod
kubectl describe pod/meupod
# Realiza a criação dos pods através do manifesto informado (melhor utilizar o apply)
kubectl create -f pod.yaml
# Realiza a execução do manifesto informado
kubectl apply -f pod.yaml
kubectl apply -f replicaset.yaml
kubectl apply -f deployment.yaml
# Realiza a exclusão completa dos manifestos informados
kubectl delete -f pod.yaml
kubectl delete -f replicaset.yaml
kubectl delete -f deployment.yaml
# Realiza a exclusão de cada objeto definidi
kubectl delete pod meupod
kubectl delete replicaset meureplicaset
kubectl delete deployment meudeployment
# Executa o pod permitindo acesso via browser através da porta 8080
kubectl port-forward pod/meupod 8080:80
# Altera a quantidade de replicaset por linha de comando
kubectl scale replicaset meureplicaset --replicas 10
# Altera a imagem definida no deployment através da linha de comando
kubectl set image deployment meudeployment web=kubedevio/web-page:green
Docker é uma plataforma de conteinerização, capaz de construir, distribuir e rodar contêineres, já o Kubernetes é uma ferramenta auxiliar de orquestração de containers que em conjunto com o Docker nos provê uma série de benefícios como escalabilidade, resiliência e balanceamento de carga evitando sobrecargas além de possuir uma estratégia de atualização que mantem sua aplicação no ar enquanto o processo está rolando.
Como funciona a arquitetura do Kubernetes e quais os elementos usados pra fazer o deploy de forma correta no Kubernetes
O kubernetes é formado por um cluster (conjunto de recursos ou máquinas) onde cada uma delas vai realizar o papel de "Control Plane" ou "Node".
O Node é quem executa os containers das aplicações, ele quem executa toda a carga enquanto o Control Plane gerencia os Nodes e orquestra todo o Cluster.
Para garantir alta disponibilidade no cluster é recomendado que tenhamos mais de um Control Plane no cluster pois caso um deles tenha algum problema o outro poderá assumir seu papel.
Para realizar o deploy de nossa aplicação precisamos de uma imagem Docker contendo a nossa aplicação completa e rodando sem bugs e disponível em algum servidor registry como DockerHub por exemplo.
O próximo passa é criarmos nosso arquivo de manifesto e definirmos a criação dos** pods** que irão executar o container, feito isso podemos configurar e implementar nossa replicaset que será responsável por manter todos os pods sempre ativos e em execução.
Cada vez que um pod apresenta algum problema a replicaset sobe outra instância do pod para manter a quantidades de réplicas em execução.
Para garantir que nosso ambiente não sofra com atualizações em produção, criamos e configuramos nosso deployment que irá garantir que uma replicaset seja executada em paralelo mantendo a replica atual rodando até a conclusão da atualização, permitindo assim a alta disponibilidade do serviço.
O CI/CD faz parte do processo de pipeline utilizado pelas equipes de desenvolvimento para automatizar a construção e execução dos testes de forma rápida e eficiente, permitindo agilizar a entrega de qualquer artefato em diversos ambientes de forma paralela ou sequencial.
Este processo aumenta a confiabilidade, segurança e consistência das entregas da equipe, evitando que algo deixe de ser realizado ou esquecido por acidente.
Atualmente estas práticas são fundamentais para construção de qualquer tipo de aplicação e garantem uma maior organização entre as etapas de desenvolvimento.
GitHub Actions é uma plataforma de integração contínua e entrega contínua (CI/CD) que permite automatizar a sua compilação, testar e pipeline de implantação.
É possível criar fluxos de trabalho completamente personalizado que criam e testam cada pull request no seu repositório, ou implantar pull requests mesclados em produção.
Os principais elementos utilizados no GitHub Actions são: Workflow, Events, Jobs, Steps, Actions e Runners.