Implantar uma aplicação de amostra no Linux - Amazon EKS

Ajudar a melhorar esta página

Quer contribuir para este guia do usuário? Escolha o link Editar esta página no GitHub, disponível no painel direito de cada página. Suas contribuições ajudarão a tornar nosso guia do usuário melhor para todos.

Implantar uma aplicação de amostra no Linux

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

Pré-requisitos

  • Um cluster Kubernetes existente 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.

  • O Kubectl instalado em seu computador. Para ter mais informações, consulte Configurar o kubectl e o eksctl.

  • O Kubectl configurado para se comunicar com o cluster. Para ter mais informações, consulte Conectar o kubectl a um cluster do EKS criando um arquivo kubeconfig.

  • Se você planeja implantar sua workload de exemplo no Fargate, deverá ter um perfil do Fargate 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, 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 que tiver entendido melhor os Pods, as implantações e os serviços do Kubernetes, você poderá experimentar alterar outros valores.

Crie um namespace

Um namespace permite agrupar recursos no Kubernetes. Para obter mais informações, consulte 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, certifique-se de que o valor de namespace em Definir quais pods usam o AWS Fargate quando iniciados seja eks-sample-app.

kubectl create namespace eks-sample-app

Crie uma implantação do Kubernetes

Crie um implantação do Kubernetes. Essa implantação de amostra extrai uma imagem de contêiner de um repositório público e implanta três réplicas (Pods individuais) dessa imagem no cluster. Para saber mais, consulte Deployments (Implantações) 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 Armazenar dados de aplicações para seu cluster.

    • 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 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 Well-Known Labels, Annotations and Taints (Rótulos, anotações e taints conhecidos) na documentação do Kubernetes.

    • O nodeSelector do kubernetes.io/os: linux significa que se você tivesse (por exemplo) nós do Linux e do Windows no cluster, a imagem só seria implantada nos nós do Linux. Para obter mais informações, consulte Well-Known Labels, Annotations and Taints (Rótulos, anotações e taints conhecidos) 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
  2. Aplique o manifesto de implantação ao seu cluster.

    kubectl apply -f eks-sample-deployment.yaml

Criar um serviço

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 Service (Serviço) na documentação do Kubernetes. Embora não implementado na aplicação de amostra, se você tiver aplicações que precisem interagir com outros serviços da AWS, recomendamos criar contas de serviço do Kubernetes para os Pods e associá-las a contas do AWS IAM. Especificando contas de serviço, os Pods só têm as permissões mínimas que você especifica para interagir com outros serviços. Para ter mais informações, consulte Perfis do IAM para contas de serviço.

  1. Salve o conteúdo a seguir no arquivo denominado eks-sample-service.yaml. O Kubernetes atribui ao serviço o seu próprio endereço IP que só pode ser acessado de dentro do cluster. Para acessar o serviço de fora do seu cluster, implante o AWS Load Balancer Controller para balancear a carga do tráfego de aplicações ou redes 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
  2. Aplique o manifesto de serviço ao seu cluster.

    kubectl apply -f eks-sample-service.yaml

Revisar os recursos criados

  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 Pod na documentação do Kubernetes. O Kubernetes cria automaticamente o arquivo do recurso replicaset, mesmo que não esteja especificado nos manifestos de exemplo. Para obter mais informações sobre ReplicaSets, consulte ReplicaSet na documentação do Kubernetes.

    nota

    O Kubernetes mantém o número de réplicas especificado no manifesto. Se essa fosse uma implantação de produção e você quisesse que o Kubernetes dimensionasse horizontalmente o número de réplicas ou verticalmente os recursos de computação para o Pods, usaria as implantações de pods de escala com o Horizontal Pod Autoscaler e os recursos de pods de ajuste com o Vertical Pod Autoscaler para fazer isso.

  2. 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 para IP: é um endereço IP exclusivo que pode ser alcançado de qualquer nó ou Pod dentro do cluster, mas não pode ser alcançado de fora do cluster. Os valores para Endpoints são endereços IP atribuídos de dentro da VPC aos Pods que fazem parte do serviço.

  3. Visualize os detalhes de um dos Pods listados na saída quando você visualizou o 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 está o nó. Se preferir atribuir aos 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 alternadas com rede personalizada. Você também pode ver que o agendador Kubernetes programou 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 sobre Pods, serviços, implantações e outros recursos do Kubernetes no AWS Management Console. Para ter mais informações, consulte Visualizar recursos do Kubernetes no AWS Management Console.

Executar um shell em um pod

  1. Execute um shell no Pod que você descreveu na etapa anterior, substituindo 65b7669776-m6qxz pelo ID de um dos seus Pods.

    kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
  2. No shell do Pod, visualize a saída do servidor da Web que foi instalado com a 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> [...]
  3. No shell do Pod, visualize o servidor DNS para o 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 a todos os Pods implantados no cluster.

  4. Desconecte-se do Pod digitando exit.

  5. 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

Após implantar a aplicação de exemplo, talvez você queira tentar alguns dos seguintes exercícios: