- Linux
- Terminal
- VSCode
- Docker
- Git
- ASDF
- kubectl
- kubectx
- k3d
Para este desafio utilizaremos o k3d para criação de nosso cluster kubernetes e o kubectl para criação de pods, replicasets, services e deployments.
Primiero vamos instalar o asdf para podermos controlar todas as versões de pacotes instalados em nossa distribuição linux, permitindo a coexistência de mais de uma versão da mesma ferramenta em nosso sistema operacional.
Abra o terminal na pasta raiz do seu usuário e clone o repositório do asdf
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.9.0
Abra e edite o arquivo .bashrc
com permissão de administrador utilizando o editor nano
sudo nano ~/.bashrc
Adicione a instrução abaixo na última linha do arquivo, salve e feche
. $HOME/.asdf/asdf.sh
Execute o comando abaixo para validar a instalação do asdf
asdf info
Caso não funcione, reinicie seu terminal e tente novamente.
Após a instalação do asdf, abra o terminal e execute a lista de comandos abaixo:
k3d:
asdf plugin-add k3d && asdf install k3d latest
kubectl/kubectx:
asdf plugin-add kubectl && asdf install kubectl latest && asdf plugin-add kubectx && asdf install kubectx latest
Agora para saber se k3d e o kubectl foram instalados corretamente pelo asdf
, execute os comandos abaixo para identificar a versão instalada e defini-la como global
para poder ser utilizada a partir de qualquer projeto.
# Lista todas ferramentas instaladas pelo asdf
asdf list
Identifique a versão de cada ferramenta instalada e defina ela como global em seu sistema operacional conforme demosntrado abaixo:
# Define cada versão a ser utilizada como global
asdf global k3d 5.4.1
asdf global kubectl 1.23.5
asdf global kubectx 0.9.4
Veja o resultado executando o comando que demosntra as versões instaladas e definidas pelo asdf
em seu sistema operacional.
# Lista qual a versão definida para cada ferramenta
asdf current
Estes comandos combinados irão realizar a adição do plugin k3d/kubectl ao controlador asdf, intalação no sistema operacional e definição do escopo de utilização da versão instalada como Global
OPCIONAL: Instale o fzf (command-line fuzzy finder)
O
fzf
é um filtro interativo do Unix para linha de comando que pode ser usado com qualquer lista; arquivos, histórico de comandos, processos, nomes de host, favoritos e etc.
Para instalar este recurso em seu sistema operacional linux, execute os passos descritos abaixo:
# Instala e configura o bash para utizar o zfz
sudo apt-get install fzf
# Reinicia o bash para aplicar a instalação
source ~/.bashrc
Quando temos mais de um ambiente configurado com o cluster kubernetes sentimos a necessidade de alternar entre eles a partir do terminal, e para realizar esta operção utilizamos o kubectx
.
Veja como utiliza-lo abaixo:
# Lista todos os contextos
kubectx
# Troca para o contexto definido
kubectx <context-name>
# Exibe todos os objetos do contexto definido
kubectl get all
Verifique o status do docker para saber se ele já está rodando na máquina.
sudo service docker status
Caso não esteja rodando, inicie o docker conforme abaixo:
sudo service docker start
Abra o terminal de comandos e execute o comando abaixo:
docker run -d -p 8080:8080 --name=conversao-temperatura rlghisleni/conversao-temperatura:latest
Liste os containers em execução e verifique se rlghisleni/conversao-temperatura consta na relação.
docker container ls
Abra o navegador de sua preferência na url http://localhost:8080/ e o projeto será apresentado.
Abra o terminal e clone este repositório público utilizando o git
git clone https://github.com/RLGHISLENI/conversao-temperatura.git
Navegue até a pasta fonte do projeto
cd conversao-temperatura/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.
Realize 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/conversao-temperatura:v[n] .
Atualize a versão :latest da imagem
docker tag rlghisleni/conversao-temperatura:v[n] rlghisleni/conversao-temperatura:latest
Liste as imagens para visualizar a nova versão da imagem criada
docker images
Realize o login na conta do DockerHub, informando o usuário e senha para se autenticar na plataforma.
docker login
Envie a nova versão da imagem alterada para o Service Registry
docker push rlghisleni/conversao-temperatura:v[n]
Envie também a imagem latest atualizada
docker push rlghisleni/conversao-temperatura:latest
Utilizando k3d crie um cluster kubernetes conforme o código abaixo:
k3d cluster create meucluster --agents 1 --servers 1 -p "8080:30000@loadbalancer"
Navegue até a pasta k8s
do projeto e usando o kubectl
execute o manifesto de deployment
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.
Um dos objetivos é facilitar o desenvolvimento, acelerar a implantação e a execução de aplicações em ambientes isolados.
Com o uso de containers podemos ter portabilidade, agilidade, escalabilidade, controle e isolamento em todo o fluxo entre o Desenvolvimento e Operações.
A utilização de containers torna possível redução de custos e permite que tenhamos o mesmo ambiente de produção rodando em nossa máquina de desenvolvimento, além de permitir que tenhamos diversos ambientes de programação diferentes na mesma máquina sem conflito entre eles.
Com os containers temos uma redução no uso de VMs e consequentemente uma redução no uso de memória, pois uma aplicação rodando em container será bem mais leve que uma aplicação rodando em uma VM completa, visto que o container não depende de um sistema operacional completo mas sim do mínimo necessário para executar a aplicação.
Outra vantagem é a possibilidade guardar uma imagem completa do ambiente e disponibilizar através de um Service Restry para toda equipe, além de ser possível gerar uma imagem do ambiente com a aplicação configurada e pronta para ser executada.
O uso de containers facilita muito a adoção de processos de automação via deploy (CI/CD).
Os containers são bem mais leves que as VMs que são máquinas completas e podem ser personalizados com o mínimo necessário para sua execução, possibilitando assim um melhor escalonamento e diminuindo custos desnecessários com infraestrutura.
O tempo de inicialização de um container é bem mais rápido que o de uma VM e isso pode fazer toda diferença na execução da aplicação em produção, principalmente falando em utilização de micro serviços.
Preferir o padrão de nomenclatura utilizando namespace na criação de imagens, adicionar a versão no nome e criar sempre uma imagem latest para manter a última versão atualizada.
Sempre utilizar imagens oficiais como base para nossas imagens. Sempre especificar a versão na tag da imagem para evitar problemas de atualização.
Não utilizar mais de um processo para cada imagem docker, a menos que seja necessário.
Utilizar as camadas na construção do arquivo Dockerfile para evitar processamento desnecessário.
Sempre utilizar o arquivo .dockerignore para não considerar arquivos ou pastas na construção da imagem.
Utilizar sempre o COPY ao invés do ADD, a menos que seja necessário.
Atenção ao utilizar os comandos ENTRYPOINT e CMD, caso necessário poderão ser utilizados os dois em conjunto.
Utilizar imagens multistage build para linguagens de programação compiladas e/ou JIT reduzindo o tamanho final da imagem.
Sempre armazenar as imagens e suas versões em um Service Registry.