<?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: Silvio Silva</title>
    <description>The latest articles on DEV Community by Silvio Silva (@silvio_silva).</description>
    <link>https://dev.to/silvio_silva</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%2F374305%2Fa547a586-2189-4814-b6b4-8ad4095ae3d9.jpg</url>
      <title>DEV Community: Silvio Silva</title>
      <link>https://dev.to/silvio_silva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/silvio_silva"/>
    <language>en</language>
    <item>
      <title>Configurando um Cluster Kubernetes em Alta Disponibilidade (5/5)</title>
      <dc:creator>Silvio Silva</dc:creator>
      <pubDate>Thu, 11 Jun 2020 20:02:38 +0000</pubDate>
      <link>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-5-k7c</link>
      <guid>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-5-k7c</guid>
      <description>&lt;p&gt;Continuando o post &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-4-20cl"&gt;anterior&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Adicionando os &lt;code&gt;workers&lt;/code&gt; ao Cluster
&lt;/h1&gt;

&lt;p&gt;Agora que terminamos o &lt;code&gt;Control Plane&lt;/code&gt;, podemos adicionar os &lt;code&gt;workers&lt;/code&gt; e o processo é bem parecido com o que fizemos para os  &lt;code&gt;masters&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Você precisa mudar para a janela &lt;code&gt;2-workers&lt;/code&gt; no &lt;code&gt;TMUX&lt;/code&gt; e para isso pode usar o comando &lt;code&gt;C-b 2&lt;/code&gt; ou o modo mouse para clicar no nome da janela.&lt;/p&gt;

&lt;p&gt;Assim como nos &lt;code&gt;masters&lt;/code&gt;, a janela &lt;code&gt;2-workers&lt;/code&gt; terá três painéis cada um com o comando &lt;code&gt;./conn.sh&lt;/code&gt; pronto para executar.&lt;/p&gt;

&lt;p&gt;Vá em frente e pressione &lt;code&gt;ENTER&lt;/code&gt; para executar o comando e conectar nos três &lt;code&gt;workers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6JI57iHd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7zava79bjph804a1bcwk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6JI57iHd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7zava79bjph804a1bcwk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para realizar o &lt;code&gt;join&lt;/code&gt; dos &lt;code&gt;workers&lt;/code&gt;, você precisará usar somente os dois primeiros tokens (&lt;code&gt;--token&lt;/code&gt; e &lt;code&gt;--discovery-token-ca-cert-hash&lt;/code&gt;) obtidos anteriormente para compor o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;--short&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm &lt;span class="nb"&gt;join &lt;/span&gt;lb:6443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--node-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--token&lt;/span&gt; wx6o8y.mdmkxmj9gfeiq1fe &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--discovery-token-ca-cert-hash&lt;/span&gt; sha256:65446ecd54074326caff65fdbbac91118dd591593930eae0842f5ea2a72e2bdf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--v&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Join dos &lt;code&gt;workers&lt;/code&gt; iniciando:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JxtuhoTQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v4bxxxdbl0t6osjafbnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JxtuhoTQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v4bxxxdbl0t6osjafbnv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Concluído com sucesso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qd9J3Som--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8go5kv22oz6hsyacdhrv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qd9J3Som--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8go5kv22oz6hsyacdhrv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora você pode retornar à janela &lt;code&gt;master-1&lt;/code&gt; e observar o status do Cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ny-Rv9za--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5d3mgsgqdvp68fmnu2c3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ny-Rv9za--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5d3mgsgqdvp68fmnu2c3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;No próximo post, mostrarei algumas operações no Cluster usando &lt;code&gt;Deployment&lt;/code&gt;, &lt;code&gt;Rollout&lt;/code&gt;, &lt;code&gt;Services&lt;/code&gt; (com &lt;code&gt;ClusterIP&lt;/code&gt; e &lt;code&gt;NodePort&lt;/code&gt;) e &lt;code&gt;HAProxy Ingress Controller&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configurando um Cluster Kubernetes em Alta Disponibilidade (4/5)</title>
      <dc:creator>Silvio Silva</dc:creator>
      <pubDate>Thu, 11 Jun 2020 20:02:31 +0000</pubDate>
      <link>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-4-20cl</link>
      <guid>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-4-20cl</guid>
      <description>&lt;p&gt;Continuando o post &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-3-4p2a"&gt;anterior&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Adicionando os outros &lt;code&gt;masters&lt;/code&gt; ao Cluster
&lt;/h1&gt;

