<?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: Isadora de Menezes</title>
    <description>The latest articles on DEV Community by Isadora de Menezes (@ibmenezes).</description>
    <link>https://dev.to/ibmenezes</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%2F1125823%2Fbd05e9cc-0113-4bae-9324-2a4280e19fe3.jpg</url>
      <title>DEV Community: Isadora de Menezes</title>
      <link>https://dev.to/ibmenezes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ibmenezes"/>
    <language>en</language>
    <item>
      <title>Usando Ngnix-Controller com MetalLB no meu Home Lab</title>
      <dc:creator>Isadora de Menezes</dc:creator>
      <pubDate>Sun, 19 Nov 2023 17:12:29 +0000</pubDate>
      <link>https://dev.to/ibmenezes/usando-ngnix-controller-com-metallb-no-meu-home-lab-57c6</link>
      <guid>https://dev.to/ibmenezes/usando-ngnix-controller-com-metallb-no-meu-home-lab-57c6</guid>
      <description>&lt;p&gt;Fala pessoal! Estou estudando Kubernetes (Fazendo o sensacional PICK da LinuxTips) e resolvi compartilhar o setup que preparei para o meu home lab.&lt;/p&gt;

&lt;p&gt;Meu objetivo é ter o Nginx Controller balanceando as requisições para os meus serviços e diponível num FQDN (Full Qualified Domain Name) que eu separei pra ele.&lt;/p&gt;

&lt;p&gt;Os manifestos usados na configuração podem ser achados &lt;a href="https://github.com/Isadoramenezes/metallb-lab" rel="noopener noreferrer"&gt;aqui.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse post está divido em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Setup Inicial&lt;/li&gt;
&lt;li&gt; Conceitos Importantes&lt;/li&gt;
&lt;li&gt; Tipos de Serviço&lt;/li&gt;
&lt;li&gt; O que é ingress (com foco no Nginx Controller)&lt;/li&gt;
&lt;li&gt; O que é Metal LB&lt;/li&gt;
&lt;li&gt; Configurando tudo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup Inicial
&lt;/h2&gt;

&lt;p&gt;Inicialmente meu cluster tem 1 Control Plane e 2 Workers, os três estão rodando na AWS, usando &lt;code&gt;Ubuntu 22.04&lt;/code&gt;, em instâncias &lt;code&gt;t3.medium&lt;/code&gt;e possuem IP's públicos efêmeros (eles mudam toda vez que eu reincio essas máquinas).&lt;/p&gt;

&lt;p&gt;Eu segui uma instalação básica do K8S, e me guiei principalmente pelo &lt;a href="https://livro.descomplicandokubernetes.com.br/pt/day_five/#instala%C3%A7%C3%A3o-de-um-cluster-kubernetes" rel="noopener noreferrer"&gt;Descomplicando o Kubernetes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos Importantes
&lt;/h2&gt;

&lt;p&gt;Disclaimer: Se, assim como eu você está começando a estudar o Kubernetes, ou se quer refrescar alguns conceitos, os próximos tópicos são pra você. Caso você já tenha uma boa ideia de toda a base, eu sugiro pular para o tópico "Configurando Tudo".&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de Serviço
&lt;/h3&gt;

&lt;p&gt;Antes de mais nada, um serviço no Kubernetes é uma forma de expor uma aplicação que esteja rodando num Pod na rede, de forma que se um Pod for recriado, ou se mais Pods de uma aplicação forem criados, todas as instâncias sejam acessíveis através do mesmo "canal".&lt;/p&gt;

&lt;p&gt;Quando um serviço é criado (seja através do kubectl create svc ou do kubectl expose deploy), um objeto chamado "Endpoint" é criado junto. Esse objeto mantém a lista com os IPs de todos os Pods ativos rodando aquele determinado serviço. Quando um Pod é criado ou destruído a lista é atualizada.&lt;/p&gt;

