Sign inSign up

rafilkmp3/docker-nodejs-challenge-delta

By rafilkmp3

•Updated over 6 years ago

Image
0

437

rafilkmp3/docker-nodejs-challenge-delta repository overview

⁠HU Desafio Delta - Rafael Bernardo 05/2020

Prezados,

Segue meu desafio concluido.

⁠Estrutura de Pastas e Arquivos:

.
├── Makefile
├── README.md
├── ca.jpg
├── k8s
│   ├── ingress
│   │   └── ingress-nginx.yaml
│   ├── metrics-server
│   │   └── metrics-server.yaml
│   ├── mysql
│   │   ├── mysql-claim0-persistentvolumeclaim.yaml
│   │   ├── mysql-deployment.yaml
│   │   ├── mysql-init-db.yaml
│   │   └── mysql-service.yaml
│   ├── nginx
│   │   ├── nginx-deployment.yaml
│   │   ├── nginx-hpa.yaml
│   │   └── nginx-service.yaml
│   └── nodejs
│       ├── nodejs-deployment.yaml
│       ├── nodejs-hpa.yaml
│       └── nodejs-service.yaml
├── kops.env
├── pull-request.txt
└── src
    ├── db
    │   └── schema
    │       └── database_schema.sql
    ├── docker-compose.yaml
    ├── nginx
    │   ├── Dockerfile
    │   ├── conf
    │   │   └── default.conf
    │   └── html
    │       ├── 50x.html
    │       └── index.html
    └── node
        ├── Dockerfile
        ├── healthcheck.js
        ├── node_modules
        ├── package-lock.json
        ├── package.json
        └── server.js

⁠Pre-Requisitos:

⁠Ambiente com docker-compose:

⁠Iniciar o Ambiente: o ambiente será criado e o banco será populado.

make docker-compose-start

⁠Acessando o Ambiente:.

curl http://localhost/packages

⁠Logs:
⁠Os logs estão disponíveis de todos os containers podem ser vistos com.

docker-compose -f src/docker-compose.yaml logs -f

⁠Ou individualmente com $nomedocontainer.
  • ex:
docker-compose -f src/docker-compose.yaml logs -f mysql
docker-compose -f src/docker-compose.yaml logs -f nodejs
docker-compose -f src/docker-compose.yaml logs -f nginx
⁠Cleanup
⁠Encerrar o Ambiente : o ambiente será encerrado, os dados do banco permanecerão.

make docker-compose-stop

⁠Destruir o Ambiente:o ambiente será encerrado e os dados do banco serão excluídos.

make docker-compose-destroy

⁠Ambiente com k8s rodando no minikube:

⁠Setup
minikube addons enable ingress # caso não esteja habilitado
make kube-deploy-app

⁠Ambiente com k8s sendo provisionado na AWS e app sendo provisionada dentro do cluster

⁠Arquitetura

Arquitetura

⁠Garanta que voce possui o aws-cli configurado e com as devidas credenciais.⁠
⁠Defina o nome do bucket para ser usado pelo kops e caso não exista crie o mesmo
  • ex:
export KOPS_STATE_STORE=s3://<CHALLENGE-DELTA-BUCKET-KOPS-STATE>
aws s3 mb $KOPS_STATE_STORE --region us-east-1
⁠Faça o seu provisionamento do seu cluster
⁠Para customizar os recursos do cluster deve se editar kops.env e depois para provisionar o cluster e fazer o deploy da app:
make kube-aws-provision
make kube-deploy-app
⁠Acessando sua app rodando no cluster:
  • ex:
APP_ENDPOINT=$(kubectl get ingress nginx-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
curl http://$APP_ENDPOINT/packages
⁠Logs:
⁠Individualmente com $nomedoservico.

kubectl logs deployments/$nomedoservico

  • ex:
kubectl logs deployments/mysql
kubectl logs deployments/nodejs
kubectl logs deployments/nginx
⁠Habilitando o pod autoscaler

Para se habilitar funcionalidade do k8s escalar os pods baseados metricas primeiro temos que coletar as metricas e por isso temos que instalar o metrics-server⁠.

Porém o nosso cluster criado com o kops não nos permite criar o cluster através da linha de comando ja com a seguinte configuração habilitada. por isso temos alguns passos que eu consegui uma forma pratica de automatizar.

⁠Prerequisites

you must allow service account tokens to communicate with kubelet, edit your cluster configuration

kops edit cluster

Add configuration below to your cluster configuration.

kubelet:
    anonymousAuth: false
    authorizationMode: Webhook
    authenticationTokenWebhook: true

Update your cluster

kops update cluster --yes
kops rolling-update cluster --yes
⁠Deployment do metrics-server
kubectl apply -f k8s/metrics-server
  • Após alguns minutos que o metrics-server estiver subido corretamente e algumas metricas tiverem sido coletadas. voce tera disponivel os seguintes comandos muito uteis para debug alem de permitir que os serviços escalem baseados por exemplo na carga. Mais Exemplos⁠
kubectl top pods
kubectl top nodes
  • Para checar o estado do HPA⁠ voce pode usar:
kubectl get hpa
kubectl describe hpa
# Ou por ex de um serviço especifico
kubectl get hpa nodejs
kubectl describe hpa nodejs

⁠Cleanup

  • ex:
make kube-aws-destroy

⁠Dados de Acesso ao banco:

Banco: packages Usuário Root: root Senha Root: hurb_root Usuário da Aplicação: user_packages Senha da aplicação: passwords Acesso:

#Ambiente com docker-compose
docker-compose -f src/docker-compose.yaml exec mysql mysql -h localhost -u root -phurb_root packages
#Ambiente com k8s
kubectl exec -it service/mysql -- mysql -h localhost -u root -phurb_root packages

⁠Considerações Finais:

As imagens docker criadas nesse projeto são buildadas pelo docker hub automaticamente no caso de um commit

https://hub.docker.com/r/rafilkmp3/docker-nodejs-challenge-delta
https://hub.docker.com/r/rafilkmp3/docker-nginx-challenge-delta

Realizei algumas mudanças na estrutura de pastas para melhor e organizar a aplicação, alem de incluir alguns endpoints para app ser monitorada pela api do k8s.

Achei bem interessante o desafio.

Obrigado pela oportunidade.

https://kubernetes.github.io/ingress-nginx/deploy/⁠

https://kubernetes.io/docs/setup/production-environment/tools/kops/⁠

https://kubernetes.io/docs/reference/kubectl/⁠

https://kubernetes.io/docs/setup/learning-environment/minikube/⁠

https://www.digitalocean.com/community/tutorials/how-to-migrate-a-docker-compose-workflow-to-kubernetes⁠

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/⁠

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/⁠

Tag summary

Content type

Image

Digest

Size

38.4 MB

Last updated

over 6 years ago

docker pull rafilkmp3/docker-nodejs-challenge-delta