elasticity-controller-docker

Controlador de elasticidade para o TCC do 4 ano de Ciência da Computação na Unioeste

https://github.com/marcoodamo/elasticity-controller-docker

Science Score: 44.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (3.5%) to scientific vocabulary
Last synced: 10 months ago · JSON representation ·

Repository

Controlador de elasticidade para o TCC do 4 ano de Ciência da Computação na Unioeste

Basic Info
  • Host: GitHub
  • Owner: marcoodamo
  • License: unlicense
  • Language: Go
  • Default Branch: main
  • Size: 496 KB
Statistics
  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • Open Issues: 0
  • Releases: 0
Created over 1 year ago · Last pushed over 1 year ago
Metadata Files
Readme License Citation

README.md

Controlador de Elasticidade de Contêineres Docker 🐳

Objetivo

Esse projeto teve como objetivo o desenvolvimento de um controlador de elasticidade vertical reativo para o Container Runtime Docker.

Funcionamento

  • O controlador monitora os recursos em utilização utilizando o cAdvisor que é uma ferramenta desenvolvida pelo Google especificamente para coletar, processar e expor métricas relacionadas ao desempenho de contêineres,
  • A partir das métricas expostas pelo cAdvisor (que podem ser analisadas em localhost:8080/metrics) o Pormetheus utiliza seu Service Discovery para scrapear tais métricas,
  • Com as métricas armazenadas no TSDB (Time-series Database) do Prometheus, tanto o main.go quanto o Grafana consultam as métricas utilizando as queries do PromQL (que é a linguagem de Query do Prometheus),
  • Essas métricas coletadas então são utilizadas para fazer a análise de utilização de CPU e memória do container, para que o controlador decida se será ou não necessário a alocação ou liberação de recursos.
    • O Grafana é utilizado para facilitar a criação de visualizações dinâmicas sobre a saúde do sistema.

Arquitetura do Projeto

Instalação

Os pré-requisitos são o Docker, Docker Compose e Golang. Clone o repositório logo em seguida:

``` sudo apt update && sudo apt install docker.io

wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose

git clone https://github.com/marcoodamo/elasticity-controller-Docker.git ```

Inicialize o módulo Go e compile o controlador: go mod init elasticity-controller go mod tidy

Como utilizar?

Com o intuito de deixar tudo o mais automatizado possível, o projeto foi desenvolvido para que o deploy do ambiente seja feito em contêineres utilizando o docker-compose. Para fazer o deploy dos serviços, é necessário executar o comando:

docker-compose up

As integrações necessárias para o funcionamento básico já estão configuradas nos manifestos do compose e prometheus. É importante ressaltar que, caso o container_name seja modificado, é necessário fazer a alteração no código main.go, já que a relação de endpoint é feita através dessa variável. Você pode achar estranho no meu código o container_name ser nginx-monitored porém na verdade é um container com Python e alguns códigos, isso se dá pelo fato de que um site está em desenvolvimento para melhorar a realização dos testes de estresse! Porém, caso deseje utilizar sua própria imagem de benchmark, apenas modifique a imagem do container.

Após ter feito o deploy dos serviços, você pode rodar o controlador de elasticidade que ele irá começar a fazer a análise de utilização de recursos:

go run main.go

Você pode realizar os teste acessando o container e rodando os comandos desejados, lembrando que todos são em python (dê um "ls" para ver as opções): docker exec -it nginx-monitored bash

Observabilidade

Para validar as métricas de consumo de recursos em tmepo real, você tem três opções: 1. Acessar o cAdvisor em localhost:8080/docker e selecionar o container que deseja, 2. Acessar o Prometheus em localhost:9090/query, selecionar "Graph" e inserir a query que deseja, 3. Ou, a que eu aconselho, acessar o Grafana em localhost:3000, configure o Data Source como o Prometheus (colocando a URL http://prometheus:9090). Depois vá em Dashboards > New Dashboard > Add visualization e crie suas visualizações. Recomendo utilizar as seguintes queries:

3.1. Memória (para ajustar a visualizaçào, no meu lateral esquerdo, vá em Standard options > Unit > Data > bytes(IEC)), ajsute também as informações de Query options para reduzir o tempo que o gráfico deve considerar (Relative time), aconselho Min interval e Time shift sendo 1s. Adicione duas queries na mesma visualização:

container_memory_usage_bytes{name="nginx-monitored"} container_spec_memory_limit_bytes{name="nginx-monitored"}

3.2 CPU, ajsute também as informações de Query options para reduzir o tempo que o gráfico deve considerar (Relative time), aconselho Min interval e Time shift sendo 1s. Adicione duas queries na mesma visualização:

irate(container_cpu_usage_seconds_total{name="nginx-monitored"}[15s]) container_spec_cpu_quota{name="nginx-monitored"} / 100000

A primeira query (linha verde) significa o recurso demandado em tempo real, enquanto a segunda (linha amarela) representa a quantidade de recursos alocados no container.

E pronto! Agora você consegue analisar a elasticidade nos conteineres Docker. Abaixo mostro o comportamento do controlador em casos de picos periódicos que ultrapassariam a memória limite do container (e o OOM Killer iria encerrar o processo)!

Comparação com e sem controlador

Você consegue citar esse repositório apenas clicando em "Cite this repository" abaixo da Licença no menu lateral direito 🥳

Tecnologias

Docker Prometheus Grafana Golang Cloud Computing cAdvisor

Typing SVG

LinkedIn Mail

Owner

  • Login: marcoodamo
  • Kind: user

Citation (CITATION.cff)

# This CITATION.cff file was generated with cffinit.
# Visit https://bit.ly/cffinit to generate yours today!

cff-version: 1.2.0
title: Controlador de Elasticidade
message: >-
  If you use this software, please cite it using the
  metadata from this file.
type: software
authors:
  - given-names: Marco Antonio
    family-names: Damo
    email: marco_damo@hotmail.com
    affiliation: Student
    orcid: 'https://orcid.org/0000-0002-1629-9532'
repository-code: 'https://github.com/marcoodamo/elasticity-controller.git'
abstract: >-
  O projeto é relacionado à um controlador de elasticidade
  para contêineres Docker, utilizando a linguagem de
  programação Go e as ferramentas Prometheus e Grafana
keywords:
  - Docker
  - Go
  - Prometheus
  - Grafana
license: Unlicense

GitHub Events

Total
  • Push event: 24
Last Year
  • Push event: 24