&lt;p&gt;Por exemplo, na imagem abaixo 2 Pods com App-A e App-B estão rodando. É importante relembrar que as aplicaçoes dentro desses Pods &lt;strong&gt;compartilham recursos&lt;/strong&gt; como o endereço IP. Ao criar um serviço para expor a App-A, o Kubernetes identifica os endereços de todos os Pods rodando a aplicação (através das labels e selectors) e cria o serviço apontando para esses Pods. Para acessar a App-A de dentro do cluster nesse caso, é possível executar um &lt;code&gt;curl http://10.100.100.100&lt;/code&gt; e a requisição será encaminhada para qualquer dos Pods disponívels.&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%2Fz0drrpi8erg2ga0vezlj.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%2Fz0drrpi8erg2ga0vezlj.png" alt="Diagrama com um retangulo para representar o Service em cima de dois retangulos para representar os Pods. O retangulo do Service tem as informações: APP-A-SVC, ClusterIP 10.100.100.100,Endpoints [10.5.6.7:80, 10.5.6.8:80]. O primeiro retangulo para representar um Pod tem Pod 1, IP: 10.5.6.7 e dois quadrados com " width="567" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalmente, os serviços podem ser de quatro tipos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cluster IP&lt;/strong&gt;: Esse é o tipo padrão de serviços, ele expõe a aplicação apenas dentro do cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load Balancer&lt;/strong&gt;: Expõe a aplicação através de um load balancer, com IP fixo fora do cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node Port&lt;/strong&gt;: Torna a aplicação acessível atravpes de uma porta específica em cada nó do cluster. Permite o acesso externo ao cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External Name&lt;/strong&gt;: É uma exceção aos demais, invés de usar labels para definir os endpoints, usa DNS. É usado para apontar para serviços externos ao cluster.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  O que é um Ingress?
&lt;/h3&gt;

&lt;p&gt;O Ingress é um objeto no Kubernetes que ajuda no gerenciamento de acesso aos serviços. Através dele é possível definir regras de acesso, rotas, SSL certificados (com integrações) e outras coisas mais.&lt;/p&gt;

&lt;p&gt;Para funcionar, o Ingress requer um Ingress Controller, que não é criado na instalação padrão no Kubernetes. É através do controller que toda a configuração do Ingress será feita, e há várias opções disponíveis. Aqui &lt;a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/" rel="noopener noreferrer"&gt;nessa página&lt;/a&gt; você pode checar a lista completa.&lt;/p&gt;

&lt;p&gt;Um dos controllers mais utilizados (e um dos três suportados oficialmente projeto Kubernetes) é o &lt;a href="https://docs.nginx.com/" rel="noopener noreferrer"&gt;Nginx-Controller&lt;/a&gt;. Ele é uma implementação do Nginx e pode fazer o balancemaento de requisições WebSocket, gRPC, TCP e UDP, além de suportar o redirecionamento de rotas e terminação TLS/SSL. &lt;/p&gt;

&lt;h3&gt;
  
  
  O que é MetalLB:
&lt;/h3&gt;

&lt;p&gt;O MetalLB é uma implementação de LoadBalancer para Kubernetes que rodam em bare-metal (fora da cloud). Ele é capaz de alocar IP's para serviços do tipo LoadBalancer e essa é a principal característica que eu vou utilizar no meu HomeLab.&lt;/p&gt;

&lt;p&gt;É importante ressaltar que o MetalLB não &lt;em&gt;cria&lt;/em&gt; os IP's, ele apenas faz a alocação de IP's baseado em ranges definidos pelo usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando tudo
&lt;/h2&gt;

&lt;p&gt;Eu sugiro começar a configuração pelo MetalLB&lt;/p&gt;

&lt;p&gt;Minha configuração final é a seguinte:&lt;/p&gt;

&lt;p&gt;O guia completo da Instalação e Configuração pode ser encontrado &lt;a href="https://metallb.universe.tf/installation/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O primeiro passo para a instalação é habilitar o modo 'strict ARP':&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl edit configmap -n kube-system kube-proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após sair salvando (&lt;code&gt;:wq!&lt;/code&gt;), é hora de fazer a instalção do MetalLB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando vai criar o namespace &lt;code&gt;metallb-system&lt;/code&gt; com um controller no control-plane e um speaker em cada nó do cluster. Após todos os pods estarem rodando, alguma configuração é necessária:&lt;/p&gt;

