{"id":35006,"date":"2019-10-31T22:01:47","date_gmt":"2019-10-31T19:01:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\/"},"modified":"2019-10-31T22:01:47","modified_gmt":"2019-10-31T19:01:47","slug":"5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","title":{"rendered":"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aplicativos \"nativos da nuvem\" ou simplesmente \"em nuvem\" s\u00e3o criados especificamente para operar em infraestruturas de nuvem. Geralmente, s\u00e3o constru\u00eddos como um conjunto de microservi\u00e7os fracamente acoplados, empacotados em cont\u00eaineres, que, por sua vez, s\u00e3o gerenciados por uma plataforma de nuvem. Esses aplicativos est\u00e3o prontos para falhas por padr\u00e3o, o que significa que funcionam de forma confi\u00e1vel e escal\u00e1vel, mesmo diante de falhas graves na infraestrutura. A contrapartida s\u00e3o os conjuntos de restri\u00e7\u00f5es (contratos) que a plataforma de nuvem imp\u00f5e aos aplicativos em cont\u00eainer para poder gerenci\u00e1-los de forma automatizada.<\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/1f4af6f356ed36d3fbd8adef333501fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nReconhecendo plenamente a necessidade e a import\u00e2ncia da transi\u00e7\u00e3o para aplicativos em nuvem, muitas organiza\u00e7\u00f5es ainda n\u00e3o sabem por onde come\u00e7ar. Neste post, vamos explorar uma s\u00e9rie de princ\u00edpios, cuja observ\u00e2ncia na cria\u00e7\u00e3o de aplicativos em cont\u00eainer permitir\u00e1 aproveitar o potencial das plataformas de nuvem e garantir o funcionamento e a escalabilidade confi\u00e1veis dos aplicativos, mesmo em caso de falhas graves na infraestrutura de TI. O objetivo final desses princ\u00edpios \u00e9 aprender a criar aplicativos que possam ser gerenciados automaticamente por plataformas de nuvem, como o Kubernetes.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Princ\u00edpios de design de software<\/h3>\n<p>\nNo mundo da programa\u00e7\u00e3o, princ\u00edpios referem-se a regras bastante gerais que devem ser seguidas no desenvolvimento de software. Eles podem ser aplicados ao trabalho com qualquer linguagem de programa\u00e7\u00e3o. Cada princ\u00edpio possui seus objetivos, cujos instrumentos de alcance geralmente s\u00e3o padr\u00f5es e pr\u00e1ticas. Al\u00e9m disso, existe uma s\u00e9rie de princ\u00edpios fundamentais para a cria\u00e7\u00e3o de software de qualidade, dos quais decorrem todos os outros. Vamos citar alguns exemplos de princ\u00edpios fundamentais:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)\">KISS<\/a><\/noindex> (Keep it simple, stupid) \u2013 n\u00e3o complicar;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Don%E2%80%99t_repeat_yourself\">DRY<\/a><\/noindex> (Don\u2019t repeat yourself) \u2013 n\u00e3o se repetir;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/YAGNI\">YAGNI<\/a><\/noindex> (You aren\u2019t gonna need it) \u2013 n\u00e3o criar o que n\u00e3o \u00e9 imediatamente necess\u00e1rio;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\">SoC<\/a><\/noindex> (Separation of concerns) \u2013 separar responsabilidades.<\/li>\n<\/ul>\n<p>\nComo se pode ver, esses princ\u00edpios n\u00e3o imp\u00f5em regras espec\u00edficas, mas pertencem \u00e0 categoria de considera\u00e7\u00f5es de bom senso baseadas na experi\u00eancia pr\u00e1tica, que muitos desenvolvedores compartilham e frequentemente referenciam.<br \/>\nAl\u00e9m disso, existe <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\">SOLID<\/a><\/noindex> \u2013 um conjunto dos primeiros cinco princ\u00edpios de programa\u00e7\u00e3o e design orientados a objetos formulados por Robert Martin. O SOLID abrange princ\u00edpios complementares que s\u00e3o generalizados e abertos \u00e0 interpreta\u00e7\u00e3o, os quais, quando aplicados em conjunto, ajudam a criar sistemas de software de maior qualidade e a mant\u00ea-los de forma mais eficiente a longo prazo.<\/p>\n<p>Os princ\u00edpios SOLID pertencem \u00e0 esfera da programa\u00e7\u00e3o orientada a objetos e s\u00e3o formulados na linguagem de conceitos e terminologias como classes, interfaces e heran\u00e7a. Analogamente, para aplica\u00e7\u00f5es em nuvem, tamb\u00e9m \u00e9 poss\u00edvel formular princ\u00edpios de desenvolvimento, sendo que o elemento b\u00e1sico aqui n\u00e3o \u00e9 uma classe, mas um cont\u00eainer. Seguindo esses princ\u00edpios, \u00e9 poss\u00edvel criar aplica\u00e7\u00f5es em cont\u00eainer que atendem melhor aos objetivos e metas de plataformas em nuvem como o Kubernetes.<\/p>\n<h3>Cont\u00eaineres orientados a nuvem: abordagem da Red Hat<\/h3>\n<p>\nHoje em dia, \u00e9 relativamente f\u00e1cil empacotar praticamente qualquer aplica\u00e7\u00e3o em cont\u00eaineres. No entanto, para que as aplica\u00e7\u00f5es sejam efetivamente automatizadas e orquestradas em uma plataforma em nuvem como o Kubernetes, s\u00e3o necess\u00e1rias esfor\u00e7os adicionais.<br \/>\nA base das ideias apresentadas a seguir \u00e9 a metodologia <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\">The Twelve-Factor App<\/a><\/noindex> e muitos outros trabalhos sobre diversos aspectos da cria\u00e7\u00e3o de aplica\u00e7\u00f5es web, desde o gerenciamento de c\u00f3digo fonte at\u00e9 modelos de escalabilidade. Os princ\u00edpios descritos referem-se exclusivamente ao desenvolvimento de aplica\u00e7\u00f5es em cont\u00eainer que s\u00e3o constru\u00eddas com base em microservi\u00e7os e destinadas a plataformas em nuvem, como o Kubernetes. O elemento b\u00e1sico em nossas discuss\u00f5es \u00e9 a imagem do cont\u00eainer, e por ambiente de execu\u00e7\u00e3o dos cont\u00eaineres entendemos a plataforma de orquestra\u00e7\u00e3o de cont\u00eaineres. O objetivo dos princ\u00edpios propostos \u00e9 criar cont\u00eaineres para os quais, na maioria das plataformas de orquestra\u00e7\u00e3o, seja poss\u00edvel automatizar tarefas de agendamento (scheduling \u2013 escolha do host para executar uma inst\u00e2ncia do cont\u00eainer), escalonamento e monitoramento. Os princ\u00edpios s\u00e3o apresentados em ordem arbitr\u00e1ria.<\/p>\n<h3>Princ\u00edpio da \u00fanica responsabilidade (Single Concern Principle, SCP)<\/h3>\n<p>\nEsse princ\u00edpio \u00e9 em muitos aspectos semelhante ao princ\u00edpio da \u00fanica responsabilidade (Single Responsibility Principle, <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\">SRP<\/a><\/noindex>), que faz parte do conjunto SOLID e afirma que cada objeto deve ter uma \u00fanica responsabilidade, e essa responsabilidade deve estar completamente encapsulada na classe. A ess\u00eancia do SRP \u00e9 que cada responsabilidade \u00e9 uma raz\u00e3o para mudan\u00e7as, e a classe deve ter uma e somente uma raz\u00e3o para ser alterada.<\/p>\n<p>No SCP, em vez da palavra \u201cresponsabilidade\u201d (responsibility), usamos a palavra \u201ctarefa\u201d (concern) para indicar um n\u00edvel mais alto de abstra\u00e7\u00e3o e um prop\u00f3sito mais amplo do cont\u00eainer em compara\u00e7\u00e3o com uma classe OOP. E se o objetivo do SRP \u00e9 ter apenas uma raz\u00e3o para mudan\u00e7as, o SCP tem como objetivo expandir as possibilidades de reutiliza\u00e7\u00e3o e substitui\u00e7\u00e3o de cont\u00eaineres. Ao seguir o SRP e criar um cont\u00eainer que resolve uma \u00fanica tarefa e faz isso de maneira funcional e completa, voc\u00ea aumenta as chances de reutilizar a imagem desse cont\u00eainer em diferentes contextos de aplica\u00e7\u00e3o.<\/p>\n<p>O princ\u00edpio SCP afirma que cada cont\u00eainer deve resolver uma \u00fanica tarefa e faz\u00ea-lo bem. Al\u00e9m disso, o SCP no mundo dos cont\u00eaineres \u00e9 alcan\u00e7ado mais facilmente do que o SRP no mundo OOP, j\u00e1 que os cont\u00eaineres geralmente executam um \u00fanico processo, e na maior parte do tempo esse processo resolve uma \u00fanica tarefa.<\/p>\n<p>Se algum microsservi\u00e7o cont\u00eainer deve resolver v\u00e1rias tarefas, ele pode ser dividido em cont\u00eaineres de uma \u00fanica tarefa e agrupados dentro de um \u00fanico pod (unidade de implanta\u00e7\u00e3o da plataforma de cont\u00eainer) usando padr\u00f5es sidecar e init-containers. Al\u00e9m disso, o SCP facilita a substitui\u00e7\u00e3o de um cont\u00eainer antigo (como um servidor web ou um broker de mensagens) por um novo que resolve a mesma tarefa, mas possui funcionalidades ampliadas ou melhor escalabilidade.<\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/a029e1ca36ace66550c94087e4aecc8e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>O princ\u00edpio de alta observabilidade (High Observability Principle, HOP)<\/h3>\n<p>\nAo usar cont\u00eaineres como uma maneira unificada de empacotar e executar aplicativos, os pr\u00f3prios aplicativos s\u00e3o vistos como uma \"caixa preta\". No entanto, se forem cont\u00eaineres em nuvem, eles devem fornecer interfaces de API especiais para o ambiente de execu\u00e7\u00e3o, a fim de controlar a integridade dos cont\u00eaineres e tomar as medidas adequadas, se necess\u00e1rio. Sem isso, n\u00e3o ser\u00e1 poss\u00edvel unificar a automa\u00e7\u00e3o da atualiza\u00e7\u00e3o dos cont\u00eaineres e a gest\u00e3o de seu ciclo de vida, o que, por sua vez, prejudicar\u00e1 a resili\u00eancia e a usabilidade do sistema de software.<\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/7df1320108d9b635c10c6cf41d5dfef6.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nNa pr\u00e1tica, um aplicativo em cont\u00eainer deve, no m\u00ednimo, ter uma API para diferentes tipos de verifica\u00e7\u00f5es de integridade: testes de atividade (liveness) e testes de prontid\u00e3o (readiness). Se o aplicativo reivindica mais, ent\u00e3o deve fornecer outros meios de controle de seu estado. Por exemplo, registrar eventos importantes atrav\u00e9s do STDERR e STDOUT para agregar logs usando Fluentd, Logstash e outras ferramentas semelhantes. Al\u00e9m disso, deve haver integra\u00e7\u00e3o com bibliotecas de rastreamento e coleta de m\u00e9tricas, como OpenTracing, Prometheus e afins.<\/p>\n<p>Em geral, o aplicativo ainda pode ser visto como uma \"caixa preta\", mas deve ser equipado com todas as APIs necess\u00e1rias para que a plataforma possa monitor\u00e1-lo e gerenci\u00e1-lo da melhor maneira poss\u00edvel.<\/p>\n<h3>Princ\u00edpio de Conformidade ao Ciclo de Vida (Life-cycle Conformance Principle, LCP)<\/h3>\n<p>\nO LCP \u00e9 uma ant\u00edtese do HOP. Enquanto o HOP afirma que o cont\u00eainer deve fornecer interfaces de API para leitura para a plataforma, o LCP exige que o aplicativo possua a capacidade de receber informa\u00e7\u00f5es da plataforma. Al\u00e9m disso, o cont\u00eainer n\u00e3o deve apenas receber eventos, mas tamb\u00e9m se adaptar, ou seja, reagir a eles. Da\u00ed o nome do princ\u00edpio, que pode ser visto como uma exig\u00eancia de fornecer interfaces de API para grava\u00e7\u00e3o \u00e0 plataforma.<\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/f32f5d133597ae3905206badc6677f92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs plataformas t\u00eam diferentes tipos de eventos que ajudam a gerenciar o ciclo de vida do cont\u00eainer. No entanto, cabe ao pr\u00f3prio aplicativo decidir quais deles perceber e como reagir.<\/p>\n<p>\u00c9 claro que alguns eventos s\u00e3o mais importantes que outros. Por exemplo, se um aplicativo lida mal com uma falha inesperada, ele deve aceitar mensagens signal: terminate (SIGTERM) e iniciar seu processo de encerramento o mais r\u00e1pido poss\u00edvel, a fim de concluir antes de receber o signal: kill (SIGKILL), que ocorre ap\u00f3s o SIGTERM.<\/p>\n<p>Al\u00e9m disso, eventos como PostStart e PreStop podem ser importantes para o ciclo de vida do aplicativo. Por exemplo, ap\u00f3s a inicializa\u00e7\u00e3o, pode ser necess\u00e1rio um certo tempo de \"aquecimento\" antes que ele possa responder a requisi\u00e7\u00f5es. Ou o aplicativo pode ter que liberar recursos de uma forma espec\u00edfica ao ser encerrado.<\/p>\n<h3>Princ\u00edpio da Imutabilidade da Imagem do Cont\u00eainer (Image Immutability Principle, IIP)<\/h3>\n<p>\n\u00c9 comum que aplica\u00e7\u00f5es em cont\u00eaineres permane\u00e7am imut\u00e1veis ap\u00f3s a constru\u00e7\u00e3o, mesmo quando executadas em diferentes ambientes. Da\u00ed surge a necessidade de externar o armazenamento de dados durante a execu\u00e7\u00e3o (ou seja, usar ferramentas externas para isso), assim como confiar em configura\u00e7\u00f5es externas adaptadas para o ambiente de execu\u00e7\u00e3o espec\u00edfico, em vez de modificar ou criar cont\u00eaineres \u00fanicos para cada ambiente. Ap\u00f3s qualquer altera\u00e7\u00e3o no aplicativo, a imagem do cont\u00eainer deve ser reconstru\u00edda e implantada em todos os ambientes utilizados. A prop\u00f3sito, um princ\u00edpio semelhante \u00e9 utilizado na gest\u00e3o de sistemas de TI, conhecido como o princ\u00edpio de imutabilidade de servidores e infraestrutura. <\/p>\n<p>O objetivo do IIP \u00e9 evitar a cria\u00e7\u00e3o de imagens de cont\u00eainer separadas para diferentes ambientes de execu\u00e7\u00e3o e usar a mesma imagem com a configura\u00e7\u00e3o correspondente para o ambiente espec\u00edfico. Seguir este princ\u00edpio permite implementar pr\u00e1ticas importantes do ponto de vista da automa\u00e7\u00e3o de sistemas em nuvem, como rollback e rollout de atualiza\u00e7\u00f5es do aplicativo.<\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/86b93724830b37f82bf289b797407480.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Princ\u00edpio da Descartabilidade de Processos (Process Disposability Principle, PDP)<\/h3>\n<p>\nUma das caracter\u00edsticas mais importantes de um cont\u00eainer \u00e9 sua efemeridade: uma inst\u00e2ncia de cont\u00eainer pode ser facilmente criada e facilmente destru\u00edda, portanto, pode ser rapidamente substitu\u00edda por outra inst\u00e2ncia a qualquer momento. H\u00e1 v\u00e1rias raz\u00f5es para essa substitui\u00e7\u00e3o: falha no teste de prontid\u00e3o, escalonamento do aplicativo, migra\u00e7\u00e3o para outro host, esgotamento de recursos da plataforma ou outras situa\u00e7\u00f5es. <\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/858287b23c276363313e35cf18b81190.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nComo resultado, as aplica\u00e7\u00f5es em cont\u00eainer devem armazenar seu estado por meio de algum recurso externo, ou utilizar esquemas internos distribu\u00eddos com redund\u00e2ncia. Al\u00e9m disso, a aplica\u00e7\u00e3o deve iniciar rapidamente e encerrar suas atividades de forma \u00e1gil, assim como estar preparada para uma falha de hardware s\u00fabita e fatal.<\/p>\n<p>Uma das pr\u00e1ticas que ajudam a implementar esse princ\u00edpio \u00e9 criar cont\u00eaineres de tamanho pequeno. Ambientes em nuvem podem escolher automaticamente um host para executar uma inst\u00e2ncia do cont\u00eainer, portanto, quanto menor for o tamanho do cont\u00eainer, mais r\u00e1pido ele ser\u00e1 iniciado \u2013 ele simplesmente ser\u00e1 copiado mais r\u00e1pido para o host de destino pela rede.<\/p>\n<h3>Princ\u00edpio da autossufici\u00eancia (Self-containment Principle, S-CP)<\/h3>\n<p>\nDe acordo com esse princ\u00edpio, na fase de constru\u00e7\u00e3o, todos os componentes necess\u00e1rios s\u00e3o inclu\u00eddos no cont\u00eainer. O cont\u00eainer deve ser projetado considerando que a \u00fanica coisa na sistema \u00e9 um n\u00facleo Linux puro, portanto, todas as bibliotecas adicionais necess\u00e1rias devem ser colocadas dentro do pr\u00f3prio cont\u00eainer. Tamb\u00e9m devem estar presentes coisas como o ambiente de execu\u00e7\u00e3o para a linguagem de programa\u00e7\u00e3o correspondente, plataforma de aplicativos (se necess\u00e1rio) e outras depend\u00eancias que ser\u00e3o necess\u00e1rias durante a execu\u00e7\u00e3o da aplica\u00e7\u00e3o em cont\u00eainer. <\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/ecc7425510d63e4914c0c9a7e90b02a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Exce\u00e7\u00f5es s\u00e3o feitas apenas para configura\u00e7\u00f5es que variam de ambiente para ambiente e devem ser fornecidas em tempo de execu\u00e7\u00e3o, por exemplo, atrav\u00e9s do Kubernetes ConfigMap.<\/p>\n<p>A aplica\u00e7\u00e3o pode incluir v\u00e1rios componentes em cont\u00eaineres, como um cont\u00eainer de SGBD dentro de uma aplica\u00e7\u00e3o web em cont\u00eainer. De acordo com o princ\u00edpio S-CP, esses cont\u00eaineres n\u00e3o devem ser combinados em um s\u00f3, mas devem ser configurados de forma que o cont\u00eainer de SGBD contenha tudo o que \u00e9 necess\u00e1rio para o funcionamento do banco de dados, enquanto o cont\u00eainer da aplica\u00e7\u00e3o web cont\u00e9m tudo o que \u00e9 necess\u00e1rio para o funcionamento da aplica\u00e7\u00e3o web, incluindo o servidor web. Como resultado, durante a execu\u00e7\u00e3o, o cont\u00eainer da aplica\u00e7\u00e3o web depender\u00e1 do cont\u00eainer de SGBD e o consultar\u00e1 conforme necess\u00e1rio.<\/p>\n<h3>Princ\u00edpio da conten\u00e7\u00e3o em tempo de execu\u00e7\u00e3o (Runtime Confinement Principle, RCP)<\/h3>\n<p>\nO princ\u00edpio S-CP define como o cont\u00eainer deve ser montado e o que deve conter o arquivo bin\u00e1rio da imagem. Contudo, o cont\u00eainer n\u00e3o \u00e9 apenas uma \"caixa preta\", cuja \u00fanica caracter\u00edstica \u00e9 o tamanho do arquivo. Durante a execu\u00e7\u00e3o, o cont\u00eainer adquire outras dimens\u00f5es: a quantidade de mem\u00f3ria usada, o tempo de CPU e outros recursos do sistema.<\/p>\n<p><img decoding=\"async\" alt=\"5 princ\u00edpios do bom senso para a cria\u00e7\u00e3o de aplicativos cloud-native\" src=\"\/wp-content\/uploads\/2019\/06\/a52e6a656892e57479ac014a3e6f4316.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c9 aqui que o princ\u00edpio RCP se torna \u00fatil, segundo o qual o cont\u00eainer deve desacoplar suas exig\u00eancias de recursos do sistema e transmiti-las \u00e0 plataforma. Com os perfis de recursos de cada cont\u00eainer (quanta CPU, mem\u00f3ria, rede e sistema de disco ele precisa), a plataforma pode realizar o gerenciamento e a dimensionamento autom\u00e1tico de forma mais eficaz, gerenciando a capacidade de TI e mantendo os n\u00edveis de SLA para os cont\u00eaineres.<\/p>\n<p>Al\u00e9m de atender \u00e0s exig\u00eancias de recursos do cont\u00eainer, \u00e9 tamb\u00e9m importante que o aplicativo n\u00e3o exceda os limites definidos por ele mesmo. Caso contr\u00e1rio, em situa\u00e7\u00f5es de escassez de recursos, a plataforma \u00e9 mais propensa a inclu\u00ed-lo na lista de aplicativos a serem interrompidos ou migrados.<\/p>\n<p>Ao falar sobre a orienta\u00e7\u00e3o para nuvem, estamos nos referindo principalmente \u00e0 forma de opera\u00e7\u00e3o. <br \/>\nAcima, formulamos uma s\u00e9rie de princ\u00edpios gerais que estabelecem a base metodol\u00f3gica para a constru\u00e7\u00e3o de aplicativos de cont\u00eainer de qualidade para ambientes de nuvem.<\/p>\n<p>Vale ressaltar que al\u00e9m desses princ\u00edpios gerais, voc\u00ea tamb\u00e9m precisar\u00e1 de m\u00e9todos e t\u00e9cnicas avan\u00e7adas adicionais para trabalhar com cont\u00eaineres. Al\u00e9m disso, temos algumas recomenda\u00e7\u00f5es curtas que t\u00eam um car\u00e1ter mais espec\u00edfico e devem ser aplicadas (ou n\u00e3o) dependendo da situa\u00e7\u00e3o:<\/p>\n<ul>\n<li>Tente reduzir o tamanho das imagens: remova arquivos tempor\u00e1rios e n\u00e3o instale pacotes desnecess\u00e1rios \u2013 quanto menor for o tamanho do cont\u00eainer, mais r\u00e1pido ele ser\u00e1 montado e copiado para o host de destino pela rede.<\/li>\n<li>Baseie-se em User-IDs arbitr\u00e1rios: n\u00e3o use o comando sudo ou IDs de usu\u00e1rio especiais para iniciar seus cont\u00eaineres.<\/li>\n<li>Marque portas importantes: os n\u00fameros das portas podem ser definidos durante a execu\u00e7\u00e3o, mas \u00e9 melhor especific\u00e1-los usando o comando EXPOSE \u2013 ser\u00e1 mais f\u00e1cil para outras pessoas e programas utilizarem suas imagens. <\/li>\n<li>Armazene dados persistentes em volumes: informa\u00e7\u00f5es que devem permanecer ap\u00f3s a destrui\u00e7\u00e3o do cont\u00eainer devem ser gravadas em volumes.<\/li>\n<li>Escreva os metadados da imagem: tags, r\u00f3tulos e anota\u00e7\u00f5es facilitam o uso das imagens - outros desenvolvedores ficar\u00e3o agradecidos.<\/li>\n<li>Sincronize o host e as imagens: alguns aplicativos em cont\u00eainer exigem que o cont\u00eainer seja sincronizado com o host em certos atributos, como tempo ou identifica\u00e7\u00e3o da m\u00e1quina.<\/li>\n<li>Por fim, compartilhamos modelos e melhores pr\u00e1ticas que ajudar\u00e3o a implementar de forma mais eficaz os princ\u00edpios mencionados acima:<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/luebken\/container-patterns\">www.slideshare.net\/luebken\/container-patterns<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/userguide\/eng-image\/dockerfile_best-practices\">docs.docker.com\/engine\/userguide\/eng-image\/dockerfile_best-practices<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/docs.projectatomic.io\/container-best-practices\">docs.projectatomic.io\/container-best-practices<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openshift.com\/enterprise\/3.0\/creating_images\/guidelines.html\">docs.openshift.com\/enterprise\/3.0\/creating_images\/guidelines.html<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/system\/files\/conference\/hotcloud16\/hotcloud16_burns.pdf\">www.usenix.org\/system\/files\/conference\/hotcloud16\/hotcloud16_burns.pdf<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/leanpub.com\/k8spatterns\/\">leanpub.com\/k8spatterns<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/\">12factor.net<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?intcmp=701f20000012s47AAA&amp;PKFormID=0x5789474c4\"><b>Webinar sobre a nova vers\u00e3o da OpenShift Container Platform - 4<\/b><\/a><\/noindex><br \/>\n11 de junho \u00e0s 11h00<\/p>\n<p>O que voc\u00ea ir\u00e1 aprender:<\/p>\n<ul>\n<li>Red Hat Enterprise Linux CoreOS Imut\u00e1vel<\/li>\n<li>Malha de servi\u00e7os do OpenShift<\/li>\n<li>Framework Operator<\/li>\n<li>Framework Knative<\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/455024\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0438 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u0430\u0431\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0441\u0431\u043e\u044f\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u0435\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043c\u0435\u0434\u0430\u043b\u0438 \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26340,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-35006","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd475 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f cloud-native apps | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:01:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:01:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd475 princ\u00edpios de bom senso para criar aplicativos cloud-native | ProHoster","description":"Aplica\u00e7\u00f5es \"nativas da nuvem\" ou apenas \"baseadas em nuvem\" s\u00e3o constru\u00eddas especificamente para operar em infraestruturas de nuvem.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd475 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f cloud-native apps | ProHoster","og:description":"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.","og:url":"https:\/\/prohoster.info\/pt\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:01:47+00:00","article:modified_time":"2019-10-31T19:01:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35006","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 21:27:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:11:30","updated":"2026-01-21 21:27:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/35006","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=35006"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/35006\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/26340"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=35006"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=35006"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=35006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}