Skip to content

Commit 17077e0

Browse files
[pt-br] Update expose-intro.html
Update the tutorial on how to expose a service outside the cluster to remove Katacoda references.
1 parent a631f1b commit 17077e0

File tree

1 file changed

+240
-22
lines changed

1 file changed

+240
-22
lines changed

content/pt-br/docs/tutorials/kubernetes-basics/expose/expose-intro.html

Lines changed: 240 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
---
22
title: Utilizando um serviço para expor seu aplicativo
33
weight: 10
4+
description: |-
5+
Aprenda sobre Services no Kubernetes.
6+
Entenda como rótulos (<i>labels</i>) e seletores (<i>selectors</i>) relacionam-se aos Services.
7+
Exponha uma aplicação externamente ao cluster Kubernetes.
48
---
59

610
<!DOCTYPE html>
711

8-
<html lang="en">
12+
<html lang="pt-BR">
913

1014
<body>
1115

@@ -19,40 +23,103 @@
1923
<div class="col-md-8">
2024
<h3>Objetivos</h3>
2125
<ul>
22-
<li>Aprenda sobre um Serviço no Kubernetes</li>
23-
<li>Entenda como os objetos <code>labels</code> e <code>LabelSelector</code> se relacionam a um Serviço</li>
24-
<li>Exponha uma aplicação externamente ao cluster Kubernetes usando um Serviço</li>
26+
<li>Aprenda sobre Services no Kubernetes</li>
27+
<li>Entenda como rótulos (<i>labels</i>) e seletores (<i>selectors</i>) relacionam-se aos Services</li>
28+
<li>Exponha uma aplicação externamente ao cluster Kubernetes usando um Service</li>
2529
</ul>
2630
</div>
2731

2832
<div class="col-md-8">
29-
<h3>Visão Geral de Serviços Kubernetes</h3>
33+
<h3>Visão Geral dos Services no Kubernetes</h3>
3034

31-
<p><a href="/docs/concepts/workloads/pods/">Pods</a> Kubernetes são efêmeros. Na verdade, Pods possuem um <a href="/docs/concepts/workloads/pods/pod-lifecycle/">ciclo de vida</a>. Quando um nó de processamento morre, os Pods executados no nó também são perdidos. A partir disso, o <a href="/docs/concepts/workloads/controllers/replicaset/">ReplicaSet</a> pode dinamicamente retornar o cluster ao estado desejado através da criação de novos Pods para manter sua aplicação em execução. Como outro exemplo, considere um backend de processamento de imagens com 3 réplicas. Estas réplicas são intercambiáveis; o sistema front-end não deveria se importar com as réplicas backend ou ainda se um Pod é perdido ou recriado. Dito isso, cada Pod em um cluster Kubernetes tem um único endereço IP, mesmo Pods no mesmo nó, então há necessidade de ter uma forma de reconciliar automaticamente mudanças entre Pods de modo que sua aplicação continue funcionando.</p>
35+
<p>
36+
<a href="/docs/concepts/workloads/pods/">Pods</a> do Kubernetes são efêmeros.
37+
Na verdade, Pods possuem um <a href="/docs/concepts/workloads/pods/pod-lifecycle/">ciclo de vida</a>.
38+
Quando um nó de processamento morre, os Pods executados no nó também são
39+
perdidos. A partir disso, o <a href="/pt-br/docs/concepts/workloads/controllers/replicaset/">ReplicaSet</a>
40+
pode dinamicamente retornar o cluster ao estado desejado através da criação
41+
de novos Pods para manter sua aplicação em execução. Como outro exemplo,
42+
considere um backend de processamento de imagens com 3 réplicas. Estas
43+
réplicas são permutáveis; o sistema front-end não deveria se importar
44+
com as réplicas backend ou ainda se um Pod foi perdido ou recriado. Dito
45+
isso, cada Pod em um cluster Kubernetes tem um endereço IP único, incluindo
46+
Pods que estejam rodando no mesmo nó, então há necessidade de ter uma
47+
forma de reconciliar automaticamente mudanças entre Pods de modo que sua
48+
aplicação continue funcionando.
49+
</p>
3250

