{"id":81173,"date":"2020-05-11T13:42:51","date_gmt":"2020-05-11T11:42:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/production-ready-images-for-k8s"},"modified":"2020-05-11T13:42:51","modified_gmt":"2020-05-11T11:42:51","slug":"production-ready-images-for-k8s","status":"publish","type":"post","link":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/production-ready-images-for-k8s","title":{"rendered":"Produksjonsklare bilder for k8s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Denne historien handler om hvordan vi bruker containere i produksjonsmilj\u00f8, spesielt under Kubernetes. Artikkelen omhandler innsamling av metrikker og logger fra containere, samt bygging av bilder.<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/c7e8df02d845138e489c09c55cd616e6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nVi er fra fintech-selskapet Exness, som utvikler tjenester for online trading og fintech-produkter for B2B og B2C. I v\u00e5rt FoU-team er det mange ulike grupper, med over 100 ansatte i utviklingsavdelingen.<\/p>\n<p>Vi representerer teamet som er ansvarlig for plattformen for innsamling og kj\u00f8ring av kode fra v\u00e5re utviklere. Spesielt er vi ansvarlige for innsamling, lagring og tilgjengeliggj\u00f8ring av metrikker, logger og hendelser fra applikasjonene. For \u00f8yeblikket opererer vi med omtrent tre tusen Docker-containere i produksjonsmilj\u00f8et, st\u00f8tter v\u00e5rt big data-lager p\u00e5 50 TB, og tilbyr arkitekturl\u00f8sninger som bygges rundt v\u00e5r infrastruktur: Kubernetes, Rancher og ulike offentlige skytjenesteleverand\u00f8rer.\u00a0<\/p>\n<h1>V\u00e5r motivasjon<\/h1>\n<p>\nHva brenner? Ingen kan svare. Hvor er brannen? \u00c5 forst\u00e5 er vanskelig. N\u00e5r begynte det \u00e5 brenne? Det kan avdekkes, men ikke med en gang.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/3ca2271caf1d02ba14937680cd89d65d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvorfor st\u00e5r noen containere stille mens andre har falt? Hvilken container er ansvarlig for dette? Utenp\u00e5 ser containerne like ut, men inni har hver sin Neo.<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/f971583f21e363244f9ea754da2a1f4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u00e5re utviklere er kompetente folk. De lager gode tjenester som gir selskapet fortjeneste. Men det skjer feil, n\u00e5r containerne med applikasjoner er uorganiserte. En container bruker for mye CPU, en annen nettverk, en tredje inn- og utdataoperasjoner, og en fjerde vet man ikke hva gj\u00f8r med soklene. Alt dette faller, og skipet synker.\u00a0<\/p>\n<h1>Agenter<\/h1>\n<p>\nFor \u00e5 forst\u00e5 hva som skjer inne i containerne, har vi bestemt oss for \u00e5 installere agenter direkte i containerne.<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/cc9eb47d1250bb866ec9452181479df4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDisse agentene er st\u00f8ttende programmer som holder containerne i en tilstand der de ikke \u00f8delegger hverandre. Agentene er standardisert, og dette gj\u00f8r det mulig \u00e5 standardisere tiln\u00e6rmingen til vedlikehold av containerne.\u00a0<\/p>\n<p>I v\u00e5rt tilfelle m\u00e5 agentene gi logger i et standardformat, merket og med throttling. De m\u00e5 ogs\u00e5 gi oss standardiserte metrikker som er utvidbare med hensyn til forretningsapplikasjoner.<\/p>\n<p>Under agenter forst\u00e5s ogs\u00e5 verkt\u00f8y for drift og vedlikehold, som kan fungere i ulike orkestreringssystemer og st\u00f8tte forskjellige bilder (Debian, Alpine, Centos, osv.).<\/p>\n<p>Endelig m\u00e5 agentene st\u00f8tte en enkel CI\/CD som inkluderer Docker-filer. Ellers vil skipet g\u00e5 i stykker fordi containerne begynner \u00e5 leveres p\u00e5 \"skakke\" skinner.<\/p>\n<h1>Byggeprosessen og oppsettet av m\u00e5lbildet<\/h1>\n<p>\nFor \u00e5 ha alt standardisert og kontrollerbart, m\u00e5 vi f\u00f8lge en eller annen standard byggeprosess. Derfor har vi besluttet \u00e5 bygge containere med containere \u2013 slik er rekursjonen.<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/708715af05bf79ce1eb9c2a8ce2aeca6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHer er containerne presentert som solide konturer. Samtidig bestemte vi oss for \u00e5 legge distribusjoner i dem, slik at \"livet ikke skulle virke for enkelt\". Hvorfor dette ble gjort, vil vi forklare nedenfor.<br \/>\n\u00a0<br \/>\nResultatet ble et verkt\u00f8y for bygging \u2013 en container av en spesifikk versjon som refererer til bestemte versjoner av distribusjoner og spesifikke versjoner av skripter.<\/p>\n<p>Hvordan bruker vi dette? Vi har Docker Hub, der containeren ligger. Vi speiler den inn i v\u00e5rt eget system for \u00e5 bli kvitt eksterne avhengigheter. Det ble en container merket med gult. Vi lager en mal for \u00e5 installere alle n\u00f8dvendige distribusjoner og skripter i containeren. Etter dette bygger vi et driftklart bilde: utviklerne legger inn koden sin og noen spesifikke avhengigheter.\u00a0<\/p>\n<p>Hva er fordelene med denne tiln\u00e6rmingen?\u00a0<\/p>\n<ul>\n<li>For det f\u00f8rste, full versjonskontroll av byggeverkt\u00f8yene \u2013 bygget container, versjoner av skriptene og distribusjonene.\u00a0<\/li>\n<li>For det andre har vi oppn\u00e5dd standardisering: vi lager maler, mellomprodukter og driftklare bilder p\u00e5 en ensartet m\u00e5te.\u00a0<\/li>\n<li>For det tredje gir containerne oss portabilitet. I dag bruker vi Gitlab, og i morgen g\u00e5r vi over til TeamCity eller Jenkins og vil fortsatt kunne kj\u00f8re containerne v\u00e5re p\u00e5 samme m\u00e5te.\u00a0<\/li>\n<li>For det fjerde, minimalisering av avhengigheter. Vi la bevisst distribusjoner i containeren, for det gj\u00f8r at vi ikke m\u00e5 laste dem ned hver gang fra Internett.\u00a0<\/li>\n<li>For det femte har byggehastigheten \u00f8kt \u2013 tilgjengeligheten av lokale kopier av bilder gj\u00f8r at vi ikke bruker tid p\u00e5 nedlasting, siden det finnes et lokalt bilde.\u00a0<\/li>\n<\/ul>\n<p>\nMed andre ord har vi oppn\u00e5dd en kontrollerbar og fleksibel byggeprosess. Vi bruker de samme verkt\u00f8yene for \u00e5 bygge alle containere med full versjonering.\u00a0<\/p>\n<h1>Hvordan fungerer v\u00e5r byggeprosedyr?<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/22b9a8546005e289f79962188dbb0659.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOppsettet startes med \u00e9n kommando, prosessen kj\u00f8res i bildet (markert med r\u00f8dt). Utvikleren har en Docker-fil (markert med gult), som vi rendrer ved \u00e5 erstatte variabler med verdier. I tillegg legger vi til headere og footere \u2014 dette er v\u00e5re agenter.\u00a0<\/p>\n<p>Headeren legger til distribusjoner fra de respektive bildene. Footer s\u00f8rger for \u00e5 installere v\u00e5re tjenester internt, konfigurerer oppstart av arbeidsmengde, logging og andre agenter, erstatter entrypoint osv.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/4004e57dc45771479e535921a839716d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi tenkte lenge p\u00e5 om vi skulle bruke en supervisor. Til slutt bestemte vi oss for at vi hadde behov for det. Vi valgte S6. Supervisoren sikrer at vi kan h\u00e5ndtere containeren: den lar oss koble til den hvis hovedprosessen feiler og gir manuell kontroll over containeren uten at vi m\u00e5 opprette den p\u00e5 nytt. Logger og metrikker er prosesser som kj\u00f8res inne i containeren. Dette m\u00e5 ogs\u00e5 kontrolleres p\u00e5 en eller annen m\u00e5te, og det gj\u00f8r vi med hjelp av supervisoren. Til slutt tar S6 seg av housekeeping, signalbehandling og andre oppgaver.<\/p>\n<p>Siden vi bruker forskjellige orkestreringssystemer, m\u00e5 containeren etter oppsett og oppstart forst\u00e5 hvilken milj\u00f8 den er i og handle deretter. For eksempel:<br \/>\nDette lar oss samle ett bilde og kj\u00f8re det i forskjellige orkestreringssystemer, og det vil bli startet med hensyn til spesifikasjonene til dette orkestreringssystemet.<\/p>\n<p>\u00a0<img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/6e76396afedbbf0e71d44a7fbb8521da.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFor den samme containeren f\u00e5r vi forskjellige prosesstr\u00e6r i Docker og Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/83f9d23876192930ffebafcdd549915e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNytten kj\u00f8res under supervisoren S6. V\u00e6r oppmerksom p\u00e5 collector og events \u2014 dette er v\u00e5re agenter som tar seg av logger og metrikker. I Kubernetes finnes de ikke, men i Docker gj\u00f8r de det. Hvorfor?\u00a0<\/p>\n<p>Hvis vi ser p\u00e5 spesifikasjonen for \u00abpod\u00bb (her og videre \u2013 Kubernetes pod), ser vi at containeren events kj\u00f8rer i en pod, som har en egen container collector som utf\u00f8rer funksjonen med \u00e5 samle metrikker og logger. Vi kan bruke mulighetene til Kubernetes: kj\u00f8re containere i \u00e9n pod, i et felles prosess- og\/eller nettverksomr\u00e5de. Faktisk kan vi implementere v\u00e5re egne agenter og utf\u00f8re noen funksjoner. Og hvis denne samme containeren kj\u00f8rer i Docker, vil den f\u00e5 de samme mulighetene, som vil v\u00e6re i stand til \u00e5 levere logger og metrikker, siden agentene vil kj\u00f8re internt.\u00a0<\/p>\n<h1>Metrikker og logger<\/h1>\n<p>\nLevering av metrikker og logger er en komplisert oppgave. L\u00f8sningen p\u00e5 den er knyttet til flere aspekter.<br \/>\nInfrastrukturen er designet for \u00e5 kj\u00f8re nyttelast, ikke for massedistribusjon av logger. Dette betyr at prosessen skal utf\u00f8res med minimale ressurser for containerne. Vi \u00f8nsker \u00e5 hjelpe utviklerne v\u00e5re: \u00abTa Docker Hub-containeren, kj\u00f8r den, og vi kan levere loggene\u00bb.\u00a0<\/p>\n<p>Det andre aspektet er \u00e5 begrense volumet av logger. Hvis flere containere opplever et volumutbrudd (applikasjonen skriver stack-trace i en loop), \u00f8ker belastningen p\u00e5 CPU, nettverkskanaler, logsamlesystemet, og dette p\u00e5virker vertsmaskinen generelt og andre containere p\u00e5 verten, noe som noen ganger f\u00f8rer til at vertsmaskinen \u00abfaller\u00bb.\u00a0<\/p>\n<p>Det tredje aspektet er at vi m\u00e5 st\u00f8tte s\u00e5 mange metoder for innsamling av m\u00e5linger som mulig fra starten av. Fra \u00e5 lese filer og sp\u00f8rre Prometheus-endepunktet til \u00e5 bruke spesifikke applikasjonsprotokoller.<\/p>\n<p>Og det siste aspektet er at vi m\u00e5 minimere ressursforbruket.<\/p>\n<p>Vi har valgt en open-source-l\u00f8sning skrevet i Go, kalt Telegraf. Dette er en universell connector som st\u00f8tter mer enn 140 typer inngangskanaler (input plugins) og 30 typer utgangskanaler (output plugins). Vi har tilpasset den, og n\u00e5 skal vi vise hvordan den brukes av oss i eksemplet Kubernetes.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/9635d571c852e5f9358458874c58d7b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa oss si at en utvikler distribuerer arbeidslast, og Kubernetes mottar foresp\u00f8rselen om \u00e5 opprette en pod. I dette \u00f8yeblikket opprettes det automatisk en container kalt Collector for hver pod (vi bruker en mutasjons-webhook). Collector er v\u00e5r agent. Ved oppstart konfigurerer denne containeren seg selv til \u00e5 jobbe med Prometheus og logsamlingssystemet.<\/p>\n<ul>\n<li>For dette bruker den pod-annotasjoner, og avhengig av innholdet, oppretter den, for eksempel, en Prometheus endepunkt.\u00a0\n<\/li>\n<li>Basert p\u00e5 spesifikasjonen til pod-en og spesifikke innstillingsalternativer for containerne avgj\u00f8r den hvordan loggene skal leveres.\n<\/li>\n<\/ul>\n<p>\nVi samler logger gjennom Docker API: utviklerne trenger bare \u00e5 legge dem i stdout eller stderr, s\u00e5 klarer Collector resten. Loggene samles inn i biter med en viss forsinkelse for \u00e5 forhindre mulig overbelastning av vertsmaskinen.\u00a0<\/p>\n<p>M\u00e5linger samles inn per instanser av arbeidslastene (prosesser) i containerne. Alt merkes med tagger: namespace, pod, osv., og blir deretter konvertert til Prometheus-format \u2013 og blir tilgjengelig for innsamling (bortsett fra logger). I tillegg sender vi logger, m\u00e5linger og hendelser til Kafka og videre:<\/p>\n<ul>\n<li>Loggene er tilgjengelige i Graylog (for visuell analyse);\n<\/li>\n<li>Logger, metrikker og hendelser sendes til Clickhouse for langtidslagring.\n<\/li>\n<\/ul>\n<p>\nAlt fungerer p\u00e5 samme m\u00e5te i AWS, bare at vi bytter ut Graylog med Kafka til Cloudwatch. Vi sender logger dit, og det blir veldig praktisk: det er lett \u00e5 se hvilken klynge og container de tilh\u00f8rer. Det samme gjelder for Google Stackdriver. S\u00e5 v\u00e5rt oppsett fungerer b\u00e5de on-premise med Kafka og i skyen.\u00a0<\/p>\n<p>Hvis vi ikke har Kubernetes med pods, blir oppsettet litt mer komplisert, men fungerer etter de samme prinsippene.<\/p>\n<p><img decoding=\"async\" alt=\"Produksjonsklare bilder for k8s\" src=\"\/wp-content\/uploads\/2020\/05\/dd8efb33c5c74433a2767cb00caeec2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInne i containeren kj\u00f8rer samme prosesser, og de orkestreres ved hjelp av S6. Alle de samme prosessene kj\u00f8rer inne i \u00e9n container.<\/p>\n<h1>Resultatet er<\/h1>\n<p>\nVi har laget en helhetlig l\u00f8sning for bygging og implementering av bilder, med alternativer for innsamling og levering av logger og metrikker:<\/p>\n<ul>\n<li>Utviklet en standardisert tiln\u00e6rming til bygging av bilder, basert p\u00e5 dette har vi utviklet CI-maler;\n<\/li>\n<li>Agenter for datainnsamling er v\u00e5re utvidelser av Telegraf. Vi har godt testet dem i produksjon;\n<\/li>\n<li>Bruker mutation webhook for \u00e5 implementere containere med agenter i pods;\u00a0\n<\/li>\n<li>Integrert i Kubernetes\/Rancher-\u00f8kosystemet;\n<\/li>\n<li>Vi kan kj\u00f8re identiske containere i forskjellige orkestreringssystemer og oppn\u00e5 det resultatet vi forventer;\n<\/li>\n<li>Vi har laget en helt dynamisk konfigurasjon for containeradministrasjon.\u00a0\n<\/li>\n<\/ul>\n<p>\nSamarbeidspartnere: <b>Ilya Prudnikov<\/b><br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/exness\/blog\/488392\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0441\u0431\u043e\u0440\u0443 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u043b\u043e\u0433\u043e\u0432 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0438\u043b\u0434\u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041c\u044b \u0438\u0437 \u0444\u0438\u043d\u0442\u0435\u0445-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Exness, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d-\u0442\u0440\u0435\u0439\u0434\u0438\u043d\u0433\u0430 \u0438 \u0444\u0438\u043d\u0442\u0435\u0445-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f B2B \u0438 \u04122\u0421. \u0412 \u043d\u0430\u0448\u0435\u043c R&amp;D \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434, \u0432 \u043e\u0442\u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 100 + \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81173","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\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\/no\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\udd47Production-ready images for k8s | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\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=\"2020-05-11T11:42:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-11T11:42:51+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\udd47Produksjonsklare bilder for k8s | ProHoster","description":"Denne historien handler om hvordan vi bruker containere i produktiv milj\u00f8, spesielt under Kubernetes.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/production-ready-images-for-k8s","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\udd47Production-ready images for k8s | ProHoster","og:description":"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.","og:url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/production-ready-images-for-k8s","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":"2020-05-11T11:42:51+00:00","article:modified_time":"2020-05-11T11:42:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81173","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:03:22","updated":"2022-09-28 06:12:17","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/81173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=81173"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/81173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/81174"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=81173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=81173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=81173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}