{"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\/da\/blog\/administrirovanie\/production-ready-images-for-k8s","title":{"rendered":"Produktionsklare billeder til k8s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Denne historie handler om, hvordan vi bruger containere i produktionsmilj\u00f8et, is\u00e6r under Kubernetes. Artiklen omhandler indsamling af metrikker og logfiler fra containere samt opbygning af billeder.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til 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-virksomheden Exness, der udvikler tjenester til online handel og fintech-produkter for B2B og B2C. I vores R&amp;D er der mange forskellige teams, og i udviklingsafdelingen er der over 100 medarbejdere.<\/p>\n<p>Vi repr\u00e6senterer et team, der er ansvarligt for platformen til indsamling og udf\u00f8relse af kode af vores udviklere. Specifikt er vi ansvarlige for indsamling, opbevaring og levering af metrikker, logfiler og h\u00e6ndelser fra applikationer. I \u00f8jeblikket opererer vi med cirka tre tusinde Docker-containere i produktionsmilj\u00f8et, vedligeholder vores big data-lager p\u00e5 50 TB og leverer arkitektoniske l\u00f8sninger, der er bygget omkring vores infrastruktur: Kubernetes, Rancher og forskellige offentlige cloud-udbydere.\u00a0<\/p>\n<h1>Vores motivation<\/h1>\n<p>\nHvad br\u00e6nder? Ingen kan svare. Hvor er epicenteret? Sv\u00e6rt at forst\u00e5. Hvorn\u00e5r br\u00e6ndte det? Det kan man finde ud af, men ikke med det samme.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/3ca2271caf1d02ba14937680cd89d65d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvorfor st\u00e5r nogle containere stille, mens andre falder? Hvilken container var ansvarlig? Udadtil ser containerne ens ud, men indeni har hver sin Neo.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/f971583f21e363244f9ea754da2a1f4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVores udviklere er dygtige folk. De laver gode tjenester, der genererer indt\u00e6gter for virksomheden. Men der er situationer, hvor containerne med applikationer driver rundt. \u00c9n container bruger for meget CPU, en anden bruger netv\u00e6rk, den tredje I\/O-operationer, og den fjerde er helt uforst\u00e5elig i sin h\u00e5ndtering af sockets. Alt dette falder, og skibet synker.\u00a0<\/p>\n<h1>Agenter<\/h1>\n<p>\nFor at forst\u00e5, hvad der sker indeni, besluttede vi at installere agenter direkte i containerne.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/cc9eb47d1250bb866ec9452181479df4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDisse agenter er stabiliseringsprogrammer, der holder containerne i en tilstand, s\u00e5 de ikke \u00f8del\u00e6gger hinanden. Agenterne er standardiserede, hvilket g\u00f8r det muligt at standardisere tilgangen til vedligeholdelse af containerne.\u00a0<\/p>\n<p>I vores tilf\u00e6lde skal agenterne levere logs i et standardformat, tagget og med throttling. De skal ogs\u00e5 give os standardiserede metrikker, der kan udvides fra forretningsapplikationers perspektiv.<\/p>\n<p>Under agenter forst\u00e5s ogs\u00e5 v\u00e6rkt\u00f8jer til drift og vedligeholdelse, der kan arbejde i forskellige orkestreringssystemer, underst\u00f8tter forskellige images (Debian, Alpine, Centos osv.).<\/p>\n<p>Endelig skal agenterne underst\u00f8tte en simpel CI\/CD, der inkluderer Docker-filer. Ellers vil skibet bryde sammen, fordi containere begynder at blive leveret ad \"sk\u00e6ve\" skinner.<\/p>\n<h1>Byggeprocessen og opbygningen af det m\u00e5lrettede image<\/h1>\n<p>\nFor at alt skal v\u00e6re standardiseret og kontrolleret, er det n\u00f8dvendigt at f\u00f8lge en standard byggeproces. Derfor har vi besluttet at samle containere med containere \u2014 s\u00e5dan en recursion.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/708715af05bf79ce1eb9c2a8ce2aeca6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHer pr\u00e6senteres containere som solide konturer. Vi besluttede samtidig at l\u00e6gge distributioner i dem, s\u00e5 \"livet ikke virker som en hindb\u00e6rmark\". Hvorfor dette blev gjort, vil vi fort\u00e6lle nedenfor.<br \/>\n\u00a0<br \/>\nResultatet blev et v\u00e6rkt\u00f8j til opbygning \u2014 en container af en bestemt version, der henviser til bestemte versioner af distributioner og bestemte versioner af scripts.<\/p>\n<p>Hvordan bruger vi det? Vi har Docker Hub, hvor containeren ligger. Vi spejler den ind i vores system for at slippe for eksterne afh\u00e6ngigheder. Det blev en container, der er markeret med gul. Vi skaber en skabelon for at installere alle n\u00f8dvendige distributioner og scripts i containeren. Derefter bygger vi et driftsklart image: udviklerne l\u00e6gger deres kode i det samt nogle s\u00e6rlige afh\u00e6ngigheder.\u00a0<\/p>\n<p>Hvad er fordelene ved denne tilgang?\u00a0<\/p>\n<ul>\n<li>For det f\u00f8rste, fuld versionskontrol over byggev\u00e6rkt\u00f8jer \u2013 byggecontainer, versioner af scripts og distributioner.\u00a0<\/li>\n<li>For det andet, har vi opn\u00e5et standardisering: vi skaber skabeloner, mellemprodukter og driftsklare images ensartet.\u00a0<\/li>\n<li>For det tredje giver containere os portabilitet. I dag bruger vi Gitlab, og i morgen skifter vi til TeamCity eller Jenkins og kan stadig k\u00f8re vores containere.\u00a0<\/li>\n<li>For det fjerde, minimering af afh\u00e6ngigheder. Vi lagde distributioner i containeren med vilje, da det sparer os for at skulle downloade dem hver gang fra internettet.\u00a0<\/li>\n<li>For det femte, \u00f8get byggehastighed \u2013 tilstedev\u00e6relsen af lokale kopier af images sparer tid p\u00e5 download, da vi har et lokalt image.\u00a0<\/li>\n<\/ul>\n<p>\nMed andre ord har vi opn\u00e5et en kontrolleret og fleksibel byggeproces. Vi bruger de samme v\u00e6rkt\u00f8jer til at opbygge enhver container med fuld versionskontrol.\u00a0<\/p>\n<h1>Hvordan fungerer vores byggeprocedure<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/22b9a8546005e289f79962188dbb0659.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBygningen startes med en enkelt kommando, og processen udf\u00f8res i et billede (markeret med r\u00f8dt). Udvikleren har en Docker-fil (markeret med gult), som vi renderer ved at erstatte variablerne med v\u00e6rdier. Og samtidig tilf\u00f8jer vi headers og footers - det er vores agenter.\u00a0<\/p>\n<p>Headeren tilf\u00f8jer distributioner fra de relevante billeder. Footeren installerer vores tjenester indeni, konfigurerer udl\u00f8b af arbejdsbelastninger, logging og andre agenter, og erstatter entrypoint osv.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/4004e57dc45771479e535921a839716d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi overvejede l\u00e6nge, om vi skulle installere en supervisor. Til sidst besluttede vi, at vi havde brug for det. Vi valgte S6. Supervisoren sikrer containerstyring: muligg\u00f8r tilslutning til den i tilf\u00e6lde af, at hovedprocessen falder, og giver manuel kontrol af containeren uden at skulle genskabe den. Logs og metrikker er processer, der k\u00f8rer inde i containeren. De skal ogs\u00e5 p\u00e5 en eller anden m\u00e5de kontrolleres, og det g\u00f8r vi med hj\u00e6lp fra supervisoren. Endelig tager S6 sig af housekeeping, signalh\u00e5ndtering og andre opgaver.<\/p>\n<p>Da vi anvender forskellige orkestreringssystemer, skal containeren efter opbygning og opstart forst\u00e5, i hvilket milj\u00f8 den befinder sig, og handle derefter. For eksempel:<br \/>\nDette g\u00f8r det muligt for os at samle \u00e9t billede og k\u00f8re det i forskellige orkestreringssystemer, hvor det vil blive opstartet med hensyn til specifikationerne for dette orkestreringssystem.<\/p>\n<p>\u00a0<img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/6e76396afedbbf0e71d44a7fbb8521da.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFor den samme container f\u00e5r vi forskellige procestr\u00e6er i Docker og Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/83f9d23876192930ffebafcdd549915e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNyttelasten k\u00f8rer under supervisoren S6. Bem\u00e6rk collector og events - det er vores agenter, der er ansvarlige for logs og metrikker. I Kubernetes findes de ikke, men i Docker findes de. Hvorfor?\u00a0<\/p>\n<p>Hvis man ser p\u00e5 specifikationen for \"pod'en\" (her og fremover - Kubernetes pod), vil vi se, at containeren events k\u00f8rer i pod'en, hvor der er en separat container collector, der udf\u00f8rer funktionen til indsamling af metrikker og logs. Vi kan udnytte mulighederne i Kubernetes: k\u00f8re containere i samme pod, i et f\u00e6lles proces- og\/eller netv\u00e6rksrum. Faktisk integrere vores agenter og udf\u00f8re visse funktioner. Og hvis denne samme container k\u00f8rer i Docker, vil den f\u00e5 de samme muligheder, hvilket betyder, at den vil kunne levere logs og metrikker, da agenterne vil blive k\u00f8rt indeni.\u00a0<\/p>\n<h1>Metrikker og logs<\/h1>\n<p>\nLevering af metrikker og logs er en kompleks opgave. L\u00f8sningen hertil involverer flere aspekter.<br \/>\nInfrastrukturen skabes til at h\u00e5ndtere belastning, ikke til massiv levering af logs. Det vil sige, at denne proces skal udf\u00f8res med minimale ressourcer kr\u00e6vet fra containerne. Vi str\u00e6ber efter at hj\u00e6lpe vores udviklere: \"Tag en Docker Hub-container, start den, og s\u00e5 kan vi levere logs.\"\u00a0<\/p>\n<p>Den anden aspekt er at begr\u00e6nse m\u00e6ngden af logs. Hvis flere containere oplever et spike i logm\u00e6ngden (n\u00e5r applikationen kontinuerligt viser stack-trace), \u00f8ges belastningen p\u00e5 CPU, netv\u00e6rkskanaler, logbehandlingssystemet, og det p\u00e5virker v\u00e6rtens ydeevne samt andre containere p\u00e5 v\u00e6rten, hvilket nogle gange f\u00f8rer til, at v\u00e6rten \"falder\".\u00a0<\/p>\n<p>Den tredje aspekt er n\u00f8dvendigheden af at underst\u00f8tte s\u00e5 mange metoder til metricsindsamling som muligt fra starten. Fra fil\u00adl\u00e6sning og polling af Prometheus-endpoints til brug af specifikke applikationsprotokoller.<\/p>\n<p>Og den sidste aspekt er n\u00f8dvendigheden af at minimere ressourcetr\u00e6k.<\/p>\n<p>Vi har valgt en open-source l\u00f8sning skrevet i Go kaldet Telegraf. Det er en alsidig connector, der underst\u00f8tter mere end 140 typer input-plugins og 30 typer output-plugins. Vi har tilpasset det, og nu vil vi vise, hvordan det bruges i vores eksempel med Kubernetes.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/9635d571c852e5f9358458874c58d7b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os sige, at en udvikler deployer belastningen, og Kubernetes modtager en anmodning om at oprette en pod. I det \u00f8jeblik oprettes der automatisk en container kaldet Collector for hver pod (vi bruger en mutation webhook). Collector er vores agent. Ved opstart konfigurerer denne container sig selv til at arbejde med Prometheus og logindsamlingssystemet.<\/p>\n<ul>\n<li>For dette bruger den pod-annoteringer, og afh\u00e6ngigt af indholdet opretter den for eksempel et end-point til Prometheus;\u00a0\n<\/li>\n<li>Baseret p\u00e5 pod-specifikationen og de specifikke indstillinger for containere beslutter den, hvordan logs skal leveres.\n<\/li>\n<\/ul>\n<p>\nVi indsamler logs via Docker API: udviklerne skal blot sende dem til stdout eller stderr, og s\u00e5 klarer Collector resten. Logs indsamles i chunks med en vis forsinkelse for at forhindre potentiel overbelastning af v\u00e6rten.\u00a0<\/p>\n<p>Metrics indsamles per instans af arbejdsbelastningen (processer) i containerne. Alt m\u00e6rkes med tags: namespace, pod osv., og konverteres derefter til Prometheus-format - og bliver tilg\u00e6ngeligt for indsamling (udover logs). Desuden sender vi logs, metrics og begivenheder til Kafka og videre:<\/p>\n<ul>\n<li>Logs er tilg\u00e6ngelige i Graylog (til visuel analyse);\n<\/li>\n<li>Logfiler, metrikker og begivenheder sendes til Clickhouse for langvarig opbevaring.\n<\/li>\n<\/ul>\n<p>\nDet fungerer p\u00e5 pr\u00e6cis samme m\u00e5de i AWS, hvor vi blot erstatter Graylog med Kafka med Cloudwatch. Vi sender logfiler derhen, og det er meget praktisk: det er straks klart, hvilket cluster og container de tilh\u00f8rer. Det samme g\u00e6lder for Google Stackdriver. Vores skema fungerer s\u00e5ledes b\u00e5de on-premise med Kafka og i skyen.\u00a0<\/p>\n<p>Hvis vi ikke har Kubernetes med pods, bliver skemaet en smule mere kompliceret, men det fungerer efter de samme principper.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsklare billeder til k8s\" src=\"\/wp-content\/uploads\/2020\/05\/dd8efb33c5c74433a2767cb00caeec2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInde i containeren k\u00f8rer de samme processer, som orkestreres ved hj\u00e6lp af S6. De samme processer er startet inde i \u00e9n container.<\/p>\n<h1>In the end,<\/h1>\n<p>\nVi har skabt en helhedsorienteret l\u00f8sning til opbygning og implementation af billeder, med indsamling og levering af logfiler og metrikker:<\/p>\n<ul>\n<li>Udviklet en standardiseret tilgang til opbygning af billeder, hvilket er grundlaget for CI-skabeloner;\n<\/li>\n<li>Agenter til dataindsamling er vores udvidelser af Telegraf. Vi har testet dem grundigt i produktion;\n<\/li>\n<li>Vi anvender mutation webhook til at implementere containere med agenter i pods;\u00a0\n<\/li>\n<li>Vi har integreret os i Kubernetes\/Ranchers \u00f8kosystem;\n<\/li>\n<li>Vi kan k\u00f8re ensartede containere i forskellige orkestreringssystemer og opn\u00e5 det \u00f8nskede resultat;\n<\/li>\n<li>Vi har skabt en fuldst\u00e6ndig dynamisk konfiguration til containerh\u00e5ndtering.\u00a0\n<\/li>\n<\/ul>\n<p>\nMedforfatter: <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.3 - 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\/da\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\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\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\/da\/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\udd47Produktionsegnede billeder til k8s | ProHoster","description":"Denne historie handler om, hvordan vi bruger containere i produktionsmilj\u00f8et, is\u00e6r under Kubernetes.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/production-ready-images-for-k8s","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\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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/81173","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=81173"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/81173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/81174"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=81173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=81173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=81173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}