&lt;p&gt;ipaddrpool.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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;metallb.io/v1beta1&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;IPAddressPool&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;k8s-lab&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;metallb-system&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;addresses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;#No meu caso esses são os IPs que eu tenho disponíveis, caso queira aplicar no seu ambiente, atualize esses IPs&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;54.152.233.228/32&lt;/span&gt; 
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;54.167.93.192/32&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Como eu estou usando a configuração via ARP, também é necessário criar um L2Advertsiment:&lt;/p&gt;

&lt;p&gt;L2Advertsiment.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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;metallb.io/v1beta1&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;L2Advertisement&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;k8s-lab&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;metallb-system&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;ipAddressPools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;k8s-lab&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;E então:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k apply -f ipaddrpool.yml
k apply -f L2Advertsiment.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checando se tudo está criado:&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%2F46cjhk5lg3sfpy0edfv3.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%2F46cjhk5lg3sfpy0edfv3.png" alt=" " width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A configuração do MetalLB está feita, para validar, precisamos criar um serviço. Optei pelo bom e velho Nginx:&lt;/p&gt;

&lt;p&gt;nginx-deployment.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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/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;Deployment&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;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;nginx&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;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&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;nginx&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&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;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;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;image&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;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;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="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&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;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5&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;256Mi&lt;/span&gt;
          &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.3&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;64Mi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k apply -f nginx-deployment.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fz1ah8rp8dgw7yk0nuq3v.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%2Fz1ah8rp8dgw7yk0nuq3v.png" alt=" " width="672" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A forma mais rápida de validar se o MetalLB está sendo capaz de fornecer IPs para os serviços, é expondo o deploy que acabamos de criar utilizando o serviço do tipo loadBalancer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl expose deploy nginx --port 80 --target-port 80 --type LoadBalancer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fvxifddzqd9i0iihcpwtc.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%2Fvxifddzqd9i0iihcpwtc.png" alt=" " width="800" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E com um &lt;code&gt;curl 54.167.93.192&lt;/code&gt; recebemos a mensagem padrão do Nginx.&lt;/p&gt;

&lt;p&gt;Okay, o MetalLB está funcionando e é possível acessar o serviço através do IP de dentro do cluster, mas eu quero que esse serviço esteja disponível no meu FQDN &lt;code&gt;k8s-lab.ibmenezes.com&lt;/code&gt;. É hora de installar o nginx-controller.&lt;/p&gt;

&lt;p&gt;O getting started dessa instalação pode ser encontrado &lt;a href="https://kubernetes.github.io/ingress-nginx/deploy/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como estamos em uma instalação 'bare-metal', a instalação será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após alguns segundos (talvez minutos) temos o pod do ingress-controller rodando no Control Plane. Além disso, o serviço do ingress-controler é criado no namespace &lt;code&gt;ingress-nginx&lt;/code&gt;, e o External IP é atribuído pelo MetalLB:&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%2Fxj99xjzghf9hcmid4a80.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%2Fxj99xjzghf9hcmid4a80.png" alt=" " width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse momento já é possível acessar o ingress controller no browser com &lt;a href="https://54.152.233.228:31333/" rel="noopener noreferrer"&gt;https://54.152.233.228:31333/&lt;/a&gt;. Esse acesso retorna um 503 porque não existe nenhum service associado a ingress nesse momento.&lt;/p&gt;

&lt;p&gt;Para corrigir isso, a criação do ingress:&lt;/p&gt;

&lt;p&gt;ingress.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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.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;Ingress&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;k8s-lab&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;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
    &lt;span class="na"&gt;cert-manager.io/issuer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;letsencrypt-staging"&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;ingressClassName&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;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;k8s-lab.ibmenezes.com&lt;/span&gt;
    &lt;span class="na"&gt;secretName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;k8s-lab-tls"&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;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;k8s-lab.ibmenezes.com&lt;/span&gt;
    &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;/&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&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;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui algumas coisas são importantes:&lt;br&gt;
