{"id":24418,"date":"2026-09-16T11:48:08","date_gmt":"2026-09-16T11:48:08","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/"},"modified":"2026-09-16T11:48:08","modified_gmt":"2026-09-16T11:48:08","slug":"entwicklungsumgebungen-mit-kubernetes-erstellen-devgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/","title":{"rendered":"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Als wir das erste Mal vor der Herausforderung standen, lokale Entwicklungsumgebungen zu erstellen, griffen wir auf g\u00e4ngige Tools wie Vagrant zur\u00fcck. Aber wie bei den meisten mit Vagrant erstellten Umgebungen sind die Build-Zeiten lang. Das bedeutet, dass Vagrant-Bilder lange leben und dazu neigen, mit der Zeit abzuweichen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unsere Dienste und Infrastruktur \u00e4ndern sich st\u00e4ndig, daher schlug der Vagrant-Build fast immer fehl. Wir wollten das klassische \u201eAufnahmeritual f\u00fcr neues Entwicklungspersonal\u201c vermeiden, bei dem es leicht Tage dauert, bis Vagrant erfolgreich eine neue Entwicklungs-VM aufgebaut hat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Idealfall k\u00f6nnen neue Teammitglieder schon wenige Stunden nach ihrer Einstellung produktiv arbeiten, nicht erst nach Tagen oder Wochen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All dies wurde durch die Tatsache erschwert, dass wir viele Microservices haben, die in der Entwicklungsumgebung laufen und sich nahtlos integrieren m\u00fcssen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Die Projektziele waren einfach:<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine Entwicklungsumgebung schnell und reproduzierbar einrichten und abbauen.<\/li>\n\n\n\n<li>Einrichtung und Abbau der Entwicklungsumgebung in einem einzigen Schritt.<\/li>\n\n\n\n<li>Dienste einschlie\u00dflich ihrer Abh\u00e4ngigkeiten nach Belieben starten und stoppen.<\/li>\n<\/ul>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-9172\"><p class=\"h5 m-0\" id=\"toc-title-9172\">Inhaltsverzeichnis<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#evaluierung-von-orchestrierungsplattformen\">Evaluierung von Orchestrierungsplattformen<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#eine-cli-entwickeln\">Eine CLI entwickeln<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#verwaltung-von-benutzerdefinierten-und-drittanbieter-diensten-mit-einer-spezifikation\">Verwaltung von benutzerdefinierten und Drittanbieter-Diensten mit einer Spezifikation<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#wie-es-weitergeht-zukuenftige-arbeit\">Wie es weitergeht \u2026 zuk\u00fcnftige Arbeit<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Evaluierung von Orchestrierungsplattformen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da unsere Microservices bereits in Containern liefen, war uns klar, dass wir uns f\u00fcr ein Orchestrierungssystem entscheiden mussten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Einige Leute in unserem Entwicklungsteam interessierten sich f\u00fcr\u00a0<a href=\"https:\/\/mesosphere.github.io\/marathon\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mesos Marathon<\/a>, also testeten wir das zuerst. Leider waren die Speicher- und Hardwareanforderungen, um Marathon in einer kleinen lokalen Entwicklungsumgebung auszuf\u00fchren, f\u00fcr unsere Zwecke viel zu restriktiv. Zum Zeitpunkt unserer Tests war Minimesos au\u00dferdem nicht in der Lage, Container in Marathon korrekt mit dem lokalen Netzwerk zu vernetzen\u00a0\u2013 ein gro\u00dfes Hindernis f\u00fcr unser Projekt. <b>Diese Probleme machten deutlich, dass Mesos f\u00fcr unsere Anforderungen ungeeignet sein w\u00fcrde.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als N\u00e4chstes evaluierten wir Kubernetes und\u00a0<a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Minikube<\/a>\u00a0, da uns die lebendige Community rund um diese Projekte begeisterte. Wir stellten fest, dass der Speicherbedarf minimal war und die Vernetzung reibungslos funktionierte. Die meisten Funktionen, die uns interessierten, funktionierten auf Anhieb, und unsere Drittanbieter-Anwendungen in Minikube zum Laufen zu bringen, erwies sich als einfacher als gedacht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit Minikube als Plattform unserer Wahl konnten wir das Projekt schnell vorantreiben und die meiste Zeit in die Entwicklung dessen investieren, was sp\u00e4ter Devgun werden sollte.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eine CLI entwickeln<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um unsere Projektziele zu erreichen, beschlossen wir, eine All-in-One-Befehlszeilenschnittstelle in Golang zu entwickeln. Wir wollten eine CLI, die als einzelne Bin\u00e4rdatei an unser Entwicklungsteam verteilt werden konnte. Deshalb haben wir eine mit dem Namen Devgun erstellt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4854\" width=\"800\" height=\"458\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun.jpg\" alt=\"Minikube and Mailgun logos with plus symbol in between\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun.jpg 800w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun-300x172.jpg 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun-768x440.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Devgun trifft keine Annahmen \u00fcber die Entwicklungsumgebung. Es l\u00e4dt automatisch alle ben\u00f6tigten Tools, einschlie\u00dflich Minikube, kubectl und Mailgun-spezifischer Tools, in das Verzeichnis\u00a0<code>\/.devgun\/bin<\/code>\u00a0herunter. <b>Alles, was Sie tun m\u00fcssen, ist Ihren Pfad hinzuzuf\u00fcgen, nachdem die anf\u00e4ngliche Einrichtung abgeschlossen ist. Da alles in einem einzigen Verzeichnis installiert wird, ist die Deinstallation so einfach wie\u00a0<\/b><b><code>rm -rf ~\/devgun<\/code><\/b><b>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir haben alle Kubernetes-Manifestdateien mithilfe des\u00a0<a href=\"http:\/\/github.com\/tmthrgd\/go-bindata\" target=\"_tabs\" rel=\"noopener noreferrer\">go-bindata-Projekts<\/a>\u00a0in die statische Bin\u00e4rdatei kompiliert, was das Herunterladen und Ausf\u00fchren einer einzigen Datei zur Installation einer Entwicklungsumgebung erm\u00f6glicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Ausf\u00fchrung von Devgun sieht wie folgt aus:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    $ devgun startrnPulling kubectl                              [done]  rnPulling minikube                             [done]  rnWriting Minikube configuration               [done after 0.702698 seconds]  rnBooting Minikube environment                 [done after 77.297039 seconds]  rnWaiting for Kubernetes..                     [done]  rnINFO[0148] Setting up minikube routes -- enter your sudo password if prompted  rnModifying routes                             [done after 0.012867 seconds]  rnAdding kube-dns resolver entry               [done after 0.002070 seconds]  rnApplying kube-dns-external configuration     [done after 0.212881 seconds]  rnEnabling Heapster                            [done after 37.506335 seconds]  rn========================================================rnMinikube is now configured and running....rnrn# Set up path for our bin directory with dev toolsrnexport PATH=&quot;$PATH:\/Users\/thrawn\/.devgun\/bin&quot;rnrnNext you should choose a mailgun service to start using &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;devgun service start&lt;\/code&gt;rnrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;devgun service list&lt;\/code&gt; to see a list of services to startrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;devgun service start&lt;\/code&gt; to start a service and its dependenciesrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;kubectl get pods&lt;\/code&gt; to list running podsrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;kubectl describe pod &lt;pod-name&gt;&lt;\/code&gt; to inspect a pod and see the pod logrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;kubectl log &lt;pod-name&gt;&lt;\/code&gt; to see the container logsrn========================================================rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Zus\u00e4tzlich zur Erstellung einer Kubernetes-Umgebung f\u00fcgt Devgun dem lokalen Rechner auch einige Netzwerkrouten hinzu. Unter OS X werden beispielsweise die folgenden Routen hinzugef\u00fcgt:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>route -n add 172.17.0.0\/16 <br>\nroute -n add 10.0.0.0\/24   <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dies erm\u00f6glicht es unserem Entwicklungsteam, Anwendungen auf ihren lokalen Rechnern mit vollst\u00e4ndiger Konnektivit\u00e4t zu Containern im k8-Cluster auszuf\u00fchren und zu testen, als ob sie selbst im Cluster liefen. Wir erm\u00f6glichen au\u00dferdem DNS-Lookups, indem wir die in OS X integrierte Resolver-Funktionalit\u00e4t nutzen. Wir erstellen\u00a0<code>\/etc\/resolver\/local<\/code>\u00a0mit dem folgenden Inhalt:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>search cluster.local svc.cluster.local default.svc.cluster.local<br>\nnameserver 172.17.0.3  <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dadurch wird die DNS-Aufl\u00f6sung von Kubernetes-Diensten erm\u00f6glicht.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    $ devgun service start etcdrnStarting service: etcd                       [done after 7.084730 seconds]rnrn$ ping etcdrnPING etcd.default.svc.cluster.local (172.17.0.4): 56 data bytes  rn64 bytes from 172.17.0.4: icmp_seq=0 ttl=63 time=0.220 ms  rn^Crn--- etcd.default.svc.cluster.local ping statistics ---rn1 packets transmitted, 1 packets received, 0.0% packet loss  rnround-trip min\/avg\/max\/stddev = 0.220\/0.220\/0.220\/0.000 ms  \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Verwaltung von benutzerdefinierten und Drittanbieter-Diensten mit einer Spezifikation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da Devgun eine Mischung aus benutzerdefinierten und Drittanbieter-Diensten verwalten muss, haben wir eine spezielle YAML-Spezifikationsdatei entwickelt, die wir f\u00fcr jeden Dienst definieren. Die Spezifikationsdatei sieht in etwa so aus:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    ervice:  rn  name: scoutrn  resources:rn    &lt;&lt;: *k8s_deploy_resourcesrn  depends_on:rn  - name: vulcandrn  - name: cassandrarn  - name: kafka-pixyrn  - name: kafkarn  - name: etcdrn  - name: metricsrn  hooks:rn    pre:rn      start:rn        - exec: &gt;rn            cqlsh -e &quot;CREATE KEYSPACE IF NOT EXISTS scout WITH REPLICATION={&#039;class&#039;:&#039;SimpleStrategy&#039;,&#039;replication_factor&#039;:1}&quot; $POD_IPrn          where: service:cassandra:cassandra\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Sie definiert einen benutzerdefinierten Dienst namens \u201escout\u201c, der Ereignisse aus Kafka liest und Analysen \u00fcber die Ereignisse in Cassandra aufzeichnet. Die Spezifikation teilt Devgun mit, von welchen benutzerdefinierten und Drittanbieter-Diensten er abh\u00e4ngt und <b>welche Hooks auf den verschiedenen Containern ausgef\u00fchrt werden sollen, bevor der Scout-Dienst gestartet wird.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Schl\u00fcssel\u00a0<code>resources<\/code>\u00a0verweist auf die Kubernetes-Manifestdateien wie ConfigMaps, Deployments und Dienstbeschreibungen, die an anderer Stelle in der Spezifikationsdatei definiert sind und die Devgun verwendet, um die Container in K8 zu starten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wie es weitergeht \u2026 zuk\u00fcnftige Arbeit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Als wir Devgun entwarfen, begannen wir von unten nach oben, ohne die gr\u00f6\u00dferen Entwicklungs- und Bereitstellungsszenarien zu ber\u00fccksichtigen. Nachdem wir nun Zeit hatten, Devgun zu nutzen, fragen wir uns, ob wir die Abstraktionen richtig gew\u00e4hlt haben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir begannen, uns Fragen zu stellen: Welche Erfahrung m\u00f6chten wir unserem Entwicklungsteam bieten, wenn es sich daransetzt, einen neuen Dienst zu erstellen und bereitzustellen? Wo enden die Zust\u00e4ndigkeiten des Entwicklungsteams und wo beginnen die Aufgaben des Betriebs? Wie viel des Betriebs k\u00f6nnen wir automatisieren und wie viel erfordert menschliches Eingreifen? Wie erleichtern wir die Informationsweitergabe zwischen der Entwicklung und dem Betrieb?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir haben damit begonnen, User Stories und Personas zu definieren, die beeinflussen werden, <b>wie sich Devgun in Zukunft weiterentwickelt<\/b>. In meinem n\u00e4chsten Beitrag werde ich einige unserer Arbeiten und Gedanken dazu teilen, wie sich die Developer Experience weiterentwickeln k\u00f6nnte, w\u00e4hrend wir weiterhin mit Kubernetes und Devgun arbeiten. Abonnieren Sie unseren Blog, damit Sie nichts verpassen.<\/p>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_ab9535e91794efd29c639e104efd0c1c\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Registrieren            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_ab9535e91794efd29c639e104efd0c1c\">\r\n                Loslegen ist ganz einfach. Und es ist kostenlos.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Erfahren Sie, was Sie mit der weltbesten Plattform f\u00fcr E-Mail-Zustellung alles erreichen k\u00f6nnen.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Als wir das erste Mal vor der Herausforderung standen, lokale Entwicklungsumgebungen zu erstellen, griffen wir auf g\u00e4ngige Tools wie Vagrant zur\u00fcck. Aber wie bei den meisten mit Vagrant erstellten Umgebungen sind die Build-Zeiten lang. Das bedeutet, dass Vagrant-Bilder lange leben und dazu neigen, mit der Zeit abzuweichen.<\/p>\n","protected":false},"author":35,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-24418","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-it-and-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Devgun: Entwicklungsumgebungen mit Kubernetes erstellen - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Zun\u00e4chst gingen wir das Problem der Erstellung lokaler Entwicklungsumgebungen an, indem wir auf g\u00e4ngige Tools zur\u00fcckgriffen, aber f\u00fcr unsere Projektanforderungen stellten wir fest, dass Kubernetes besser geeignet war.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Zun\u00e4chst gingen wir das Problem der Erstellung lokaler Entwicklungsumgebungen an, indem wir auf g\u00e4ngige Tools zur\u00fcckgriffen, aber f\u00fcr unsere Projektanforderungen stellten wir fest, dass Kubernetes besser geeignet war.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/\",\"name\":\"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T11:48:08+00:00\",\"description\":\"Zun\u00e4chst gingen wir das Problem der Erstellung lokaler Entwicklungsumgebungen an, indem wir auf g\u00e4ngige Tools zur\u00fcckgriffen, aber f\u00fcr unsere Projektanforderungen stellten wir fest, dass Kubernetes besser geeignet war.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/it-and-engineering\\\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen - Transactional Email API Service For Developers | Mailgun","description":"Zun\u00e4chst gingen wir das Problem der Erstellung lokaler Entwicklungsumgebungen an, indem wir auf g\u00e4ngige Tools zur\u00fcckgriffen, aber f\u00fcr unsere Projektanforderungen stellten wir fest, dass Kubernetes besser geeignet war.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/","og_locale":"de_DE","og_type":"article","og_title":"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen - Transactional Email API Service For Developers | Mailgun","og_description":"Zun\u00e4chst gingen wir das Problem der Erstellung lokaler Entwicklungsumgebungen an, indem wir auf g\u00e4ngige Tools zur\u00fcckgriffen, aber f\u00fcr unsere Projektanforderungen stellten wir fest, dass Kubernetes besser geeignet war.","og_url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/","url":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/","name":"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T11:48:08+00:00","description":"Zun\u00e4chst gingen wir das Problem der Erstellung lokaler Entwicklungsumgebungen an, indem wir auf g\u00e4ngige Tools zur\u00fcckgriffen, aber f\u00fcr unsere Projektanforderungen stellten wir fest, dass Kubernetes besser geeignet war.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/de\/blog\/it-and-engineering\/entwicklungsumgebungen-mit-kubernetes-erstellen-devgun\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"Devgun: Entwicklungsumgebungen mit Kubernetes erstellen"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/24418\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=24418"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=24418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}