&lt;p&gt;Agora que o &lt;code&gt;master-1&lt;/code&gt; está pronto, podemos adicionar o &lt;code&gt;master-2&lt;/code&gt; e o &lt;code&gt;master-3&lt;/code&gt; ao &lt;code&gt;Control Plane&lt;/code&gt; usando o comando &lt;code&gt;kubeadm join&lt;/code&gt; com o parâmetro &lt;code&gt;--control-plane&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para montar o comando de join, precisaremos dos valores dos seguintes tokens gerados durante a inicialização do &lt;code&gt;master-1&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;token&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;discovery-token-ca-cert-hash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;certificate-key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Execute o comando abaixo para obter os valores dos tokens a partir do arquivo de log gerado durante a inicialização do &lt;code&gt;master-1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBEADM_LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/kubeadm-init.log"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\-\-&lt;/span&gt;&lt;span class="s2"&gt;certificate-key"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBEADM_LOG_FILE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--before&lt;/span&gt; 2 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--only-matching&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--extended-regexp&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\-\-&lt;/span&gt;&lt;span class="s2"&gt;.*"&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/\-\-control-plane //; s/^/  /'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A saída do comando anterior deve se parecer com isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kcXgv-0D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0joyqa4jal01zr2c51wi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kcXgv-0D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0joyqa4jal01zr2c51wi.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você deve copiar as três últimas linhas como as que listei abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nt"&gt;--token&lt;/span&gt; wx6o8y.mdmkxmj9gfeiq1fe &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--discovery-token-ca-cert-hash&lt;/span&gt; sha256:65446ecd54074326caff65fdbbac91118dd591593930eae0842f5ea2a72e2bdf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--certificate-key&lt;/span&gt; cfcf9ea9ee8adafd9210858fa8f344596888d1041ef96cce6125b4e960cd3e41
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Monte o comando de join adicionando as 3 linhas copiadas anteriormente como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;--short&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;LOCAL_IP_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; /etc/hosts | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $1 }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NODE_NAME..................: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"LOCAL_IP_ADDRESS...........: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_IP_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm &lt;span class="nb"&gt;join &lt;/span&gt;lb:6443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--v&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--control-plane&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--node-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--apiserver-advertise-address&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_IP_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--token&lt;/span&gt; wx6o8y.mdmkxmj9gfeiq1fe &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--discovery-token-ca-cert-hash&lt;/span&gt; sha256:65446ecd54074326caff65fdbbac91118dd591593930eae0842f5ea2a72e2bdf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--certificate-key&lt;/span&gt; cfcf9ea9ee8adafd9210858fa8f344596888d1041ef96cce6125b4e960cd3e41
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Executando o comando no &lt;code&gt;master-2&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Você deve mudar para o painel do &lt;code&gt;master-2&lt;/code&gt; e pode fazer isso usando &lt;code&gt;C-b + seta-para-baixo + seta-para-direita&lt;/code&gt; ou ativar o modo mouse com &lt;code&gt;C-b m&lt;/code&gt; e simplesmente clicar no painel.&lt;/p&gt;

&lt;p&gt;Tanto faz em qual &lt;code&gt;master&lt;/code&gt; (&lt;code&gt;master-2&lt;/code&gt; ou &lt;code&gt;master-3&lt;/code&gt;) você executará o comando de &lt;code&gt;join&lt;/code&gt; primeiro e inclusive pode executar no &lt;code&gt;master-3&lt;/code&gt; enquanto ainda estiver executando no &lt;code&gt;master-2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--72vllEBt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b3fftl88lfsckqgwmthy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--72vllEBt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b3fftl88lfsckqgwmthy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Novos &lt;code&gt;masters&lt;/code&gt; adicionados e prontos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oTiR0eP5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o56eabahrxgb0abyleyq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oTiR0eP5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o56eabahrxgb0abyleyq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nota sobre &lt;code&gt;etcd&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Durante o processo que deve levar menos de 1 minuto, você pode notar uma mensagem com a informação de que o &lt;code&gt;etcd leader&lt;/code&gt; mudou.&lt;/p&gt;