A primeira annotation &lt;code&gt;nginx.ingress.kubernetes.io/rewrite-target: /&lt;/code&gt; determina que todas as vezes que uma requisição for encaminhada para a &lt;code&gt;/&lt;/code&gt;, ela será redirecionada ao path (que falaremos mais abaixo).&lt;/p&gt;

&lt;p&gt;A segunda anotação, &lt;code&gt;cert-manager.io/issuer: "letsencrypt-staging"&lt;/code&gt; é associada à criação de certificados SSL usando o letsencrypt. Nesse setup não iremos a fundo nisso, na próxima sessão explico os motivos. O bloco &lt;code&gt;tls&lt;/code&gt; também está associado ao certificado.&lt;/p&gt;

&lt;p&gt;Já nas especificações, o bloco de rules vai determinar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- host: k8s-lab.ibmenezes.com -&amp;gt; O FQDN onde o ingress espera ouvir a requisição 
http.paths.path -&amp;gt; O caminho da applicação para onde o trafego será redirecionado quando o usuário digitar `/` (da annotation)
http.paths.pathType -&amp;gt;  O tipo de path, esse valor é requerido quando o tipo é Prefix ou Exact
http.paths.backend -&amp;gt; as configurações do serviço para o qual o ingress estará apontando
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quase tudo pronto, alguns detalhes finais:&lt;/p&gt;

&lt;p&gt;É importante remover o serviço que criamos anteriormente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete svc nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso vai liberar o IP anteriormente atribuido ao serviço e prevenir que a gente valide o serviço errado. Antes de criar o ingress é importante criar o serviço definido em http.paths.backend. Como eu defini o meu se chamando 'nginx', me basta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl expose deploy nginx --port 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F99m2sbv42ho54hy9a9ld.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%2F99m2sbv42ho54hy9a9ld.png" alt=" " width="800" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar o ingress a partir do manifesto criado anteriormente basta executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f ingress.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com um describe é possível verificar que o ingress recebe o mesmo IP do ingress-controller recebeu anteriormente.&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%2Fpt50bhqsgqx1n0bfbkku.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%2Fpt50bhqsgqx1n0bfbkku.png" alt=" " width="731" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A última configuração necessária é no provedor de DNS, no meu caso eu criei uma entrada tipo A apontando para o IP do ingress.&lt;/p&gt;

&lt;p&gt;Para validar o balanceamento, editei o index.html de cada Pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k exec -it nginx-f888bbf65-j94fk /bin/bash
echo "Eu sou o pod nginx-f888bbf65-j94fk" &amp;gt; /usr/share/nginx/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k exec -it nginx-f888bbf65-tcmvz/bin/bash
echo "Eu sou o pod nginx-f888bbf65-tcmvz" &amp;gt; /usr/share/nginx/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E, acessando '&lt;a href="https://k8s-lab.ibmenezes.com:31333" rel="noopener noreferrer"&gt;https://k8s-lab.ibmenezes.com:31333&lt;/a&gt;' pelo browser temos:&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%2Fgopryzq377l71qusan5k.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%2Fgopryzq377l71qusan5k.png" alt=" " width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resumindo como tudo funciona de forma superficial:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Eu tenho uma entrada DNS 'k8s-lab.ibmenezes.com' do tipo A, aonde eu precisei atualizar o IP de destino;&lt;/li&gt;
&lt;li&gt;A lista de IP's disponíveis para a virtualização foi feita a partir dos IP's públicos das minhas máquinas na AWS e passada para o MetalLB;&lt;/li&gt;
&lt;li&gt;O MetalLB forneceu um dos IP's disponíveis para o nginx-controller&lt;/li&gt;
&lt;li&gt;Ta pronto o sorvetinho! Agora eu consigo acessar meus serviços externamente.&lt;/li&gt;
&lt;/ol&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%2Fd4ozti37ywbzo6razney.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%2Fd4ozti37ywbzo6razney.png" alt=" " width="769" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hashicorp Vault Operations Professional (HCVOP) - Minha experiência</title>
      <dc:creator>Isadora de Menezes</dc:creator>
      <pubDate>Sat, 29 Jul 2023 19:19:01 +0000</pubDate>
      <link>https://dev.to/ibmenezes/hashicorp-vault-operations-professional-hcvop-minha-experiencia-2mhb</link>
      <guid>https://dev.to/ibmenezes/hashicorp-vault-operations-professional-hcvop-minha-experiencia-2mhb</guid>
      <description>&lt;p&gt;Nesse post eu estou compartilhando como foi minha preparação e a experiência de fazer a certificação HCVOP-002 esse ano (2023). Ele está dividido em: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Introdução - Informações gerais sobre a certificação, o Vault, e promessas de novos posts&lt;/li&gt;
