Introdução ao AWS App Mesh Kubernetes - AWS App Mesh

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Introdução ao AWS App Mesh Kubernetes

Ao se integrar AWS App Mesh ao Kubernetes usando o controlador App Mesh para Kubernetes, você gerencia recursos do App Mesh, como malhas, serviços virtuais, nós virtuais, roteadores virtuais e rotas por meio do Kubernetes. Também é possível adicionar automaticamente imagens de contêiner do arquivo associado do App Mesh às especificações do pod do Kubernetes. Este tutorial orienta a instalação do controlador do App Mesh para Kubernetes de forma a permitir essa integração.

O controlador é acompanhado pela implantação das seguintes definições de recursos personalizados do Kubernetes: meshes, virtual services, virtual nodes e virtual routers. O controlador observa a criação, modificação e exclusão dos recursos personalizados e faz alterações nos recursos correspondentes do App MeshMalhas de serviço,,,Serviços virtuais, Nós virtuais Gateways virtuaisRotas de gateway, Roteadores virtuais (incluindoRotas) por meio do App MeshAPI. Para saber mais ou contribuir com o controlador, consulte o GitHubprojeto.

O controlador também instala um webhook que injeta os seguintes contêineres em pods do Kubernetes etiquetados com um nome que você especificar.

  • Proxy do App Mesh Envoy: o Envoy usa a configuração definida no ambiente de gerenciamento do App Mesh para determinar para onde enviar o tráfego do seu aplicativo.

  • Gerenciador de rotas de proxy do App Mesh: atualiza as regras iptables em um namespace de rede do pod que roteia o tráfego de entrada e saída pelo Envoy. Esse contêiner é executado como um contêiner de init do Kubernetes dentro do pod.

Pré-requisitos

  • Uma compreensão existente dos conceitos do App Mesh. Para obter mais informações, consulte O que é o AWS App Mesh?.

  • Uma compreensão existente dos conceitos de Kubernetes. Para obter mais informações, consulte O que é o Kubernetes na documentação do Kubernetes.

  • Um cluster do Kubernetes existente. Se você não tiver um cluster existente, consulte Getting Started with Amazon EKS no Guia do EKS usuário da Amazon. Se você estiver executando seu próprio cluster Kubernetes na AmazonEC2, certifique-se de que o Docker esteja autenticado no repositório da ECR Amazon em que a imagem do Envoy está. Para obter mais informações, consulte Imagem do Envoy, Autenticação do registro no Guia do usuário do Amazon Elastic Container Registry e Como extrair uma imagem de um registro privado na documentação do Kubernetes.

  • O App Mesh oferece suporte a serviços Linux registrados com DNS AWS Cloud Map, ou com ambos. Para usar este guia de introdução, recomendamos que você tenha três serviços existentes registrados noDNS. Para os procedimentos nesse tópico, espera-se que os serviços existentes sejam nomeados serviceA, serviceB e serviceBv2; e que todos os serviços sejam detectáveis por meio de um namespace chamado apps.local.

    É possível criar uma malha de serviço e seus recursos mesmo que os serviços não existam, mas não será possível usar a malha enquanto não tiver implantado serviços reais.

  • A AWS CLI versão 1.18.116 ou posterior ou 2.0.38 ou posterior instalada. Para instalar ou atualizar o AWS CLI, consulte Instalando AWS CLI o.

  • Um cliente do kubectl que está configurado para se comunicar com o cluster do Kubernetes. Se você estiver usando o Amazon Elastic Kubernetes Service, use as instruções para instalar kubectl e configurar um arquivo kubeconfig.

  • Ter o Helm versão 3.0 ou posterior instalado. Se você não tiver o Helm instalado, consulte Usando o Helm com a Amazon EKS no Guia EKS do usuário da Amazon.

  • EKSAtualmente, a Amazon suporta apenas IPv4_ONLY e IPv6_ONLY somente preferências de IP, porque EKS atualmente a Amazon só oferece suporte a pods que são capazes de atender somente IPv4 tráfego ou somente IPv6 tráfego.

Supõe-se nas etapas restantes que os serviços reais sejam nomeados serviceA, serviceB e serviceBv2 e que todos os serviços sejam detectáveis por meio de um namespace chamado apps.local.

Etapa 1: Instalar os componentes de integração

Instale os componentes de integração uma vez em cada cluster que hospeda os pods a serem usados com o App Mesh.

