{"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\/da\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","title":{"rendered":"5 fornuftige principper til opbygning af cloud-native apps","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00abCloud native\u00bb (cloud native) eller blot \u00abcloud\u00bb applikationer er designet specielt til at fungere i cloud-infrastrukturer. De bygges typisk som et s\u00e6t af svagt sammenkoblede mikroservices, pakket ind i containere, som igen styres af en cloud-platform. S\u00e5danne applikationer er som standard fejltolerante, hvilket betyder, at de fungerer p\u00e5lideligt og skaleres selv under alvorlige infrastrukturelle fejl. Ulempen er de begr\u00e6nsninger (kontrakter), som cloud-platformen p\u00e5l\u00e6gger containerapplikationer for at kunne administrere dem automatisk.<\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/1f4af6f356ed36d3fbd8adef333501fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMens mange organisationer er fuldt bevidste om n\u00f8dvendigheden og vigtigheden af at skifte til cloud-applikationer, ved de stadig ikke, hvor de skal begynde. I dette indl\u00e6g vil vi se p\u00e5 en r\u00e6kke principper, hvis overholdelse under udviklingen af containerapplikationer vil muligg\u00f8re at frigive potentialet i cloud-platforme og opn\u00e5 p\u00e5lidelig drift og skalering af applikationer selv under alvorlige IT-infrastrukturfejl. M\u00e5let med de principper, der pr\u00e6senteres her, er at l\u00e6re at skabe applikationer, der kan administreres automatisk af cloud-platforme som Kubernetes.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Principper for softwaredesign<\/h3>\n<p>\nI programmeringsverdenen forst\u00e5s principper som ret generelle regler, der skal f\u00f8lges ved udviklingen af software. De kan anvendes uanset programmeringssprog. Hvert princip har sine m\u00e5l, som typisk opn\u00e5s gennem skabeloner og praksis. Der findes ogs\u00e5 en r\u00e6kke grundl\u00e6ggende principper for at skabe kvalitetssoftware, hvoraf alle andre principper udspringer. Her er nogle eksempler p\u00e5 grundl\u00e6ggende principper:<\/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 g\u00f8r det ikke mere kompliceret;<\/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 undg\u00e5 gentagelse;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/YAGNI\">YAGNI<\/a><\/noindex> (You aren\u2019t gonna need it) \u2013 skab ikke noget, medmindre der er et direkte behov for det;<\/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 adskil ansvar.<\/li>\n<\/ul>\n<p>\nSom man kan se, s\u00e6tter disse principper ikke nogen specifikke regler, men h\u00f8rer til kategorien af s\u00e5kaldte sund fornuft overvejelser baseret p\u00e5 praktisk erfaring, som mange udviklere deler og ofte henviser til.<br \/>\nDerudover findes der <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 et s\u00e6t af de fem f\u00f8rste principper for objektorienteret programmering og design formuleret af Robert Martin. SOLID inkluderer generel og \u00e5bent fortolkede supplerende principper, som, n\u00e5r de anvendes samlet, hj\u00e6lper med at skabe mere kvalitetsprogramsystemer og bedre vedligeholde dem p\u00e5 lang sigt.<\/p>\n<p>SOLID-principperne relaterer sig til OOP og formuleres p\u00e5 et sprog af begreber og koncepter som klasser, interfaces og arv. P\u00e5 samme m\u00e5de kan der ogs\u00e5 formuleres udviklingsprincipper for cloud-applikationer, hvor det grundl\u00e6ggende element ikke er en klasse, men en container. Ved at f\u00f8lge disse principper kan man skabe containerapplikationer, der bedre opfylder m\u00e5lene og opgaverne for cloud-platforme som Kubernetes.<\/p>\n<h3>Cloud-orienterede containere: Red Hat-tilgangen<\/h3>\n<p>\nI dag kan man forholdsvis let pakke n\u00e6sten enhver applikation ind i containere. Men for at applikationerne kan automatiseres og orkestreres effektivt inden for en cloud-platform som Kubernetes, kr\u00e6ves der yderligere indsats.<br \/>\nGrunden til de f\u00f8lgende ideer er <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> og mange andre v\u00e6rker om forskellige aspekter af oprettelse af webapplikationer, fra kildekodeadministration til skaleringsmodeller. De beskrevne principper g\u00e6lder kun for udviklingen af containerapplikationer, der er bygget p\u00e5 mikrotjenester og designet til cloud-platforme som Kubernetes. Det grundl\u00e6ggende element i vores overvejelser er containerbilledet, mens den m\u00e5lrettede k\u00f8rsel af containere forst\u00e5s som en platform for containerorkestrering. Form\u00e5let med de foresl\u00e5ede principper er at skabe containere, for hvilke opgaverne omkring planl\u00e6gning (scheduling \u2013 valg af v\u00e6rt til at k\u00f8re en containerinstans), skalerings og overv\u00e5gning kan automatiseres p\u00e5 de fleste orkestreringsplatforme. Principperne pr\u00e6senteres i vilk\u00e5rlig r\u00e6kkef\u00f8lge.<\/p>\n<h3>Princip for enkelt ansvar (Single Concern Principle, SCP)<\/h3>\n<p>\nDette princip ligner meget prinsippet om enkelt ansvar (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>), som er en del af SOLID-principperne og siger, at hver objekt skal have \u00e9t ansvar, og dette ansvar skal v\u00e6re fuldst\u00e6ndig inkapsuleret i klassen. Essensen af SRP er, at hver forpligtelse er en \u00e5rsag til \u00e6ndringer, og klassen b\u00f8r have \u00e9n og kun \u00e9n \u00e5rsag til \u00e6ndring.<\/p>\n<p>I SCP bruger vi ordet \u201eopgave\u201c (concern) i stedet for \u201eansvar\u201c (responsibility) for at angive et h\u00f8jere niveau af abstraktion og en bredere anvendelse af containeren i forhold til en OOP-klasse. Og hvis m\u00e5let med SRP er at have kun \u00e9n \u00e5rsag til \u00e6ndringer, s\u00e5 bygger SCP p\u00e5 \u00f8nsket om at udvide mulighederne for genbrug og udskiftning af containere. Ved at f\u00f8lge SRP og skabe en container, der l\u00f8ser en enkelt opgave p\u00e5 en funktionelt afsluttet m\u00e5de, \u00f8ger du chancerne for at genbruge denne containers image i forskellige anvendelseskontekster.<\/p>\n<p>SCP-princippet siger, at hver container skal l\u00f8se en enkelt opgave og g\u00f8re det godt. Derudover opn\u00e5s SCP i containerverdenen lettere end SRP i OOP-verdenen, da containere typisk udf\u00f8rer en enkelt proces, og denne proces l\u00f8ser oftest en enkelt opgave.<\/p>\n<p>Hvis en eller anden container-mikrotjeneste skal l\u00f8se flere opgaver samtidig, kan den opdeles i enopgave-containere og samles i en enkelt pod (enhed til implementering p\u00e5 containerplatformen) med hj\u00e6lp af sidecar- og init-containermaler. Desuden letter SCP udskiftningen af en gammel container (f.eks. en webserver eller meddelelsesbroker) med en ny, der l\u00f8ser den samme opgave, men har udvidet funktionalitet eller bedre skalerbarhed.<\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/a029e1ca36ace66550c94087e4aecc8e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Princippet om h\u00f8j observerbarhed (High Observability Principle, HOP)<\/h3>\n<p>\nN\u00e5r man bruger containere som en standardiseret metode til at pakke og k\u00f8re applikationer, betragtes selve applikationerne som en \u00absort boks\u00bb. Men hvis det drejer sig om cloud-containere, skal de tilbyde runtime-milj\u00f8et s\u00e6rlige API'er for at kontrollere containerens integritet og tr\u00e6ffe de n\u00f8dvendige foranstaltninger, hvis det er p\u00e5kr\u00e6vet. Uden dette er det umuligt at standardisere automatiseringen af containeropdateringer og deres livscyklusstyring, hvilket igen vil forringe stabiliteten og brugervenligheden af softwaresystemet.<\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/7df1320108d9b635c10c6cf41d5dfef6.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nI praksis skal en containerapplikation mindst have et API til forskellige typer integritetskontroller: livstest (liveness) og klarhedstest (readiness). Hvis applikationen kr\u00e6ver mere, skal den ogs\u00e5 tilbyde andre midler til at overv\u00e5ge sin tilstand. For eksempel at logge vigtige h\u00e6ndelser via STDERR og STDOUT for at aggregere logs ved hj\u00e6lp af Fluentd, Logstash og andre lignende v\u00e6rkt\u00f8jer. Samt integration med sporings- og metrikindsamlingsbiblioteker, s\u00e5som OpenTracing, Prometheus osv.<\/p>\n<p>Generelt kan applikationen stadig betragtes som en \u00absort boks\u00bb, men den skal forsynes med alle API'er, der er n\u00f8dvendige for platformen til at overv\u00e5ge og administrere den p\u00e5 bedst mulige m\u00e5de.<\/p>\n<h3>Livscyklusoverensstemmelsesprincip (Life-cycle Conformance Principle, LCP)<\/h3>\n<p>\nLCP er en antitese til HOP. Mens HOP siger, at containeren skal give platformen API'er til l\u00e6sning, kr\u00e6ver LCP, at applikationen skal kunne modtage information fra platformen. Desuden skal containeren ikke kun modtage h\u00e6ndelser, men ogs\u00e5 tilpasse sig, med andre ord reagere p\u00e5 dem. Derfor er navnet p\u00e5 princippet, som kan betragtes som et krav om at give platformen API'er til skrivning.<\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/f32f5d133597ae3905206badc6677f92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPlatforme har forskellige typer h\u00e6ndelser, der hj\u00e6lper med at styre containerens livscyklus. Men det skal selv applikationen afg\u00f8re, hvilke h\u00e6ndelser den vil opfange, og hvordan den vil reagere.<\/p>\n<p>Det er klart, at nogle h\u00e6ndelser er vigtigere end andre. For eksempel, hvis en applikation ikke h\u00e5ndterer et n\u00f8dstop godt, s\u00e5 skal den kunne modtage signalerne: terminate (SIGTERM) og hurtigst muligt igangs\u00e6tte sin afslutningsprocedure for at n\u00e5 det, f\u00f8r den modtager signalet: kill (SIGKILL), som kommer efter SIGTERM.<\/p>\n<p>Desuden kan h\u00e6ndelser som PostStart og PreStop v\u00e6re vigtige for applikationens livscyklus. For eksempel kan en applikation have brug for en vis opvarmningstid efter opstart, f\u00f8r den kan svare p\u00e5 anmodninger. Eller applikationen skal frigive ressourcer p\u00e5 en bestemt m\u00e5de ved afslutning.<\/p>\n<h3>Princippet om immutabilitet af containerbilleder (Image Immutability Principle, IIP)<\/h3>\n<p>\nDet er alment accepteret, at containerapplikationer skal forblive uforandrede efter opbygning, selv om de k\u00f8res i forskellige milj\u00f8er. Dette medf\u00f8rer behovet for at eksternalisere dataopbevaring under k\u00f8rsel (med andre ord, bruge eksterne midler til det), samt at stole p\u00e5 eksterne konfigurationer, der er tilpasset til det specifikke k\u00f8remilj\u00f8, i stedet for at \u00e6ndre eller oprette unikke containere til hvert milj\u00f8. Efter \u00e6ndringer i applikationen skal containerbilledet opbygges igen og distribueres i alle brugte milj\u00f8er. Forresten anvendes et lignende princip i IT-systemadministration, kendt som prinsippet om uforanderlighed af servere og infrastruktur. <\/p>\n<p>M\u00e5let med IIP er at forhindre oprettelsen af separate containerbilleder til forskellige k\u00f8remilj\u00f8er og i stedet bruge det samme billede sammen med den passende konfiguration til det specifikke milj\u00f8. At f\u00f8lge dette princip muligg\u00f8r implementeringen af vigtige praksisser for automatisering af cloud-systemer, s\u00e5som roll-back og roll-forward opdateringer af applikationer.<\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/86b93724830b37f82bf289b797407480.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Princippet om engangsprocesser (Process Disposability Principle, PDP)<\/h3>\n<p>\nEn af de vigtigste egenskaber ved en container er dens ephemerality: en containerinstans kan nemt oprettes og nemt destrueres, s\u00e5 den n\u00e5r som helst let kan erstattes med en anden instans. Der kan v\u00e6re mange grunde til en s\u00e5dan udskiftning: fejl ved tests, skalering af applikationen, overflytning til en anden v\u00e6rt, ressourceudt\u00f8mning p\u00e5 platformen eller andre situationer. <\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/858287b23c276363313e35cf18b81190.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nSom f\u00f8lge heraf skal container-applikationer bevare deres tilstand ved hj\u00e6lp af eksterne midler eller anvende interne distribuerede systemer med redundans. Desuden skal applikationen starte hurtigt og afslutte hurtigt og v\u00e6re klar til pludselige fatale hardwarefejl.<\/p>\n<p>En af de praksisser, der hj\u00e6lper med at realisere dette princip, er at skabe container med lille st\u00f8rrelse. Cloud-milj\u00f8er kan automatisk v\u00e6lge en v\u00e6rt til at k\u00f8re en container-forekomst, s\u00e5 jo mindre containeren er, desto hurtigere vil den starte \u2013 den kopieres hurtigere til m\u00e5l-v\u00e6rten via netv\u00e6rket.<\/p>\n<h3>Selvforsyningsprincippet (Self-containment Principle, S-CP)<\/h3>\n<p>\nIf\u00f8lge dette princip inkluderes alle n\u00f8dvendige komponenter i containeren under byggefasen. Containeren skal konstrueres med det for \u00f8je, at systemet kun har et rent Linux-kernel, s\u00e5 alle n\u00f8dvendige biblioteker skal placeres i selve containeren. Her skal ogs\u00e5 v\u00e6re ting som runtime-milj\u00f8et for det relevante programmeringssprog, applikationsplatformen (hvis n\u00f8dvendigt) og andre afh\u00e6ngigheder, der er n\u00f8dvendige under drift af container-applikationen. <\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/ecc7425510d63e4914c0c9a7e90b02a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Undtagelser g\u00f8res kun for konfigurationer, der varierer fra milj\u00f8 til milj\u00f8 og skal leveres ved k\u00f8retid, f.eks. gennem Kubernetes ConfigMap.<\/p>\n<p>Applikationen kan omfatte flere containeriserede komponenter, f.eks. en separat databasecontainer som en del af en container-baseret webapplikation. If\u00f8lge S-CP-princippet skal disse containere ikke kombineres til \u00e9n, men sikres, at databasecontaineren indeholder alt n\u00f8dvendigt for databasen, mens webapplikationscontaineren har alt n\u00f8dvendigt for webapplikationen, herunder webserveren. Som f\u00f8lge heraf vil webapplikationscontaineren under drift afh\u00e6nge af databasecontaineren og tilg\u00e5 den efter behov.<\/p>\n<h3>Begr\u00e6nsningsprincippet under k\u00f8retid (Runtime Confinement Principle, RCP)<\/h3>\n<p>\nS-CP-princippet bestemmer, hvordan en container skal bygges, og hvad den bin\u00e6re fil af billedet skal indeholde. Men en container er ikke bare en \"sort boks\" med kun \u00e9n egenskab \u2013 filst\u00f8rrelse. Ved udf\u00f8relse f\u00e5r containeren ogs\u00e5 andre dimensioner: m\u00e6ngden af anvendt hukommelse, CPU-tid og andre systemressourcer.<\/p>\n<p><img decoding=\"async\" alt=\"5 fornuftige principper til opbygning af cloud-native apps\" src=\"\/wp-content\/uploads\/2019\/06\/a52e6a656892e57479ac014a3e6f4316.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHer kommer RCP-princippet til nytte, som fastsl\u00e5r, at containeren skal afkoble sine krav til systemressourcerne og overf\u00f8re dem til platformen. Med ressourceprofiler for hver container (hvor meget CPU, hukommelse, netv\u00e6rk og diskplads den har brug for) kan platformen optimere distributionen og autoskaleringen, styre IT-ressourcerne og opretholde SLA-niveauerne for containerne.<\/p>\n<p>Udover at opfylde containerens ressourcekrav er det ogs\u00e5 vigtigt for applikationen ikke at overskride de rammer, den selv har sat. Ellers vil platformen med st\u00f8rre sandsynlighed inkludere den p\u00e5 listen over applikationer, der skal afbrydes eller migreres, hvis ressourcerne bliver knappe.<\/p>\n<p>N\u00e5r vi taler om cloud-orientering, handler det prim\u00e6rt om arbejdsmetoden. <br \/>\nOvenfor har vi formuleret en r\u00e6kke generelle principper, der danner det metodologiske fundament for at skabe kvalitetscontainere, der er tilpasset cloud-milj\u00f8er.<\/p>\n<p>Bem\u00e6rk, at ud over disse generelle principper vil du ogs\u00e5 have brug for yderligere avancerede metoder og teknikker til arbejdet med containere. Derudover har vi nogle korte anbefalinger, som er mere specifikke og skal anvendes (eller ikke anvendes) afh\u00e6ngigt af situationen:<\/p>\n<ul>\n<li>Str\u00e6b efter at reducere st\u00f8rrelsen af billederne: slet midlertidige filer og installer ikke un\u00f8dvendige pakker \u2013 jo mindre containeren er, jo hurtigere kan den bygges og kopieres til den m\u00e5lhoste via netv\u00e6rket.<\/li>\n<li>Fokuser p\u00e5 arbitr\u00e6re User-ID'er: brug ikke sudo-kommandoen eller specielle userid'er til at starte dine containere.<\/li>\n<li>M\u00e6rk vigtige porte: portnumre kan angives under udf\u00f8relsen, men det er bedre at angive dem med EXPOSE-kommandoen \u2013 det bliver nemmere for andre mennesker og programmer at bruge dine billeder. <\/li>\n<li>Gem data p\u00e5 volumener: data, der skal bevares efter containerens destruktion, b\u00f8r gemmes p\u00e5 volumener.<\/li>\n<li>Angiv metadata for billedet: tags, labels og annotationer g\u00f8r det lettere at bruge billeder \u2013 andre udviklere vil s\u00e6tte pris p\u00e5 det.<\/li>\n<li>Synkroniser v\u00e6rten og billederne: for visse containerapplikationer kr\u00e6ves det, at containeren synkroniseres med v\u00e6rten baseret p\u00e5 bestemte attributter, s\u00e5som tid eller maskin-ID.<\/li>\n<li>Til slut deler vi skabeloner og bedste praksisser, som vil hj\u00e6lpe med mere effektivt at implementere de f\u00f8rn\u00e6vnte principper:<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 om den nye version af OpenShift Container Platform \u2013 4<\/b><\/a><\/noindex><br \/>\n11. juni kl. 11.00<\/p>\n<p>Hvad du vil l\u00e6re:<\/p>\n<ul>\n<li>Immutable Red Hat Enterprise Linux CoreOS<\/li>\n<li>OpenShift service mesh<\/li>\n<li>Operator framework<\/li>\n<li>Knative framework<\/li>\n<\/ul>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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 sund fornuft principper for oprettelse af cloud-native apps | ProHoster","description":"\u00abCloud-native\u00bb eller blot \u00abcloud\u00bb-applikationer er skabt specielt til at k\u00f8re p\u00e5 cloud-infrastrukturen.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/35006","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=35006"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/35006\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/26340"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=35006"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=35006"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=35006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}