{"id":1342549,"date":"2025-11-13T17:35:38","date_gmt":"2025-11-13T16:35:38","guid":{"rendered":"https:\/\/www.luklagroup.com\/sem-categoria\/uma-estrutura-basica-para-implantar-no-kubernetes\/"},"modified":"2026-01-21T14:50:49","modified_gmt":"2026-01-21T13:50:49","slug":"uma-estrutura-basica-para-implantar-no-kubernetes","status":"publish","type":"post","link":"https:\/\/www.luklagroup.com\/pt-pt\/web-marketing-pt-pt\/uma-estrutura-basica-para-implantar-no-kubernetes\/","title":{"rendered":"Uma estrutura b\u00e1sica para implantar no Kubernetes"},"content":{"rendered":"\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\n<p>J\u00e1 descobriste todas as funcionalidades oferecidas por Kubernetes e est\u00e1s convencido?  <br\/>\u00c9 exatamente o que precisas para o teu site!<br\/><br\/>Mas agora \u00e9 altura de come\u00e7ares. E por onde come\u00e7ar <strong>quando est\u00e1s a come\u00e7ar do zero<\/strong>? Neste artigo, propomos um fundamento b\u00e1sico que te permitir\u00e1 come\u00e7ar com tranquilidade, com uma solu\u00e7\u00e3o estruturada, leg\u00edvel e, portanto, f\u00e1cil de manter. Aten\u00e7\u00e3o: para seguires este artigo corretamente e, sobretudo, para implementares esta proposta, recomenda-se que tenhas um bom conhecimento dos conceitos b\u00e1sicos de Kubernetes.   <\/p>\n\n\n\n<p><\/p>\n<\/div>\n\n<h1 class=\"wp-block-heading\"><a href=\"#les-outils-de-base\"><\/a><strong><em>Ferramentas b\u00e1sicas<\/em><\/strong><\/h1>\n\n<p>Antes de mais, eis as principais ferramentas que vamos utilizar:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>kubectl<\/li>\n\n\n\n<li>leme (segredos\/difus\u00e3o)<\/li>\n\n\n\n<li>sopas<\/li>\n\n\n\n<li>helmfile<\/li>\n\n\n\n<li>git<\/li>\n<\/ul>\n\n<p>Para versionar facilmente as tuas configura\u00e7\u00f5es e acompanhar as nossas implementa\u00e7\u00f5es, usamos <strong>helmfile<\/strong> que, tal como o docker compose, te permite <strong>declarar ambientes<\/strong>. \u00c9 muito mais simples do que reescrever todos os comandos helm do zero (reespecificando o namespace, o ficheiro de valores, etc.)! <\/p>\n\n<h1 class=\"wp-block-heading\"><a href=\"#architecture\"><\/a><strong><em>Arquitetura<\/em><\/strong><\/h1>\n\n<p>Com o kubernetes, quando come\u00e7as com um cluster &#8220;vazio&#8221;, existem basicamente apenas os pods utilizados para executar os n\u00f3s, todos em <strong>namespaces kube-*<\/strong>.<\/p>\n\n<p>Para organizar corretamente os nossos recursos, utilizaremos v\u00e1rios espa\u00e7os de nomes, como <code>reverse-proxy<\/code>, <code>monitoring<\/code>, <code>logging<\/code>&#8230; Isto permitir-nos-\u00e1 conceder facilmente direitos mais detalhados aos utilizadores ligados ao cluster. <\/p>\n\n<p>Por isso, temos de come\u00e7ar por dividir as nossas configura\u00e7\u00f5es em v\u00e1rios reposit\u00f3rios git:<\/p>\n\n<ul class=\"wp-block-list\">\n<li><strong>Kubernetes Common<\/strong>:<br\/>Permite a instancia\u00e7\u00e3o de elementos que devem ser \u00fanicos para todo o cluster. Estes incluem o painel de controlo do Kubernetes, o proxy inverso, a monitoriza\u00e7\u00e3o, etc. <\/li>\n\n\n\n<li><strong>Kubernetes your-site deployments<\/strong>:<br\/>Cont\u00e9m tudo o que precisas para implementar os diferentes ambientes do teu site. Se quiseres entregar uma nova vers\u00e3o do teu site, isso acontecer\u00e1 atrav\u00e9s de um commit para este reposit\u00f3rio. <\/li>\n\n\n\n<li><strong>Frontend do Helm Chart<\/strong>:<br\/>Define todos os componentes necess\u00e1rios para implementar o teu s\u00edtio. Estes podem ser <code>deployments<\/code>, <code>services<\/code>, <code>secrets<\/code>&#8230; <\/li>\n\n\n\n<li><strong>Helm Chart xxx<\/strong>:<br\/>Todos os teus outros gr\u00e1ficos personalizados, como um api ou outro&#8230;<\/li>\n<\/ul>\n\n<h1 class=\"wp-block-heading\"><a href=\"#%C3%A0-quoi-%C3%A7a-ressemble-\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><strong><em>O que \u00e9 que te parece?<\/em><\/strong><\/h1>\n\n<h2 class=\"wp-block-heading\"><a href=\"#kubernetes-common\"><\/a>Kubernetes comum<\/h2>\n\n<p>Come\u00e7amos com um ficheiro <code>helmfile.yaml<\/code> que ir\u00e1 conter a lista dos nossos lan\u00e7amentos helm. e.g. : <\/p>\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\nliberta:\n  - nome: traefik\n  gr\u00e1fico: traefik\/traefik\n  vers\u00e3o: x.x.x\n  namespace: reverse-proxy\n  segredos:\n  - .\/traefik.values.encrypted.yml\n\n  - nome: cert-manager\n  gr\u00e1fico: jetstack\/cert-manager\n  vers\u00e3o: x.x.x\n  namespace: reverse-proxy\n  valores:\n  - .\/cert-manager.values.yml\n<\/pre><\/div>\n<pre id=\"code-135\" class=\"wp-block-code\"><code><\/code><\/pre>\n\n<p><code>cert-manager.yaml<\/code><\/p>\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\ncrds:\n  ativado: verdadeiro\n  mant\u00e9m: verdadeiro\n<\/pre><\/div>\n<p>Depois de termos configurado os nossos valores para as v\u00e1rias ferramentas, s\u00f3 nos resta executar o comando <code>helmfile apply<\/code>.<\/p>\n\n<p>Por vezes \u00e9 necess\u00e1rio incluir dados sens\u00edveis em ficheiros de valor, como uma chave privada. Estes ficheiros podem, portanto, ser encriptados usando <a href=\"https:\/\/github.com\/getsops\/sops\" rel=\"noreferrer noopener\" target=\"_blank\">sops<\/a> e <a href=\"https:\/\/github.com\/jkroepke\/helm-secrets\" rel=\"noreferrer noopener\" target=\"_blank\">helm secrets<\/a>, o que permitir\u00e1 ao helm desencriptar os ficheiros antes de os aplicar. <\/p>\n\n<h2 class=\"wp-block-heading\"><a href=\"#kubernetes-votre-site-deployments\"><\/a><strong><em>Implementa\u00e7\u00f5es Kubernetes no teu local<\/em><\/strong><\/h2>\n\n<p>Este ficheiro ser\u00e1 diferente do comum, porque ter\u00e1 uma dimens\u00e3o extra: <strong>o ambiente<\/strong>.<\/p>\n\n<p><code>helmfile.yaml<\/code><\/p>\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\nambientes:\n  preprod: {}\n  prod: {}\n\nreposit\u00f3rios:\n  - nome: ma-stack\n  url: https:\/\/url-du-repo\n\nliberta:\n  - nome: frontend\n  gr\u00e1fico: ma-stack\/frontend\n  vers\u00e3o: 1.0.0\n  namespace: &quot;{{ .Environment.Name }}&quot;\n  segredos:\n  - .\/{{ .Environment.Name }}\/frontend.values.encrypted.yaml\n\n  - nome: api\n  gr\u00e1fico: ma-stack\/api\n  vers\u00e3o: 1.0.0\n  espa\u00e7o de nome: prod\n  segredos:\n  - .\/prod\/api.values.encrypted.yaml\n\n  - nome: api\n  gr\u00e1fico: ma-stack\/api\n  vers\u00e3o: 2.0.0\n  espa\u00e7o de nome: preprod\n  segredos:\n  - .\/preprod\/api.values.encrypted.yaml\n<\/pre><\/div>\n<p>Adicionando a no\u00e7\u00e3o de ambiente a este helmfile significa que uma vers\u00e3o espec\u00edfica pode ser implementada para cada ambiente.<\/p>\n\n<p>Neste exemplo, a vers\u00e3o 1.0.0 do gr\u00e1fico frontend \u00e9 implantada duas vezes: uma no ambiente prod e outra no ambiente preprod. A diferen\u00e7a pode estar no ficheiro de valores, que conter\u00e1 defini\u00e7\u00f5es diferentes consoante o ambiente de destino.<br\/>Por exemplo, nos ficheiros de valores, especificamos geralmente a etiqueta da imagem da doca implementada, o que, neste caso, significa que podem ser implementadas duas vers\u00f5es diferentes do site em cada ambiente. <\/p>\n\n<p>Relativamente \u00e0 API, esta tem uma <strong>nova vers\u00e3o do gr\u00e1fico<\/strong> em pr\u00e9-produ\u00e7\u00e3o. Isto permite-te adicionar um novo elemento kubernetes, como um novo <code>service<\/code> ou qualquer outra coisa&#8230; \u00c9 por isso que \u00e9 uma boa ideia extrair o gr\u00e1fico do teu front-end\/api para outro reposit\u00f3rio.  <\/p>\n\n<p>Depois de tudo isto, podemos aplicar esta configura\u00e7\u00e3o com <code>helmfile apply<\/code> e ela entrega todas as modifica\u00e7\u00f5es necess\u00e1rias em todos os ambientes!<\/p>\n\n<h1 class=\"wp-block-heading\"><a href=\"#ensuite-\"><\/a><strong><em>O que vais fazer a seguir?<\/em><\/strong><\/h1>\n\n<p>Com esta distribui\u00e7\u00e3o entre diferentes projectos, resta apenas implementar o CD.<br\/>A implementa\u00e7\u00e3o da configura\u00e7\u00e3o pode assim ser autom\u00e1tica e os nossos reposit\u00f3rios ser\u00e3o a fonte de verdade para o estado do teu cluster.<br\/>Na tua cadeia de integra\u00e7\u00e3o, a atualiza\u00e7\u00e3o de uma aplica\u00e7\u00e3o consistir\u00e1 em fazer o commit nestes reposit\u00f3rios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J\u00e1 descobriste todas as funcionalidades oferecidas por Kubernetes e est\u00e1s convencido? \u00c9 exatamente o que precisas para o teu site! Mas agora \u00e9 altura de come\u00e7ares. E por onde come\u00e7ar quando est\u00e1s a come\u00e7ar do zero? Neste artigo, propomos um fundamento b\u00e1sico que te permitir\u00e1 come\u00e7ar com tranquilidade, com uma solu\u00e7\u00e3o estruturada, leg\u00edvel e, portanto, [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":1016889,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"Come\u00e7ar a utilizar o Kubernetes: estrutura, ferramentas e implementa\u00e7\u00e3o","_seopress_titles_desc":"Descobre como estruturar os teus projectos e implementar serenamente com Kubernetes gra\u00e7as a uma arquitetura clara, ferramentas-chave e exemplos concretos.","_seopress_robots_index":"","footnotes":""},"categories":[183,182],"tags":[286,285,284],"class_list":{"0":"post-1342549","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-apps-data-pt-pt","8":"category-web-marketing-pt-pt","9":"tag-arquitetura","10":"tag-codigo","11":"tag-kubernetes-pt-pt"},"_links":{"self":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/1342549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=1342549"}],"version-history":[{"count":1,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/1342549\/revisions"}],"predecessor-version":[{"id":1342591,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/1342549\/revisions\/1342591"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/media\/1016889"}],"wp:attachment":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=1342549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=1342549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=1342549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}