&lt;p&gt;Isso acontece porque nesta configuração o &lt;code&gt;etcd cluster&lt;/code&gt; é criado nos mesmos &lt;code&gt;nodes&lt;/code&gt; do &lt;code&gt;Control Plane&lt;/code&gt;, isto é, usando os &lt;code&gt;masters&lt;/code&gt; (configuração chamada de &lt;code&gt;stacked&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;O cluster &lt;code&gt;etcd&lt;/code&gt; precisa de no mínimo 3 integrantes para que possa haver a "eleição" do líder.&lt;/p&gt;

&lt;p&gt;Como novos integrantes desse cluster estão sendo incluídos é esperado que essa "eleição" ocorra.&lt;/p&gt;

&lt;p&gt;Mais detalhes sobre a configuração do &lt;code&gt;etcd&lt;/code&gt; em modo &lt;code&gt;stacked&lt;/code&gt; podem ser encontradas &lt;a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/#stacked-etcd-topology"&gt;aqui&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Próximo: &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-5-k7c"&gt;Adicionando os workers ao Cluster&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configurando um Cluster Kubernetes em Alta Disponibilidade (3/5)</title>
      <dc:creator>Silvio Silva</dc:creator>
      <pubDate>Thu, 11 Jun 2020 20:02:24 +0000</pubDate>
      <link>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-3-4p2a</link>
      <guid>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-3-4p2a</guid>
      <description>&lt;p&gt;Continuando o post &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-2-46kp"&gt;anterior&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalando o &lt;code&gt;Control Plane&lt;/code&gt; no primeiro &lt;code&gt;Master&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Ao mudar para a janela &lt;code&gt;1-masters&lt;/code&gt; o comando &lt;code&gt;./conn.sh&lt;/code&gt; deve estar pronto para ser executado. Faça isso pressionando &lt;code&gt;ENTER&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XgPaxLnK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cnesacs35xzbfue91n7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XgPaxLnK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cnesacs35xzbfue91n7y.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Configure o auto completion para o &lt;code&gt;kubectl&lt;/code&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="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; | tee --append ~/.bashrc

source &amp;lt;(kubectl completion bash)
alias k=kubectl
complete -F __start_kubectl k
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Além de configurar o completion, o comando anterior também criou um alias que permite usar apenas &lt;code&gt;k&lt;/code&gt; ao invés de &lt;code&gt;kubectl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MPIvFKnu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uzn2jqr7dmt29ii0k7nh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MPIvFKnu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uzn2jqr7dmt29ii0k7nh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Atenção: deste ponto em diante, você deve realizar a configuração apenas no primeiro &lt;code&gt;master&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para isso, você precisa desativar a sincronização de janelas no &lt;code&gt;TMUX&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A configuração que usei consiste na combinação &lt;code&gt;C-b y&lt;/code&gt;. Caso queira usar a mesma combinação de teclas, sugiro criar o arquivo &lt;code&gt;${HOME}/.tmux.conf&lt;/code&gt; exatamente como criei &lt;a href="https://github.com/smsilva/linux/blob/master/scripts/utilities/tmux/tmux.conf"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Você também pode pressionar &lt;code&gt;C-b&lt;/code&gt; (&lt;code&gt;CTRL+b&lt;/code&gt;) e digitar o comando abaixo (incluindo os dois pontos no início da linha) para desativar a sincronização dos painéis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;:set-window-option synchronize-panes off
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Tenha certeza de que os painéis não estão mais sincronizados (digite algo no terminal ou pressione &lt;code&gt;ENTER&lt;/code&gt; algumas vezes para ter certeza):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9XZyEV6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b4oe2pfat4xpre6l5pq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9XZyEV6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b4oe2pfat4xpre6l5pq7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando a versão do Kubernetes
&lt;/h2&gt;

&lt;p&gt;Neste exemplo você pode manter a versão &lt;code&gt;1.18&lt;/code&gt; mas este processo também foi testado com sucesso na &lt;code&gt;1.17&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBERNETES_DESIRED_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'1.18'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="o"&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;sudo &lt;/span&gt;apt-cache madison kubeadm | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_DESIRED_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $3 }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;KUBERNETES_BASE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="p"&gt;%-*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;LOCAL_IP_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;--short&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; /etc/hosts | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $1 }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;LOAD_BALANCER_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'6443'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;LOAD_BALANCER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'lb'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;CONTROL_PLANE_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOAD_BALANCER_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOAD_BALANCER_PORT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"LOCAL_IP_ADDRESS...........: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_IP_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"CONTROL_PLANE_ENDPOINT.....: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONTROL_PLANE_ENDPOINT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"KUBERNETES_BASE_VERSION....: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_BASE_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Três informações serão exibidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O endereço &lt;code&gt;IP&lt;/code&gt; da máquina (&lt;code&gt;192.168.10.11&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;Control Plane Endpoint&lt;/code&gt; (&lt;code&gt;lb:6443&lt;/code&gt; - endereço que será usado por todos os &lt;code&gt;nodes&lt;/code&gt; para comunicação com o &lt;code&gt;Control Plane&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A versão mais recente encontrada no repositório&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observe a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y5X9Z5EO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hupex6z938xjeqnd8b9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y5X9Z5EO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hupex6z938xjeqnd8b9w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Inicializando o &lt;code&gt;Control Plane&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;KUBEADM_LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/kubeadm-init.log"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;--short&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm init &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--v&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--node-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NODE_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--apiserver-advertise-address&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_IP_ADDRESS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kubernetes-version&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_BASE_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--control-plane-endpoint&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONTROL_PLANE_ENDPOINT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--upload-certs&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBEADM_LOG_FILE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%d hour %d minute %d seconds\n'&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;3600&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="m"&gt;3600&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Esse processo não deve levar mais que 1 minuto pois já havíamos efetuado o preloading das imagens usadas por ele.&lt;/p&gt;

&lt;p&gt;Ao término da execução você deve visualizar as seguintes informações no terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X1snh7U7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x5320v0i6bzbacxpgeol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X1snh7U7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x5320v0i6bzbacxpgeol.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Você deve configurar o acesso do &lt;code&gt;kubectl&lt;/code&gt; ao cluster recém criado
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&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;h2&gt;
  
  
  Verificando o Status do Cluster
