{"id":24898,"date":"2026-09-16T17:52:56","date_gmt":"2026-09-16T17:52:56","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/"},"modified":"2026-09-16T17:52:56","modified_gmt":"2026-09-16T17:52:56","slug":"criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/","title":{"rendered":"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Quando come\u00e7amos a lidar com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais, recorremos a ferramentas comuns, como o vagrant. Mas, como na maioria dos ambientes criados no vagrant, os tempos de compila\u00e7\u00e3o s\u00e3o longos. Isso significa que as imagens do vagrant t\u00eam vida longa e tendem a divergir com o tempo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nossos servi\u00e7os e infraestrutura mudam constantemente, de forma que as compila\u00e7\u00f5es no vagrant estavam quase sempre com falhas. Quer\u00edamos evitar o tradicional &#8220;rito de passagem para novos membros da equipe de desenvolvimento&#8221;, que muitas vezes implica dias de trabalho at\u00e9 conseguir que o vagrant crie uma nova VM de desenvolvimento com sucesso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Idealmente, profissionais rec\u00e9m-contratados podem ser produtivos poucas horas ap\u00f3s a contrata\u00e7\u00e3o, e n\u00e3o ap\u00f3s dias ou semanas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tudo isso era agravado pelo fato de termos muitos microsservi\u00e7os que precisavam rodar no ambiente de desenvolvimento de forma perfeitamente integrada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Os objetivos do projeto eram simples:<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configurar e destruir um ambiente de desenvolvimento rapidamente e de forma reprodut\u00edvel.<\/li>\n\n\n\n<li>Configura\u00e7\u00e3o e desmontagem do ambiente de desenvolvimento em uma \u00fanica etapa.<\/li>\n\n\n\n<li>Iniciar e interromper servi\u00e7os, incluindo suas depend\u00eancias, de acordo com a necessidade.<\/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-1792\"><p class=\"h5 m-0\" id=\"toc-title-1792\">\u00cdndice<\/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=\"#avaliacao-de-plataformas-de-orquestracao\">Avalia\u00e7\u00e3o de plataformas de orquestra\u00e7\u00e3o<\/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=\"#criacao-de-uma-cli\">Cria\u00e7\u00e3o de uma CLI<\/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=\"#gerenciamento-de-servicos-personalizados-e-de-terceiros-com-uma-especificacao\">Gerenciamento de servi\u00e7os personalizados e de terceiros com uma especifica\u00e7\u00e3o<\/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=\"#os-proximos-passos-planos-futuros\">Os pr\u00f3ximos passos\u2026 planos futuros<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Avalia\u00e7\u00e3o de plataformas de orquestra\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como nossos microsservi\u00e7os j\u00e1 estavam rodando em cont\u00eaineres, sab\u00edamos que precisar\u00edamos escolher um sistema de orquestra\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e1rias pessoas da nossa equipe de desenvolvimento tinham interesse no\u00a0<a href=\"https:\/\/mesosphere.github.io\/marathon\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mesos Marathon<\/a>, ent\u00e3o o testamos primeiro. Infelizmente, os requisitos de hardware e mem\u00f3ria necess\u00e1rios para rodar o marathon em um ambiente de desenvolvimento local pequeno eram muito restritivos para os nossos prop\u00f3sitos. Na \u00e9poca em que testamos, o minimesos tamb\u00e9m n\u00e3o conseguia conectar corretamente os cont\u00eaineres do Marathon \u00e0 rede local \u2013 um grande obst\u00e1culo para o nosso projeto. <b>Esses problemas deixaram claro que o Mesos seria invi\u00e1vel para as nossas necessidades.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Em seguida, avaliamos o Kubernetes e o\u00a0<a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Minikube<\/a>\u00a0pois a comunidade ativa em torno desses projetos nos atraiu. Descobrimos que o consumo de mem\u00f3ria era m\u00ednimo e a rede funcionava perfeitamente. A maioria dos recursos do nosso interesse funcionou de imediato, e rodar nossos aplicativos de terceiros dentro do Minikube acabou sendo mais f\u00e1cil do que o esperado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Assim, com o Minikube como plataforma escolhida, conseguimos avan\u00e7ar r\u00e1pido com o projeto e passar a maior parte do nosso tempo desenvolvendo o que viria a ser o Devgun.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cria\u00e7\u00e3o de uma CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para alcan\u00e7ar os objetivos do nosso projeto, decidimos criar uma interface de linha de comando completa escrita em Golang. Quer\u00edamos uma CLI que pudesse ser distribu\u00edda \u00e0 nossa equipe de desenvolvimento como um \u00fanico bin\u00e1rio, ent\u00e3o criamos uma chamada Devgun.<\/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\">O Devgun n\u00e3o faz nenhuma suposi\u00e7\u00e3o sobre o ambiente de desenvolvimento. Ele baixa automaticamente todas as ferramentas exigidas, incluindo o Minikube, o kubectl e ferramentas espec\u00edficas do Mailgun, no diret\u00f3rio\u00a0<code>\/.devgun\/bin<\/code>. <b>Tudo o que voc\u00ea precisa fazer \u00e9 adicionar seu caminho ap\u00f3s a conclus\u00e3o da configura\u00e7\u00e3o inicial. A instala\u00e7\u00e3o de tudo em um \u00fanico diret\u00f3rio torna a desinstala\u00e7\u00e3o t\u00e3o simples quanto rodar\u00a0<\/b><b><code>rm -rf ~\/devgun<\/code><\/b><b>.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compilamos todos os arquivos de manifesto do kubernetes no bin\u00e1rio est\u00e1tico usando o\u00a0<a href=\"http:\/\/github.com\/tmthrgd\/go-bindata\" target=\"_tabs\" rel=\"noopener noreferrer\">projeto go-bindata<\/a>, permitindo baixar e executar um \u00fanico arquivo para instalar um ambiente de desenvolvimento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A execu\u00e7\u00e3o do Devgun fica assim:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Al\u00e9m de criar um ambiente no Kubernetes, o Devgun tamb\u00e9m adiciona algumas rotas de rede na m\u00e1quina local. Por exemplo, no OS X, as rotas a seguir s\u00e3o adicionadas:<\/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\">Isso permite que a nossa equipe de desenvolvimento rode e teste aplicativos nas suas m\u00e1quinas locais com conectividade total aos cont\u00eaineres no cluster k8, como se estivessem rodando no pr\u00f3prio cluster. N\u00f3s tamb\u00e9m habilitamos a pesquisa de DNS utilizando o recurso de resolu\u00e7\u00e3o integrado ao OS X. Criamos o\u00a0<code>\/etc\/resolver\/local<\/code>\u00a0com o seguinte conte\u00fado:<\/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\">Isso habilita a resolu\u00e7\u00e3o de DNS dos servi\u00e7os do kubernetes.<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Gerenciamento de servi\u00e7os personalizados e de terceiros com uma especifica\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como o Devgun precisa gerenciar uma mistura de servi\u00e7os personalizados e de terceiros, desenvolvemos um arquivo de especifica\u00e7\u00e3o customizado no formato yaml para definirmos cada servi\u00e7o. O arquivo de especifica\u00e7\u00e3o \u00e9 mais ou menos assim:<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Ele define um servi\u00e7o personalizado chamado &#8220;scout&#8221;, que l\u00ea os eventos do Kafka e grava an\u00e1lises sobre esses eventos no Cassandra. A especifica\u00e7\u00e3o diz ao devgun de quais servi\u00e7os personalizados e de terceiros ele depende e <b>quais ganchos devem rodar em cont\u00eaineres diferentes antes de iniciar o servi\u00e7o scout.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A chave\u00a0<code>resources<\/code>\u00a0faz refer\u00eancia aos arquivos de manifesto do kubernetes, como mapas de configura\u00e7\u00e3o, implementa\u00e7\u00f5es e descri\u00e7\u00f5es de servi\u00e7o, definidos em outras partes do arquivo de especifica\u00e7\u00e3o e usados pelo devgun para iniciar os cont\u00eaineres no K8.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Os pr\u00f3ximos passos\u2026 planos futuros<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quando criamos o Devgun, come\u00e7amos de baixo para cima, sem considerar o contexto mais amplo das hist\u00f3rias de desenvolvimento e implementa\u00e7\u00e3o. Agora que tivemos tempo de usar o Devgun, estamos nos perguntando se acertamos nas abstra\u00e7\u00f5es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come\u00e7amos a nos questionar: qual \u00e9 a experi\u00eancia que queremos proporcionar \u00e0 nossa equipe de desenvolvimento na hora de criar e implementar um novo servi\u00e7o? Onde terminam as responsabilidades da equipe de desenvolvimento e come\u00e7am as da equipe de opera\u00e7\u00f5es? O quanto das opera\u00e7\u00f5es podemos automatizar e o quanto exige intera\u00e7\u00e3o humana? Como podemos facilitar o repasse de informa\u00e7\u00f5es entre a equipe de desenvolvimento e a de opera\u00e7\u00f5es?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come\u00e7amos a definir hist\u00f3rias e personas que v\u00e3o moldar <b>como o Devgun evoluir\u00e1 de agora em diante<\/b>. Na minha pr\u00f3xima publica\u00e7\u00e3o, vou compartilhar um pouco do nosso trabalho e de nossas ideias sobre como a experi\u00eancia de desenvolvimento pode evoluir \u00e0 medida que continuarmos nosso trabalho com o Kubernetes e o Devgun. N\u00e3o deixe de assinar nosso blog para n\u00e3o perder nada.<\/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_9f29b602aa9b0151c7a84bc85d1c77e3\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Cadastre-se            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_9f29b602aa9b0151c7a84bc85d1c77e3\">\r\n                \u00c9 f\u00e1cil come\u00e7ar. E \u00e9 gr\u00e1tis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Veja o que voc\u00ea pode alcan\u00e7ar com a melhor plataforma de entrega de e-mail do mundo.<\/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>Quando come\u00e7amos a lidar com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais, recorremos a ferramentas comuns, como o vagrant. Mas, como na maioria dos ambientes criados no vagrant, os tempos de compila\u00e7\u00e3o s\u00e3o longos. Isso significa que as imagens do vagrant t\u00eam vida longa e tendem a divergir com o tempo.<\/p>\n","protected":false},"author":35,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-24898","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: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"No come\u00e7o, lidamos com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais recorrendo a ferramentas comuns, mas logo notamos que o Kubernetes era muito mais adequado para as necessidades do nosso projeto.\" \/>\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\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"No come\u00e7o, lidamos com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais recorrendo a ferramentas comuns, mas logo notamos que o Kubernetes era muito mais adequado para as necessidades do nosso projeto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-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 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\\\/\",\"name\":\"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T17:52:56+00:00\",\"description\":\"No come\u00e7o, lidamos com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais recorrendo a ferramentas comuns, mas logo notamos que o Kubernetes era muito mais adequado para as necessidades do nosso projeto.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-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\\\/pt\\\/blog\\\/it-and-engineering\\\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/inicio\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/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\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes - Transactional Email API Service For Developers | Mailgun","description":"No come\u00e7o, lidamos com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais recorrendo a ferramentas comuns, mas logo notamos que o Kubernetes era muito mais adequado para as necessidades do nosso projeto.","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\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/","og_locale":"pt_BR","og_type":"article","og_title":"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes - Transactional Email API Service For Developers | Mailgun","og_description":"No come\u00e7o, lidamos com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais recorrendo a ferramentas comuns, mas logo notamos que o Kubernetes era muito mais adequado para as necessidades do nosso projeto.","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-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 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/","name":"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T17:52:56+00:00","description":"No come\u00e7o, lidamos com o problema da cria\u00e7\u00e3o de ambientes de desenvolvimento locais recorrendo a ferramentas comuns, mas logo notamos que o Kubernetes era muito mais adequado para as necessidades do nosso projeto.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-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\/pt\/blog\/it-and-engineering\/criacao-de-ambientes-de-desenvolvimento-com-kubernetes-devgun\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/pt\/inicio\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Devgun: cria\u00e7\u00e3o de ambientes de desenvolvimento com Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/pt\/#website","url":"https:\/\/www.mailgun.com\/pt\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!","publisher":{"@id":"https:\/\/www.mailgun.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/pt\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/#\/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\/pt\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/24898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/24898\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=24898"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=24898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}