&lt;li&gt;Informações mais específicas sobre a certificação - duração, nota de corte, conteúdo&lt;/li&gt;
&lt;li&gt;Como eu me preparei &lt;/li&gt;
&lt;li&gt;O dia da prova &lt;/li&gt;
&lt;li&gt;O que eu sugiro praticar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;É importante ressaltar que tudo o que será escrito aqui é baseado na &lt;strong&gt;minha experiência&lt;/strong&gt; e eu vou usar esse termo várias vezes. Se você está pensando em fazer a certificação esse post &lt;strong&gt;não&lt;/strong&gt; é um guia de estudos ou caminho das pedras, é apenas o caminho que eu fiz com o maior número de detalhes que eu posso fornecer. Não é minha intenção replicar qualquer questão do exame nesse post. Siga a documentação oficial da Hashicorp na sua preparação.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Introdução&lt;/strong&gt;&lt;br&gt;
A HCVOP é focada em pessoas que trabalham no deploy, configuração, gerenciamento e monitoramento do Hashicorp Vault (você pode conferir todos os detalhes na &lt;a href="https://www.hashicorp.com/certification/vault-operations-professional"&gt;página da Hashicorp&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Se você não sabe o que é, para que serve ou do que se alimenta o Vault, eu pretendo iniciar uma sequência em breve (sem compromissos com datas por aqui) com alguns detalhes sobre o que é, como usar algumas funcionalidades e talvez com alguns laboratórios que eu ache interessante. Apenas para rápida contextualização, o Vault - desenvolvido pela Hashicorp - é uma ferramenta de segurança, focado em gerenciamento de segredos e dados sensíveis, que permite a manipulação segura desses dados durante todo o "ciclo de vida" deles. Quer saber mais agora mesmo? Dá uma olhada na &lt;a href="https://www.vaultproject.io/"&gt;página oficial do Vault&lt;/a&gt;. Nesse post eu vou assumir que você já conhece algumas terminologias sobre o Vault e as funcionalidades, então se algo ficar confuso por hoje espero que os próximos posts esclareçam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A certificação segundo a Hashicorp&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A primeira coisa é possível perceber quando a gente lê a página da Hashicorp é que esta não é uma certificação para quem usa o Vault só como cliente, essa prova - que tem parte teórica e prática - vai exigir que você saiba gerenciar o Vault em si, habilitar e configurar funcionalidades, monitorar os logs e identificar problemas por lá, usar as &lt;strong&gt;&lt;em&gt;features enterprise&lt;/em&gt;&lt;/strong&gt; (funcionalidades pagas) de Disaster Recovery e Replica Performance.&lt;/p&gt;

&lt;p&gt;Os pré requisitos listados na página da documentação (o link ta ali em cima pessoal) são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ter passado na certificação Associate do Vault (Recomendado, não obrigatório). Alguns anos atrás eu fiz esse &lt;a href="https://gist.github.com/Isadoramenezes/2d19c208f2313106d1f56916101cb386"&gt;&lt;em&gt;gist&lt;/em&gt;&lt;/a&gt; com algumas notas de quando fiz o exame.&lt;/li&gt;
&lt;li&gt;Linux (listar e editar arquivos)&lt;/li&gt;
&lt;li&gt;Redes&lt;/li&gt;
&lt;li&gt;Experiência com PKI, incluindo PGP e TLS&lt;/li&gt;
&lt;li&gt;Fundamentos de segurança da informação, incluindo segurança de redes e RBAC (Role Based Access Control)&lt;/li&gt;
&lt;li&gt;Containers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A versão do Vault rodando no ambiente vai ser 1.8.0 ou maior (post em Julho de 2023). É importante saber exatamente qual versão está rodando na hora da prova porquê o acesso a &lt;a href="https://developer.hashicorp.com/vault/api-docs"&gt;documentação da API&lt;/a&gt; é liberado dentro do ambiente (nada de acesso ao learn.hashicorp.com), e você não quer perder tempo consultando a versão errada. Aqui no canto direito é possível selecionar as opções disponíveis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GnHcVTYo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jie14quhj5g3c8fqhu3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GnHcVTYo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jie14quhj5g3c8fqhu3s.png" alt="Print da página inicial da documentação da API do Vault onde pode-se observar no canto direito um menu drop-down com a versão 1.14.x" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A prova dura até 4 horas e isso inclui uma pausa de até 15 minutos.&lt;/p&gt;

&lt;p&gt;O preço com retake (você pode refazer caso não passe na primeira) é $295 (em dólar).&lt;/p&gt;

&lt;p&gt;A prova está disponível apenas em inglês, e é válida por 2 anos.&lt;/p&gt;

&lt;p&gt;Como mencionado anteriormente, você vai encontrar questões teóricas - na minha foram algo entre 15 e 20 se não me engano - e práticas - 4 ou 6 cenários com 2 a 4 itens cada.&lt;/p&gt;

&lt;p&gt;A Hashicorp disponibiliza um &lt;a href="https://learn.hashicorp.com/collections/vault/ops-pro-cert"&gt;guia para preparação&lt;/a&gt; com:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/ops-pro-cert/ops-pro-overview"&gt;Visão geral sobre o exame&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/ops-pro-cert/ops-pro-study"&gt;Guia de estudos por tópico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/ops-pro-cert/ops-pro-review"&gt;Guia de revisão por tópico&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Na página da certificação os tópicos estão divididos em:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar a configuração e executar o Vault em certo cenário - que será fornecido na hora da prova&lt;/li&gt;
&lt;li&gt;Monitoração do Vault&lt;/li&gt;
&lt;li&gt;Emprego do modelo de segurança do Vault&lt;/li&gt;
&lt;li&gt;Criação de ambientes tolerantes à falha&lt;/li&gt;
&lt;li&gt;Entendimento da integração com HSM&lt;/li&gt;
&lt;li&gt;Escalabilidade para performance&lt;/li&gt;
&lt;li&gt;Configuração de controle de acesso&lt;/li&gt;
&lt;li&gt;Configuração do Vault agent&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sobre a pontuação mínima para passar na prova eu não consegui achar a informação atualizada, quando eu fiz acredito que era de 85%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Minha preparação e dicas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meu primeiro contato com o Vault foi através do &lt;a href="https://www.linuxtips.io/course/descomplicando-o-vault"&gt;curso da LinuxTips&lt;/a&gt; na primeira edição do Chama as Minas lá em 2020, mesmo ano que eu comecei a atuar profissionalmente na instalação dele em ambientes corporativos. Em 2021 eu tive a chance de fazer a certificação de nível associate para participar do programa de parceiros da Hashicorp e tudo isso serviu de aprendizado e experiência pra mim. Depois disso eu foquei em outras coisas, até que no começo desse ano tive novamente a chance de participar de um projeto de implementação interessante, o que coincidiu com o convite para fazer o exame beta até 15 de Abril.&lt;/p&gt;

&lt;p&gt;Eis então o cenário: eu não mexia no Vault desde o final de 2021, voltei a mexer em Fevereiro de 2023 e 01/03 eu recebi o convite da certificação. Dalí tive até 14/04 para me preparar.&lt;br&gt;
E como foi isso? Bom, inicialmente eu procurei relatos de pessoas que já tinham feito a prova para entender melhor o que esperar, e achei basicamente &lt;a href="https://medium.com/@glen.yu/how-i-passed-the-hashicorp-vault-operations-professional-exam-7ee4e88fd979"&gt;esse post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Olhando as páginas da documentação eu percebi que tinha MUITO conteúdo pra estudar e eu não tinha esse tempo todo, então para a parte mais básica e teórica eu optei por fazer um dos &lt;a href="https://www.udemy.com/course/hashicorp-certified-vault-associate-practice-exam/"&gt;simulados para a prova associate do Bryan Krausen&lt;/a&gt; que eu tinha comprado em 2021. Isso me ajudou e identificar os pontos teóricos que eu precisa revisar antes de tudo. &lt;/p&gt;

&lt;p&gt;Daí eu tinha outro problema, como fica claro na página da prova, essa certificação vai testar suas habilidades no nível enterprise, as funcionalidades pagas são a chave dessa prova, e como participante beta eu não recebi nenhuma licença para estudar. Eu entrei em contato com o suporte da Hashicorp que foi super parceiro e conseguiu me direcionar para o canal correto para solicitar uma licença temporária. Eles também me sugeriram outro curso do &lt;a href="https://www.udemy.com/course/hashicorp-certified-vault-operations-professional/"&gt;Bryan Krausen: Vault Operations Professional &lt;/a&gt; - O Bryan é certificado como exam contributor para essa prova e o curso dele dá acesso a &lt;a href="https://kodekloud.com/courses/lab-hashicorp-certified-vault-operations-professional-2022/"&gt;esse ambiente prático&lt;/a&gt; com laboratórios que permititam treinar as funcionalidades pagas. Eu decidi comprar o curso e em relação ao conteúdo gravado não foi de super ajuda, mas os laboratórios podem dar uma visão legal sobre coisas que você talvez não pratique no dia a dia (como uma operação de disaster recovery, ou auto-auth com o vault agent). A balança para mim foi positiva aqui.&lt;/p&gt;

&lt;p&gt;O post do Glen Yu me fez refletir sobre outra coisa que acho importante - &lt;em&gt;e assim como ele eu reforço aqui: siga a orientação da Hashicorp, essa é uma conclusão nossa e você não quer ter uma surpresa por não estudar algo que estava no plano&lt;/em&gt; - o objetivo dessa prova é te testar em Vault, as possíveis integrações com provedores de nuvem (AWS, Azure, GCP), com métodos de autenticação externos (Okta, LDAP) e, principalmente com outros tipos de storage que não o raft, podem cair na prova, mas &lt;strong&gt;na minha opinião&lt;/strong&gt; não é provável que caiam, isso me ajudou a afunilar os estudos cortando todas as integrações &lt;strong&gt;por minha conta e risco&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. O Dia da Prova&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eu achei o ambiente da prova um pouco estranho, mas basicamente você tem acesso a um ambiente virtual com uma guia do Chrome vai receber as instruções pré-exame. &lt;strong&gt;Leia as instruções&lt;/strong&gt;, elas vão te orientar como iniciar os cenários, como navegar no ambiente e o que você pode e não pode fazer.&lt;/p&gt;

&lt;p&gt;As minhas 15 primeiras questões foram teóricas e elas também focaram bastante no nível enterprise, por exemplo sobre as funcionalidades relacionadas a FIPS 140-2, sobre como funciona a configuração de um cluster Replica Performance com e sem path filters, sobre policies e sobre o sentinel.&lt;/p&gt;

&lt;p&gt;Logo após vieram as questões práticas. &lt;strong&gt;Eu não lembro de todas&lt;/strong&gt; mas lembro que as questões abordaram:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criação de tokens;&lt;/li&gt;
&lt;li&gt;Criação de policies;&lt;/li&gt;
&lt;li&gt;Configuração de secret engines;&lt;/li&gt;
&lt;li&gt;Configuração de auth engines;&lt;/li&gt;
&lt;li&gt;Disaster recovery (configuração e operação);&lt;/li&gt;
&lt;li&gt;Replica Performance (configuração e operação);&lt;/li&gt;
&lt;li&gt;Vault-agent (auto-auth e PKI);&lt;/li&gt;
&lt;li&gt;Metricas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;É muito importante que você leia com calma e atenção o que as questões estão pedindo, a maioria delas vai pedir para você criar um arquivo em determinado diretório, ou escrever o resultado de determinada operação de um campo. &lt;strong&gt;Valide seu resultado&lt;/strong&gt; antes de ir para a próxima questão. A questão pedia para criar um token em um arquivo com certa policy? Execute um vault login ou um token lookup para verificar se o token de fato tem aquela policy. O objetivo era criar um usuário? Valide que você consegue logar e acessar as coisas que aquele usuário deveria acessar. Cheque se seu cluster secundário está conectado,  e assim por diante.&lt;/p&gt;

&lt;p&gt;Quando eu finalmente acabei essas questões - elas consumiram mais de 3 horas no meu caso - haviam ainda mais 5 questões híbridas sobre logs de auditoria, basicamente eu precisei checar os logs dentro de um container e identificar quem performou determinada ação, ou em que horário algo ocorreu, e depois escrever isso nos campos disponíveis.&lt;/p&gt;

&lt;p&gt;O resultado demorou bastante para chegar, a prova foi em Abril e eu só recebi o resultado em Julho, então é bom segurar a ansiedade depois do exame :) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. O que eu sugiro praticar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A resposta curta é: &lt;strong&gt;tudo&lt;/strong&gt; :)&lt;br&gt;
A resposta longa é: Não se desespere com a resposta curta, a documentação está ao seu lado e irá te ajudar.&lt;br&gt;
A minha prova cobriu facilmente 90% do que está no programa, de forma prática ou teórica, então o ideal é você saber navegar na documentação de olhos fechados. Consultar qual endpoint chamar, quais parâmetros ele aceita, e até uma segunda confirmação sobre questões teóricas pode ajudar muito.&lt;/p&gt;