33-
<p>Um serviço no Kubernetes é uma abstração que define um conjunto lógico de Pods e uma política pela qual acessá-los. Serviços permitem um baixo acoplamento entre os Pods dependentes. Um serviço é definido usando YAML <a href="/docs/concepts/configuration/overview/#general-configuration-tips">(preferencialmente)</a> ou JSON, como todos objetos Kubernetes. O conjunto de Pods selecionados por um Serviço é geralmente determinado por um seletor de rótulos <i>LabelSelector</i> (veja abaixo o motivo pelo qual você pode querer um Serviço sem incluir um seletor <code>selector</code> na especificação <code>spec</code>).</p>
51+
<p>
52+
Um objeto Service no Kubernetes é uma abstração que define um conjunto
53+
lógico de Pods e uma política pela qual acessá-los. Serviços permitem um
54+
baixo acoplamento entre os Pods dependentes. Um serviço é definido usando
55+
YAML ou JSON, como todos os manifestos de objetos Kubernetes. O conjunto
56+
de Pods selecionados por um Service é geralmente determinado por um
57+
<i>seletor de rótulos</i> (veja abaixo o motivo pelo qual você poderia
58+
desejar um Service que não inclui um seletor (<code>selector</code>) na
59+
especificação (<code>spec</code>)).
60+
</p>
3461

35-
<p>Embora cada Pod tenha um endereço IP único, estes IPs não são expostos externamente ao cluster sem um Serviço. Serviços permitem que suas aplicações recebam tráfego. Serviços podem ser expostos de formas diferentes especificando um tipo <code>type</code> na especificação do serviço <code>ServiceSpec</code>:</p>
62+
<p>
63+
Embora cada Pod tenha um endereço IP único, estes IPs não são expostos
64+
externamente ao cluster sem um objeto Service. Objetos Service permitem
65+
que suas aplicações recebam tráfego. Services podem ser expostos de
66+
formas diferentes especificando um tipo (campo <code>type</code>) na
67+
especificação do serviço (campo <tt>spec</tt>):</p>
3668
<ul>
37-
<li><i>ClusterIP</i> (padrão) - Expõe o serviço sob um endereço IP interno no cluster. Este tipo faz do serviço somente alcançável de dentro do cluster.</li>
38-
<li><i>NodePort</i> - Expõe o serviço sob a mesma porta em cada nó selecionado no cluster usando NAT. Faz o serviço acessível externamente ao cluster usando <code>&lt;NodeIP&gt;:&lt;NodePort&gt;</code>. Superconjunto de ClusterIP.</li>
39-
<li><i>LoadBalancer</i> - Cria um balanceador de carga externo no provedor de nuvem atual (se suportado) e assinala um endereço IP fixo e externo para o serviço. Superconjunto de NodePort.</li>
40-
<li><i>ExternalName</i> - Expõe o serviço usando um nome arbitrário (especificado através de <code>externalName</code> na especificação <code>spec</code>) retornando um registro de CNAME com o nome. Nenhum proxy é utilizado. Este tipo requer v1.7 ou mais recente de <code>kube-dns</code>.</li>
69+
<li>
70+
<i>ClusterIP</i> (padrão) - Expõe o serviço sob um endereço IP interno
71+
no cluster. Este tipo de serviço é acessível somente dentro do cluster.
72+
</li>
73+
<li>
74+
<i>NodePort</i> - Expõe o serviço sob a mesma porta em cada nó
75+
selecionado no cluster usando NAT. Torna o serviço acessível externamente
76+
ao cluster usando o endereço <code>&lt;NodeIP&gt;:&lt;NodePort&gt;</code>.
77+
É um superconjunto do tipo ClusterIP.
78+
</li>
79+
<li>
80+
<i>LoadBalancer</i> - Cria um balanceador de carga externo no provedor
81+
de nuvem atual (se suportado) e atribui um endereço IP fixo e externo
82+
para o serviço. É um superconjunto do tipo NodePort.
83+
</li>
84+
<li>
85+
<i>ExternalName</i> - Mapeia o Service para o conteúdo do campo
86+
<code>externalName</code> (por exemplo, <code>foo.bar.example.com</code>),
87+
retornando um registro DNS do tipo <code>CNAME</code> com o seu valor.
88+
Nenhum tipo de proxy é configurado. Este tipo requer a versão 1.7 ou
89+
mais recente do <code>kube-dns</code>, ou o CoreDNS versão 0.0.8 ou
90+
superior.
91+
</li>
4192
</ul>
42-
<p>Mais informações sobre diferentes tipos de Serviços podem ser encontradas no tutorial <a href="/docs/tutorials/services/source-ip/">Utilizando IP de origem</a>. Também confira <a href="/docs/concepts/services-networking/connect-applications-service">Conectando aplicações com serviços</a>.</p>
43-
<p>Adicionalmente, note que existem alguns casos de uso com serviços que envolvem a não definição de <code>selector</code> em <code>spec</code>. Serviços criados sem <code>selector</code> também não criarão objetos Endpoints correspondentes. Isto permite usuários mapear manualmente um serviço a endpoints específicos. Outra possibilidade na qual pode não haver seletores é ao se utilizar estritamente <code>type: ExternalName</code>.</p>
93+
<p>
94+
Mais informações sobre diferentes tipos de Services podem ser encontradas
95+
no tutorial <a href="/docs/tutorials/services/source-ip/">Utilizando IP de origem</a>.
96+
Veja também <a href="/docs/tutorials/services/connect-applications-service">Conectando aplicações com serviços</a>.
97+
</p>
98+
<p>
99+
Adicionalmente, note que existem alguns casos de uso com serviços que
100+
envolvem a ausência de um <code>selector</code> no campo <code>spec</code>.
101+
Services criados sem <code>selector</code> também não criarão objetos
102+
Endpoints correspondentes. Isto permite que usuários mapeiem manualmente
103+
um serviço a <i>endpoints</i> específicos. Outro motivo pelo qual seletores
104+
podem estar ausentes é que você esteja utilizando estritamente
105+
<code>type: ExternalName</code>.
106+
</p>
44107
</div>
45108
<div class="col-md-4">
46109
<div class="content__box content__box_lined">
47110
<h3>Resumo</h3>
48111
<ul>
49-
<li>Expõe Pods ao tráfego externo</li>
50-
<li>Tráfego de balanceamento de carga entre múltiplos Pods</li>
51-
<li>Uso de rótulos <code>labels</code></li>
112+
<li>Exposição de Pods ao tráfego externo</li>
113+
<li>Balanceamento de carga de tráfego entre múltiplos Pods</li>
114+
<li>Utilização de rótulos (<i>labels</i>)</li>
52115
</ul>
53116
</div>
54117
<div class="content__box content__box_fill">
55-
<p><i>Um serviço Kubernetes é uma camada de abstração que define um conjunto lógico de Pods e habilita a exposição ao tráfego externo, balanceamento de carga e descoberta de serviço para esses Pods.</i></p>
118+
<p><i>
119+
Um objeto Service do Kubernetes é uma camada de abstração que define
120+
um conjunto lógico de Pods e habilita a exposição ao tráfego externo,
121+
balanceamento de carga e descoberta de serviço para esses Pods.
122+
</i></p>
56123
</div>
57124
</div>
58125
</div>
@@ -66,8 +133,20 @@ <h3>Serviços e Rótulos</h3>
66133