&lt;/h2&gt;

&lt;p&gt;Neste momento, o Control Plane está ativo porém, o único nó do cluster é o &lt;code&gt;master-1&lt;/code&gt; e ele está como &lt;code&gt;NotReady&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso acontece porque ainda não instalamos o plugin de &lt;code&gt;CNI&lt;/code&gt; (&lt;code&gt;Container Network Interface&lt;/code&gt;) para habilitar a &lt;code&gt;POD Network&lt;/code&gt; que é a rede que permite a comunicação entre as &lt;code&gt;PODs&lt;/code&gt; no &lt;code&gt;Cluster&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para entender melhor, vamos deixar executando um comando que vai exibir os nós e alguns objetos que já foram criados no &lt;code&gt;namespace&lt;/code&gt; &lt;code&gt;kube-system&lt;/code&gt; usando o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;watch &lt;span class="nt"&gt;-n&lt;/span&gt; 3 &lt;span class="s1"&gt;'kubectl get nodes,pods,services -o wide -n kube-system'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Observe o status do &lt;code&gt;master-1&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oJYRyJFZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2bo8i00e6v9u0j92bdb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oJYRyJFZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2bo8i00e6v9u0j92bdb4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perceba também que as duas &lt;code&gt;PODs&lt;/code&gt; do &lt;code&gt;coredns&lt;/code&gt; estão com o status &lt;code&gt;Pending&lt;/code&gt; e continuarão assim até que seja instalado um plugin &lt;code&gt;CNI&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Como esse ambiente destina-se ao aprendizado de &lt;code&gt;Kubernetes&lt;/code&gt; e temos uma limitação considerável de memória, usaremos o &lt;code&gt;Plugin Weave&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Você pode encontrar uma lista de plugins e suas instruções de instalação &lt;a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Antes de executar o comando para instalar o plugin &lt;code&gt;Weave&lt;/code&gt;, criarei um novo painel no &lt;code&gt;TMUX&lt;/code&gt; para executar os comandos e manter o monitoramento do passo anterior na tela.&lt;/p&gt;

&lt;p&gt;Optei por fazer isso para que você possa perceber quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O &lt;code&gt;master-1&lt;/code&gt; mudar de &lt;code&gt;NotReady&lt;/code&gt; para &lt;code&gt;Ready&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;As novas &lt;code&gt;PODs&lt;/code&gt; para o agente &lt;code&gt;Weave&lt;/code&gt; forem criadas, e&lt;/li&gt;
&lt;li&gt;As PODs do &lt;code&gt;coredns&lt;/code&gt; mudarem para &lt;code&gt;Running&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para criar um novo painel no &lt;code&gt;TMUX&lt;/code&gt; &lt;em&gt;(considerando que você está usando a mesma configuração que eu no arquivo ${HOME}/.tmux.conf)&lt;/em&gt;, use o comando &lt;code&gt;C-b "&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O painel do &lt;code&gt;master-1&lt;/code&gt; será então dividido em dois:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YfwbBCBU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rmsakeyi50lz9uky3lgz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YfwbBCBU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rmsakeyi50lz9uky3lgz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode ajustar os tamanhos dos painéis usando o mouse.&lt;/p&gt;

&lt;p&gt;Para habilitar isso, pode usar o comando &lt;code&gt;C-b m&lt;/code&gt; (esse comando ativa ou desativa o modo mouse).&lt;/p&gt;

&lt;p&gt;Veja como reduzi o tamanho dos painéis inferiores:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KdkJPLuI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/shfkdpysrtxyqlnelckg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KdkJPLuI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/shfkdpysrtxyqlnelckg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No novo painel, precisamos conectar ao &lt;code&gt;master-1&lt;/code&gt; usando &lt;code&gt;ssh&lt;/code&gt;. Para isso usaremos a função nativa do &lt;code&gt;Vagrant&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant ssh master-1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nova conexão ao &lt;code&gt;master-1&lt;/code&gt; realizada:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--46gWZdD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g7de5qlaqcvy4mc5m94d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--46gWZdD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g7de5qlaqcvy4mc5m94d.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora execute o comando para instalar o plugin &lt;code&gt;Weave Net&lt;/code&gt; para a &lt;code&gt;Pod Network&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"https://cloud.weave.works/k8s/net?k8s-version=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kubectl version | &lt;span class="nb"&gt;base64&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Após executar o comando anterior você verá um log de alguns objetos criados e no painel superior poderá acompanhar a atualização das &lt;code&gt;PODs&lt;/code&gt; e do status do &lt;code&gt;master-1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VRCs-Wvn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/90ijvwls61rzt8xroyx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VRCs-Wvn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/90ijvwls61rzt8xroyx0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após alguns segundos, verifique que as atualizações mencionadas anteriormente aconteceram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--luWDZ5Ct--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dkgt10kf90hgj14hei2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--luWDZ5Ct--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dkgt10kf90hgj14hei2i.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Próximo: &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-4-20cl"&gt;Adicionando os outros masters ao Cluster&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configurando um Cluster Kubernetes em Alta Disponibilidade (2/5)</title>
      <dc:creator>Silvio Silva</dc:creator>
      <pubDate>Thu, 11 Jun 2020 20:02:14 +0000</pubDate>
      <link>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-2-46kp</link>
      <guid>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-2-46kp</guid>
      <description>&lt;p&gt;Continuando o post &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-1-5-3l0"&gt;anterior&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparando as Máquinas Virtuais