Como instalar os componentes de integração
  1. As etapas restantes deste procedimento exigem um cluster sem uma versão de pré-lançamento do controlador instalada. Se você instalou uma versão de pré-lançamento ou não tem certeza se você a tem, baixe e execute um script para verificar se uma versão de pré-lançamento está instalada no seu cluster.

    curl -o pre_upgrade_check.sh https://raw.githubusercontent.com/aws/eks-charts/master/stable/appmesh-controller/upgrade/pre_upgrade_check.sh sh ./pre_upgrade_check.sh

    Se o script retornar Your cluster is ready for upgrade. Please proceed to the installation instructions, você poderá avançar para a próxima etapa. Se for diferente, você precisará concluir as etapas de atualização antes de continuar. Para obter mais informações sobre como atualizar uma versão de pré-lançamento, consulte Atualizar em. GitHub

  2. Adicione o repositório eks-charts ao Helm.

    helm repo add eks https://aws.github.io/eks-charts
  3. Instale as definições de recursos personalizadas do App Mesh Kubernetes (). CRD

    kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller/crds?ref=master"
  4. Crie um namespace do Kubernetes para o controlador.

    kubectl create ns appmesh-system
  5. Defina as seguintes variáveis para uso nas etapas mais adiante. Substitua cluster-name e Region-code pelos valores do cluster existente.

    export CLUSTER_NAME=cluster-name export AWS_REGION=Region-code
  6. (Opcional) Se você deseja executar o controlador no Fargate, é necessário criar um perfil do Fargate. Se você não tiver eksctl instalado, consulte Instalação ou atualização eksctl no Guia do EKS usuário da Amazon. Se você preferir criar o perfil usando o console, consulte Criação de um perfil do Fargate no Guia EKS do usuário da Amazon.

    eksctl create fargateprofile --cluster $CLUSTER_NAME --name appmesh-system --namespace appmesh-system
  7. Crie um provedor de identidade OpenID Connect (OIDC) para seu cluster. Se você não tiver eksctl instalado, poderá instalá-lo seguindo as instruções em Instalação ou atualização eksctl no Guia do EKS usuário da Amazon. Se você preferir criar o provedor usando o console, consulte Habilitando IAM funções para contas de serviço em seu cluster no Guia EKS do usuário da Amazon.

    eksctl utils associate-iam-oidc-provider \ --region=$AWS_REGION \ --cluster $CLUSTER_NAME \ --approve
  8. Crie uma IAM função, AWSAppMeshFullAccessanexe as políticas AWSCloudMapFullAccess AWS gerenciadas a ela e vincule-a à conta de serviço do appmesh-controller Kubernetes. A função permite que o controlador adicione, remova e altere os recursos do App Mesh.

    nota

    O comando cria uma AWS IAM função com um nome gerado automaticamente. Você não pode especificar o nome da IAM função criada.

    eksctl create iamserviceaccount \ --cluster $CLUSTER_NAME \ --namespace appmesh-system \ --name appmesh-controller \ --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapFullAccess,arn:aws:iam::aws:policy/AWSAppMeshFullAccess \ --override-existing-serviceaccounts \ --approve

    Se você preferir criar a conta de serviço usando o AWS Management Console ou AWS CLI, consulte Criação de uma IAM função e política para sua conta de serviço no Guia EKS do usuário da Amazon. Se você usar AWS Management Console ou AWS CLI para criar a conta, também precisará mapear a função para uma conta de serviço do Kubernetes. Para obter mais informações, consulte Especificação de uma IAM função para sua conta de serviço no Guia do EKS usuário da Amazon.

  9. Implante o controlador do App Mesh. Para obter uma lista de todas as opções de configuração, consulte Configuração ativada GitHub.
    1. Para implantar o controlador App Mesh em um cluster privado, você precisa primeiro habilitar o App Mesh e os VPC endpoints de descoberta de serviços da Amazon na sub-rede privada vinculada. Você também precisa definir o accountId.

      --set accountId=$AWS_ACCOUNT_ID

      Para habilitar o rastreamento de raios X em um cluster privado, habilite os VPC endpoints X-Ray e Amazon ECR Amazon. O controlador usa public.ecr.aws/xray/aws-xray-daemon:latest por padrão, então puxe essa imagem para o local e envie-a para seu ECR repositório pessoal.

      nota

      Atualmente, VPCos endpoints da Amazon não oferecem suporte aos repositórios ECR públicos da Amazon.

      O exemplo a seguir mostra a implantação do controlador com configurações do X-Ray.

      helm upgrade -i appmesh-controller eks/appmesh-controller \ --namespace appmesh-system \ --set region=$AWS_REGION \ --set serviceAccount.create=false \ --set serviceAccount.name=appmesh-controller \ --set accountId=$AWS_ACCOUNT_ID \ --set log.level=debug \ --set tracing.enabled=true \ --set tracing.provider=x-ray \ --set xray.image.repository=your-account-id.dkr.ecr.your-region.amazonaws.com/your-repository \ --set xray.image.tag=your-xray-daemon-image-tag

      Verifique se o daemon do X-Ray foi injetado com sucesso ao vincular a implantação do aplicativo ao seu nó virtual ou gateway.

      Para obter mais informações, consulte Clusters privados no Guia EKS do usuário da Amazon.

    2. Implante o controlador do App Mesh para outros clusters. Para obter uma lista de todas as opções de configuração, consulte Configuração ativada GitHub.

      helm upgrade -i appmesh-controller eks/appmesh-controller \ --namespace appmesh-system \ --set region=$AWS_REGION \ --set serviceAccount.create=false \ --set serviceAccount.name=appmesh-controller
    nota

    Se sua família de EKS clusters Amazon forIPv6, defina o nome do cluster ao implantar o controlador App Mesh adicionando a seguinte opção ao comando --set clusterName=$CLUSTER_NAME anterior.

    Importante

    Se seu cluster estiver em me-south-1, ap-east-1, ap-southeast-3, eu-south-1, il-central-1 ou af-south-1, você precisará adicionar as seguintes opções ao comando anterior:

    Substituir account-id e Region-code com um dos conjuntos de valores apropriados.

    • Para a imagem associada:
      • --set image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/amazon/appmesh-controller
      • 772975370895.dkr. ecr.me-south-1.amazonaws.com /:v1.29.6.1-prod aws-appmesh-envoy

      • 856666278305.dkr. ecr.ap-east-1.amazonaws.com /:v1.29.6.1-prod aws-appmesh-envoy

      • 909464085924.dkr. ecr.ap-southeast-3.amazonaws.com /:v1.29.6.1-prod aws-appmesh-envoy

      • 422531588944.dkr. ecr.eu-south-1.amazonaws.com /:v1.29.6.1-prod aws-appmesh-envoy

      • 564877687649.dkr. ecr.il-central-1.amazonaws.com /:v1.29.6.1-prod aws-appmesh-envoy

      • 924023996002.dkr. ecr.af-south-1.amazonaws.com /:v1.29.6.1-prod aws-appmesh-envoy

    • A imagem mais antiga URIs pode ser encontrada no log de alterações GitHub. As AWS contas nas quais as imagens estão presentes mudaram de versãov1.5.0. As versões mais antigas das imagens são hospedadas em contas da AWS encontradas nos registros de imagens de contêineres da Amazon no Amazon Elastic Kubernetes Service.

    • Para a imagem do controlador:
      • --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
      • 772975370895.dkr. ecr.me-south-1.amazonaws.com /amazon/appmesh-controller:v1.13.1

      • 856666278305.dkr. ecr.ap-east-1.amazonaws.com /amazon/appmesh-controller:v1.13.1

      • 909464085924.dkr. ecr.ap-southeast-3.amazonaws.com /amazon/appmesh-controller:v1.13.1

      • 422531588944.dkr. ecr.eu-south-1.amazonaws.com /amazon/appmesh-controller:v1.13.1

      • 564877687649.dkr. ecr.il-central-1.amazonaws.com /amazon/appmesh-controller:v1.13.1

      • 924023996002.dkr. ecr.af-south-1.amazonaws.com /amazon/appmesh-controller:v1.13.1

    • Para a imagem associada de inicialização:
      • --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
      • 772975370895.dkr. ecr.me-south-1.amazonaws.com/-manager:v7-prod aws-appmesh-proxy-route

      • 856666278305.dkr. ecr.ap-east-1.amazonaws.com/-manager:v7-prod aws-appmesh-proxy-route

      • 909464085924.dkr. ecr.ap-southeast-3.amazonaws.com/-manager:v7-prod aws-appmesh-proxy-route

      • 422531588944.dkr. ecr.eu-south-1.amazonaws.com/-manager:v7-prod aws-appmesh-proxy-route

      • 564877687649.dkr. ecr.il-central-1.amazonaws.com/-manager:v7-prod aws-appmesh-proxy-route

      • 924023996002.dkr. ecr.af-south-1.amazonaws.com/-manager:v7-prod aws-appmesh-proxy-route

    Importante

    Somente a versão v1.9.0.0-prod ou posterior é compatível para uso com o App Mesh.

  10. Confirme se a versão do controlador é v1.4.0 ou posterior. Você pode revisar o registro de alterações GitHub.

    kubectl get deployment appmesh-controller \ -n appmesh-system \ -o json | jq -r ".spec.template.spec.containers[].image" | cut -f2 -d ':'
    nota

    Se visualizar o log para o contêiner em execução, você poderá ver uma linha que inclui o seguinte texto, que pode ser ignorado com segurança.

    Neither -kubeconfig nor -master was specified. Using the inClusterConfig. This might not work.