67134
<div class="row">
68135
<div class="col-md-8">
69-
<p>Um serviço roteia tráfego entre um conjunto de Pods. Serviço é a abstração que permite pods morrerem e se replicarem no Kubernetes sem impactar sua aplicação. A descoberta e o roteamento entre Pods dependentes (tal como componentes frontend e backend dentro de uma aplicação) são controlados por serviços Kubernetes.</p>
70-
<p>Serviços relacionam um conjunto de Pods usando <a href="/docs/concepts/overview/working-with-objects/labels">Rótulos e seletores</a>, um agrupamento primitivo que permite operações lógicas sobre objetos Kubernetes. Rótulos são pares de chave/valor anexados à objetos e podem ser usados de inúmeras formas:</p>
136+
<p>
137+
Um Service roteia tráfego entre um conjunto de Pods. Service é a
138+
abstração que permite Pods morrerem e se replicarem no Kubernetes sem
139+
impactar sua aplicação. A descoberta e o roteamento entre Pods
140+
dependentes (tal como componentes frontend e backend dentro de uma
141+
aplicação) são controlados por Services do Kubernetes.
142+
</p>
143+
<p>
144+
Services relacionam um conjunto de Pods usando
145+
<a href="/docs/concepts/overview/working-with-objects/labels">rótulos e seletores</a>,
146+
uma primitiva de agrupamento que permite operações lógicas sobre objetos
147+
do Kubernetes. Rótulos são pares chave/valor anexados à objetos e
148+
podem ser usados de diversas formas:
149+
</p>
71150
<ul>
72151
<li>Designar objetos para desenvolvimento, teste e produção</li>
73152
<li>Adicionar tags de versão</li>
@@ -87,15 +166,154 @@ <h3>Serviços e Rótulos</h3>
87166
<br>
88167
<div class="row">
89168
<div class="col-md-8">
90-
<p>Rótulos podem ser anexados à objetos no momento de sua criação ou posteriormente. Eles podem ser modificados a qualquer tempo. Vamos agora expor sua aplicação usando um serviço e aplicar alguns rótulos.</p>
169+
<p>
170+
Rótulos podem ser anexados aos objetos no momento de sua criação ou
171+
posteriormente. Eles podem ser modificados a qualquer momento. Vamos
172+
expor nossa aplicação usando um Service e aplicar alguns rótulos.
173+
</p>
91174
</div>
92175
</div>
93176
<br>
94177
<div class="row">
95178
<div class="col-md-12">
96-
<a class="btn btn-lg btn-success" href="/pt/docs/tutorials/kubernetes-basics/expose/expose-interactive/" role="button">Iniciar tutorial interativo<span class="btn__next"></span></a>
179+
<h3>Crie um novo Service</h3>
180+
<p>
181+
Vamos verificar que nossa aplicação está rodando. Utilizaremos o comando
182+
<code>kubectl get</code> e procuraremos por Pods existentes:
183+
</p>
184+
<p><code><b>kubectl get pods</b></code></p>
185+
<p>
186+
Se não houver Pods rodando, isso significa que o ambiente interativo
187+
ainda está recarregando o estado anterior. Por favor, aguarde alguns
188+
instantes e liste os Pods novamente. Você poderá prosseguir assim que
189+
vir um Pod rodando.
190+
</p>
191+
<p>A seguir, vamos listar os Services existentes no momento no nosso cluster:</p>
192+
<p><code><b>kubectl get services</b></code></p>
193+
<p>
194+
Temos um Service chamado <tt>kubernetes</tt> que é criado por padrão
195+
quando o minikube inicializa o cluster.
196+
Para criar um novo Service e expô-lo para tráfego externo utilizaremos
197+
o comando <tt>expose</tt> com o tipo NodePort.
198+
</p>
199+
<p><code><b>kubectl expose deployment/kubernetes-bootcamp --type=NodePort --port 8080</b></code></p>
200+
<p>
201+
Vamos rodar novamente o subcomando <code>get services</code>:
202+
</p>
203+
<p><code><b>kubectl get services</b></code></p>
204+
<p>
205+
Temos agora um Service chamado kubernetes-bootcamp rodando. Aqui vemos
206+
que o Service recebeu um ClusterIP único, uma porta interna e um IP
207+
externo (o IP do nó).
208+
</p>
209+
<p>
210+
Para descobrir qual porta foi aberta externamente (para o Service com
211+
tipo <tt>NodePort</tt>) iremos rodar o subcomando <code>describe service</code>:
212+
</p>
213+
<p><code><b>kubectl describe services/kubernetes-bootcamp</b></code></p>
214+
<p>
215+
Crie uma variável de ambiente chamada <tt>NODE_PORT</tt> que armazena
216+
o número da porta do nó:
217+
</p>
218+
<p>
219+
<code><b>export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"</b></code><br />
220+
<code><b>echo "NODE_PORT=$NODE_PORT"</b></code>
221+
</p>
222+
<p>
223+
Agora podemos verificar que a aplicação está exposta externamente ao
224+
cluster utilizando <code>curl</code>, o endereço IP do nó e a porta
225+
exposta externamente:
226+
</p>
227+
<p><code><b>curl http://"$(minikube ip):$NODE_PORT"</b></code></p>
228+
<p>E receberemos uma resposta do servidor. O Service está exposto.</p>
97229
</div>
98230
</div>
231+
232+
<div class="row">
233+
<div class="col-md-12">
234+
<h3>Passo 2: Utilizando rótulos (<i>labels</i>)</h3>
235+
<div class="content">
236+
<p>
237+
O Deployment criou automaticamente um rótulo para o nosso Pod. Com o
238+
subcomando <code>describe deployment</code> você pode ver o nome
239+
(a <em>chave</em>) deste rótulo:
240+
</p>
241+
<p><code><b>kubectl describe deployment</b></code></p>
242+
<p>
243+
Vamos utilizar este rótulo para filtrar nossa lista de Pods.
244+
Utilizaremos o comando <code>kubectl get pods</code> com o parâmetro
245+
<tt>-l</tt>, seguido dos valores dos rótulos:
246+
</p>
247+
<p><code><b>kubectl get pods -l app=kubernetes-bootcamp</b></code></p>
248+
<p>Você pode fazer o mesmo para listar os Services existentes:</p>
249+
<p><code><b>kubectl get services -l app=kubernetes-bootcamp</b></code></p>
250+
<p>
251+
Obtenha o nome do Pod e armazene-o na variável de ambiente <tt>POD_NAME</tt>:
252+
</p>
253+
<p>
254+
<code><b>export POD_NAME="$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')"</b></code><br />
255+
<code><b>echo "Name of the Pod: $POD_NAME"</b></code>
256+
</p>
257+
<p>
258+
Para aplicar um novo rótulo podemos utilizar o subcomando <code>label</code>,
259+
seguido pelo tipo de objeto, nome do objeto e o novo rótulo:
260+
</p>
261+
<p><code><b>kubectl label pods "$POD_NAME" version=v1</b></code></p>
262+
<p>
263+
Este comando aplicará um novo rótulo no Pod (nós fixamos a versão
264+
da aplicação ao Pod) e podemos verificar com o comando
265+
<code>describe pod</code>:
266+
</p>
267+
<p><code><b>kubectl describe pods "$POD_NAME"</b></code></p>
268+
<p>
269+
Vemos aqui que o rótulo está agora vinculado ao nosso Pod. E agora
270+
podemos pesquisar a lista de Pods utilizando o novo label:
271+
</p>
272+
<p><code><b>kubectl get pods -l version=v1</b></code></p>
273+
<p>E vemos o Pod.</p>
274+
</div>
275+
</div>
276+
</div>
277+
278+
<div class="row">
279+
<div class="col-md-12">
280+
<h3>Removendo um Service</h3>
281+
<p>
282+
Para remover um Service você pode utilizar o subcomando <code>delete service</code>.
283+
Rótulos também podem ser utilizados aqui:
284+
</p>
285+
<p><code><b>kubectl delete service -l app=kubernetes-bootcamp</b></code></p>
286+
<p>
287+
Confirme que o Service foi removido com sucesso:
288+
</p>
289+
<p><code><b>kubectl get services</b></code></p>
290+
<p>
291+
Isto confirma que nosso Service foi removido. Para confirmar que a rota
292+
não está mais exposta, você pode disparar uma requisição para o endereço
293+
IP e porta previamente expostos através do comando <tt>curl</tt>:
294+
</p>
295+
<p><code><b>curl http://"$(minikube ip):$NODE_PORT"</b></code></p>
296+
<p>
297+
Isto prova que a aplicação não está mais acessível de fora do cluster.
298+
Você pode confirmar que a aplicação ainda está rodando com um <tt>curl</tt>
299+
de dentro do Pod:
300+
</p>
301+
<p><code><b>kubectl exec -ti $POD_NAME -- curl http://localhost:8080</b></code></p>
302+
<p>
303+
Vemos aqui que a aplicação ainda está rodando. Isto se deve ao fato de
304+
que o Deployment está gerenciando a aplicação. Para encerrar a aplicação,
305+
você precisaria remover o Deployment também.
306+
</p>
307+
</div>
308+
</div>
309+
310+
<div class="row">
311+
<p>
312+
Assim que você finalizar este tutorial, vá para
313+
<a href="/pt-br/docs/tutorials/kubernetes-basics/scale/scale-intro/" title="Executando Múltiplas Instâncias do seu Aplicativo">
314+
Executando Múltiplas Instâncias do seu Aplicativo</a>.
315+
</p>
316+
</div>
99317
</main>
100318
</div>
101319

0 commit comments

Comments
 (0)