<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Natália Granato</title>
    <description>The latest articles on DEV Community by Natália Granato (@nataliagranato).</description>
    <link>https://dev.to/nataliagranato</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F643832%2Ffb966874-51a5-4145-a53c-62591bf8b536.jpg</url>
      <title>DEV Community: Natália Granato</title>
      <link>https://dev.to/nataliagranato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nataliagranato"/>
    <language>en</language>
    <item>
      <title>Build de Imagens no Kubernetes com Gitlab Runner e Kaniko</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 19 Jul 2024 19:19:30 +0000</pubDate>
      <link>https://dev.to/nataliagranato/build-de-imagens-no-kubernetes-com-gitlab-runner-e-kaniko-17e4</link>
      <guid>https://dev.to/nataliagranato/build-de-imagens-no-kubernetes-com-gitlab-runner-e-kaniko-17e4</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Gitlab Runner?
&lt;/h2&gt;

&lt;p&gt;O Gitlab Runner é uma aplicação de código aberto que executa os jobs definidos em seus pipelines do Gitlab CI/CD. Ele pode ser instalado em diferentes plataformas, incluindo máquinas virtuais, servidores bare-metal e Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Registro do Runner em seus projetos
&lt;/h2&gt;

&lt;p&gt;Após o deploy do Gitlab Runner no Kubernetes, você precisa registrar o runner em seus projetos para que ele possa executar os jobs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse a seção &lt;code&gt;Settings &amp;gt; CI/CD&lt;/code&gt; do seu projeto no Gitlab.&lt;/li&gt;
&lt;li&gt;Expanda a seção &lt;code&gt;Runners&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clique em &lt;code&gt;Register a runner&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copie o token de registro exibido.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute o seguinte comando no seu cluster Kubernetes, substituindo &lt;code&gt;YOUR_REGISTRATION_TOKEN&lt;/code&gt; pelo token copiado:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; gitlab-runner-gitlab-runner-XXXXX-XXXXX &lt;span class="nt"&gt;--&lt;/span&gt; gitlab-runner register &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--non-interactive&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; https://gitlab.example.com/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--registration-token&lt;/span&gt; YOUR_REGISTRATION_TOKEN &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--executor&lt;/span&gt; kubernetes
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deploy do Gitlab Runner no Kubernetes usando Helm
&lt;/h2&gt;

&lt;p&gt;Para instalar o Gitlab Runner no Kubernetes usando Helm, siga estes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Adicione o repositório do Helm:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add gitlab https://charts.gitlab.io/
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Atualize os repositórios:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo update
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Instale o Gitlab Runner:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;gitlab-runner gitlab/gitlab-runner &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;gitlabUrl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://gitlab.example.com/ &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;runnerRegistrationToken&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_REGISTRATION_TOKEN
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Substitua &lt;code&gt;https://gitlab.example.com/&lt;/code&gt; pela URL do seu Gitlab.&lt;br&gt;&lt;br&gt;
Substitua &lt;code&gt;YOUR_REGISTRATION_TOKEN&lt;/code&gt; pelo token de registro do runner, obtido na seção de CI/CD do seu projeto no Gitlab.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pontos de atenção no values.yaml
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  rules:
    - resources:
        - configmaps
        - pods
        - pods/attach
        - secrets
        - services
      verbs:
        - get
        - list
        - watch
        - create
        - patch
        - update
        - delete
    - apiGroups:
        - ''
      resources:
        - pods/exec
      verbs:
        - create
        - patch
        - delete
### 
runners:
  cache: {}
  config: |
    [[runners]]
      [runners.kubernetes]
        image = "ubuntu:20.04"
        wait_for_services_timeout = "-1"
        privileged = true
        allow_privilege_escalation = true
        image_pull_secrets = ["aws-ecr"]

  configPath: ''
  name: globalweb-gitlab-runner
  privileged: true
  runUntagged: true
  tags: docker, share_cache, share_cache1, amd64
secrets: []
securityContext:
  allowPrivilegeEscalation: false
  capabilities:
    drop:
      - ALL
  privileged: false
  readOnlyRootFilesystem: false
  runAsNonRoot: true
service:
  enabled: false
  type: ClusterIP
serviceAccount:
  annotations: {}
  imagePullSecrets: null
  name: null
sessionServer:
  enabled: false
shutdown_timeout: 0
strategy: {}
terminationGracePeriodSeconds: 3600
tolerations: null
topologySpreadConstraints: {}
useTini: false
volumeMounts: null
volumes: null
gitlabUrl: https://gitlab.com/
global:
  cattle:
    systemProjectId: p-mpfgv
