<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Kubernetes - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Kubernetes - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 13:53:50 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/kubernetes/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ O que é um Helm Chart? Um tutorial para iniciantes no Kubernetes ]]>
                </title>
                <description>
                    <![CDATA[ O Kubernetes [https://azure.microsoft.com/pt-br/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan]  é uma ferramenta muito útil para desenvolvedores nativos da nuvem. No entanto, por si só, ele não abrange todos os aspectos – existem algumas coisas que o Kubernetes não consegue resolver ou que estão fora de seu escopo. Essa é uma das razões pelas quais os ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-um-helm-chart-um-tutorial-para-iniciantes-no-kubernetes/</link>
                <guid isPermaLink="false">64fbd71c7a00f703f731d3cb</guid>
                
                    <category>
                        <![CDATA[ Kubernetes ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ana Laura Reis ]]>
                </dc:creator>
                <pubDate>Tue, 16 Apr 2024 21:57:23 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/604640a8a7946308b768453d.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-is-a-helm-chart-tutorial-for-kubernetes-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is a Helm Chart? A Tutorial for Kubernetes Beginners</a>
      </p><p>O <a href="https://azure.microsoft.com/pt-br/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a> &nbsp;é uma ferramenta muito útil para desenvolvedores nativos da nuvem. No entanto, por si só, ele não abrange todos os aspectos – existem algumas coisas que o Kubernetes não consegue resolver ou que estão fora de seu escopo.</p><p>Essa é uma das razões pelas quais os projetos de código aberto são tão bons. Eles ajudam ferramentas incríveis a se tornarem ainda mais incríveis quando as combinamos com outras ferramentas incríveis de código aberto. Muitas vezes, essas ferramentas foram desenvolvidas com o único propósito de preencher lacunas. Uma dessas ferramentas é o Helm.</p><h2 id="o-que-o-helm"><strong>O que é o Helm?</strong></h2><p>O <a href="https://helm.sh/">Helm</a> é amplamente conhecido como o "gerenciador de pacotes do <a href="https://azure.microsoft.com/pt-br/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a>". Embora se apresente assim, seu funcionamento vai muito além de um simples gerenciador de pacotes. No entanto, vamos começar do início.</p><p>Helm é um projeto de código aberto que foi originalmente criado pela <a href="https://deislabs.io/">DeisLabs</a> e doado à <a href="https://azure.microsoft.com/blog/announcing-cncf/?WT.mc_id=containers-19838-ludossan">CNCF</a> (texto em inglês), que agora o mantém. O objetivo original do Helm era proporcionar aos usuários uma maneira melhor de gerenciar todos os arquivos YAML do <a href="https://azure.microsoft.com/pt-br/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a> que criamos em projetos no <a href="https://azure.microsoft.com/pt-br/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a>.</p><p>O caminho que o Helm seguiu para resolver esse problema foi criar Helm <a href="https://docs.microsoft.com/azure/aks/kubernetes-helm?WT.mc_id=containers-19838-ludossan"><strong><strong>Charts</strong></strong></a>. Cada <em>chart</em> (em português, algo como "gráfico") é um pacote com um ou mais arquivos de configuração do Kubernetes – um <em>chart</em> pode ter <em>charts</em> filhos e <em>charts</em> dependentes também.</p><p>Isso significa que o Helm instala toda a árvore de dependências de um projeto se você executar o comando de instalação para o <em>chart</em> de nível superior. Você precisa apenas de um único comando para instalar toda a sua aplicação, em vez de listar os arquivos para instalação via <code>kubectl</code>.</p><p>Os <em>charts</em> também permitem que você controle a versão dos arquivos de configuração, assim como fazemos com o Node.js ou qualquer outro pacote. Isso permite que você instale versões específicas do <em>chart</em>, o que significa manter configurações específicas para sua infraestrutura na forma de código.</p><p>O Helm também mantém todo o histórico de lançamento de todos os <em>charts</em>, para que você possa voltar para uma versão anterior se algo der errado.</p><p>O <a href="https://docs.microsoft.com/azure/aks/kubernetes-helm?WT.mc_id=containers-19838-ludossan">Helm</a> oferece suporte nativo ao <a href="https://azure.microsoft.com/services/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a>. Isso significa que você não precisa escrever nenhum arquivo de sintaxe complexa ou algo do tipo para começar a usar o Helm. Basta colocar seus arquivos de modelo em um novo <em>chart</em> e você está pronto para começar.</p><p>Porém, você pode se perguntar o porquê devemos usá-lo. Gerenciar manifestos de aplicações pode ser facilmente feito com algumas combinações de comandos.</p><h2 id="por-que-voc-deve-usar-o-helm">Por que você deve usar o Helm<strong>?</strong></h2><p>O Helm realmente se destaca onde o Kubernetes não consegue. Por exemplo, na criação de <em>templates</em>. <br>O escopo do projeto Kubernetes é lidar com seus contêineres para você, não com seus arquivos de <em>template</em> (em português, modelos).</p><p>Isso torna muito difícil a criação de arquivos verdadeiramente genéricos para serem usados por meio de uma grande equipe ou organização, com diferentes parâmetros que precisam ser definidos para cada arquivo.</p><p>Além disso, como você <em>versiona</em> informações sensíveis usando o Git quando os arquivos de modelo são texto simples?</p><p>A resposta: com os <em>templates</em>. O Helm permite que você adicione variáveis e use funções dentro de seus arquivos de modelo. Isso o torna perfeito para aplicações escaláveis que, em algum momento, precisarão ter seus parâmetros alterados. Vamos ver um exemplo:</p><p>Eu tenho um projeto de código aberto chamado <em>Zaqar</em>, um microsserviço de e-mail simples para Node.js, que se comunica com o SendGrid. O projeto é basicamente composto por um serviço, um <em>deployment</em> e um escalonamento automático.</p><p>Vamos pegar o arquivo de <em>deployment</em> como exemplo. Eu teria algo assim:</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: zaqar
  namespace: default
  labels:
    app: zaqar
    version: v1.0.0
    env: production
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zaqar
      env: production
  template:
    metadata:
      labels:
        app: zaqar
        version: v1.0.0
        env: production
    spec:
      containers:
        - name: zaqar
          image: "khaosdoctor/zaqar:v1.0.0"
          imagePullPolicy: IfNotPresent
          env:
            - name: SENDGRID_APIKEY
              value: "MY_SECRET_KEY"
            - name: DEFAULT_FROM_ADDRESS
              value: "my@email.com"
            - name: DEFAULT_FROM_NAME
              value: "Lucas Santos"
          ports:
            - name: http
              containerPort: 3000
              protocol: TCP
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi</code></pre><p>Se eu quiser usar esse modelo em um <em>pipeline</em> de integração contínua (CI) ou publicá-lo no meu GitHub, precisarei substituir as partes variáveis por marcadores de posição. Assim, podemos substituir esses textos pelas informações necessárias.</p><p>Nesse caso, tanto a tag da versão, a etiqueta de ambiente e as variáveis de ambiente seriam substituídas por marcadores de posição, como mostrado abaixo:</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: zaqar
  namespace: default
  labels:
    app: zaqar
    version: #!VERSION!#
    env: #!ENV!#
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zaqar
      env: #!ENV!#
  template:
    metadata:
      labels:
        app: zaqar
        version: #!VERSION!#
        env: #!ENV!#
    spec:
      containers:
        - name: zaqar
          image: "khaosdoctor/zaqar:#!VERSION!#"
          imagePullPolicy: IfNotPresent
          env:
            - name: SENDGRID_APIKEY
              value: "#!SENDGRID_KEY!#"
            - name: DEFAULT_FROM_ADDRESS
              value: "#!FROM_ADDR!#"
            - name: DEFAULT_FROM_NAME
              value: "#!FROM_NAME!#"
          ports:
            - name: http
              containerPort: 3000
              protocol: TCP
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi</code></pre><p>Agora podemos executar nosso <em>pipeline</em> de CI. Antes de fazer isso, contudo, precisamos substituir nossos marcadores de posição pelos valores reais.<br><br>Para isso, podemos usar o <code>sed</code> e sua sintaxe "super fácil" &nbsp;<code>sed</code> &nbsp;<code>s/#!PLACEHOLDER!#/substituicao/g</code> e aplicá-la até que tenhamos substituído todos os marcadores de posição. O comando final seria algo assim:</p><pre><code class="language-bash">cat deploy.yaml | \
    sed 's/#!ENV!#/production/g' | \
    sed 's/#!VERSION!#/v1.0.0/g' | \
    sed 's/#!SENDGRID_KEY!#/MyKey/g' | \
    sed 's/#!FROM_ADDR!#/my@email.com/g' | \
    sed 's/#!FROM_NAME!#/Lucas Santos/g'</code></pre><p>Por padrão, o <code>sed</code> imprime tudo no <code>stdout</code>. Então, podemos adicionar outro I para o <code>kubectl -f</code>, como <code>&lt;todo o comando anterior&gt; | kubectl -f -</code>. Desse modo, teremos nossa implantação no lugar. O único problema é que precisamos fazer o mesmo para todos os outros arquivos.</p><p>Agora, imagine um projeto maior, com muitas outras variáveis e marcadores de posição. Você provavelmente escreveria um script para fazer isso por você, não é mesmo? Esse script é o Helm.</p><p>Quando você cria um Chart (mais sobre isso posteriormente), temos uma árvore de diretórios específica que devemos seguir para que o Helm entenda o que queremos fazer. Dentro do diretório de modelos <code>templates</code>, podemos adicionar nossos arquivos de manifesto, com <code>go templating</code> nativo, assim</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.name }}
  namespace: {{ default .Release.Namespace .Values.namespace }}
  labels:
    app: {{ .Values.name }}
    version: {{ .Values.image.tag }}
    env: {{ .Values.env }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.name }}
      env: {{ .Values.env }}
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
        version: {{ .Values.image.tag }}
        env: {{ .Values.env }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "khaosdoctor/zaqar:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:
            - name: SENDGRID_APIKEY
              value: {{ required "You must set a valid Sendgrid API key" .Values.environment.SENDGRID_APIKEY | quote }}
            - name: DEFAULT_FROM_ADDRESS
              value: {{ required "You must set a default from address" .Values.environment.DEFAULT_FROM_ADDRESS | quote }}
            - name: DEFAULT_FROM_NAME
              value: {{ required "You must set a default from name" .Values.environment.DEFAULT_FROM_NAME | quote }}
          ports:
            - name: http
              containerPort: 3000
              protocol: TCP
          resources:
            {{- toYaml .Values.resources | nindent 12 }}</code></pre><p>Todos esses valores podem ser obtidos de um arquivo <code>Values.yaml</code> (para valores padrão), ou você pode defini-los na linha de comando usando a flag <code>--set &lt;caminho&gt; valor</code>. </p><p>Se queremos instalar nosso <em>chart</em>, podemos emitir o seguinte comando</p><pre><code class="language-bash">helm upgrade --install --create-namespace myChart ./path/to/my/chart \
  --set image.tag=v1.0.0 \
  --set env=production \
  --set environment.SENDGRID_APIKEY=myKey \
  --set environment.DEFAULT_FROM_ADDRESS="my@email.com" \
  --set environment.DEFAULT_FROM_NAME="Lucas Santos"</code></pre><p>O Helm também nos permite usar funções dentro de nossos <em>deployments</em>. Assim, podemos ter funções padrões para recorrer a valores padrões se não forem preenchidos, como o <em>namespace</em>. Também podemos ter a função <code>required</code>, que exibe uma mensagem e falha na instalação do Chart se o valor não for fornecido, como é o caso de nossas variáveis de ambiente.</p><p>Há muitas outras funções úteis na documentação deles – confira. </p><p>Agora, somos capazes de gerenciar não apenas de modo mais eficiente os recursos de nossa aplicação, mas também de publicar esses recursos em um sistema de controle de versão de código aberto sem nenhum problema ou questão de segurança.</p><h2 id="como-criar-um-helm-chart">Como criar um Helm Chart</h2><p></p><p>É bem fácil criar um <em>chart</em> no Helm. Primeiro, você precisa ter o Helm instalado. Em seguida, basta digitar <code>helm create &lt;nome do chart&gt;</code> e ele criará um diretório preenchido com arquivos e outros diretórios. Esses arquivos são necessários para que o Helm crie um <em>chart</em>.</p><p>Vamos dar uma olhada mais detalhada em como é essa árvore de diretórios e quais são os arquivos dentro dela:</p><ul><li><strong><strong>chart.yaml:</strong></strong> aqui é onde você colocará as informações relacionadas ao seu <em>chart</em>. Isso inclui a versão do <em>chart</em>, o nome e a descrição, para que você possa encontrá-lo se o publicar em um repositório aberto. Nesse arquivo, você também poderá definir <a href="https://helm.sh/docs/topics/charts/#chart-dependencies">dependências</a> externas usando a chave <code>dependencies</code> (documentação em inglês). </li><li><strong><strong>values.yaml</strong></strong>: como vimos antes, este é o arquivo que contém os valores padrão para as variáveis.</li><li><strong><strong>templates (dir):</strong></strong> esse é o local onde você colocará todos os seus arquivos de manifesto. Tudo aqui será passado e criado no Kubernetes.</li><li><strong><strong>charts:</strong></strong> se o seu <em>chart</em> depender de outro <em>chart</em> que você possui, ou se você não quiser depender da biblioteca padrão do Helm (o registro padrão de onde o Helm baixa os <em>charts</em>), você pode trazer essa mesma estrutura dentro desse diretório. As dependências do <em>chart</em> são instaladas de baixo para cima, o que significa que se o <em>chart</em> A depende do <em>chart</em> B, e B depende do C, a ordem de instalação será C -&gt; B -&gt; A.</li></ul><p>Há outros campos, mas estes são os mais comuns e são os obrigatórios. Você pode dar uma olhada rápida no <a href="https://github.com/khaosdoctor/zaqar/tree/master/helm">repositório do Zaqar</a> para ver como podemos publicar <em>charts</em> de código aberto.</p><p>Um aviso rápido: ao instalar o Helm, certifique-se de estar instalando a versão 3. A versão 2 ainda funciona, mas precisa de um componente do lado do servidor chamado Tiller, que vincula sua instalação do Helm a um único cluster. O Helm 3 removeu essa necessidade com a adição de vários CRDs, mas não é suportado em todas as versões do Kubernetes.</p><h2 id="como-hospedar-um-helm-chart">Como hospedar um Helm Chart</h2><p>Ok, você criou seu <em>chart</em>, e agora? Precisamos baixar o repositório inteiro para instalar esses <em>charts</em>? Não! O Helm tem uma biblioteca pública para os <em>charts</em> mais usados, que funciona de modo semelhante ao Docker Hub.</p><p>Você também pode criar seu próprio repositório de <em>charts</em> e <a href="https://helm.sh/docs/topics/chart_repository/">hospedá-lo on-line</a> (documentação em inglês). O Helm bebe da mesma fonte que o HomeBrew, ou o Linux. Você pode acessar esses repositórios para baixar os <em>charts</em> contidos neles.</p><p>Uma vez que um repositório de <em>charts</em> é basicamente um arquivo <code>index.yaml</code> servido a partir de um servidor da web estático, você pode praticamente criar um repositório de <em>charts</em> de qualquer lugar.</p><p>Vamos pegar o Zaqar, por exemplo – ele está hospedado no GitHub Pages e é acessível por meio do <a href="https://lsantos.me/zaqar/helm/index.yaml">meu domínio</a>. Quando o Helm procura por um arquivo <code>index.yaml</code>, na verdade está procurando a lista de versões disponíveis desse <em>chart</em>, seus resumos SHA256 e a localização do arquivo empacotado <code>.tgz</code> para baixar o próprio <em>chart</em>. Isso é mais ou menos o que o NPM faz nos bastidores (de modo bastante simplificado).</p><p>Isso significa que você não precisa ter seu repositório clonado para sempre, e seus <em>charts</em> podem ser privados também. Você só precisa criar um repositório de <em>charts</em>.</p><p>Você pode até mesmo usar <a href="https://learn.microsoft.com/pt-br/azure/container-registry/container-registry-helm-repos?WT.mc_id=containers-19838-ludossan">serviços hospedados como o Azure CR</a> para fazer o trabalho, ou você pode ter uma solução completa chamada <a href="https://github.com/helm/chartmuseum">Chart Museum</a>, que permite armazenar seus <em>charts</em> e oferece uma interface de usuário organizada.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>O Helm veio para ficar. Ele ajudou e continuará a ajudar muitos desenvolvedores do Kubernetes por muito tempo.</p><p>Se você quer saber como usar o Helm, pode consultar a <a href="https://helm.sh/">documentação</a> deles, ou pode fazer este <a href="https://learn.microsoft.com/pt-br/training/modules/aks-app-package-management-using-helm/?WT.mc_id=containers-19838-ludossan">módulo de aprendizagem gratuito</a> sobre como implantar suas aplicações no Kubernetes de maneira fácil com o Helm.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