&lt;p&gt;Como eu disse antes, &lt;strong&gt;baseada na minha experiência&lt;/strong&gt; eu não focaria eu integrações externas, exceto talvez pelo caso de bancos de dados, já que essa é uma funcionalidade amplamente utilizada.&lt;/p&gt;

&lt;p&gt;Alguns cenários que eu praticaria e pretendo trazer aqui na sequência sobre Vault:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/auto-unseal/autounseal-transit"&gt;Configuração de autounseal com transit engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Configuração e &lt;a href="https://developer.hashicorp.com/vault/docs/concepts/pgp-gpg-keybase"&gt;inicialização segura&lt;/a&gt; e &lt;a href="https://developer.hashicorp.com/vault/docs/internals/security"&gt;modelo de segurança&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/docs/secrets/databases/mysql-maria"&gt;Segredos dinâmicos - DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.hashicorp.com/vault/tutorials/tokens/tokens"&gt;Criação e revogação de tokens&lt;/a&gt; - explorando diferentes tipos tokens de serviço e batch tokens, tokens periódicos, tokens com limite de uso, wrap e unwrap de token e assim por diante&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.hashicorp.com/vault/docs/audit/file"&gt;Audit devices&lt;/a&gt; e audit logs &lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/docs/secrets/pki"&gt;Vault PKI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/docs/auth"&gt;Métodos de autenticação humana/maquina&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/enterprise/disaster-recovery"&gt;Disaster Recovery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/enterprise/performance-replication"&gt;Performance Replication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/docs/concepts/policies"&gt;Policies e controle de acesso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/policies/sentinel"&gt;Sentinel Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/tutorials/operations/rekeying-and-rotating"&gt;Processo de Rekey e de Key Rotation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/docs/enterprise/namespaces"&gt;Namespaces &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/vault/docs/agent-and-proxy/agent"&gt;Vault agent&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por hoje é isso, obrigada por ter lido até aqui,  espero voltar em breve com alguns laboratórios e se você está pensando em prestar esse exame e quer trocar uma ideia pode deixar um comentário por aqui :) &lt;/p&gt;

</description>
      <category>devops</category>
      <category>vault</category>
      <category>hashicorp</category>
    </item>
  </channel>
</rss>
