

 **Ajudar a melhorar esta página** 

Para contribuir com este guia de usuário, escolha o link **Editar esta página no GitHub**, disponível no painel direito de cada página.

# Implantar uma aplicação de amostra no Linux
<a name="sample-deployment"></a>

Neste tópico, você implementa uma aplicação de amostra em seu cluster em nós Linux.

## Pré-requisitos
<a name="_prerequisites"></a>
+ Um cluster existente do Kubernetes com pelo menos um nó. Se você não tiver um cluster do Amazon EKS existente, poderá implantar um usando um dos guias em [Começar a usar o Amazon EKS](getting-started.md).
+  O `Kubectl` instalado em seu computador. Para ter mais informações, consulte [Configurar o `kubectl` e o `eksctl`](install-kubectl.md).
+  O `Kubectl` configurado para se comunicar com o cluster. Para ter mais informações, consulte [Conecte o kubectl a um cluster de EKS criando um arquivo kubeconfig](create-kubeconfig.md).
+ Se você planeja implantar sua workload de exemplo no Fargate, deverá ter um [perfil do Fargate](fargate-profile.md) que inclua o mesmo namespace criado neste tutorial, que será `eks-sample-app`, a menos que você altere o nome. Se você criou um cluster com um dos grupos no [Começar a usar o Amazon EKS](getting-started.md), será necessário criar um novo perfil ou adicionar o namespace ao perfil existente, pois o perfil criado nos guias de introdução não especifica o namespace usado neste tutorial. A VPC também deve conter pelo menos uma sub-rede privada.

Embora muitas variáveis possam ser alteradas nas etapas a seguir, recomendamos alterar apenas os valores das variáveis quando especificado. Depois de entender melhor os pods, as implantações e os serviços do Kubernetes, você pode experimentar alterar outros valores.

## Crie um namespace
<a name="_create_a_namespace"></a>

Um namespace permite agrupar recursos no Kubernetes. Para obter mais informações, consulte [Namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) na documentação do Kubernetes. Se você planeja implantar o exemplo de aplicação para [Simplificar o gerenciamento de computação com o AWS Fargate](fargate.md), certifique-se de que o valor de `namespace` em [Definir quais pods usam o AWS Fargate quando iniciados](fargate-profile.md) seja `eks-sample-app`.

```
kubectl create namespace eks-sample-app
```

## Crie uma implantação do Kubernetes
<a name="_create_a_kubernetes_deployment"></a>

Crie uma implantação do Kubernetes. Essa implantação de exemplo extrai uma imagem de contêiner de um repositório público e implanta três réplicas (pods individuais) dessa imagem em seu cluster. Para saber mais, consulte [Implantações](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) na documentação do Kubernetes.