runnerRegistrationToken: glrt-1234567891011121415
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Explicação do Arquivo de Configuração
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Regras (&lt;code&gt;rules&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Esta seção define permissões para acessar recursos do Kubernetes. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;resources&lt;/strong&gt;: Lista de recursos do Kubernetes que o runner pode acessar. Isso inclui &lt;code&gt;configmaps&lt;/code&gt;, &lt;code&gt;pods&lt;/code&gt;, &lt;code&gt;pods/attach&lt;/code&gt;, &lt;code&gt;secrets&lt;/code&gt;, e &lt;code&gt;services&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;verbs&lt;/strong&gt;: Ações que podem ser realizadas nos recursos listados acima, como &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;watch&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;patch&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, e &lt;code&gt;delete&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;apiGroups&lt;/strong&gt;: Grupos de API do Kubernetes. Neste caso, está vazio (&lt;code&gt;''&lt;/code&gt;), indicando o grupo principal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resources&lt;/strong&gt;: Lista de recursos específicos do grupo de API acima. Aqui, &lt;code&gt;pods/exec&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;verbs&lt;/strong&gt;: Ações que podem ser realizadas no recurso &lt;code&gt;pods/exec&lt;/code&gt;, como &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;patch&lt;/code&gt;, e &lt;code&gt;delete&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Runners (&lt;code&gt;runners&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Esta seção define a configuração dos runners.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;cache&lt;/strong&gt;: Configuração de cache, atualmente vazio (&lt;code&gt;{}&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;config&lt;/strong&gt;: Configuração dos runners em formato TOML.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;runners.kubernetes&lt;/strong&gt;: Configuração específica para runners Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;image&lt;/strong&gt;: Imagem de container a ser utilizada (&lt;code&gt;ubuntu:20.04&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wait_for_services_timeout&lt;/strong&gt;: Tempo de espera para serviços (&lt;code&gt;-1&lt;/code&gt;, indicando infinito).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;privileged&lt;/strong&gt;: Permissão privilegiada para o container (&lt;code&gt;true&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;allow_privilege_escalation&lt;/strong&gt;: Permissão para escalonar privilégios (&lt;code&gt;true&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;image_pull_secrets&lt;/strong&gt;: Segredos utilizados para puxar imagens do container (&lt;code&gt;aws-ecr&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;configPath&lt;/strong&gt;: Caminho de configuração, atualmente vazio (&lt;code&gt;''&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;name&lt;/strong&gt;: Nome do runner (&lt;code&gt;globalweb-gitlab-runner&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;privileged&lt;/strong&gt;: Indicação de execução privilegiada (&lt;code&gt;true&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;runUntagged&lt;/strong&gt;: Indicação se deve executar tarefas não etiquetadas (&lt;code&gt;true&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;tags&lt;/strong&gt;: Tags associadas ao runner (&lt;code&gt;docker, share_cache, share_cache1, amd64&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Secrets (&lt;code&gt;secrets&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Lista de segredos, atualmente vazia (&lt;code&gt;[]&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  SecurityContext (&lt;code&gt;securityContext&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Configurações de segurança para os containers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;allowPrivilegeEscalation&lt;/strong&gt;: Permissão para escalonar privilégios (&lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;capabilities&lt;/strong&gt;: Capacidades do container.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;drop&lt;/strong&gt;: Capacidades a serem removidas (&lt;code&gt;ALL&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;privileged&lt;/strong&gt;: Indicação se o container é privilegiado (&lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;readOnlyRootFilesystem&lt;/strong&gt;: Indicação se o sistema de arquivos raiz é somente leitura (&lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;runAsNonRoot&lt;/strong&gt;: Indicação se o container deve ser executado como um usuário não root (&lt;code&gt;true&lt;/code&gt;).&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Service (&lt;code&gt;service&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Configurações do serviço.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;enabled&lt;/strong&gt;: Indicação se o serviço está habilitado (&lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;type&lt;/strong&gt;: Tipo de serviço (&lt;code&gt;ClusterIP&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ServiceAccount (&lt;code&gt;serviceAccount&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Configurações da conta de serviço.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;annotations&lt;/strong&gt;: Anotações, atualmente vazias (&lt;code&gt;{}&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;imagePullSecrets&lt;/strong&gt;: Segredos para puxar imagens, atualmente &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;name&lt;/strong&gt;: Nome da conta de serviço, atualmente &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SessionServer (&lt;code&gt;sessionServer&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Configurações do servidor de sessão.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;enabled&lt;/strong&gt;: Indicação se o servidor de sessão está habilitado (&lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shutdown Timeout (&lt;code&gt;shutdown_timeout&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Tempo de espera para o desligamento (&lt;code&gt;0&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Strategy (&lt;code&gt;strategy&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Estratégia de implantação, atualmente vazia (&lt;code&gt;{}&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Termination Grace Period Seconds (&lt;code&gt;terminationGracePeriodSeconds&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Período de tempo de espera antes de forçar a terminação (&lt;code&gt;3600&lt;/code&gt; segundos).&lt;/p&gt;

&lt;h2&gt;
  
  
  Tolerations (&lt;code&gt;tolerations&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Tolerâncias para nós, atualmente &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Topology Spread Constraints (&lt;code&gt;topologySpreadConstraints&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Restrições de dispersão topológica, atualmente vazias (&lt;code&gt;{}&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  UseTini (&lt;code&gt;useTini&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Indicação se deve usar tini como init, atualmente &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  VolumeMounts (&lt;code&gt;volumeMounts&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Montagens de volume, atualmente &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Volumes (&lt;code&gt;volumes&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Volumes, atualmente &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitLab URL (&lt;code&gt;gitlabUrl&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;URL do GitLab (&lt;code&gt;https://gitlab.com/&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Runner Registration Token (&lt;code&gt;runnerRegistrationToken&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Token de registro do runner (&lt;code&gt;glrt-1234567891011121415&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Essas configurações combinadas permitem que um GitLab Runner seja executado em um cluster Kubernetes com permissões e configurações específicas para realizar tarefas de CI/CD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizando o novo runner em pipelines do Gitlab CI
&lt;/h2&gt;

&lt;p&gt;Para utilizar o novo runner em seus pipelines do Gitlab CI, adicione a tag &lt;code&gt;kubernetes&lt;/code&gt; ao job que você deseja executar no Kubernetes. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;build_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:latest&lt;/span&gt;
  &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kubernetes&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "Building image..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Kubernetes não utiliza Docker como container runtime e agora? O Kaniko pode resolver esse problema
&lt;/h2&gt;

&lt;p&gt;O Kubernetes não utiliza o Docker como container runtime por padrão. Isso pode ser um problema para pipelines de CI/CD que dependem do Docker para construir imagens. O Kaniko é uma ferramenta que permite construir imagens de container sem precisar do Docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Kaniko e como ele funciona?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F685auczagni3ktz4c707.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F685auczagni3ktz4c707.png" alt="Image description" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Kaniko é uma ferramenta de código aberto que constrói imagens de container a partir de um Dockerfile dentro de um container ou cluster Kubernetes. Ele funciona extraindo o filesystem do container base, executando os comandos do Dockerfile e empacotando o resultado em uma imagem de container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando variáveis de ambiente no Gitlab CI
&lt;/h2&gt;

&lt;p&gt;Para que o Kaniko funcione corretamente, você precisa configurar algumas variáveis de ambiente no Gitlab CI. Essas variáveis incluem credenciais para acessar seu registro de container e informações sobre o projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passos para configurar variáveis de ambiente para a sua pipeline
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse a seção &lt;code&gt;Settings &amp;gt; CI/CD&lt;/code&gt; do seu projeto no Gitlab.&lt;/li&gt;
&lt;li&gt;Expanda a seção &lt;code&gt;Variables&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Adicione as seguintes variáveis, sem a flag de proteção:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AWS_REGION&lt;/code&gt;: Define a região da Amazon Web Services (AWS) onde os recursos serão criados e gerenciados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;: É a chave de acesso pública da AWS que, junto com o AWS_SECRET_ACCESS_KEY, é usada para autenticar e autorizar chamadas para os serviços da AWS.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;: É a chave de acesso secreta da AWS, usada em conjunto com o AWS_ACCESS_KEY_ID para autenticar e autorizar chamadas para os serviços da AWS.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REGISTRY&lt;/code&gt;: Refere-se ao registro de contêineres onde as imagens Docker são armazenadas e gerenciadas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Exemplo &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; de build e push de imagens de containers com o Kaniko
&lt;/h2&gt;

&lt;p&gt;O exemplo a seguir demonstra como usar o Kaniko em um pipeline do Gitlab CI para construir e enviar uma imagem de container para um registro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    - mkdir -p /kaniko/.docker
    - echo "{\"credsStore\":\"ecr-login\",\"credHelpers\":{\"$REGISTRY/portal-colaborador-hml\":\"ecr-login\"}}" &amp;gt; /kaniko/.docker/config.json
    - &amp;gt;-
      /kaniko/executor
      --context "${CI_PROJECT_DIR}" 
      --dockerfile "${CI_PROJECT_DIR}/Dockerfile" 
      --build-arg AWS_REGION=$AWS_REGION 
      --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID 
      --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY 
      --destination "${REGISTRY}/portal-colaborador-hml:${CI_COMMIT_SHORT_SHA:0:5}"

  tags:
    - docker, share_cache, share_cache1, amd64
  only:
    - main
    - develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa configuração permite que o GitLab CI/CD construa e empurre uma imagem Docker usando Kaniko, autenticando-se no registro de contêineres utilizando credenciais da AWS, e apenas executando este processo nas branches main e develop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Utilizar o Gitlab Runner em conjunto com o Kaniko no Kubernetes permite construir e enviar imagens de container de forma eficiente e segura, sem depender do Docker como runtime. Esta configuração aproveita o poder do Kubernetes para escalar e gerenciar suas builds de CI/CD, garantindo maior flexibilidade e desempenho em seus pipelines.&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>git</category>
      <category>kaniko</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>A Importância dos testes de carga no Kubernetes: Garantindo a resiliência e escalabilidade</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 19 Jul 2024 19:16:42 +0000</pubDate>
      <link>https://dev.to/nataliagranato/a-importancia-dos-testes-de-carga-no-kubernetes-garantindo-a-resiliencia-e-escalabilidade-4115</link>
      <guid>https://dev.to/nataliagranato/a-importancia-dos-testes-de-carga-no-kubernetes-garantindo-a-resiliencia-e-escalabilidade-4115</guid>
      <description>&lt;p&gt;Em um ecossistema digital cada vez mais dinâmico e complexo, a capacidade de garantir que as aplicações permaneçam funcionais e responsivas mesmo sob pesadas cargas de trabalho é crucial. É aqui que os testes de carga entram em cena, desempenhando um papel fundamental na garantia de que as aplicações hospedadas no Kubernetes possam enfrentar desafios de escalabilidade e resiliência.&lt;/p&gt;

&lt;p&gt;O Kubernetes, com sua capacidade de orquestrar e gerenciar contêineres em escala, oferece um ambiente altamente flexível para implantar e executar aplicações distribuídas. No entanto, a escalabilidade dinâmica proporcionada pelo Kubernetes também pode apresentar desafios únicos. À medida que o tráfego aumenta, é crucial garantir que os recursos alocados possam lidar com a demanda adicional sem comprometer a qualidade do serviço.&lt;/p&gt;

&lt;p&gt;A finalidade dos testes de carga no Kubernetes é simular condições de uso intensivo, submetendo as aplicações e infraestrutura a cargas de trabalho cada vez maiores, a fim de avaliar seu desempenho e identificar possíveis gargalos. Esses testes não apenas ajudam a determinar os limites de escalabilidade de uma aplicação, mas também fornecem insights valiosos sobre o comportamento do sistema sob diferentes condições de carga.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planejamento Adequado:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Planeje requisitos de hardware, distribuição e topologia da infraestrutura.&lt;/li&gt;
&lt;li&gt;Facilite o dimensionamento e a manutenção do cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuração de Rede:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Escolha uma solução de rede adequada.&lt;/li&gt;
&lt;li&gt;Utilize segmentação de rede para segurança.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gerenciamento de Recursos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Defina limites e solicitações de recursos para os pods.&lt;/li&gt;
&lt;li&gt;Monitore o uso de recursos e implemente escalonamento automático.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backup e Recuperação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Garanta a integridade dos dados armazenados nos volumes persistentes.&lt;/li&gt;
&lt;li&gt;Use ferramentas de backup confiáveis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testes de Carga Realistas:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simule cenários reais com ferramentas como k6 ou loadtest.&lt;/li&gt;
&lt;li&gt;Identifique problemas de desempenho.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monitoramento Contínuo:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Monitore o desempenho e o uso de recursos.&lt;/li&gt;
&lt;li&gt;Faça ajustes conforme necessário.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Automação de Escalonamento:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use recursos nativos de escalonamento automático do Kubernetes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ferramentas Recomendadas:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;k6&lt;/strong&gt;: Ferramenta de teste de carga baseada em JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Locust&lt;/strong&gt;: Ferramenta rica em recursos para testes de carga complexos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubecarga&lt;/strong&gt;: O teste cria deployments de forma contínua em intervalos regulares para simular carga no cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo, o Kubernetes e suas ferramentas oferecem um ecossistema robusto para testes de carga, garantindo que seus aplicativos sejam resilientes e dimensionados adequadamente.&lt;/p&gt;

&lt;h1&gt;
  
  
  Um exemplo prático com Kubecarga
&lt;/h1&gt;

&lt;p&gt;Este é um exemplo de teste de carga em Go para clusters Kubernetes. O teste cria deployments de forma contínua em intervalos regulares para simular carga no cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go instalado na máquina local&lt;/li&gt;
&lt;li&gt;Acesso a um cluster Kubernetes (local ou remoto)&lt;/li&gt;
&lt;li&gt;Configuração do Kubernetes (&lt;code&gt;kubectl&lt;/code&gt;) ou arquivo &lt;code&gt;kubeconfig&lt;/code&gt; para autenticação e autorização&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que o código faz
&lt;/h2&gt;

&lt;p&gt;O código cria deployments no cluster Kubernetes em intervalos regulares. No exemplo fornecido, ele cria deployments usando a imagem &lt;code&gt;nginx&lt;/code&gt;, mas pode ser adaptado para outras imagens e tipos de recursos do Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos de atenção
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Caso não seja setado no momento da execução o caminho do KUBECONFIG ele herdará das variáveis de ambiente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O teste é para criação de deployments, caso deseje mudar o Namespace, Name, Imagem e etc realize a alteração entre as linhas 67-89.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Clone este repositório
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Tech-Preta/kubecarga.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kubecarga
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inicialize o módulo Go
&lt;/h3&gt;

&lt;p&gt;Execute o seguinte comando para inicializar um novo módulo Go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go mod init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalação das dependências
&lt;/h3&gt;

&lt;p&gt;Para instalar as dependências necessárias, execute os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get k8s.io/client-go/kubernetes
go get k8s.io/client-go/rest
go get k8s.io/client-go/tools/clientcmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses comandos irão baixar e instalar os pacotes e suas dependências, e também atualizarão os arquivos go.mod e go.sum.&lt;/p&gt;

&lt;h3&gt;
  
  
  Construindo o projeto
&lt;/h3&gt;

&lt;p&gt;Agora que temos todas as dependências instaladas, podemos criar o executável para isso utilize o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go build &lt;span class="nt"&gt;-o&lt;/span&gt; kube-carga &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso irá compilar o código e criar o executável no diretório atual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como executar
&lt;/h3&gt;

&lt;p&gt;Finalmente podemos executar a nossa aplicação com o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x kube-carga
./kube-carga &lt;span class="nt"&gt;-kubeconfig&lt;/span&gt; /caminho/para/seu/kubeconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.cloudskillsboost.google/focuses/967?locale=pt_BR&amp;amp;parent=catalog" rel="noopener noreferrer"&gt;Você também pode realizar um laboratório prático: Teste de carga distribuída usando o Kubernetes no Google Cloud Skills Boost&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>testing</category>
    </item>
    <item>
      <title>Kubernetes Vanilla em instâncias ec2</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 19 Jul 2024 18:29:06 +0000</pubDate>
      <link>https://dev.to/nataliagranato/kubernetes-vanilla-em-instancias-ec2-12lo</link>
      <guid>https://dev.to/nataliagranato/kubernetes-vanilla-em-instancias-ec2-12lo</guid>
      <description>&lt;h2&gt;
  
  
  Criando um Cluster Kubernetes em Instâncias EC2
&lt;/h2&gt;

&lt;p&gt;Este guia detalha o processo de criação de um cluster Kubernetes em instâncias EC2 na AWS, com base nas configurações e comandos fornecidos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mqd5mqoiou6tpra6h9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mqd5mqoiou6tpra6h9w.png" alt="Arquitetura do Kubernetes" width="758" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurações das Instâncias EC2
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nome&lt;/strong&gt;: k8s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Número de Instâncias&lt;/strong&gt;: 5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imagem da Máquina&lt;/strong&gt;: Ubuntu Server 22.04 LTS (HVM), SSD Volume Type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura&lt;/strong&gt;: 64 bits (x86)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tipo de Instância&lt;/strong&gt;: t2.medium&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Pair&lt;/strong&gt;: key_par_k8s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuração de Armazenamento&lt;/strong&gt;: Volume do tipo gp3&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configurações do Cluster Kubernetes
&lt;/h2&gt;

&lt;p&gt;Para criar um cluster Kubernetes usando o kubeadm, é necessário liberar algumas portas no grupo de segurança das instâncias EC2. Essas portas são essenciais para o funcionamento correto do cluster. A seguir, estão as portas que precisam ser liberadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Porta 6443&lt;/strong&gt;: Essa porta é usada pelo servidor de API do Kubernetes para comunicação com os componentes do cluster. É necessário permitir o tráfego TCP na porta 6443 para que os nós do cluster possam se comunicar com o servidor de API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Portas 10250-10259&lt;/strong&gt;: Essas portas são usadas pelo kubelet, kube-scheduler e kube-controller-manager para comunicação interna no cluster. É necessário permitir o tráfego TCP nessas portas para que os componentes do cluster possam se comunicar entre si.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Porta 30000-32767&lt;/strong&gt;: Essas portas são usadas para serviços NodePort no Kubernetes. É necessário permitir o tráfego TCP nessas portas para que os serviços NodePort possam ser acessados externamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Portas 6783-6784&lt;/strong&gt;: Essas portas são usadas pelo Weave Net para comunicação interna no cluster. É necessário permitir o tráfego UDP nessas portas para que o Weave Net possa funcionar corretamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Portas 2379-2380&lt;/strong&gt;: Essas portas são usadas pelo etcd para comunicação interna no cluster. É necessário permitir o tráfego TCP nessas portas para que o etcd possa funcionar corretamente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, é importante lembrar de liberar a porta 22 para permitir a conexão SSH com as instâncias EC2.&lt;/p&gt;

&lt;p&gt;Certifique-se de configurar corretamente as regras de entrada no grupo de segurança das instâncias EC2 para permitir o tráfego nessas portas. As regras de saída podem ser mantidas com as configurações padrão da AWS.&lt;br&gt;
TCP - Portas 10250-10259 - Security Group ID - Kubelet API, kube-scheduler e kube-controller-manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regras de Saída&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Não irei específicar as regras de saída, portanto, usarão as configurações padrão da AWS.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conectando-se às Instâncias
&lt;/h2&gt;

&lt;p&gt;Para se conectar às instâncias EC2, é necessário usar a chave privada associada ao key pair usado durante a criação das instâncias. A seguir, está o comando para se conectar a uma instância EC2 usando a chave privada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;400 sua_chave_privada.pem
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"sua_chave_privada.pem"&lt;/span&gt; ubuntu@ip_da_instância.compute-1.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua &lt;code&gt;sua_chave_privada.pem&lt;/code&gt; pelo caminho da sua chave privada e &lt;code&gt;ip_da_instância.compute-1.amazonaws.com&lt;/code&gt; pelo endereço IP público da instância EC2.&lt;/p&gt;

&lt;p&gt;Altere o hostname da máquina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
hostnamectl set-hostname k8s-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurando os Nós
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Desativando a Memória Swap:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;swapoff &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando desativa a memória swap em seu sistema. No contexto do Kubernetes, a memória swap pode interferir no desempenho do sistema e causar problemas de estabilidade, portanto, é recomendado desativá-la.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configurando os Módulos de Kernel:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/modules-load.d/k8s.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando abre o editor de texto nano para editar o arquivo k8s.conf localizado no diretório /etc/modules-load.d/. Este arquivo é usado para especificar quais módulos do kernel devem ser carregados durante a inicialização do sistema.&lt;/p&gt;

&lt;p&gt;Adicione as seguintes linhas ao arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;br_netfilter
overlay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses módulos do kernel são necessários para o funcionamento adequado do Kubernetes. O br_netfilter é usado para configurar a ponte de rede do Docker, enquanto o overlay é usado para suportar a camada de sobreposição de contêineres.&lt;/p&gt;

&lt;p&gt;Salve e feche o arquivo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Carregando os Módulos de Kernel:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe br_netfilter
&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe overlay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Em seguida, execute:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;--system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estes comandos são usados para configurar os parâmetros do sistema no Linux, especialmente para preparar o ambiente para a execução do Kubernetes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | sudo tee /etc/sysctl.d/k8s.conf&lt;/code&gt;: Este comando redireciona a entrada para um arquivo chamado &lt;code&gt;k8s.conf&lt;/code&gt; localizado no diretório &lt;code&gt;/etc/sysctl.d/&lt;/code&gt;. O conteúdo que vem após &lt;code&gt;&amp;lt;&amp;lt;EOF&lt;/code&gt; é inserido neste arquivo. Neste caso, estamos definindo três parâmetros do sistema relacionados ao funcionamento do Kubernetes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;net.bridge.bridge-nf-call-iptables  = 1&lt;/code&gt;: Habilita a chamada do iptables para encaminhamento de pacotes entre interfaces de rede.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;net.bridge.bridge-nf-call-ip6tables = 1&lt;/code&gt;: Habilita a chamada do ip6tables para encaminhamento de pacotes IPv6 entre interfaces de rede.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;net.ipv4.ip_forward                 = 1&lt;/code&gt;: Habilita o encaminhamento de IP no sistema, permitindo que os pacotes sejam roteados entre diferentes interfaces de rede.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;O &lt;code&gt;EOF&lt;/code&gt; indica o fim do texto que será redirecionado para o arquivo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo sysctl --system&lt;/code&gt;: Este comando é usado para recarregar as configurações do sistema sem precisar reiniciar. Isso faz com que o sistema leia e aplique as configurações definidas no arquivo &lt;code&gt;k8s.conf&lt;/code&gt; e em outros arquivos de configuração no diretório &lt;code&gt;/etc/sysctl.d/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Instalando kubectl, kubeadm e kubelet:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https ca-certificates curl gnupg
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/kubernetes.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; kubelet kubeadm kubectl
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-mark hold kubelet kubeadm kubectl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Instalando e configurando o Containerd:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;ca-certificates curl
&lt;span class="nb"&gt;sudo install&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 0755 &lt;span class="nt"&gt;-d&lt;/span&gt; /etc/apt/keyrings
&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &amp;lt;https://download.docker.com/linux/ubuntu/gpg&amp;gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.asc
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;a+r /etc/apt/keyrings/docker.asc

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;: Atualiza a lista de pacotes disponíveis e suas versões, mas não instala ou atualiza nenhum pacote.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo apt-get install ca-certificates curl&lt;/code&gt;: Instala os pacotes &lt;code&gt;ca-certificates&lt;/code&gt; e &lt;code&gt;curl&lt;/code&gt;. &lt;code&gt;ca-certificates&lt;/code&gt; é usado para verificar a confiabilidade dos servidores remotos, e &lt;code&gt;curl&lt;/code&gt; é usado para baixar dados de ou para um servidor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo install -m 0755 -d /etc/apt/keyrings&lt;/code&gt;: Cria o diretório &lt;code&gt;/etc/apt/keyrings&lt;/code&gt; com permissões &lt;code&gt;0755&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo curl -fsSL &amp;lt;https://download.docker.com/linux/ubuntu/gpg&amp;gt; -o /etc/apt/keyrings/docker.asc&lt;/code&gt;: Baixa a chave GPG do repositório Docker e a salva no arquivo &lt;code&gt;/etc/apt/keyrings/docker.asc&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc&lt;/code&gt;: Altera as permissões do arquivo &lt;code&gt;docker.asc&lt;/code&gt; para que todos os usuários possam lê-lo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O comando &lt;code&gt;echo&lt;/code&gt; cria uma nova entrada na lista de fontes do APT para o repositório Docker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;: Novamente, atualiza a lista de pacotes disponíveis e suas versões.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&lt;/code&gt;: Instala o Docker, o CLI do Docker, o Containerd, o plugin Docker Buildx e o plugin Docker Compose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configurando o Containerd:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;containerd config default | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/containerd/config.toml


&lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SystemdCgroup = false/SystemdCgroup = true/g'&lt;/span&gt; /etc/containerd/config.toml

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart containerd
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status containerd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Habilitando o serviço do Kubelet:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; kubelet
systemctl status kubelet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: A partir daqui, execute os comandos como &lt;code&gt;root&lt;/code&gt; para evitar problemas de permissões, erros de certificado, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o cluster Kubernetes na versão v1.30
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Inicializando o cluster:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm init &lt;span class="nt"&gt;--pod-network-cidr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.10.0.0/16 &lt;span class="nt"&gt;--apiserver-advertise-address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;ip-controlplane&amp;gt;

&lt;span class="c"&gt;# Configurando o Acesso ao Kubernetes:&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; /etc/kubernetes/admin.conf &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Adicionando nós workers ao cluster:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm &lt;span class="nb"&gt;join&lt;/span&gt; &amp;lt;ip-controlplane:6443&amp;gt; &lt;span class="nt"&gt;--token&lt;/span&gt; &amp;lt;token&amp;gt; &lt;span class="nt"&gt;--discovery-token-ca-cert-hash&lt;/span&gt;  sha256:&amp;lt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Instalando o Wave Net para a rede do cluster:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verificando o status do cluster:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes
kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora você tem um cluster Kubernetes funcional em execução em instâncias EC2 na AWS. Você pode implantar aplicativos, serviços e recursos no cluster e começar a explorar as capacidades do Kubernetes.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>aws</category>
    </item>
    <item>
      <title>Parâmetros avançados no Docker Compose</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 19 Jul 2024 18:22:01 +0000</pubDate>
      <link>https://dev.to/nataliagranato/parametros-avancados-no-docker-compose-1p2a</link>
      <guid>https://dev.to/nataliagranato/parametros-avancados-no-docker-compose-1p2a</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Docker Compose?
&lt;/h2&gt;

&lt;p&gt;O Docker Compose é uma ferramenta exclusiva para a plataforma Docker, projetada especificamente para gerenciar containers. Ele não é compatível com outras plataformas de containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5j6qa9chude011cpxnf4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5j6qa9chude011cpxnf4.png" alt="Icone do Docker Compose" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para ilustrar as funcionalidades do Docker Compose, vamos analisar o seguinte exemplo de um arquivo docker-compose.yml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.9'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;giropops-senhas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5000:5000"&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;giropops-senhas&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;REDIS_HOST=redis&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;natalia:/granato&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0.25'&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;128M&lt;/span&gt;
        &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0.50'&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;256M&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis-server --appendonly yes&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;giropops-senhas&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;curl"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-f"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:5000"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;giropops-senhas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;natalia&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, temos dois serviços definidos: &lt;code&gt;giropops-senhas&lt;/code&gt; e &lt;code&gt;redis&lt;/code&gt;. O serviço giropops-senhas é construído a partir do Dockerfile no diretório atual (indicado pelo ponto), expõe a porta 5000 e usa a rede &lt;code&gt;giropops-senhas&lt;/code&gt;. Além disso, ele define uma variável de ambiente &lt;code&gt;REDIS_HOST&lt;/code&gt; e utiliza um volume chamado natalia.&lt;/p&gt;

&lt;p&gt;Já o serviço redis utiliza a imagem oficial do Redis do Docker Hub, executa o servidor Redis em modo append-only e também usa a rede giropops-senhas. Além disso, ele possui um healthcheck que verifica a saúde do serviço a cada 30 segundos.&lt;/p&gt;

&lt;p&gt;A rede &lt;code&gt;giropops-senhas&lt;/code&gt; é definida como uma rede do tipo bridge, e o volume natalia é criado sem qualquer configuração adicional.&lt;/p&gt;

&lt;p&gt;Este exemplo demonstra a flexibilidade e o poder do Docker Compose na definição e gerenciamento de múltiplos containers e suas interações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alguns comandos para facilitar o seu dia a dia
&lt;/h2&gt;

&lt;p&gt;O Docker Compose é uma ferramenta que permite definir e gerenciar aplicativos multi-container. Ele utiliza um arquivo de configuração chamado docker-compose.yml para especificar os serviços, redes e volumes necessários para a execução desses contêineres.&lt;/p&gt;

&lt;p&gt;Aqui estão algumas das instruções que você mencionou e o que elas fazem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker compose up -d&lt;/code&gt;: Inicia os serviços definidos no arquivo docker-compose.yml em segundo plano (-d). Isso cria e inicia os contêineres conforme as configurações especificadas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker compose ps&lt;/code&gt;: Exibe o status dos serviços definidos no arquivo docker-compose.yml. Mostra quais contêineres estão em execução, parados ou com erro.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker compose down&lt;/code&gt;: Encerra todos os serviços e contêineres definidos no arquivo docker-compose.yml. Isso também remove as redes e volumes associados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker compose pause&lt;/code&gt;: Pausa a execução dos serviços e contêineres definidos no arquivo docker-compose.yml. Isso pode ser útil para depurar ou realizar manutenção.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker compose unpause&lt;/code&gt;: Retoma a execução dos serviços e contêineres pausados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker compose logs -f&lt;/code&gt;: Exibe os logs dos serviços em tempo real (-f). Isso é útil para depurar problemas ou monitorar a saída dos contêineres.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docker compose build, replicas e resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Funcionalidade &lt;code&gt;build&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A funcionalidade build é utilizada no arquivo docker-compose.yml para construir a imagem de um serviço a partir de um Dockerfile localizado no diretório atual. Isso permite personalizar a imagem do serviço antes de executá-lo.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;giropops-senhas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o serviço giropops-senhas está sendo construído a partir do Dockerfile localizado no diretório atual (.).&lt;/p&gt;

&lt;h3&gt;
  
  
  Funcionalidade replicas
&lt;/h3&gt;

&lt;p&gt;A funcionalidade &lt;code&gt;replicas&lt;/code&gt; define o número de réplicas de um serviço que serão criadas e executadas. Ela permite dimensionar horizontalmente os serviços, distribuindo a carga entre várias instâncias do mesmo serviço.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;services:&lt;br&gt;
  giropops-senhas:&lt;br&gt;
    ...&lt;br&gt;
    deploy:&lt;br&gt;
      replicas: 3&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Neste exemplo, o serviço `giropops-senhas` terá três réplicas em execução.

### Funcionalidade resources

A funcionalidade resources permite definir limites e reservas de recursos para um serviço. Isso inclui especificações de CPU e memória para garantir que os recursos sejam alocados de forma eficiente e equitativa entre os serviços.

Exemplo:



      ```yaml
services:
  giropops-senhas:
    ...
    deploy:
      resources:
        reservations:
          cpus: '0.25'
          memory: 128M
        limits:
          cpus: '0.50'
          memory: 256M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o serviço &lt;code&gt;giropops-senhas&lt;/code&gt; tem uma reserva de 0,25 CPUs e 128MB de memória por réplica, com um limite máximo de 0,50 CPUs e 256MB de memória por réplica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos úteis do Docker Compose
&lt;/h2&gt;

&lt;p&gt;Essas funcionalidades fornecem flexibilidade e controle sobre a construção, replicação e alocação de recursos dos serviços definidos no arquivo &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker compose -f docker-compose.yml up -d&lt;/code&gt;: Inicia os serviços definidos no arquivo docker-compose.yml em segundo plano (-d). Isso cria e inicia os contêineres conforme as configurações especificadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker compose -f docker-compose.yml up -d --scale redis=3&lt;/code&gt;: Inicia os serviços definidos no arquivo docker-compose.yml em segundo plano (-d) e escala o serviço redis para 3 réplicas. Isso cria e inicia múltiplos contêineres do serviço redis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker compose -f docker-compose.yml build&lt;/code&gt;: Constrói as imagens dos serviços definidos no arquivo docker-compose.yml. Isso é útil quando você fez alterações nos Dockerfiles ou nas configurações dos serviços.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses comandos são úteis para gerenciar e monitorar os serviços definidos no arquivo &lt;code&gt;docker-compose.yml&lt;/code&gt; de forma eficiente e eficaz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual é a diferença entre Docker e Docker Compose?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Docker é uma plataforma de virtualização de contêineres que permite empacotar, distribuir e executar aplicativos em ambientes isolados chamados contêineres. Ele fornece uma maneira consistente de empacotar aplicativos, suas dependências e configurações em um único pacote. Cada contêiner é uma instância isolada de um aplicativo, com seu próprio sistema de arquivos, bibliotecas e recursos. O Docker usa imagens para criar contêineres. As imagens são como modelos que contêm todas as instruções para criar um contêiner. É amplamente utilizado para desenvolvimento, teste e implantação de aplicativos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Docker Compose é uma ferramenta que simplifica a orquestração de vários contêineres. Ele permite definir e gerenciar aplicativos multi-container usando um arquivo de configuração chamado docker-compose.yml. No arquivo docker-compose.yml, você pode especificar serviços, redes, volumes e outras configurações necessárias para seus contêineres. Com o Docker Compose, você pode iniciar, parar, escalar e gerenciar todos os contêineres de um aplicativo com um único comando. É útil para cenários em que você precisa executar vários contêineres juntos, como aplicativos que dependem de bancos de dados, cache, servidores web, etc.&lt;/p&gt;

&lt;p&gt;Em resumo, o Docker é a base para criar e executar contêineres individuais, enquanto o Docker Compose é usado para definir e gerenciar aplicativos compostos por vários contêineres interconectados. Ambos são essenciais para o desenvolvimento e implantação eficiente de aplicativos baseados em contêineres. 🐳&lt;/p&gt;

&lt;p&gt;Espero que essas informações sejam úteis para você! Se tiver mais dúvidas ou precisar de mais informações, não hesite em perguntar.&lt;/p&gt;

</description>
      <category>docker</category>
    </item>
    <item>
      <title>Certificado TLS no Kubernetes</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 19 Jul 2024 18:19:22 +0000</pubDate>
      <link>https://dev.to/nataliagranato/certificado-tls-no-kubernetes-1o38</link>
      <guid>https://dev.to/nataliagranato/certificado-tls-no-kubernetes-1o38</guid>
      <description>&lt;p&gt;Utilize o openssl, projeto de código aberto dos protocolos ssl e tls para gerar o seu certificado autoassinado. Use &lt;code&gt;openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout chave-privada.key -out certificado.crt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ymatlohp981av9wnudz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ymatlohp981av9wnudz.png" alt="Certificado TLS no Kubernetes" width="600" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar um Secret do tipo TLS, você pode usar o comando &lt;code&gt;kubectl create secret tls meu-servico-web-tls-secret --cert=certificado.crt --key=chave-privada.key&lt;/code&gt; seguido sempre pelo nome da Secret e a localização dos arquivos de certificado e chave.&lt;/p&gt;

&lt;p&gt;Verificando os dados de uma Secret, você pode usar o comando &lt;code&gt;kubectl get secret meu-servico-tls-secret -o yaml&lt;/code&gt; para visualizar os dados de uma Secret.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo do arquivo de configuração do nginx para utilizar tls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;http {&lt;/span&gt;
    &lt;span class="s"&gt;server {&lt;/span&gt;
        &lt;span class="s"&gt;listen 80;&lt;/span&gt;
        &lt;span class="s"&gt;listen 443 ssl;&lt;/span&gt;
        &lt;span class="s"&gt;ssl_certificate /etc/nginx/tls/certificado.crt;&lt;/span&gt;
        &lt;span class="s"&gt;ssl_certificate_key /etc/nginx/tls/chave-privada.key;&lt;/span&gt;

        &lt;span class="s"&gt;location / {&lt;/span&gt;
            &lt;span class="s"&gt;return 200 'Hello, World!';&lt;/span&gt;
            &lt;span class="s"&gt;add_header Content-Type text/plain;&lt;/span&gt;
        &lt;span class="s"&gt;}&lt;/span&gt;
    &lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criando um ConfigMap para adicionar um arquivo no Pod e configurar o SSL no Nginx
&lt;/h2&gt;

&lt;p&gt;Para criar um ConfigMap para adicionar um arquivo no Pod e configurar o SSL no Nginx, você pode usar o comando &lt;code&gt;kubectl create configmap nginx-config --from-file=nginx.conf&lt;/code&gt; seguido pelo nome do ConfigMap e o arquivo a ser incluído.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gita-pod&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gita-pod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gita-container&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:1.26&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
    &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;meu-volume&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/nginx.conf&lt;/span&gt;
      &lt;span class="na"&gt;subPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx.conf&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-tls&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/tls&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-config-volume&lt;/span&gt;
    &lt;span class="na"&gt;configMap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-config&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-tls&lt;/span&gt;
    &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;meu-servico-tls-secret&lt;/span&gt;
      &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;certificado.crt&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;certificado.crt&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;chave-privada.key&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;chave-privada.key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recapirulando, aprendemos o que são as Secrets do Kubernetes, os tipos de Secrets e o que é a codificação base64, como criar uma Secret do tipo Opaque, como utilizar o nosso Secret como variável de ambiente dentro do Pod, como criar uma Secret para autenticação no Docker Hub, como criar um Secret do tipo TLS e como criar um ConfigMap para adicionar um arquivo no Pod e configurar o SSL no Nginx.&lt;/p&gt;

&lt;p&gt;Para realizar o passo a passo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Crie o seu certificado TLS: &lt;code&gt;openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout chave-privada.key -out certificado.crt&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crie a secret do tipo TLS com o comando &lt;code&gt;kubectl create secret tls meu-servico-tls-secret --cert=certificado.crt --key=chave-privada.key&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crie o ConfigMap com o comando &lt;code&gt;kubectl create configmap nginx-config --from-file=nginx.conf&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crie o Pod com o comando &lt;code&gt;kubectl apply -f nginx-pod.yml&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crie um service para expor o Pod criado com o comando &lt;code&gt;kubectl expose pod nginx&lt;/code&gt;. Liste o service com &lt;code&gt;kubectl get svc&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Faça o port-forward do service para acessar o Nginx com o comando &lt;code&gt;kubectl port-forward service/nginx 4443:443&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para testar o Nginx, acesse o endereço &lt;code&gt;https://localhost:4443&lt;/code&gt; ou &lt;code&gt;https://127.0.0.1:4443&lt;/code&gt; e você verá a mensagem &lt;code&gt;Bem-vindo ao Nginx!&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Você também pode utilizar o &lt;code&gt;curl -k https://localhost:4443&lt;/code&gt; e verá a seguinte mensagem:&lt;/p&gt;

&lt;p&gt;Bem-vindo ao Nginx!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>openssl</category>
      <category>tls</category>
    </item>
    <item>
      <title>Iniciando com o Ansible</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 19 Jul 2024 17:57:14 +0000</pubDate>
      <link>https://dev.to/nataliagranato/iniciando-com-o-ansible-1dfg</link>
      <guid>https://dev.to/nataliagranato/iniciando-com-o-ansible-1dfg</guid>
      <description>&lt;h2&gt;
  
  
  Ansible: Uma Visão Geral
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2jz8v5x27hrvd81cn10s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2jz8v5x27hrvd81cn10s.png" alt="Funcionamento do Ansible" width="708" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatização de Tarefas
&lt;/h2&gt;

&lt;p&gt;O Ansible permite automatizar tarefas como configuração de sistemas, implantação de aplicativos e provisionamento de recursos de nuvem. Ele segue uma abordagem sem agentes, o que significa que não é necessário instalar um agente de software nos sistemas que você deseja gerenciar. Pode ser executado em qualquer sistema operacional que suporte Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelagem Declarativa
&lt;/h2&gt;

&lt;p&gt;Em vez de escrever scripts para automatizar tarefas, os usuários definem o estado desejado dos sistemas usando uma linguagem de modelagem chamada YAML. O Ansible traduz essas definições em ações reais nos sistemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playbooks
&lt;/h2&gt;

&lt;p&gt;Os playbooks são arquivos YAML que descrevem as tarefas a serem executadas pelo Ansible. Eles definem o fluxo de trabalho e as configurações desejadas. Com os playbooks, você pode automatizar tarefas complexas e sequenciais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integração com Nuvem e Contêineres
&lt;/h2&gt;

&lt;p&gt;O Ansible tem integrações nativas com várias plataformas de nuvem, incluindo AWS, Azure, Google Cloud Platform e OpenStack. Também pode ser usado para gerenciar contêineres, como Docker e Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitetura
&lt;/h2&gt;

&lt;p&gt;O Ansible usa um conjunto de módulos escritos principalmente em Python. Esses módulos são executados em um controlador remoto para gerenciar os sistemas. O Ansible não requer a instalação de um agente nos sistemas, pois se comunica diretamente com eles via SSH.&lt;/p&gt;

&lt;h3&gt;
  
  
  Um projeto prático
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Instalação do Ansible&lt;/strong&gt;
Certifique-se de que o Ansible está instalado na sua máquina controladora. Caso não esteja, você pode instalá-lo via gerenciador de pacotes (por exemplo, apt, yum, brew, etc.). Se preferir utilize:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 -m pip install --user ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Criação de Chaves SSH&lt;/strong&gt;
Se você ainda não possui um par de chaves SSH, gere um usando o comando:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Isso criará as chaves pública (id_rsa.pub) e privada (id_rsa) no diretório ~/.ssh/.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Envio da Chave Pública para o Host de Destino&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Copie a chave pública para o host de destino (onde você deseja executar o Ansible). Você pode fazer isso manualmente ou usar o Ansible para automatizar o processo.&lt;/li&gt;
&lt;li&gt;Manualmente:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usando Ansible (em um playbook):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
- hosts: seu_host
  tasks:
    - name: Copiar chave pública para o host
      authorized_key:
        user: seu_usuario
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuração do Inventário&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Crie um arquivo de inventário (por exemplo, hosts.ini) com os detalhes dos hosts que você deseja gerenciar com o Ansible.&lt;/li&gt;
&lt;li&gt;Exemplo de arquivo hosts.ini:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[servidores]
servidor1 ansible_host=192.168.1.10
servidor2 ansible_host=192.168.1.20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Teste a Conexão SSH&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Antes de tudo, verifique se o Ansible pode se conectar aos hosts. Execute o comando abaixo onde está localizado o seu arquivo de inventário:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansible -i hosts.ini -m ping servidores
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Caso tenha sucesso você verá algo como:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.0.146 | SUCCESS =&amp;gt; {
    "changed": false,
    "ping": "pong"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Crie Seus Playbooks:&lt;/li&gt;
&lt;li&gt;Agora você pode criar seus playbooks Ansible para automatizar tarefas nos servidores.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Executando o Ansible Node Exporter
&lt;/h2&gt;

&lt;p&gt;Faça o clone do repositório e modifique o inventário de acordo com os servidores que deseja gerenciar. Não se esqueça de seguir os passos anteriores para ter acesso aos servidores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/Tech-Preta/ansible-node-exporter.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para executar o playbook instalar_node_exporter.yml, você pode usar o comando &lt;code&gt;ansible-playbook&lt;/code&gt;. Certifique-se de estar no diretório onde o playbook está localizado. Aqui está o comando que você pode usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansible-playbook instalar_node_exporter.yml --ask-become-pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o seu playbook estiver em um diretório específico, você precisará fornecer o caminho completo para o playbook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansible-playbook /caminho/para/o/playbook/instalar_node_exporter.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em caso de sucesso, a saída será semelhante a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PLAY [seus_servidores] *******************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [192.168.0.146]

PLAY [Configurar tipos de chave de host permitidos] **************************************************************************

TASK [Adicionar tipos de chave de host ao cliente SSH] ***********************************************************************
ok: [192.168.0.146] =&amp;gt; (item=HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,ssh-rsa,rsa-sha2-512,rsa-sha2-256)

PLAY [seus_servidores] *******************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [192.168.0.146]

TASK [node_exporter : Baixar o Node Exporter] ********************************************************************************
changed: [192.168.0.146]

TASK [node_exporter : Criar diretório para o Node Exporter] ******************************************************************
ok: [192.168.0.146]

TASK [node_exporter : Extrair o Node Exporter] *******************************************************************************
changed: [192.168.0.146]

TASK [node_exporter : Mover o Node Exporter para /usr/local/bin] *************************************************************
changed: [192.168.0.146]

TASK [node_exporter : Criar usuário para o Node Exporter] ********************************************************************
ok: [192.168.0.146]

TASK [node_exporter : Copiar o serviço systemd do Node Exporter] *************************************************************
changed: [192.168.0.146]

TASK [node_exporter : Definir permissões nos arquivos temporários do Ansible] ************************************************
changed: [192.168.0.146 -&amp;gt; localhost]

TASK [node_exporter : Habilitar e iniciar o serviço do Node Exporter] ********************************************************
ok: [192.168.0.146]

PLAY RECAP *******************************************************************************************************************
192.168.0.146              : ok=11   changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certifique-se de ter um arquivo de inventário configurado corretamente e definido os hosts alvo no playbook ou passá-los como argumentos na linha de comando, conforme necessário. Isso garantirá que o Ansible execute as tarefas definidas no playbook nos hosts especificados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://4linux.com.br/o-que-e-ansible/" rel="noopener noreferrer"&gt;O que é Ansible - 4Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursodevops.com.br/o-que-e-o-ansible/" rel="noopener noreferrer"&gt;O que é o Ansible - CursoDevOps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.interop.com.br/blog/ansible/" rel="noopener noreferrer"&gt;Blog do Ansible - InterOp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este texto foi construído com a ajuda das IAs Copilot e ChatGPT.&lt;/p&gt;

</description>
      <category>ansible</category>
      <category>prometheus</category>
    </item>
    <item>
      <title>Policy as Code with Kyverno</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 19 Jul 2024 17:50:15 +0000</pubDate>
      <link>https://dev.to/nataliagranato/policy-as-code-with-kyverno-1bbl</link>
      <guid>https://dev.to/nataliagranato/policy-as-code-with-kyverno-1bbl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj4lese60dsuibhwzklo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj4lese60dsuibhwzklo.png" alt="Arquitetura do Kyverno" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Kyverno?
&lt;/h2&gt;

&lt;p&gt;O Kyverno é uma ferramenta de política de código aberto para o Kubernetes. Ele fornece uma maneira de definir políticas de validação, mutação, geração de recursos Kubernetes, também realiza varreduras em segundo plano e varreduras de repositório de código-fonte. O Kyverno é implantado como um controlador de recursos Kubernetes e não requer um servidor de webhook de admissão.&lt;/p&gt;

&lt;p&gt;Ele permite segurança, automação, conformidade e governança usando política como código. As políticas do Kyverno podem ser gerenciadas como recursos do Kubernetes e não requerem o aprendizado de uma nova linguagem. Kyverno é projetado para funcionar bem com ferramentas que você já usa, como kubectl, kustomize e Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona - uma demo
&lt;/h2&gt;

&lt;p&gt;Vamos criar um cluster kind e instalar o Kyverno. Primeiro, crie um cluster kind:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kind create cluster &lt;span class="nt"&gt;--name&lt;/span&gt; kyverno
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, instale o Kyverno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; https://github.com/kyverno/kyverno/releases/download/v1.11.1/install.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos criar uma política de exemplo para o Kyverno. Crie um arquivo chamado &lt;code&gt;disallow-latest-tag.yaml&lt;/code&gt; com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kyverno.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;disallow-latest-tag&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;policies.kyverno.io/title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Disallow Latest Tag&lt;/span&gt;
    &lt;span class="na"&gt;policies.kyverno.io/category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Best Practices&lt;/span&gt;
    &lt;span class="na"&gt;policies.kyverno.io/minversion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.6.0&lt;/span&gt;
    &lt;span class="na"&gt;policies.kyverno.io/severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;medium&lt;/span&gt;
    &lt;span class="na"&gt;policies.kyverno.io/subject&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
    &lt;span class="na"&gt;policies.kyverno.io/description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
      &lt;span class="s"&gt;The ':latest' tag is mutable and can lead to unexpected errors if the&lt;/span&gt;
      &lt;span class="s"&gt;image changes. A best practice is to use an immutable tag that maps to&lt;/span&gt;
      &lt;span class="s"&gt;a specific version of an application Pod. This policy validates that the image&lt;/span&gt;
      &lt;span class="s"&gt;specifies a tag and that it is not called `latest`.      &lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;validationFailureAction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enforce&lt;/span&gt;
  &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;require-image-tag&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;any&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;kinds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
    &lt;span class="na"&gt;validate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;An&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tag&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;required."&lt;/span&gt;
      &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*:*"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;validate-image-tag&lt;/span&gt;
    &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;any&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;kinds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
    &lt;span class="na"&gt;validate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Using&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mutable&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tag&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;e.g.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'latest'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;allowed."&lt;/span&gt;
      &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;!*:latest"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, aplique a política ao cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; disallow-latest-tag.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O retorno será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clusterpolicy.kyverno.io/disallow-latest-tag created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A política &lt;code&gt;disallow-latest-tag&lt;/code&gt; possui a configuração &lt;code&gt;validationFailureAction: Enforce&lt;/code&gt;, o que significa que ela rejeitará qualquer recurso que viole a política.&lt;/p&gt;

&lt;p&gt;Agora, vamos criar um arquivo chamado &lt;code&gt;pod.yaml&lt;/code&gt; com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, aplique o arquivo ao cluster para validar se a política irá rejeitar a criação do pod com a tag de imagem &lt;code&gt;latest&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pod.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Kyverno deve rejeitar a criação do pod porque a política &lt;code&gt;disallow-latest-tag&lt;/code&gt; não permite o uso de tags &lt;code&gt;latest&lt;/code&gt;. Para verificar, execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você verá que o pod foi rejeitado. A saída será algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Error from server: error when creating &lt;span class="s2"&gt;"pod.yml"&lt;/span&gt;: admission webhook &lt;span class="s2"&gt;"validate.kyverno.svc-fail"&lt;/span&gt; denied the request: 

resource Pod/default/nginx was blocked due to the following policies 

disallow-latest-tag:
  validate-image-tag: &lt;span class="s1"&gt;'validation error: Using a mutable image tag e.g. ''latest''
    is not allowed. rule validate-image-tag failed at path /spec/containers/0/image/'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O output acima mostra que o Kyverno rejeitou a criação do pod porque a política &lt;code&gt;disallow-latest-tag&lt;/code&gt; não permite o uso de tags &lt;code&gt;latest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso mostra como o Kyverno pode ser usado para aplicar políticas de segurança e conformidade em um cluster Kubernetes.&lt;/p&gt;

</description>
      <category>devsecops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Explicando o Dockerfile</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Sun, 21 Jan 2024 19:52:22 +0000</pubDate>
      <link>https://dev.to/nataliagranato/explicando-o-dockerfile-np4</link>
      <guid>https://dev.to/nataliagranato/explicando-o-dockerfile-np4</guid>
      <description>&lt;p&gt;O Dockerfile é composto por uma série de instruções que especificam como a imagem Docker deve ser construída, incluindo as dependências e configurações necessárias para a aplicação funcionar corretamente dentro do contêiner Docker.&lt;/p&gt;

&lt;p&gt;Uma imagem Docker é uma representação auto-suficiente e portável de um ambiente de execução que inclui tudo o que é necessário para executar uma aplicação, como bibliotecas, dependências e configurações. Uma imagem Docker pode ser executada em qualquer sistema operacional ou ambiente em que o Docker esteja instalado, independentemente de suas bibliotecas e configurações.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dockerizar uma aplicação significa criar uma imagem Docker que encapsula a aplicação e suas dependências&lt;/em&gt;, tornando-a fácil de distribuir e executar em diferentes ambientes, independentemente das configurações do sistema local. Isso oferece uma série de benefícios, incluindo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portabilidade:&lt;/strong&gt; a aplicação pode ser executada em qualquer sistema compatível com Docker, independentemente do sistema operacional, configuração ou infraestrutura subjacente.&lt;br&gt;
**&lt;br&gt;
Reprodutibilidade:** a imagem Docker contém todas as dependências necessárias para executar a aplicação, garantindo que a mesma versão da aplicação seja executada de forma consistente em diferentes ambientes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalabilidade:&lt;/strong&gt; as imagens Docker são leves e portáteis, o que facilita a implantação e o escalonamento de aplicativos em ambientes de nuvem ou clusters de servidores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Facilidade de implantação:&lt;/strong&gt; as imagens Docker podem ser facilmente implantadas em diferentes ambientes, o que economiza tempo e esforço em comparação com a configuração manual de ambientes e servidores.&lt;/p&gt;

&lt;p&gt;Além disso, a Dockerização de uma aplicação permite que ela seja executada em contêineres isolados e seguros, que podem ser gerenciados e implantados em grande escala com mais facilidade. Isso é especialmente útil para ambientes de produção, onde a segurança e a confiabilidade são essenciais.&lt;/p&gt;

&lt;p&gt;**FROM &lt;br&gt;
**O comando FROM em um Dockerfile é usado para especificar a imagem base a partir da qual a imagem Docker está sendo construída. Essa instrução é obrigatória em um Dockerfile e deve ser a primeira instrução a ser definida no arquivo. Por exemplo, se quisermos construir uma imagem Docker que execute uma aplicação Node.js, podemos começar com uma imagem base do Node.js. Para fazer isso, podemos usar o comando FROM com a imagem base do Node.js, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:14-alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;RUN *&lt;/em&gt;&lt;br&gt;
O comando RUN em um Dockerfile é usado para executar comandos dentro do contêiner Docker durante o processo de construção da imagem. Esses comandos podem ser usados para instalar dependências, configurar o ambiente e executar outras tarefas necessárias para construir a imagem Docker. Por exemplo, para instalar o pacote “nginx” em uma imagem Docker baseada em Ubuntu, podemos usar o comando RUN com o comando “apt-get” para instalar o pacote, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o comando “apt-get update” é executado para atualizar os repositórios de pacotes do Ubuntu, e em seguida, o comando “apt-get install -y nginx” é executado para instalar o pacote nginx.&lt;/p&gt;

&lt;p&gt;Cada vez que o comando RUN é executado, ele cria uma nova camada na imagem Docker. Isso significa que o Docker pode usar o cache de camadas anteriores para acelerar o processo de construção da imagem, desde que o comando RUN e suas dependências não tenham sido alterados.&lt;/p&gt;

&lt;p&gt;O comando RUN é uma das instruções mais usadas em um Dockerfile, pois permite que os desenvolvedores definam as dependências e configurações de suas aplicações de forma clara e consistente, garantindo que a imagem Docker possa ser reproduzida em qualquer sistema em que o Docker esteja instalado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CMD&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;LABEL *&lt;/em&gt;&lt;br&gt;
Uma LABEL em um Dockerfile é uma diretiva que permite adicionar metadados (informações descritivas) a uma imagem Docker. Esses metadados podem incluir informações como a versão da imagem, o mantenedor, a descrição e outras informações relevantes. Por exemplo, para adicionar uma LABEL que especifique o mantenedor da imagem, pode-se usar a seguinte diretiva no Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LABEL maintainer="seu_nome"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;**&lt;br&gt;
EXPOSE &lt;br&gt;
ENV &lt;br&gt;
ADD &lt;br&gt;
COPY &lt;br&gt;
ENTRYPOINT &lt;br&gt;
VOLUME &lt;br&gt;
USER &lt;br&gt;
WORKDIR &lt;br&gt;
ARG &lt;br&gt;
ONBUILD &lt;br&gt;
STOPSIGNAL &lt;br&gt;
HEALTHCHECK &lt;br&gt;
SHELL**&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>container</category>
    </item>
    <item>
      <title>O que é o Helm?</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Sun, 21 Jan 2024 19:49:34 +0000</pubDate>
      <link>https://dev.to/nataliagranato/o-que-e-o-helm-4cll</link>
      <guid>https://dev.to/nataliagranato/o-que-e-o-helm-4cll</guid>
      <description>&lt;p&gt;O Helm é um gerenciador de pacotes para Kubernetes, que facilita a instalação e o gerenciamento de aplicativos em clusters do Kubernetes. Ele é usado para empacotar, distribuir e instalar aplicativos, bem como para gerenciar suas dependências.&lt;/p&gt;

&lt;p&gt;O Helm funciona usando um modelo de pacote, onde os aplicativos são empacotados em arquivos chamados “charts”. Esses charts são compostos de um conjunto de arquivos YAML que definem os recursos do Kubernetes que serão implantados e configurados no cluster.&lt;/p&gt;

&lt;p&gt;O Helm também inclui um sistema de gerenciamento de repositórios, onde os charts podem ser armazenados e compartilhados entre diferentes usuários e equipes. Isso permite que as equipes de desenvolvimento e operações compartilhem seus aplicativos com outras equipes e simplifiquem a implantação e a gestão de aplicativos em clusters Kubernetes.&lt;/p&gt;

&lt;p&gt;**Alguns dos recursos mais importantes do Helm são: &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;**Gerenciamento de dependências:&lt;/em&gt;* O Helm permite que as dependências dos aplicativos sejam gerenciadas automaticamente, facilitando a implantação de aplicativos complexos que precisam de vários componentes diferentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rollbacks:&lt;/strong&gt; O Helm permite reverter rapidamente as alterações feitas em um aplicativo, em caso de problemas ou erros.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Templates:&lt;/strong&gt; O Helm permite que os arquivos YAML sejam configurados dinamicamente, usando variáveis de modelo. Isso torna a implantação de aplicativos mais flexível e fácil de personalizar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Valores de configuração:&lt;/strong&gt; O Helm permite que os valores de configuração sejam definidos separadamente dos arquivos YAML do chart. Isso simplifica o gerenciamento de configurações em diferentes ambientes.&lt;/p&gt;

&lt;p&gt;O Helm é uma ferramenta de código aberto, mantida pela comunidade e hospedada no GitHub. Ele é amplamente utilizado no ecossistema Kubernetes e possui uma grande comunidade de usuários e desenvolvedores.&lt;/p&gt;

&lt;p&gt;Aqui estão alguns dos principais comandos do Helm que podem ser usados para debug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm install --dry-run --debug

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando executa uma simulação da instalação do chart, exibindo informações detalhadas do processo de instalação, como os valores de configuração, recursos do Kubernetes que serão criados e outras informações relevantes. Ele é útil para verificar se as configurações estão corretas antes de fazer a instalação real.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando executa uma verificação estática no chart para garantir que ele esteja formatado corretamente e siga as melhores práticas do Helm. Ele verifica se o chart tem arquivos obrigatórios, se os valores estão definidos corretamente e se a sintaxe está correta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm get manifest &amp;lt;release-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando exibe o manifesto Kubernetes que foi gerado para um determinado release do Helm. Isso permite que você visualize o que será criado no Kubernetes antes de fazer a instalação real.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm get values &amp;lt;release-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando exibe os valores de configuração que foram definidos para um determinado release do Helm. Isso é útil para verificar se os valores foram definidos corretamente antes da instalação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm rollback &amp;lt;release-name&amp;gt; &amp;lt;revision-number&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando faz o rollback para uma versão anterior do release do Helm. Ele é útil para reverter uma atualização que pode ter causado problemas no ambiente Kubernetes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm delete --purge &amp;lt;release-name&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando remove um release do Helm e todos os seus recursos associados do cluster Kubernetes. É útil para limpar um ambiente que não está sendo mais utilizado.&lt;/p&gt;

&lt;p&gt;Esses são apenas alguns dos principais comandos do Helm para debug. Existem outros comandos e opções disponíveis que podem ser úteis para diferentes cenários de debug. Consulte a documentação oficial do Helm para obter mais informações.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>helm</category>
    </item>
    <item>
      <title>Seu ambiente de laboratório Kubernetes com k3d</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Mon, 23 Jan 2023 01:23:24 +0000</pubDate>
      <link>https://dev.to/nataliagranato/introducao-ao-kubernetes-com-k3s-e-k3d-2c5e</link>
      <guid>https://dev.to/nataliagranato/introducao-ao-kubernetes-com-k3s-e-k3d-2c5e</guid>
      <description>&lt;h1&gt;
  
  
  Implemente o seu ambiente de laboratório
&lt;/h1&gt;

&lt;p&gt;k3d é um pequeno programa feito para executar um cluster K3s  no Docker. O K3s é um projeto Sandbox e uma distribuição Kubernetes leve e certificada pela CNCF. Projetado para ambientes de poucos recursos, o K3s é distribuído como um único binário que usa menos de 512 MB de RAM.&lt;/p&gt;

&lt;p&gt;O k3d facilita muito a criação de clusters k3s de um ou vários nós no docker, por exemplo, para desenvolvimento local no Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Requisitos&lt;/em&gt;&lt;br&gt;
Tenha o docker instalado para poder utilizar o k3d.&lt;br&gt;
O kubectl para interagir com o cluster Kubernetes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalação via script
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget -q -O - https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Criando um cluster k3s de alta disponibilidade com o k3d
&lt;/h2&gt;

&lt;p&gt;Como as práticas recomendadas de alta disponibilidade do Kubernetes, devemos criar um cluster de alta disponibilidade com pelo menos três nós control plane.&lt;/p&gt;

&lt;p&gt;Podemos conseguir isso no k3d em um comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k3d cluster create --servers 3 --image rancher/k3s:v1.23.15-k3s1-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Aprendendo o comando:
&lt;/h3&gt;

&lt;p&gt;Comando base: k3d cluster create&lt;br&gt;
Opções:&lt;br&gt;
– server 3: solicita que três nós sejam criados.&lt;/p&gt;

&lt;p&gt;– image rancher/k3s:v1.19.3-k3s2: especifica a imagem K3S a ser usada.&lt;/p&gt;

&lt;p&gt;Agora podemos verificar o que foi criado a partir dos diferentes pontos de vista:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get nodes --output wide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Scale
&lt;/h1&gt;

&lt;p&gt;Graças ao k3d e ao fato de nosso cluster ser executado em contêineres, podemos simular rapidamente a adição de outro nó control plane ao cluster HA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k3d node create extraCPnode --role=server --image=rancher/k3s:v1.19.3-k3s2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Aprendendo o comando:
&lt;/h2&gt;

&lt;p&gt;Comando base: k3d node create&lt;/p&gt;

&lt;h3&gt;
  
  
  Opções:
&lt;/h3&gt;

&lt;p&gt;extraCPnode: nome base que o k3d usará para criar o nome do nó.&lt;/p&gt;

&lt;p&gt;role=server: define a função do nó como um control plane.&lt;/p&gt;

&lt;p&gt;image rancher/k3s:v1.19.3-k3s2: especifica a imagem K3s a ser usada.&lt;/p&gt;

&lt;h1&gt;
  
  
  Limpando os recursos
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k3d cluster delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tradução livre:&lt;br&gt;
&lt;a href="https://www.suse.com/c/rancher_blog/set-up-k3s-in-high-availability-using-k3d/" rel="noopener noreferrer"&gt;https://www.suse.com/c/rancher_blog/set-up-k3s-in-high-availability-using-k3d/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>devops</category>
      <category>k3s</category>
    </item>
    <item>
      <title>Seu ambiente de laboratório Kubernetes com KinD</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Fri, 20 Jan 2023 15:56:15 +0000</pubDate>
      <link>https://dev.to/nataliagranato/configure-um-cluster-kubernetes-de-varios-nos-localmente-usando-o-kind-1l70</link>
      <guid>https://dev.to/nataliagranato/configure-um-cluster-kubernetes-de-varios-nos-localmente-usando-o-kind-1l70</guid>
      <description>&lt;p&gt;&lt;em&gt;Se você está iniciando agora os seus estudos sobre Kubernetes é importante ter um cluster para se familiarizar&lt;/em&gt; com os componentes, comandos e etc. Existem muitas plataformas que oferecem clusters kubernetes para experimentar, entre elas o minikube, k3s, microk8s e etc, não recomendadas para produção. Para isso você pode ir com GKE (Google Cloud), EKS (AWS).&lt;/p&gt;

&lt;p&gt;Existem plataformas como o &lt;a href="https://labs.play-with-k8s.com" rel="noopener noreferrer"&gt;Play with Kubernetes&lt;/a&gt; que oferecem ambientes temporários, com isso você pode perder o seu aprendizado e objetos deployados no playground. Nos provedores de nuvem temos que desembolsar um valor considerável para ter um cluster, por isso o KinD - Kubernetes em Docker é uma boa alternativa pra quem está iniciando agora sua jornada e necessita de um ambiente de desenvolvimento e testes.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Siga os passos abaixo para ter um cluster pra chamar de seu:&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Instale o Docker:&lt;/strong&gt;&lt;br&gt;
Este exemplo baixa o script de &lt;a href="https://get.docker.com/" rel="noopener noreferrer"&gt;https://get.docker.com/&lt;/a&gt; e o executa para instalar a versão estável mais recente do Docker no Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode acessar a &lt;a href="https://docs.docker.com/engine/install" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt; para verificar como instalar em outros sistemas operacionais.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;2. Instale o Kubectl:&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
A instalação do kubectl em sua máquina permitirá que você acesse o cluster que iremos criar e outros no futuro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install -y kubectl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Kubectl também está disponível para macos e windows, &lt;a href="https://kubernetes.io/docs/tasks/tools" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;3. Instale o KinD:&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64
chmod +x ./kind
mv ./kind /usr/local/bin/kind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Criando um cluster:&lt;/strong&gt;&lt;br&gt;
Agora temos o necessário para criar o nosso cluster, se você executar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kind create cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele irá criar um cluster com as configurações padrões, mas a partir de um arquivo de configuração podemos informar quantos nós desejamos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.1. Criando um arquivo de configuração do KinD:&lt;/strong&gt;&lt;br&gt;
A documentação oficial fornece um exemplo, &lt;a href="https://raw.githubusercontent.com/kubernetes-sigs/kind/main/site/content/docs/user/kind-example-config.yaml" rel="noopener noreferrer"&gt;acessível clicando aqui&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;gt; kind-config.yaml &amp;lt;&amp;lt;EOF
# um cluster com 3 nós control plane e 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4.2 Criando o nosso cluster:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kind create cluster --name k8s-playground --config kind-config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o cluster está pronto e você pode usar comandos kubectl para trabalhar no cluster. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Deletando um cluster:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kind delete cluster --name k8s-playground
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>discuss</category>
      <category>programmers</category>
    </item>
    <item>
      <title>Deploying Rancher Server com o Vagrant</title>
      <dc:creator>Natália Granato</dc:creator>
      <pubDate>Thu, 06 Oct 2022 20:40:50 +0000</pubDate>
      <link>https://dev.to/nataliagranato/deploying-rancher-server-com-o-vagrant-338d</link>
      <guid>https://dev.to/nataliagranato/deploying-rancher-server-com-o-vagrant-338d</guid>
      <description>&lt;p&gt;As etapas a seguir implantam rapidamente um Rancher Server com um cluster de nó único anexado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atenção
&lt;/h2&gt;

&lt;p&gt;A intenção desse guia é lançar rapidamente um sandbox que você pode usar para conhecer o Rancher. Não se destinam a ambientes de produção. &lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Vagrant: Vagrant é necessário, pois é usado para provisionar a máquina com base no Vagrantfile.&lt;/p&gt;

&lt;p&gt;Virtualbox: As máquinas virtuais que o Vagrant provisiona precisam ser provisionadas para o VirtualBox.&lt;br&gt;
Pelo menos 4 GB de RAM livre.&lt;/p&gt;
&lt;h3&gt;
  
  
  Observação
&lt;/h3&gt;

&lt;p&gt;O Vagrant exigirá plugins para criar VMs do VirtualBox. Instale-os com os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vagrant plugin instalar vagrant-vboxmanage
vagrant plugin instalar vagrant-vbguest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Começando
&lt;/h2&gt;

&lt;p&gt;Clone Rancher Quickstart para uma pasta usando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/rancher/quickstart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vá para a pasta que contém o Vagrantfile executando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd quickstart/rancher/vagrant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opcional: edite config.yaml para:
&lt;/h3&gt;

&lt;p&gt;Altere o número de nós e as alocações de memória, se necessário. (node.count, node.cpus, node.memory)&lt;br&gt;
Altere a senha do usuário administrador para fazer login no Rancher. (senha do administrador)&lt;br&gt;
Para iniciar a criação do ambiente execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vagrant up --provider=virtualbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando o provisionamento terminar, acesse &lt;a href="https://192.168.56.101" rel="noopener noreferrer"&gt;https://192.168.56.101&lt;/a&gt; no navegador. O usuário/senha padrão é admin/adminPassword.&lt;/p&gt;

&lt;p&gt;Resultado: o Rancher Server e seu cluster Kubernetes estão instalados no VirtualBox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Destruindo o Meio Ambiente
&lt;/h2&gt;

&lt;p&gt;Na pasta quickstart/rancher/vagrant execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vagrant destroy -f.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aguarde a confirmação de que todos os recursos foram destruídos.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>kubernetes</category>
      <category>rancher</category>
      <category>vagrant</category>
    </item>
  </channel>
</rss>