&lt;/h1&gt;

&lt;p&gt;Neste ponto, optei por usar o &lt;code&gt;TMUX&lt;/code&gt; para executar os comandos um a um nas máquinas pois acho que faz parte do processo de perceber o que está sendo feito nelas.&lt;/p&gt;

&lt;p&gt;É perfeitamente possível e recomendável automatizar esse tipo de processo usando ferramentas como Terraform ou Ansible mas lembre-se que o objetivo aqui é ter uma melhor visão do todo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando o &lt;code&gt;TMUX&lt;/code&gt; para acessar várias máquinas ao mesmo tempo
&lt;/h2&gt;

&lt;p&gt;Para ajudar na criação de uma janela para cada máquina, sugiro que você baixe e configure &lt;a href="https://github.com/smsilva/linux/blob/master/scripts/bin/kubectl-tx"&gt;este script&lt;/a&gt; em um diretório no seu path.&lt;/p&gt;

&lt;p&gt;Copie o script &lt;a href="https://github.com/smsilva/linux/blob/master/scripts/bin/ktx"&gt;&lt;code&gt;ktx&lt;/code&gt;&lt;/a&gt; em sua máquina em um diretório que esteja incluído na variável de ambiente &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A partir do diretório &lt;code&gt;kubernetes/install/kubeadm/vagrant/&lt;/code&gt;, execute o script para abrir o &lt;code&gt;TMUX&lt;/code&gt; e criar várias janelas divididas em painés, um painel para cada máquina virtual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;ktx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;TMUX&lt;/code&gt; iniciará uma sessão chamada "k8s" e criará 4 janelas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0-bash&lt;/li&gt;
&lt;li&gt;1-masters&lt;/li&gt;
&lt;li&gt;2-workers&lt;/li&gt;
&lt;li&gt;3-all (janela ativa)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas janelas estarão sincronizadas, isto é, o que for digitado em uma será repetido nas demais permitindo executar os próximos comandos em paralelo nas seis máquinas (&lt;code&gt;masters&lt;/code&gt; e &lt;code&gt;workers&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BamMbCXi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1t35cg8wx2zbr76k4wck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BamMbCXi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1t35cg8wx2zbr76k4wck.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressione &lt;code&gt;ENTER&lt;/code&gt; para conectar nas 6 máquinas virtuais.&lt;/p&gt;

&lt;p&gt;Em alguns segundos a sua tela deve estar parecida com a imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QdTO-Sg2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r14cptyf661e1ksyxagy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QdTO-Sg2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r14cptyf661e1ksyxagy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressione &lt;code&gt;CTRL+l&lt;/code&gt; (L minúsculo) para limpar os terminais para que você possa ter uma visualização melhor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teste a Conectividade das máquinas com o &lt;code&gt;Load Balancer&lt;/code&gt; (&lt;code&gt;lb&lt;/code&gt;) na porta &lt;code&gt;6443&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-d&lt;/span&gt; lb 6443 &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;"OK"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A sua tela deve se parecer com a da imagem abaixo exibindo um "OK" como resultado do comando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vxzrgug5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u2az31373h81j7b589d1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vxzrgug5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u2az31373h81j7b589d1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressione CTRL+l (L minúsculo).&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifique se a rota para &lt;code&gt;10.96.0.0&lt;/code&gt; foi configurada
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;route &lt;span class="nt"&gt;-n&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="s2"&gt;"10.96.0.0"&lt;/span&gt; &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;"OK"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A saída do comando deve exibir um "&lt;code&gt;OK&lt;/code&gt;". Pressione &lt;code&gt;CTRL+l&lt;/code&gt; novamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gLbkcmls--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rjqtwhtol47gr88nujxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gLbkcmls--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rjqtwhtol47gr88nujxp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Atualize os pacotes do sistema e adicione a chave &lt;code&gt;GPG&lt;/code&gt; do Google&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;grep&lt;/span&gt; &lt;span class="nt"&gt;--invert-match&lt;/span&gt; &lt;span class="nt"&gt;--extended-regexp&lt;/span&gt; &lt;span class="s2"&gt;"^Hit|^Get"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="s2"&gt;"https://packages.cloud.google.com/apt/doc/apt-key.gpg"&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A saída do comando deve se parecer com a imagem abaixo com um &lt;code&gt;"OK"&lt;/code&gt; no final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NB0xCDj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1jut79sqjwz4k8g9y7dp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NB0xCDj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1jut79sqjwz4k8g9y7dp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pressione &lt;code&gt;CTRL+l&lt;/code&gt; novamente (sugiro fazer isso após executar cada comando).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Adicione o Repositório do Kubernetes e atualize a lista de pacotes&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="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/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;--invert-match&lt;/span&gt; &lt;span class="nt"&gt;--extended-regexp&lt;/span&gt; &lt;span class="s2"&gt;"^Hit|^Get"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O resultado deve ser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h0lqxqSj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0g9ujwljnocz7hkkh31c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h0lqxqSj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0g9ujwljnocz7hkkh31c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Defina a versão do Kubernetes que deseja instalar&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Algumas variáveis de ambiente serão atualizadas com formatos diferentes da versão mais recente encontrada no repositório adicionado no passo anterior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBERNETES_DESIRED_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'1.18'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="o"&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;sudo &lt;/span&gt;apt-cache madison kubeadm | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_DESIRED_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{ print $3 }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;KUBERNETES_BASE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="p"&gt;%-*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"KUBERNETES_DESIRED_VERSION.: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_DESIRED_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"KUBERNETES_VERSION.........: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"KUBERNETES_BASE_VERSION....: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_BASE_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Os três diferentes formatos devem ser exibidos dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eYG2CRDz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4eqrh9auwea5dxdgdjdv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eYG2CRDz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4eqrh9auwea5dxdgdjdv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Instale em todos o kubeadm e o kubelet e somente o kubectl nos masters&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;--short&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&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;--yes&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;kubeadm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;kubelet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;kubectl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-mark hold &lt;span class="se"&gt;\&lt;/span&gt;
    kubelet &lt;span class="se"&gt;\&lt;/span&gt;
    kubeadm &lt;span class="se"&gt;\&lt;/span&gt;
    kubectl
&lt;span class="k"&gt;else
  &lt;/span&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;--yes&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;kubeadm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;kubelet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-mark hold &lt;span class="se"&gt;\&lt;/span&gt;
    kubelet &lt;span class="se"&gt;\&lt;/span&gt;
    kubeadm
&lt;span class="k"&gt;fi&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%d hour %d minute %d seconds\n'&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;3600&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="m"&gt;3600&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A instalação deve demorar menos de 1 minuto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uxYhJ48x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dunp7pkwso5bswc7empe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uxYhJ48x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dunp7pkwso5bswc7empe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Agora que o utilitário crictl também foi instalado no passo anterior, configure o containerd e teste se consegue listar as imagens (neste momento a lista estará vazia)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;crictl config &lt;span class="se"&gt;\&lt;/span&gt;
  runtime-endpoint unix:///var/run/containerd/containerd.sock &lt;span class="se"&gt;\&lt;/span&gt;
  image-endpoint   unix:///var/run/containerd/containerd.sock &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crictl images
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A lista de imagens estará vazia mas indica que o &lt;code&gt;Container Runtime&lt;/code&gt; (&lt;code&gt;containerd&lt;/code&gt;) está funcionando:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3vLKr4-l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l6l1rhftn9esce7z9b56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3vLKr4-l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l6l1rhftn9esce7z9b56.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Faça o preloading das imagens para acelerar o tempo no momento em que formos configurar o &lt;code&gt;Control Plane&lt;/code&gt; nos masters e adicionar os &lt;code&gt;workers&lt;/code&gt; no cluster&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;--short&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm config images pull
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;crictl pull &lt;span class="s2"&gt;"k8s.gcr.io/kube-proxy:v&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KUBERNETES_BASE_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;crictl pull docker.io/weaveworks/weave-kube:2.6.4
&lt;span class="nb"&gt;sudo &lt;/span&gt;crictl pull docker.io/weaveworks/weave-npc:2.6.4
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%d hour %d minute %d seconds\n'&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;3600&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="m"&gt;3600&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="k"&gt;$((${&lt;/span&gt;&lt;span class="nv"&gt;SECONDS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O processo deve levar um pouco mais de 1 minuto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iupLz5WQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xw1ftu0rl3t28n7jphwj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iupLz5WQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xw1ftu0rl3t28n7jphwj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Liste as imagens que foram baixadas&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;cricrtl images
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Serão exibidas imagens diferentes nos &lt;code&gt;masters&lt;/code&gt; e nos &lt;code&gt;workers&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jpP7Tp4t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8pj502vneuis07hkzrxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jpP7Tp4t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8pj502vneuis07hkzrxy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deste ponto em diante, as máquinas virtuais serão configuradas separadamente.&lt;/p&gt;

&lt;p&gt;Você pode fechar a janela &lt;code&gt;3-all&lt;/code&gt; do &lt;code&gt;TMUX&lt;/code&gt; pressionando &lt;code&gt;CTRL+d&lt;/code&gt; duas vezes (a primeira para desconectar das máquinas virtuais e a segunda para sair dos 6 terminais abertos na janela "all" o que, consequentemente, fechará essa janela).&lt;/p&gt;

&lt;p&gt;Para mudar para a janela &lt;code&gt;1-masters&lt;/code&gt;, você deve pressionar &lt;code&gt;CTRL+b&lt;/code&gt; e em seguida pressionar &lt;code&gt;1&lt;/code&gt; (o número de identificação da janela).&lt;/p&gt;

&lt;p&gt;Essa notação no &lt;code&gt;TMUX&lt;/code&gt; é representada assim: &lt;code&gt;C-b 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você também pode digitar &lt;code&gt;exit&lt;/code&gt; e pressionar &lt;code&gt;ENTER&lt;/code&gt; e repetir essa ação para fechar os painéis e a janela &lt;code&gt;3-all&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na imagem abaixo são mostrados os painéis após digitar a primeira sequência:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GhVPKgh5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k8rnq76lcmu7tvbqkiuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GhVPKgh5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k8rnq76lcmu7tvbqkiuj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Próximo: &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-3-4p2a"&gt;Instalando o Control Plane no primeiro Master&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configurando um Cluster Kubernetes em Alta Disponibilidade (1/5)</title>
      <dc:creator>Silvio Silva</dc:creator>
      <pubDate>Thu, 11 Jun 2020 20:01:59 +0000</pubDate>
      <link>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-1-5-3l0</link>
      <guid>https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-1-5-3l0</guid>
      <description>&lt;h1&gt;
  
  
  Resumo
&lt;/h1&gt;

&lt;p&gt;Seguir os passos aqui descritos me ajudou a entender melhor como um Cluster Kubernetes funciona e a testar aspectos que só fazem sentido em um ambiente com vários servidores.&lt;/p&gt;

&lt;p&gt;Fique à vontade para entrar em contato comigo e esclarecer qualquer dúvida, vamos continuar aprendendo juntos!&lt;/p&gt;

&lt;p&gt;No entanto, acho importante enfatizar que o Cluster criado aqui tem como finalidade somente o aprendizado e não deve ser usado em ambientes de produção.&lt;/p&gt;

&lt;p&gt;Dito isso, mãos à obra!&lt;/p&gt;




&lt;p&gt;Seguindo este e os próximos posts você conseguirá:&lt;/p&gt;

&lt;h2&gt;
  
  
  Provisionar 8 máquinas virtuais:
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Caso queira mudar o número de máquinas, a quantidade de memória, a faixa de endereços &lt;code&gt;IP&lt;/code&gt; (&lt;code&gt;192.168.10.0/26&lt;/code&gt;) assim como o domínio &lt;code&gt;example.com&lt;/code&gt;, altere os valores no arquivo &lt;code&gt;Vagrantfile&lt;/code&gt;. Os scripts que criam os servidores &lt;code&gt;DNS&lt;/code&gt; e o &lt;code&gt;Load Balancer HAProxy&lt;/code&gt; buscam essas informações de lá.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Máquina&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dns&lt;/td&gt;
&lt;td&gt;512 MB&lt;/td&gt;
&lt;td&gt;192.168.10.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loadbalancer&lt;/td&gt;
&lt;td&gt;512 MB&lt;/td&gt;
&lt;td&gt;192.168.10.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;master-1&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;192.168.10.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;master-2&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;192.168.10.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;master-3&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;192.168.10.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;worker-1&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;192.168.10.21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;worker-2&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;192.168.10.22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;worker-3&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;td&gt;192.168.10.23&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;*Sites como &lt;a href="https://community.spiceworks.com/tools/subnet-calc/"&gt;Spiceworks Subnet Calculator&lt;/a&gt; ajudam a entender melhor como funciona o dimensionamento de sub nets (&lt;a href="https://pt.wikipedia.org/wiki/Classless_Inter-Domain_Routing"&gt;CIDR&lt;/a&gt; - Classless Inter-Domain Routing).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dica: digite &lt;code&gt;192.168.10.0/26&lt;/code&gt; no campo  "First Address or CIDR" e clique em "Generate". No campo "Last Address" você verá o último endereço dessa faixa de &lt;code&gt;IP&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurar as Máquinas com os Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Instalar o Ubuntu 18.04&lt;/li&gt;
&lt;li&gt;Desativar o &lt;code&gt;Swap&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configurar parâmetros de &lt;code&gt;DNS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configurar IP Fixo (usando &lt;code&gt;netplan&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Configurar Rota para o Services (&lt;code&gt;10.96.0.0/8&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Configurar Host Name com &lt;code&gt;FQDN&lt;/code&gt; (ex: &lt;code&gt;dns.example.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Instalar o &lt;code&gt;containerd 1.2.13&lt;/code&gt; como &lt;code&gt;Container Runtime&lt;/code&gt; (&lt;code&gt;CRI&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*Vale ressaltar que é possível usar outros &lt;code&gt;Containers Runtimes&lt;/code&gt; como o &lt;code&gt;Docker&lt;/code&gt; por exemplo como descrito na documentação &lt;a href="https://kubernetes.io/docs/setup/production-environment/container-runtimes/"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Porém, o &lt;code&gt;Docker&lt;/code&gt; já usa o &lt;code&gt;containerd&lt;/code&gt; e o &lt;code&gt;Kubernetes&lt;/code&gt; já possui as features de &lt;code&gt;network&lt;/code&gt; e &lt;code&gt;storage&lt;/code&gt; que o &lt;code&gt;Docker&lt;/code&gt; instala também e que não serão utilizadas.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/ana-maria-calin/?originalSubdomain=ca"&gt;Ana Calin&lt;/a&gt;&lt;/strong&gt; explica muito bem &lt;a href="https://www.youtube.com/watch?v=uDOu6rK4yOk"&gt;neste vídeo&lt;/a&gt; (em inglês sem legendas) a experiência de migrar de &lt;code&gt;Docker&lt;/code&gt; para &lt;code&gt;containerd&lt;/code&gt; e as motivações.&lt;/p&gt;

&lt;p&gt;Assim, usar o &lt;code&gt;containerd&lt;/code&gt; faz com que a nossa instalação seja mais "leve".&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;containerd&lt;/code&gt; também é usado no projeto &lt;code&gt;Moby&lt;/code&gt; (&lt;a href="https://mobyproject.org/"&gt;Moby Project&lt;/a&gt;) mantido pela &lt;code&gt;Docker&lt;/code&gt; e o &lt;code&gt;Moby&lt;/code&gt; é usado na &lt;code&gt;Azure&lt;/code&gt;, ou seja, em última instância, clusters &lt;code&gt;Kubernetes&lt;/code&gt; rodando na &lt;code&gt;Azure&lt;/code&gt; (&lt;code&gt;AKS&lt;/code&gt;) usam o &lt;code&gt;containerd&lt;/code&gt; como &lt;code&gt;Container Runtime&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparar os Nodes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Ação&lt;/th&gt;
&lt;th&gt;Masters&lt;/th&gt;
&lt;th&gt;Workers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;kubeadm&lt;/td&gt;
&lt;td&gt;Instalar&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kubelet&lt;/td&gt;
&lt;td&gt;Instalar&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kubectl&lt;/td&gt;
&lt;td&gt;Instalar&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;api-server&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;controller-manager&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;coredns&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;etcd&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scheduler&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kube-proxy&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pause&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;weave-kube&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;weave-npc&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Do que você vai precisar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Host Linux (usei um notebook com Ubuntu 20.04 e 16GB de RAM)&lt;/li&gt;
&lt;li&gt;Virtualbox 6.1&lt;/li&gt;
&lt;li&gt;Vagrant 2.2.9&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;TMUX (Opcional mas muito útil)&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Provisionando as Máquinas Virtuais
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Clone e acesse o Repositório&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:smsilva/kubernetes.git

&lt;span class="nb"&gt;cd &lt;/span&gt;kubernetes/install/kubeadm/vagrant
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Verifique o Status das Máquinas Virtuais
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Resultado esperado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Current machine states:

dns                       not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
loadbalancer              not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
master-1                  not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
master-2                  not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
master-3                  not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
worker-1                  not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
worker-2                  not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
worker-3                  not created &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run &lt;span class="sb"&gt;`&lt;/span&gt;vagrant status NAME&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Crie as máquinas virtuais
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;./provision.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O processo de provisionamento deve levar em torno de 10 minutos (dependendo da velocidade da sua conexão) para criar as 8 máquinas virtuais e nesse processo está incluída a configuração dos servidores &lt;code&gt;DNS&lt;/code&gt; e &lt;code&gt;HAProxy Load Balancer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Caso queira mais detalhes sobre o provisionamento, ele é feito através da execução de scripts que estão disponíveis no diretório &lt;code&gt;kubernetes/install/kubeadm/vagrant/ubuntu/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cada escript é chamado no momento do provisionamento das máquinas e essas chamadas são coordenadas no arquivo &lt;code&gt;kubernetes/install/kubeadm/vagrant/Vagrantfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Verifique novamente o status após a conclusão do processo de provisionamento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Resultado esperado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;Current machine states:

dns                       running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
loadbalancer              running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
master-1                  running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
master-2                  running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
master-3                  running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
worker-1                  running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
worker-2                  running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;
worker-3                  running &lt;span class="o"&gt;(&lt;/span&gt;virtualbox&lt;span class="o"&gt;)&lt;/span&gt;

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run &lt;span class="sb"&gt;`&lt;/span&gt;vagrant status NAME&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

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






&lt;p&gt;Próximo passo: &lt;a href="https://dev.to/silvio_silva/configurando-um-cluster-kubernetes-em-alta-disponibilidade-2-46kp"&gt;Preparando as Máquinas Virtuais&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>kubeadm</category>
      <category>install</category>
    </item>
  </channel>
</rss>