1. Salve o conteúdo a seguir em um arquivo denominado `eks-sample-deployment.yaml`. Os contêineres da aplicação de exemplo não usam armazenamento em rede, mas pode haver aplicações que precisem. Para ter mais informações, consulte [Usar armazenamento de dados de aplicações para o cluster](storage.md).
   + Os `values` de `amd64` ou `arm64` na chave `kubernetes.io/arch` significam que a aplicação pode ser implantada em qualquer arquitetura de hardware (se ambos estiverem no cluster). Isso é possível porque essa imagem é uma imagem multiarquitetura, mas nem todas são. É possível determinar a arquitetura de hardware em que há suporte para a imagem visualizando os [detalhes da imagem](https://gallery.ecr.aws/nginx/nginx) no repositório do qual você está extraindo. Ao implantar imagens que não oferecem suporte a um tipo de arquitetura de hardware ou quando você não deseja que a imagem seja implantada, remova esse tipo do manifesto. Para obter mais informações, consulte [Rótulos, anotações e taints conhecidos](https://kubernetes.io/docs/reference/labels-annotations-taints/) na documentação do Kubernetes.
   + `kubernetes.io/os: linux` `nodeSelector` significa que se você tivesse nós do Linux e do Windows (por exemplo) no cluster, a imagem só seria implantada nos nós do Linux. Para obter mais informações, consulte [Rótulos, anotações e taints conhecidos](https://kubernetes.io/docs/reference/labels-annotations-taints/) na documentação do Kubernetes.

     ```
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: eks-sample-linux-deployment
       namespace: eks-sample-app
       labels:
         app: eks-sample-linux-app
     spec:
       replicas: 3
       selector:
         matchLabels:
           app: eks-sample-linux-app
       template:
         metadata:
           labels:
             app: eks-sample-linux-app
         spec:
           affinity:
             nodeAffinity:
               requiredDuringSchedulingIgnoredDuringExecution:
                 nodeSelectorTerms:
                 - matchExpressions:
                   - key: kubernetes.io/arch
                     operator: In
                     values:
                     - amd64
                     - arm64
           containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
             - name: http
               containerPort: 80
             imagePullPolicy: IfNotPresent
           nodeSelector:
             kubernetes.io/os: linux
     ```

1. Aplique o manifesto de implantação ao seu cluster.

   ```
   kubectl apply -f eks-sample-deployment.yaml
   ```

## Criar um serviço
<a name="_create_a_service"></a>

Um serviço permite que você acesse todas as réplicas por meio de um único endereço IP ou nome. Para obter mais informações, consulte [Serviço](https://kubernetes.io/docs/concepts/services-networking/service/) na documentação do Kubernetes. Embora não esteja implementado na aplicação de exemplo, se houver aplicações que precisem interagir com outros serviços da AWS, recomendamos criar contas de serviço do Kubernetes para seus pods e associá-las a contas do AWS IAM. Ao especificar contas de serviço, seus pods podem ter apenas as permissões mínimas especificadas para elas para interagir com outros serviços. Para ter mais informações, consulte [Funções do IAM para contas de serviço](iam-roles-for-service-accounts.md).

1. Salve o conteúdo a seguir em um arquivo denominado `eks-sample-service.yaml`. O Kubernetes atribui ao serviço o seu próprio endereço IP acessível somente de dentro do cluster. Para acessar o serviço de fora do seu cluster, implante o [AWS Load Balancer Controller](aws-load-balancer-controller.md) para balancear a carga do tráfego de [aplicações](alb-ingress.md) ou [redes](network-load-balancing.md) para o serviço.

   ```
   apiVersion: v1
   kind: Service
   metadata:
     name: eks-sample-linux-service
     namespace: eks-sample-app
     labels:
       app: eks-sample-linux-app
   spec:
     selector:
       app: eks-sample-linux-app
     ports:
       - protocol: TCP
         port: 80
         targetPort: 80
   ```

1. Aplique o manifesto de serviço ao seu cluster.

   ```
   kubectl apply -f eks-sample-service.yaml
   ```

## Revisar os recursos criados
<a name="sample-app-view-namespace"></a>

1. Visualize todos os recursos no namespace `eks-sample-app`.

   ```
   kubectl get all -n eks-sample-app
   ```

   Veja um exemplo de saída abaixo.

   ```
   NAME                                               READY   STATUS    RESTARTS   AGE
   pod/eks-sample-linux-deployment-65b7669776-m6qxz   1/1     Running   0          27m
   pod/eks-sample-linux-deployment-65b7669776-mmxvd   1/1     Running   0          27m
   pod/eks-sample-linux-deployment-65b7669776-qzn22   1/1     Running   0          27m
   
   NAME                               TYPE         CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
   service/eks-sample-linux-service   ClusterIP    10.100.74.8     <none>        80/TCP    32m
   
   NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
   deployment.apps/eks-sample-linux-deployment 3/3     3            3           27m
   
   NAME                                                      DESIRED   CURRENT   READY   AGE
   replicaset.apps/eks-sample-linux-deployment-776d8f8fd8    3         3         3       27m
   ```

   Na saída, você verá o serviço e a implantação especificados nos manifestos de exemplo implantados nas etapas anteriores. Você também vê três pods. Isso ocorre porque `3` `replicas` foram especificadas no manifesto de exemplo. Para obter mais informações sobre pods, consulte [Pods](https://kubernetes.io/docs/concepts/workloads/pods/pod/) na documentação do Kubernetes. O Kubernetes cria automaticamente o recurso `replicaset`, mesmo que não esteja especificado nos manifestos de exemplo. Para obter mais informações sobre `ReplicaSets`, consulte [ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/) na documentação do Kubernetes.
**nota**  
O Kubernetes mantém o número de réplicas especificado no manifesto. Se esta fosse uma implantação de produção e você quisesse que o Kubernetes escalasse horizontalmente o número de réplicas ou verticalmente os recursos de computação para os pods, você usaria as [implantações de pods de escala com o Horizontal Pod Autoscaler](horizontal-pod-autoscaler.md) e os [recursos de pods de ajuste com o Vertical Pod Autoscaler](vertical-pod-autoscaler.md) para fazer isso.

1. Veja os detalhes do serviço implantado.

   ```
   kubectl -n eks-sample-app describe service eks-sample-linux-service
   ```

   Veja um exemplo de saída abaixo.

   ```
   Name:              eks-sample-linux-service
   Namespace:         eks-sample-app
   Labels:            app=eks-sample-linux-app
   Annotations:       <none>
   Selector:          app=eks-sample-linux-app
   Type:              ClusterIP
   IP Families:       <none>
   IP:                10.100.74.8
   IPs:               10.100.74.8
   Port:              <unset>  80/TCP
   TargetPort:        80/TCP
   Endpoints:         192.168.24.212:80,192.168.50.185:80,192.168.63.93:80
   Session Affinity:  None
   Events:            <none>
   ```

   Na saída anterior, o valor de `IP:` é um endereço IP exclusivo que pode ser acessado de qualquer nó ou pod dentro do cluster, mas não pode ser acessado de fora do cluster. Os valores de `Endpoints` são endereços IP atribuídos de dentro da VPC aos pods que fazem parte do serviço.

1. Visualize os detalhes de um dos pods listados na saída quando você [visualizou o namespace](#sample-app-view-namespace) em uma etapa anterior. Substitua *776d8f8fd8-78w66* pelo valor retornado para um dos seus pods.

   ```
   kubectl -n eks-sample-app describe pod eks-sample-linux-deployment-65b7669776-m6qxz
   ```

   Exemplo abreviado de saída

   ```
   Name:         eks-sample-linux-deployment-65b7669776-m6qxz
   Namespace:    eks-sample-app
   Priority:     0
   Node:         ip-192-168-45-132.us-west-2.compute.internal/192.168.45.132
   [...]
   IP:           192.168.63.93
   IPs:
     IP:           192.168.63.93
   Controlled By:  ReplicaSet/eks-sample-linux-deployment-65b7669776
   [...]
   Conditions:
     Type              Status
     Initialized       True
     Ready             True
     ContainersReady   True
     PodScheduled      True
   [...]
   Events:
     Type    Reason     Age    From                                                 Message
     ----    ------     ----   ----                                                 -------
     Normal  Scheduled  3m20s  default-scheduler                                    Successfully assigned eks-sample-app/eks-sample-linux-deployment-65b7669776-m6qxz to ip-192-168-45-132.us-west-2.compute.internal
   [...]
   ```

   Na saída anterior, o valor de `IP:` é um IP exclusivo atribuído ao pod do bloco CIDR atribuído à sub-rede em que o nó está localizado. Se preferir atribuir a pods endereços IP de blocos CIDR diferentes, você pode alterar o comportamento padrão. Para ter mais informações, consulte [Implementar pods em sub-redes alternativas com rede personalizada](cni-custom-network.md). Você também pode ver que o agendador do Kubernetes agendou o pod no `Node` com o endereço IP *192.168.45.132*.
**dica**  
Em vez de usar a linha de comando, você pode visualizar muitos detalhes dos pods, serviços, implantações e outros recursos do Kubernetes no Console de gerenciamento da AWS. Para ter mais informações, consulte [Visualize os recursos do Kubernetes na seção Console de gerenciamento da AWS](view-kubernetes-resources.md).

## Executar um shell em um pod
<a name="_run_a_shell_on_a_pod"></a>

1. Execute um shell no pod que você descreveu na etapa anterior, substituindo *65b7669776-m6qxz* pelo ID de um de seus pods.

   ```
   kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
   ```

1. No shell do pod, visualize a saída do servidor da Web instalado com a sua implantação em uma etapa anterior. Basta especificar o nome do serviço. Ele é resolvido para o endereço IP do serviço pelo CoreDNS, que é implantado com um cluster do Amazon EKS, por padrão.

   ```
   curl eks-sample-linux-service
   ```

   Veja um exemplo de saída abaixo.

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. No shell do pod, exiba o servidor DNS do pod.

   ```
   cat /etc/resolv.conf
   ```

   Veja um exemplo de saída abaixo.

   ```
   nameserver 10.100.0.10
   search eks-sample-app.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal
   options ndots:5
   ```

   Na saída anterior, `10.100.0.10` é atribuído automaticamente como `nameserver` para todos os pods implantados no cluster.

1. Desconecte-se do pod digitando `exit`.

1. Ao terminar de usar a aplicação de exemplo, você poderá remover o namespace, o serviço e a implantação de exemplo com o comando a seguir.

   ```
   kubectl delete namespace eks-sample-app
   ```

## Próximas etapas
<a name="sample-deployment-next-steps"></a>

Após implantar a aplicação de exemplo, talvez você queira tentar alguns dos seguintes exercícios:
+  [Roteamento de aplicações e tráfego HTTP com Application Load Balancers](alb-ingress.md) 
+  [Roteamento de tráfego TCP e UDP com Network Load Balancers](network-load-balancing.md) 