# Container scaling da esteira Java V4 ## Overview No intuito de evitar má utilização dos containers, sobretudo no tocante ao consumo de memória das VM's pelas nossas aplicações, foi decidido que as esteiras de publicação receberão uma feature onde são definidas a RAM e a CPU em tempo de build. Para tanto, criamos um arquivo JSON que guarda em um único lugar as configurações das apps para o dimensionamento de seus containers, como se segue: `$HOME/jenkins/arquitetura/publicacao/java_apps.json` ```json [ { "id": "1", "name": "regnet", "jvm-xms": "200M", "cpu": "0.4", "reservations-cpu": "0.2" }, { "id": "2", "name": "sisesg", "jvm-xms": "340M", "cpu": "0.5", "reservations-cpu": "0.3" }, { "id": "3", "name": "silacen", "jvm-xms": "150M", "cpu": "0.6", "reservations-cpu": "0.3" }, { "id": "4", "name": "sigosv4", "jvm-xms": "150M", "cpu": "0.6", "reservations-cpu": "0.3" }, { "id": "5", "name": "cns-api", "jvm-xms": "130M", "cpu": "0.4", "reservations-cpu": "0.2" }, { "id": "6", "name": "form-cirugias-eletivas", "jvm-xms": "120M", "cpu": "0.75", "reservations-cpu": "0.25" } ] ``` A esteira - o script `build.sh` em conjunto com as suas funcionalidades, `util.js` - basicamente identifica o nó do projeto pelo seu job, pega as suas propriedades e calcula o que for necessário para as dimensões do container que irá "subir" em seguida, no tocante à memória e CPU. Ex: Para o projeto `sisesg`, a propriedade `cpu` tem o valor `0.5`. Para definir a RAM do container, a esteira considera as propriedades do Job e, caso não existam, ela busca do JSON a informação da memória da JVM da aplicação, adicionando um valor excedente para o pleno funcionamento do S.O. do container. Nesse cálculo, as funcionalidades usam o valor `jvm-xms` (Memória Java Heap Mínima) para calcular o tamanho da RAM final do container. A gente informa nesse JSON o valor mínimo de consumo habitual de cada aplicação (aqui é heurística). > Propriedades RAM: `LIMITS_MEMORY` e `RESERVATIONS_MEMORY` Para definir a CPU do container, a esteira considera, da mesma forma anterior, as propriedades do Job. Entretando, caso não existam, a informação da CPU consultada no JSON. Aqui na CPU, nada é calculado. > Propriedades CPU: `LIMITS_CPU` e `RESERVATIONS_CPU` As propriedades são registradas no arquivo `.env`, cujo `docker-compose.yml` reconhece e seta no momento da inicialização do container. > Obs: Num primeiro momento será utilizada a esteira Java V4 como projeto piloto do _container scaling_. ## Fluxograma 1. Verifica se o arquivo JSON existe e se é válido (parse). > Função utilizada: `get_json_content()` 2. Verifica se o job já possui as propriedades RAM do container e, caso positivo, não realiza os cálculos, saltando essa parte. 3. Não havendo propriedades RAM no job, a esteira precisará calcular seus valores para o container. Então lê o JSON, identifica o valor da `jvm-xms` da app e calcula os valores das novas propriedades (`LIMITS_MEMORY` e `RESERVATIONS_MEMORY`). > Funções utilizadas para o cálculo da RAM: `get_container_limits_mem()` e `get_container_reservation_mem()` 4. Registra as propriedades RAM no arquivo `.env`. ```sh # Exclui propriedades antigas do arquivo, se houver egrep -v '(LIMITS_MEMORY|RESERVATIONS_MEMORY)' ${WORKSPACE_EXTRA}/.env > ${WORKSPACE_EXTRA}/.env.new mv ${WORKSPACE_EXTRA}/.env.new ${WORKSPACE_EXTRA}/.env # Registra as novas propriedades RAM no arquivo echo -e "LIMITS_MEMORY=${LIMITS_MEMORY}\nRESERVATIONS_MEMORY=${RESERVATIONS_MEMORY}" >> ${WORKSPACE_EXTRA}/.env ``` 5. Verifica se o job já possui as propriedades CPU do container e, caso positivo, não busca do JSON, saltando essa parte. 6. Não havendo propriedades CPU no job, a esteira precisará buscar seus valores globais. Então lê o JSON, identifica os valores (`cpu` e `reservations-cpu`) da app, setando as novas propriedades (`LIMITS_CPU` e `RESERVATIONS_CPU`). > Funções utilizadas para manipular a CPU: `get_limits_cpu()` e `get_reservations_cpu` 7. Registra as propriedades CPU no arquivo `.env`. ```sh # Exclui propriedades antigas do arquivo, se houver egrep -v '(LIMITS_CPU|RESERVATIONS_CPU)' ${WORKSPACE_EXTRA}/.env > ${WORKSPACE_EXTRA}/.env.new mv ${WORKSPACE_EXTRA}/.env.new ${WORKSPACE_EXTRA}/.env # Registra as novas propriedades CPU no arquivo echo -e "LIMITS_CPU=${LIMITS_CPU}\nRESERVATIONS_CPU=${RESERVATIONS_CPU}" >> ${WORKSPACE_EXTRA}/.env ``` 8. Não havendo nenhum erro, a esteira segue o seu fluxo.