Implantar uma aplicação de exemplo - Amazon EKS

Ajudar a melhorar esta página

Quer contribuir para este guia do usuário? Role até o final desta página e selecione Editar esta página no GitHub. Suas contribuições ajudarão a tornar nosso guia do usuário melhor para todos.

Implantar uma aplicação de exemplo

Neste tópico, você implanta uma aplicação de exemplo no cluster.

Pré-requisitos
  • Um cluster Kubernetes existente com pelo menos um nó. Se você não tiver um cluster do Amazon EKS, implante um usando um dos guias Começar a usar o Amazon EKS. Se você estiver implantando uma aplicação do Windows, será necessário ter o suporte ao Windows habilitado para o cluster e pelo menos um nó do Windows do Amazon EC2.

  • 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ê usou um dos guias de conceitos básicos para criar o cluster, 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.

Para implantar uma aplicação de exemplo

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.

  1. 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 sua aplicação de exemplo para Simplificar o gerenciamento da computação com o AWS Fargate, verifique se o valor do namespace em Defina quais Pods usarão o AWS Fargate quando em execução é eks-sample-app.

    kubectl create namespace eks-sample-app
  2. 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. É possível implantar a aplicação em nós Linux ou Windows. Se estiver implantando no Fargate, só poderá implantar uma aplicação do Linux.

    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.

      Linux

      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
      Windows

      O nodeSelector do kubernetes.io/os: windows significa que se você tivesse (por exemplo) nós do Windows e do Linux no cluster, a imagem só seria implantada nos nós do Windows. 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-windows-deployment namespace: eks-sample-app labels: app: eks-sample-windows-app spec: replicas: 3 selector: matchLabels: app: eks-sample-windows-app template: metadata: labels: app: eks-sample-windows-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 containers: - name: windows-server-iis image: mcr.microsoft.com/windows/servercore:ltsc2019 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent command: - powershell.exe - -command - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; " nodeSelector: kubernetes.io/os: windows
    2. Aplique o manifesto de implantação ao seu cluster.

      kubectl apply -f eks-sample-deployment.yaml
  3. Crie 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.

      Linux
      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
      Windows
      apiVersion: v1 kind: Service metadata: name: eks-sample-windows-service namespace: eks-sample-app labels: app: eks-sample-windows-app spec: selector: app: eks-sample-windows-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
  4. Visualize todos os recursos no namespace eks-sample-app.

    kubectl get all -n eks-sample-app

    Veja um exemplo de saída abaixo.

    Se você implantou recursos do Windows, todas as instâncias do linux na saída a seguir serão windows. Os outros exemplos de valores podem ser diferentes da saída.

    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 implantação fosse uma implantação de produção e você quisesse que o Kubernetesescalasse horizontalmente o número de réplicas ou escalasse verticalmente os recursos de computação para os Pods, você usaria Escalar as implantações de pods com o Horizontal Pod Autoscaler e Ajustar os recursos de pods com o Vertical Pod Autoscaler para fazer isso.

  5. Veja os detalhes do serviço implantado. Se você implantou um serviço do Windows, substitua linux por windows.

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

    Veja um exemplo de saída abaixo.

    Se você implantou recursos do Windows, todas as instâncias do linux na saída a seguir serão windows. Os outros exemplos de valores podem ser diferentes da saída.

    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.

  6. Visualize os detalhes de um dos Pods listados na saída quando você visualizou o namespace em uma etapa anterior. Se você implantou uma aplicação do Windows, substitua linux por windows e substitua 776d8f8fd8-78w66 pelo valor retornado para um dos Pods.

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

    Resultado abreviado

    Se você implantou recursos do Windows, todas as instâncias do linux na saída a seguir serão windows. Os outros example values podem ser diferentes da 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 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 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.

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

    Linux
    kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
    Windows
    kubectl exec -it eks-sample-windows-deployment-65b7669776-m6qxz -n eks-sample-app -- powershell.exe
  8. 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.

    Linux
    curl eks-sample-linux-service

    Veja um exemplo de saída abaixo.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
    Windows
    Invoke-WebRequest -uri eks-sample-windows-service/default.html -UseBasicParsing

    Veja um exemplo de saída abaixo.

    StatusCode : 200 StatusDescription : OK Content : < h t m l > < b o d y > < b r / > < b r / > < m a r q u e e > < H 1 > H e l l o E K S ! ! ! < H 1 > < m a r q u e e > < / b o d y > < h t m l >
  9. No shell do Pod, visualize o servidor DNS para o Pod.

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

    Windows
    Get-NetIPConfiguration

    Resultado abreviado

    InterfaceAlias : vEthernet [...] IPv4Address : 192.168.63.14 [...] DNSServer : 10.100.0.10

    Na saída anterior, 10.100.0.10 é atribuído automaticamente como o servidor de DNS a todos os Pods implantados no cluster.

  10. Desconecte-se do Pod digitando exit.

  11. 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óximos Passos

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