Etapa 2: Como implantar recursos do App Mesh

Quando você implanta um aplicativo no Kubernetes, você também cria os recursos personalizados do Kubernetes para que o controlador possa criar os recursos do App Mesh correspondentes. O procedimento a seguir ajuda a implantar recursos do App Mesh com alguns atributos deles. Você pode encontrar exemplos de manifestos para implantar outros recursos de recursos do App Mesh nas v1beta2 subpastas de muitas das pastas de recursos listadas nas orientações do App Mesh em. GitHub

Importante

Depois que o controlador criar um recurso do App Mesh, recomendamos fazer apenas alterações ou excluir o recurso do App Mesh usando o controlador. Se você fizer alterações ou excluir o recurso usando o App Mesh, o controlador não alterará nem recriará o recurso alterado ou excluído do App Mesh por dez horas, por padrão. Você pode configurar essa duração para ser menor. Para obter mais informações, consulte Configuração ativada GitHub.

Como implantar recursos do App Mesh
  1. Crie um namespace do Kubernetes no qual implantar recursos do App Mesh.

    1. Salve o seguinte conteúdo no seu computador, em um arquivo chamado namespace.yaml:

      apiVersion: v1 kind: Namespace metadata: name: my-apps labels: mesh: my-mesh appmesh.k8s.aws/sidecarInjectorWebhook: enabled
    2. Crie o novo namespace.

      kubectl apply -f namespace.yaml
  2. Crie uma malha de serviços do App Mesh.

    1. Salve o seguinte conteúdo no seu computador, em um arquivo chamado mesh.yaml: O arquivo é usado para criar um recurso de malha chamado my-mesh. Uma malha de serviços é um limite lógico para o tráfego de rede entre os serviços que residem nela.

      apiVersion: appmesh.k8s.aws/v1beta2 kind: Mesh metadata: name: my-mesh spec: namespaceSelector: matchLabels: mesh: my-mesh
    2. Crie a malha.

      kubectl apply -f mesh.yaml
    3. Veja os detalhes do recurso de malha do Kubernetes que foi criado.

      kubectl describe mesh my-mesh

      Saída

      Name: my-mesh Namespace: Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"Mesh","metadata":{"annotations":{},"name":"my-mesh"},"spec":{"namespaceSelector":{"matchLa... API Version: appmesh.k8s.aws/v1beta2 Kind: Mesh Metadata: Creation Timestamp: 2020-06-17T14:51:37Z Finalizers: finalizers.appmesh.k8s.aws/mesh-members finalizers.appmesh.k8s.aws/aws-appmesh-resources Generation: 1 Resource Version: 6295 Self Link: /apis/appmesh.k8s.aws/v1beta2/meshes/my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Spec: Aws Name: my-mesh Namespace Selector: Match Labels: Mesh: my-mesh Status: Conditions: Last Transition Time: 2020-06-17T14:51:37Z Status: True Type: MeshActive Mesh ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh Observed Generation: 1 Events: <none>
    4. Veja os detalhes sobre a malha de serviços do App Mesh que o controlador criou.

      aws appmesh describe-mesh --mesh-name my-mesh

      Saída

      { "mesh": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh", "createdAt": "2020-06-17T09:51:37.920000-05:00", "lastUpdatedAt": "2020-06-17T09:51:37.920000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": {}, "status": { "status": "ACTIVE" } } }
  3. Crie um nó virtual do App Mesh. Um nó virtual atua como um ponteiro lógico para uma implantação do Kubernetes.

    1. Salve o seguinte conteúdo no seu computador, em um arquivo chamado virtual-node.yaml: O arquivo é usado para criar um nó virtual do App Mesh chamado my-service-a no meus aplicativos namespace. O nó virtual representa um serviço do Kubernetes criado em uma etapa posterior. O valor de hostname é o DNS nome de host totalmente qualificado do serviço real que esse nó virtual representa.

      apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualNode metadata: name: my-service-a namespace: my-apps spec: podSelector: matchLabels: app: my-app-1 listeners: - portMapping: port: 80 protocol: http serviceDiscovery: dns: hostname: my-service-a.my-apps.svc.cluster.local

      Os nós virtuais têm recursos, como end-to-end criptografia e verificações de integridade, que não são abordados neste tutorial. Para obter mais informações, consulte Nós virtuais. Para ver todas as configurações disponíveis para um nó virtual que é possível definir na especificação anterior, execute o comando a seguir.

      aws appmesh create-virtual-node --generate-cli-skeleton yaml-input
    2. Implante o nó virtual.

      kubectl apply -f virtual-node.yaml
    3. Veja os detalhes do recurso de nó virtual do Kubernetes que foi criado.

      kubectl describe virtualnode my-service-a -n my-apps

      Saída

      Name: my-service-a Namespace: my-apps Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualNode","metadata":{"annotations":{},"name":"my-service-a","namespace":"my-apps"},"s... API Version: appmesh.k8s.aws/v1beta2 Kind: VirtualNode Metadata: Creation Timestamp: 2020-06-17T14:57:29Z Finalizers: finalizers.appmesh.k8s.aws/aws-appmesh-resources Generation: 2 Resource Version: 22545 Self Link: /apis/appmesh.k8s.aws/v1beta2/namespaces/my-apps/virtualnodes/my-service-a UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Spec: Aws Name: my-service-a_my-apps Listeners: Port Mapping: Port: 80 Protocol: http Mesh Ref: Name: my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Pod Selector: Match Labels: App: nginx Service Discovery: Dns: Hostname: my-service-a.my-apps.svc.cluster.local Status: Conditions: Last Transition Time: 2020-06-17T14:57:29Z Status: True Type: VirtualNodeActive Observed Generation: 2 Virtual Node ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps Events: <none>
    4. Veja os detalhes do nó virtual que o controlador criou no App Mesh.

      nota

      Embora o nome do nó virtual criado no Kubernetes seja my-service-a, o nome do nó virtual criado no App Mesh é my-service-a_my-apps. O controlador acrescenta o nome do namespace do Kubernetes ao nome do nó virtual do App Mesh ao criar o recurso do App Mesh. O nome do namespace é adicionado porque no Kubernetes é possível criar nós virtuais com o mesmo nome em namespaces diferentes, mas no App Mesh, um nome de nó virtual deve ser exclusivo em uma malha.

      aws appmesh describe-virtual-node --mesh-name my-mesh --virtual-node-name my-service-a_my-apps

      Saída

      { "virtualNode": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps", "createdAt": "2020-06-17T09:57:29.840000-05:00", "lastUpdatedAt": "2020-06-17T09:57:29.840000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": { "backends": [], "listeners": [ { "portMapping": { "port": 80, "protocol": "http" } } ], "serviceDiscovery": { "dns": { "hostname": "my-service-a.my-apps.svc.cluster.local" } } }, "status": { "status": "ACTIVE" }, "virtualNodeName": "my-service-a_my-apps" } }
  4. Crie um roteador virtual do App Mesh. Os roteadores virtuais manipulam o tráfego de um ou mais serviços virtuais dentro da malha.

    1. Salve o seguinte conteúdo no seu computador, em um arquivo chamado virtual-router.yaml: O arquivo é usado para criar um tráfego de roteador a roteador virtual para o nó virtual chamado my-service-a que foi criado na etapa anterior. O controlador cria o roteador virtual e os recursos de roteamento do App Mesh. É possível especificar muitos mais recursos para suas rotas e usar protocolos diferentes de http. Para ter mais informações, consulte Roteadores virtuais e Rotas. Perceba que o nome do nó virtual referenciado é o nome do nó virtual do Kubernetes, não o nome do nó virtual do App Mesh que foi criado no App Mesh pelo controlador.

      apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualRouter metadata: namespace: my-apps name: my-service-a-virtual-router spec: listeners: - portMapping: port: 80 protocol: http routes: - name: my-service-a-route httpRoute: match: prefix: / action: weightedTargets: - virtualNodeRef: name: my-service-a weight: 1

      (Opcional) Para ver todas as configurações disponíveis para roteador virtual que podem ser definidas na especificação anterior, execute o comando a seguir.

      aws appmesh create-virtual-router --generate-cli-skeleton yaml-input

      Para ver todas as configurações disponíveis para uma rota que podem ser definidas na especificação anterior, execute o comando a seguir.

      aws appmesh create-route --generate-cli-skeleton yaml-input
    2. Implante o roteador virtual.

      kubectl apply -f virtual-router.yaml
    3. Veja o recurso de roteador virtual do Kubernetes que foi criado.

      kubectl describe virtualrouter my-service-a-virtual-router -n my-apps

      Resultado abreviado

      Name: my-service-a-virtual-router Namespace: my-apps Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualRouter","metadata":{"annotations":{},"name":"my-service-a-virtual-router","namespac... API Version: appmesh.k8s.aws/v1beta2 Kind: VirtualRouter ... Spec: Aws Name: my-service-a-virtual-router_my-apps Listeners: Port Mapping: Port: 80 Protocol: http Mesh Ref: Name: my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Routes: Http Route: Action: Weighted Targets: Virtual Node Ref: Name: my-service-a Weight: 1 Match: Prefix: / Name: my-service-a-route Status: Conditions: Last Transition Time: 2020-06-17T15:14:01Z Status: True Type: VirtualRouterActive Observed Generation: 1 Route AR Ns: My - Service - A - Route: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps/route/my-service-a-route Virtual Router ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps Events: <none>
    4. Veja o recurso de roteador virtual que o controlador criou no App Mesh. Especifique my-service-a-virtual-router_my-apps para name, porque quando o controlador criou o roteador virtual no App Mesh, ele anexou o nome do namespace do Kubernetes ao nome do roteador virtual.

      aws appmesh describe-virtual-router --virtual-router-name my-service-a-virtual-router_my-apps --mesh-name my-mesh

      Saída

      { "virtualRouter": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps", "createdAt": "2020-06-17T10:14:01.547000-05:00", "lastUpdatedAt": "2020-06-17T10:14:01.547000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http" } } ] }, "status": { "status": "ACTIVE" }, "virtualRouterName": "my-service-a-virtual-router_my-apps" } }
    5. Veja o recurso de rota que o controlador criou no App Mesh. Um recurso de rota não foi criado no Kubernetes porque a rota faz parte da configuração do roteador virtual no Kubernetes. As informações da rota foram mostradas nos detalhes do recurso do Kubernetes na subetapa c. O controlador não acrescentou o nome do namespace do Kubernetes ao nome da rota do App Mesh ao criar a rota no App Mesh porque os nomes de rota são exclusivos de um roteador virtual.

      aws appmesh describe-route \ --route-name my-service-a-route \ --virtual-router-name my-service-a-virtual-router_my-apps \ --mesh-name my-mesh

      Saída

      { "route": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps/route/my-service-a-route", "createdAt": "2020-06-17T10:14:01.577000-05:00", "lastUpdatedAt": "2020-06-17T10:14:01.577000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "routeName": "my-service-a-route", "spec": { "httpRoute": { "action": { "weightedTargets": [ { "virtualNode": "my-service-a_my-apps", "weight": 1 } ] }, "match": { "prefix": "/" } } }, "status": { "status": "ACTIVE" }, "virtualRouterName": "my-service-a-virtual-router_my-apps" } }
  5. Crie um serviço virtual do App Mesh. Um serviço virtual é uma abstração de um serviço real que é fornecido por um nó virtual direta ou indiretamente por meio de um roteador virtual. Os serviços dependentes chamam o serviço virtual pelo nome. Embora o nome não seja importante para o App Mesh, recomendamos nomear o serviço virtual com o nome de domínio totalmente qualificado do serviço real que o serviço virtual representa. Ao nomear seus serviços virtuais dessa forma, você não precisa alterar o código do aplicativo para fazer referência a um nome diferente. As solicitações são roteadas para o nó virtual ou o roteador virtual especificado como o provedor para o serviço virtual.

    1. Salve o seguinte conteúdo no seu computador, em um arquivo chamado virtual-service.yaml: O arquivo é usado para criar um serviço virtual que usa um provedor de roteador virtual para direcionar o tráfego para o nó virtual chamado my-service-a criado em uma etapa anterior. O valor de awsName in the spec é o nome de domínio totalmente qualificado (FQDN) do serviço real do Kubernetes que esse serviço virtual abstrai. O serviço Kubernetes é criado no Etapa 3: Criar ou atualizar serviços. Para obter mais informações, consulte Serviços virtuais.

      apiVersion: appmesh.k8s.aws/v1beta2 kind: VirtualService metadata: name: my-service-a namespace: my-apps spec: awsName: my-service-a.my-apps.svc.cluster.local provider: virtualRouter: virtualRouterRef: name: my-service-a-virtual-router

      Para ver todas as configurações disponíveis para um serviço virtual que é possível definir na especificação anterior, execute o comando a seguir.

      aws appmesh create-virtual-service --generate-cli-skeleton yaml-input
    2. Crie o serviço virtual.

      kubectl apply -f virtual-service.yaml
    3. Veja os detalhes do recurso de serviço virtual do Kubernetes que foi criado.

      kubectl describe virtualservice my-service-a -n my-apps

      Saída

      Name: my-service-a Namespace: my-apps Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualService","metadata":{"annotations":{},"name":"my-service-a","namespace":"my-apps"}... API Version: appmesh.k8s.aws/v1beta2 Kind: VirtualService Metadata: Creation Timestamp: 2020-06-17T15:48:40Z Finalizers: finalizers.appmesh.k8s.aws/aws-appmesh-resources Generation: 1 Resource Version: 13598 Self Link: /apis/appmesh.k8s.aws/v1beta2/namespaces/my-apps/virtualservices/my-service-a UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Spec: Aws Name: my-service-a.my-apps.svc.cluster.local Mesh Ref: Name: my-mesh UID: 111a11b1-c11d-1e1f-gh1i-j11k1l111m711 Provider: Virtual Router: Virtual Router Ref: Name: my-service-a-virtual-router Status: Conditions: Last Transition Time: 2020-06-17T15:48:40Z Status: True Type: VirtualServiceActive Observed Generation: 1 Virtual Service ARN: arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualService/my-service-a.my-apps.svc.cluster.local Events: <none>
    4. Veja os detalhes do recurso de serviço virtual que o controlador criou no App Mesh. O controlador Kubernetes não anexou o nome do namespace Kubernetes ao nome do serviço virtual App Mesh quando criou o serviço virtual no App Mesh porque o nome do serviço virtual é exclusivo. FQDN

      aws appmesh describe-virtual-service --virtual-service-name my-service-a.my-apps.svc.cluster.local --mesh-name my-mesh

      Saída

      { "virtualService": { "meshName": "my-mesh", "metadata": { "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualService/my-service-a.my-apps.svc.cluster.local", "createdAt": "2020-06-17T10:48:40.182000-05:00", "lastUpdatedAt": "2020-06-17T10:48:40.182000-05:00", "meshOwner": "111122223333", "resourceOwner": "111122223333", "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711", "version": 1 }, "spec": { "provider": { "virtualRouter": { "virtualRouterName": "my-service-a-virtual-router_my-apps" } } }, "status": { "status": "ACTIVE" }, "virtualServiceName": "my-service-a.my-apps.svc.cluster.local" } }

Embora não seja abordado neste tutorial, o controlador também pode implantar Gateways virtuais e Rotas de gateway do App Mesh. Para ver um passo a passo da implantação desses recursos com o controlador, consulte Configurando o gateway de entrada ou um exemplo de manifesto que inclui os recursos em. GitHub

Etapa 3: Criar ou atualizar serviços

Todos os pods a serem usados com o App Mesh devem ter os contêineres associados do App Mesh adicionados a eles. O injetor adiciona automaticamente os contêineres associados a qualquer pod implantado com uma etiqueta especificada.

  1. Habilite a autorização de proxy. Recomendamos que você habilite cada implantação do Kubernetes para transmitir somente a configuração de seu próprio nó virtual do App Mesh.

    1. Salve o seguinte conteúdo no seu computador, em um arquivo chamado proxy-auth.json: Certifique-se de substituir o alternate-colored values com o seu.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appmesh:StreamAggregatedResources", "Resource": [ "arn:aws:appmesh:Region-code:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps" ] } ] }
    2. Crie a política .

      aws iam create-policy --policy-name my-policy --policy-document file://proxy-auth.json
    3. Crie uma IAM função, anexe a política que você criou na etapa anterior a ela, crie uma conta de serviço do Kubernetes e vincule a política à conta de serviço do Kubernetes. A função permite que o controlador adicione, remova e altere os recursos do App Mesh.

      eksctl create iamserviceaccount \ --cluster $CLUSTER_NAME \ --namespace my-apps \ --name my-service-a \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy \ --override-existing-serviceaccounts \ --approve

      Se você preferir criar a conta de serviço usando o AWS Management Console ou AWS CLI, consulte Criação de uma IAM função e política para sua conta de serviço no Guia EKS do usuário da Amazon. Se você usar AWS Management Console ou AWS CLI para criar a conta, também precisará mapear a função para uma conta de serviço do Kubernetes. Para obter mais informações, consulte Especificação de uma IAM função para sua conta de serviço no Guia do EKS usuário da Amazon.

  2. (Opcional) Se você deseja fazer sua implantação em pods do Fargate, será necessário criar um perfil do Fargate. Se você não tiver eksctl instalado, poderá instalá-lo seguindo as instruções em Instalação ou atualização eksctl no Guia do EKS usuário da Amazon. Se você preferir criar o perfil usando o console, consulte Criação de um perfil do Fargate no Guia EKS do usuário da Amazon.

    eksctl create fargateprofile --cluster my-cluster --region Region-code --name my-service-a --namespace my-apps
  3. Crie um serviço e uma implantação do Kubernetes. Se você tem uma implantação existente que deseja usar com o App Mesh, precisará implantar um nó virtual, como fez na subetapa 3 de Etapa 2: Como implantar recursos do App Mesh. Atualize sua implantação para garantir que o rótulo corresponda àquele definido no nó virtual, para que os contêineres auxiliares sejam automaticamente adicionados aos pods e os pods sejam reimplantados.

    1. Salve o seguinte conteúdo no seu computador, em um arquivo chamado example-service.yaml: Se você alterar o nome do namespace e estiver usando pods do Fargate, certifique-se de que nome do namespace corresponda ao àquele definido no seu perfil do Fargate.

      apiVersion: v1 kind: Service metadata: name: my-service-a namespace: my-apps labels: app: my-app-1 spec: selector: app: my-app-1 ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-service-a namespace: my-apps labels: app: my-app-1 spec: replicas: 3 selector: matchLabels: app: my-app-1 template: metadata: labels: app: my-app-1 spec: serviceAccountName: my-service-a containers: - name: nginx image: nginx:1.19.0 ports: - containerPort: 80
      Importante

      O valor para app matchLabels selector na especificação deve corresponder àquele especificado na criação do nó virtual na subetapa 3 em Etapa 2: Como implantar recursos do App Mesh, ou os contêineres associados não serão injetados no pod. No exemplo anterior, o valor para o rótulo é my-app-1. Se você implantar um gateway virtual, em vez de um nó virtual, o Deployment manifesto deverá incluir somente o contêiner Envoy. Para mais informações sobre a imagem a ser usada, consulte Imagem do Envoy. Para ver um exemplo de manifestação, consulte o exemplo de implantação em. GitHub

    2. Implante o serviço.

      kubectl apply -f example-service.yaml
    3. Visualize o serviço e a implantação.

      kubectl -n my-apps get pods

      Saída

      NAME READY STATUS RESTARTS AGE my-service-a-54776556f6-2cxd9 2/2 Running 0 10s my-service-a-54776556f6-w26kf 2/2 Running 0 18s my-service-a-54776556f6-zw5kt 2/2 Running 0 26s
    4. Visualize os detalhes de um dos pods que foi implantado.

      kubectl -n my-apps describe pod my-service-a-54776556f6-2cxd9

      Resultado abreviado

      Name: my-service-a-54776556f6-2cxd9 Namespace: my-app-1 Priority: 0 Node: ip-192-168-44-157.us-west-2.compute.internal/192.168.44.157 Start Time: Wed, 17 Jun 2020 11:08:59 -0500 Labels: app=nginx pod-template-hash=54776556f6 Annotations: kubernetes.io/psp: eks.privileged Status: Running IP: 192.168.57.134 IPs: IP: 192.168.57.134 Controlled By: ReplicaSet/my-service-a-54776556f6 Init Containers: proxyinit: Container ID: docker://e0c4810d584c21ae0cb6e40f6119d2508f029094d0e01c9411c6cf2a32d77a59 Image: 111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2 Image ID: docker-pullable://111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager Port: <none> Host Port: <none> State: Terminated Reason: Completed Exit Code: 0 Started: Fri, 26 Jun 2020 08:36:22 -0500 Finished: Fri, 26 Jun 2020 08:36:22 -0500 Ready: True Restart Count: 0 Requests: cpu: 10m memory: 32Mi Environment: APPMESH_START_ENABLED: 1 APPMESH_IGNORE_UID: 1337 APPMESH_ENVOY_INGRESS_PORT: 15000 APPMESH_ENVOY_EGRESS_PORT: 15001 APPMESH_APP_PORTS: 80 APPMESH_EGRESS_IGNORED_IP: 169.254.169.254 APPMESH_EGRESS_IGNORED_PORTS: 22 AWS_ROLE_ARN: arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token ... Containers: nginx: Container ID: docker://be6359dc6ecd3f18a1c87df7b57c2093e1f9db17d5b3a77f22585ce3bcab137a Image: nginx:1.19.0 Image ID: docker-pullable://nginx Port: 80/TCP Host Port: 0/TCP State: Running Started: Fri, 26 Jun 2020 08:36:28 -0500 Ready: True Restart Count: 0 Environment: AWS_ROLE_ARN: arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token ... envoy: Container ID: docker://905b55cbf33ef3b3debc51cb448401d24e2e7c2dbfc6a9754a2c49dd55a216b6 Image: 840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod Image ID: docker-pullable://840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy Port: 9901/TCP Host Port: 0/TCP State: Running Started: Fri, 26 Jun 2020 08:36:36 -0500 Ready: True Restart Count: 0 Requests: cpu: 10m memory: 32Mi Environment: APPMESH_RESOURCE_ARN: arn:aws:iam::111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps APPMESH_PREVIEW: 0 ENVOY_LOG_LEVEL: info AWS_REGION: us-west-2 AWS_ROLE_ARN: arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Pulling 30s kubelet, ip-192-168-44-157.us-west-2.compute.internal Pulling image "111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2" Normal Pulled 23s kubelet, ip-192-168-44-157.us-west-2.compute.internal Successfully pulled image "111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2" Normal Created 21s kubelet, ip-192-168-44-157.us-west-2.compute.internal Created container proxyinit Normal Started 21s kubelet, ip-192-168-44-157.us-west-2.compute.internal Started container proxyinit Normal Pulling 20s kubelet, ip-192-168-44-157.us-west-2.compute.internal Pulling image "nginx:1.19.0" Normal Pulled 16s kubelet, ip-192-168-44-157.us-west-2.compute.internal Successfully pulled image "nginx:1.19.0" Normal Created 15s kubelet, ip-192-168-44-157.us-west-2.compute.internal Created container nginx Normal Started 15s kubelet, ip-192-168-44-157.us-west-2.compute.internal Started container nginx Normal Pulling 15s kubelet, ip-192-168-44-157.us-west-2.compute.internal Pulling image "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod" Normal Pulled 8s kubelet, ip-192-168-44-157.us-west-2.compute.internal Successfully pulled image "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod" Normal Created 7s kubelet, ip-192-168-44-157.us-west-2.compute.internal Created container envoy Normal Started 7s kubelet, ip-192-168-44-157.us-west-2.compute.internal Started container envoy

      No resultado anterior, é possível ver que os contêineres proxyinit e envoy foram adicionados ao pod pelo controlador. Se você implantou o serviço de exemplo no Fargate, o contêiner envoy foi adicionado ao pod pelo controlador, mas o contêiner proxyinit não foi.

  4. (Opcional) Instale complementos como Prometheus, Grafana, Jaeger e AWS X-Ray Datadog. Para obter mais informações, consulte os complementos do App Mesh GitHub e a seção Observabilidade do Guia do usuário do App Mesh.

nota

Para ver mais exemplos e orientações sobre o App Mesh, consulte o repositório de exemplos do App Mesh.

Etapa 4: limpar

Remova todos os recursos de exemplo criados neste tutorial. O controlador também remove os recursos criados na malha de serviços my-mesh do App Mesh.

kubectl delete namespace my-apps

Se você criou um perfil do Fargate para o serviço de exemplo, remova-o.

eksctl delete fargateprofile --name my-service-a --cluster my-cluster --region Region-code

Exclua a malha.

kubectl delete mesh my-mesh

(Opcional) É possível remover os componentes de integração do Kubernetes.

helm delete appmesh-controller -n appmesh-system

(Opcional) Se você implantou os componentes de integração do Kubernetes no Fargate, exclua o perfil do Fargate.

eksctl delete fargateprofile --name appmesh-system --cluster my-cluster --region Region-code