

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS App Mesh 및 Kubernetes 시작하기
<a name="getting-started-kubernetes"></a>

**중요**  
지원 종료 공지: 2026년 9월 30일에 AWS 는에 대한 지원을 중단합니다 AWS App Mesh. 2026년 9월 30일 이후에는 AWS App Mesh 콘솔 또는 AWS App Mesh 리소스에 더 이상 액세스할 수 없습니다. 자세한 내용은이 블로그 게시물 [Migrating from to Amazon ECS Service Connect를 참조 AWS App Mesh 하세요](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect).

Kubernetes용 App Mesh 컨트롤러를 사용하여 Kubernetes AWS App Mesh 와 통합하면 Kubernetes를 통해 메시, 가상 서비스, 가상 노드, 가상 라우터 및 경로와 같은 App Mesh 리소스를 관리합니다. 또한 App Mesh 사이드카 컨테이너 이미지를 Kubernetes 포드 사양에 자동으로 추가합니다. 이 자습서에서는 Kubernetes용 App Mesh 컨트롤러를 설치하여 이러한 통합을 활성화하는 방법을 안내합니다.

컨트롤러에는 Kubernetes 사용자 지정 리소스 정의(`meshes`, `virtual services`, `virtual nodes` 및 `virtual routers`)의 배포가 포함됩니다. 컨트롤러는 사용자 지정 리소스의 생성, 수정, 삭제를 감시하고 App Mesh API를 통해 해당 App Mesh [서비스 메시](meshes.md), [가상 서비스](virtual_services.md), [가상 노드](virtual_nodes.md), [가상 게이트웨이](virtual_gateways.md), [게이트웨이 경로](gateway-routes.md), [가상 라우터](virtual_routers.md)([Routes](routes.md) 포함) 리소스를 변경합니다. 자세히 알아보거나 컨트롤러에 기여하려면 [GitHub 프로젝트](https://github.com/aws/aws-app-mesh-controller-for-k8s)를 참조하십시오.

또한 컨트롤러는 사용자가 지정한 이름으로 레이블이 지정된 Kubernetes 포드에 다음 컨테이너를 삽입하는 웹훅을 설치합니다.
+ **App Mesh Envoy 프록시** - Envoy는 App Mesh 컨트롤 영역에 정의된 구성을 사용하여 애플리케이션 트래픽을 전송할 위치를 결정합니다.
+ **App Mesh 프록시 경로 관리자** - 포드의 네트워크 네임스페이스에서 Envoy를 통한 인바운드 및 아웃바운드 트래픽을 라우팅하는 `iptables` 규칙을 업데이트합니다. 이 컨테이너는 포드 내부의 Kubernetes 초기화 컨테이너로 실행됩니다.

## 사전 조건
<a name="mesh-k8s-integration-prerequisites"></a>
+ App Mesh 개념에 대한 기존의 이해. 자세한 내용은 [란 무엇입니까 AWS App Mesh?](what-is-app-mesh.md) 단원을 참조하십시오.
+ Kubernetes 개념에 대한 기존의 이해. 자세한 내용은 Kubernetes 설명서의 [Kubernetes란?](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/)을 참조하세요.
+ 기존 Kubernetes 클러스터. 기존 클러스터가 없는 경우 Amazon EKS 사용 설명서의 [Amazon EKS 시작하기](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)를 참조하세요.** Amazon EC2에서 자체 Kubernetes 클러스터를 실행하는 경우 Envoy 이미지가 있는 Amazon ECR 리포지토리에 Docker가 인증되었는지 확인합니다. 자세한 내용은 Amazon Elastic Container Registry 사용 설명서의 [Envoy 이미지](https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html), [레지스트리 인증](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth) 및 Kubernetes 설명서의 [프라이빗 레지스트리에서 이미지 가져오기](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)를 참조하세요.
+ App Mesh는 DNS AWS Cloud Map또는 둘 다에 등록된 Linux 서비스를 지원합니다. 이 시작 안내서를 사용하려면 DNS에 등록된 기존 서비스 3개가 있으면 좋습니다. 이 주제의 절차에서는 기존 서비스의 이름이 `serviceA`, `serviceB` 및 `serviceBv2`이고 `apps.local`이라는 네임스페이스를 통해 모든 서비스를 검색할 수 있다고 가정합니다.

  서비스가 존재하지 않더라도 서비스 메시 및 해당 리소스를 생성할 수 있지만 실제 서비스를 배포할 때까지 메시를 사용할 수 없습니다.
+  AWS CLI 버전 1.18.116 이상 또는 2.0.38 이상이 설치되었습니다. 를 설치하거나 업그레이드하려면 설치를 AWS CLI참조하세요. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 
+ Kubernetes 클러스터와 통신하도록 구성된 `kubectl` 클라이언트. Amazon Elastic Kubernetes Service를 사용하는 경우 `[kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)` 설치 및 `[kubeconfig](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html)` 파일 구성에 대한 지침을 사용할 수 있습니다.
+ Helm 버전 3.0 이상이 설치되어 있어야 합니다. Helm이 설치되어 있지 않은 경우 Amazon EKS 사용 설명서의 [Amazon EKS에서 Helm 사용](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)을 참조하세요.**
+ Amazon EKS는 현재 `IPv4_ONLY` 및 `IPv6_ONLY` 전용 IP 기본 설정을 지원합니다. Amazon EKS는 현재 `IPv4` 트래픽만 또는 `IPv6` 트래픽만 처리할 수 있는 포드만 지원하기 때문입니다.

나머지 단계에서는 실제 서비스의 이름이 `serviceA`, `serviceB` 및 `serviceBv2`이고 `apps.local`이라는 네임스페이스를 통해 모든 서비스를 검색할 수 있다고 가정합니다.

## 1단계: 통합 구성 요소 설치
<a name="install-controller"></a>

App Mesh에 사용할 포드를 호스팅하는 각 클러스터에 통합 구성 요소를 한 번 설치합니다.

**통합 구성 요소를 설치하려면**

1. 이 절차의 나머지 단계에서는 시험판 버전의 컨트롤러가 설치되지 않은 클러스터가 필요합니다. 시험판 버전을 설치했거나 보유하고 있는지 확실하지 않은 경우 클러스터에 시험판 버전이 설치되어 있는지 확인하는 스크립트를 다운로드하여 실행할 수 있습니다.

   ```
   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
   ```

   스크립트가 `Your cluster is ready for upgrade. Please proceed to the installation instructions`를 반환하면 다음 단계로 진행할 수 있습니다. 다른 메시지가 반환되면 계속하기 전에 업그레이드 단계를 완료해야 합니다. 시험판 버전 업그레이드에 대한 자세한 내용은 GitHub에서 [업그레이드](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#upgrade)를 참조하십시오.

1. Helm에 `eks-charts` 리포지토리를 추가합니다.

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. App Mesh Kubernetes 사용자 지정 리소스 정의(CRD)를 설치합니다.

   ```
   kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller/crds?ref=master"
   ```

1. 컨트롤러에 대한 Kubernetes 네임스페이스를 만듭니다.

   ```
   kubectl create ns appmesh-system
   ```

1. 이후 단계에서 사용할 수 있도록 다음 변수를 설정합니다. `{{cluster-name}}` 및 `{{Region-code}}`를 기존 클러스터의 값으로 바꿉니다.

   ```
   export CLUSTER_NAME={{cluster-name}}
   export AWS_REGION={{Region-code}}
   ```

1. (선택 사항) Fargate에서 컨트롤러를 실행하려면 Fargate 프로필을 생성해야 합니다. 아직 `eksctl`을 설치하지 않은 경우 Amazon EKS 사용 설명서의 [`eksctl` 설치 또는 업그레이드](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl)를 참조하세요.** 콘솔을 사용하여 프로필을 생성하려면 Amazon EKS 사용 설명서의 [Fargate 프로필 생성](https://docs.aws.amazon.com/eks/latest/userguide/fargate-profile.html#create-fargate-profile)을 참조하세요.**

   ```
   eksctl create fargateprofile --cluster $CLUSTER_NAME --name {{appmesh-system}} --namespace {{appmesh-system}}
   ```

1. 클러스터에 대한 OpenID Connect(OIDC) 자격 증명 공급자를 만듭니다. `eksctl`을 설치하지 않은 경우 Amazon EKS 사용 설명서의 [`eksctl` 설치 또는 업그레이드](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl)의 지침에 따라 설치할 수 있습니다.** 콘솔을 사용하여 공급자를 생성하려면 Amazon EKS 사용 설명서의 [클러스터에서 서비스 계정의 IAM 역할 활성화](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)를 참조하세요.**

   ```
   eksctl utils associate-iam-oidc-provider \
       --region=$AWS_REGION \
       --cluster $CLUSTER_NAME \
       --approve
   ```

1. IAM 역할을 생성하고 및 [https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSAppMeshFullAccess$jsonEditor](https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSAppMeshFullAccess$jsonEditor) [https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSCloudMapFullAccess$jsonEditor](https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSCloudMapFullAccess$jsonEditor) AWS 관리형 정책을 연결한 다음 `appmesh-controller` Kubernetes 서비스 계정에 바인딩합니다. 이 역할을 사용하면 컨트롤러가 App Mesh 리소스를 추가, 제거 및 변경할 수 있습니다.
**참고**  
명령은 자동 생성된 이름으로 AWS IAM 역할을 생성합니다. 생성된 IAM 역할 이름은 지정할 수 없습니다.

   ```
   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
   ```

    AWS Management Console 또는를 사용하여 서비스 계정을 생성하려면 *Amazon EKS 사용 설명서*의 서비스 계정에 대한 IAM 역할 및 정책 생성을 AWS CLI참조하세요. [https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role](https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role) AWS Management Console 또는를 사용하여 계정을 AWS CLI 생성하는 경우 역할을 Kubernetes 서비스 계정에 매핑해야 합니다. 자세한 내용을 알아보려면 Amazon EKS 사용 설명서의 [서비스 계정에 대한 IAM 역할 지정](https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html)를 참조하세요.**

1. 

**App Mesh 컨트롤러를 배포합니다. 모든 구성 옵션 목록은 GitHub의 [Configuration](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration)을 참조하십시오.**

   1. 프라이빗 클러스터용 App Mesh 컨트롤러를 배포하려면 먼저 연결된 프라이빗 서브넷에 App Mesh와 서비스 검색 Amazon VPC 엔드포인트를 활성화해야 합니다. 또한 `accountId`를 설정해야 합니다.

      ```
      --set accountId=$AWS_ACCOUNT_ID
      ```

      프라이빗 클러스터에서 X-Ray 추적을 활성화하려면 X-Ray 및 Amazon ECR Amazon VPC 엔드포인트를 활성화합니다. 컨트롤러는 기본적으로 `public.ecr.aws/xray/aws-xray-daemon:latest`를 사용하므로 이 이미지를 로컬로 가져와서 [개인 ECR 리포지토리로 푸시](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)합니다.
**참고**  
[Amazon VPC 엔드포인트](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)는 현재 Amazon ECR 퍼블릭 리포지토리를 지원하지 않습니다.

      다음 예에서는 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}}
      ```

      애플리케이션 배포를 가상 노드 또는 게이트웨이에 바인딩할 때 X-Ray 대몬(daemon)이 성공적으로 삽입되었는지 확인합니다.

      자세한 내용은 *Amazon EKS 사용 설명서*의 [프라이빗 클러스터](https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html)를 참조하세요.

   1. 다른 클러스터용 App Mesh 컨트롤러를 배포합니다. 모든 구성 옵션 목록은 GitHub의 [Configuration](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration)을 참조하십시오.

      ```
      helm upgrade -i appmesh-controller eks/appmesh-controller \
          --namespace appmesh-system \
          --set region=$AWS_REGION \
          --set serviceAccount.create=false \
          --set serviceAccount.name=appmesh-controller
      ```
**참고**  
Amazon EKS 클러스터 패밀리가 `IPv6`인 경우, App Mesh 컨트롤러를 배포할 때 이전 명령 `--set clusterName=$CLUSTER_NAME`에 다음 옵션을 추가하여 클러스터 이름을 설정하세요.
**중요**  
클러스터가 `me-south-1`, `ap-east-1`, `ap-southeast-3`, `eu-south-1`, `il-central-1` 또는 `af-south-1` 리전에 있는 경우, 이전 명령에 다음 옵션을 추가해야 합니다.  
{{account-id}} 및 {{Region-code}}를 해당 값 세트 중 하나로 바꿉니다.  

       ```
        --set image.repository={{account-id}}.dkr.ecr.{{Region-code}}.amazonaws.com/amazon/appmesh-controller
       ```
772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
이전 이미지 URI는 GitHub의 [변경 로그](https://github.com/aws/aws-app-mesh-controller-for-k8s/releases)에서 찾을 수 있습니다. 이미지가 있는 AWS 계정이 버전에서 변경되었습니다`v1.5.0`. 이전 버전의 이미지는 Amazon Elastic Kubernetes Service [Amazon 컨테이너 이미지 레지스트리](https://docs.aws.amazon.com/eks/latest/userguide/add-ons-images.html)에 있는 AWS 계정에 호스팅됩니다.

       ```
       --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

       ```
       --set sidecar.image.repository={{account-id}}.dkr.ecr.{{Region-code}}.amazonaws.com/aws-appmesh-envoy
       ```
772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
**중요**  
v1.9.0.0-prod 이상 버전만 App Mesh에서 사용할 수 있습니다.

1. 컨트롤러 버전이 `v1.4.0` 이상인지 확인합니다. GitHub에서 [변경 로그](https://github.com/aws/aws-app-mesh-controller-for-k8s/releases)를 검토할 수 있습니다.

   ```
   kubectl get deployment appmesh-controller \
       -n appmesh-system \
       -o json  | jq -r ".spec.template.spec.containers[].image" | cut -f2 -d ':'
   ```
**참고**  
실행 중인 컨테이너에 대한 로그를 보면 무시해도 되는 다음 텍스트가 포함된 줄이 표시될 수 있습니다.  

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

## 2단계: App Mesh 리소스 배포
<a name="configure-app-mesh"></a>

Kubernetes에 애플리케이션을 배포할 때 Kubernetes 사용자 지정 리소스도 생성되므로 컨트롤러가 해당 App Mesh 리소스를 생성할 수 있습니다. 다음 절차는 일부 기능을 사용하여 App Mesh 리소스를 배포하는 데 도움이 됩니다. GitHub의 [App Mesh 연습](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs)에 나열된 여러 기능 폴더의 `v1beta2` 하위 폴더에서 다른 App Mesh 리소스 기능을 배포하기 위한 예제 매니페스트를 찾을 수 있습니다.

**중요**  
컨트롤러가 App Mesh 리소스를 생성한 후에는 컨트롤러를 사용하여 해당 App Mesh 리소스만 변경하거나 삭제하는 것이 좋습니다. App Mesh를 사용하여 리소스를 변경하거나 삭제하면 컨트롤러는 기본적으로 10시간 동안 변경되거나 삭제된 App Mesh 리소스를 변경하거나 다시 생성하지 않습니다. 이 기간을 더 짧게 구성할 수 있습니다. 자세한 내용은 GitHub에서 [구성](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration)을 참조하십시오.

**앱 메시 리소스를 배포하려면**

1. App Mesh 리소스를 배포할 Kubernetes 네임스페이스를 생성합니다.

   1. 다음 콘텐츠를 컴퓨터에 `namespace.yaml`이라는 파일에 저장합니다.

      ```
      apiVersion: v1
      kind: Namespace
      metadata:
        name: {{my-apps
      }}  labels:
          mesh: {{my-mesh}}
          appmesh.k8s.aws/sidecarInjectorWebhook: enabled
      ```

   1. 네임스페이스를 생성합니다.

      ```
      kubectl apply -f namespace.yaml
      ```

1. App Mesh 서비스 메시를 생성합니다.

   1. 다음 콘텐츠를 컴퓨터에 `mesh.yaml`이라는 파일에 저장합니다. 이 파일은 `{{my-mesh}}`라는 메시 리소스를 생성하는 데 사용됩니다. 서비스 메시는 내부에 있는 서비스 간의 네트워크 트래픽에 대한 논리적 경계입니다.

      ```
      apiVersion: appmesh.k8s.aws/v1beta2
      kind: Mesh
      metadata:
        name: {{my-mesh}}
      spec:
        namespaceSelector:
          matchLabels:
            mesh: {{my-mesh}}
      ```

   1. 메시를 생성합니다.

      ```
      kubectl apply -f mesh.yaml
      ```

   1. 생성된 Kubernetes 메시 리소스의 세부 정보를 봅니다.

      ```
      kubectl describe mesh {{my-mesh}}
      ```

      출력

      ```
      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>
      ```

   1. 컨트롤러가 생성한 App Mesh 서비스 메시에 대한 세부 정보를 봅니다.

      ```
      aws appmesh describe-mesh --mesh-name {{my-mesh}}
      ```

      출력

      ```
      {
          "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"
              }
          }
      }
      ```

1. 앱 메시 가상 노드를 만듭니다. 가상 노드는 Kubernetes 배포에 대한 논리적 포인터 역할을 합니다.

   1. 다음 콘텐츠를 컴퓨터에 `virtual-node.yaml`이라는 파일에 저장합니다. 이 파일은 {{`my-apps`}} 네임스페이스에 이름이 `{{my-service-a}}`인 App Mesh 가상 노드를 생성하는 데 사용됩니다. 가상 노드는 이후 단계에서 만드는 Kubernetes 서비스를 나타냅니다. `hostname`의 값은 이 가상 노드가 나타내는 실제 서비스의 정규화된 DNS 호스트 이름입니다.

      ```
      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}}
      ```

      가상 노드에는 이 자습서에서는 다루지 않는 종단 간 암호화 및 상태 확인과 같은 기능이 있습니다. 자세한 내용은 [가상 노드](virtual_nodes.md) 단원을 참조하십시오. 앞의 사양에서 설정할 수 있는 가상 노드에 사용 가능한 모든 설정을 보려면 다음 명령을 실행합니다.

      ```
      aws appmesh create-virtual-node --generate-cli-skeleton yaml-input
      ```

   1. 가상 노드를 배포합니다.

      ```
      kubectl apply -f virtual-node.yaml
      ```

   1. 생성된 Kubernetes 가상 노드 리소스의 세부 정보를 봅니다.

      ```
      kubectl describe virtualnode {{my-service-a}} -n {{my-apps}}
      ```

      출력

      ```
      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>
      ```

   1. 컨트롤러가 App Mesh에 생성한 가상 노드의 세부 정보를 봅니다.
**참고**  
Kubernetes에서 생성된 가상 노드의 이름은 `{{my-service-a}}`이지만, App Mesh 에서 생성한 가상 노드의 이름은 `{{my-service-a_my-apps}}`입니다. 컨트롤러는 App Mesh 리소스를 생성할 때 App Mesh 가상 노드 이름에 Kubernetes 네임스페이스 이름을 추가합니다. Kubernetes에서는 서로 다른 네임스페이스에 같은 이름의 가상 노드를 만들 수 있지만, App Mesh에서 가상 노드 이름은 메시 내에서 고유해야 하기 때문에 네임스페이스 이름이 추가됩니다.

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

      출력

      ```
      {
          "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"
          }
      }
      ```

1. App Mesh 가상 라우터를 생성합니다. 가상 라우터는 메시 내에 있는 하나 이상의 가상 서비스에 대한 트래픽을 처리합니다.

   1. 다음 콘텐츠를 컴퓨터에 `virtual-router.yaml`이라는 파일에 저장합니다. 이 파일은 이전 단계에서 생성된 `my-service-a`라는 가상 노드로 트래픽을 라우팅하는 가상 라우터를 생성하는 데 사용됩니다. 컨트롤러는 App Mesh 가상 라우터 및 경로 리소스를 생성합니다. 경로에 대해 더 많은 기능을 지정하고 `http` 이외의 프로토콜을 사용할 수 있습니다. 자세한 내용은 [가상 라우터](virtual_routers.md) 및 [Routes](routes.md) 섹션을 참조하세요. 참조된 가상 노드 이름은 컨트롤러에서 App Mesh에 생성한 App Mesh 가상 노드 이름이 아니라 Kubernetes 가상 노드 이름입니다.

      ```
      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}}
      ```

      (선택 사항) 앞의 사양에서 설정할 수 있는 가상 라우터에 사용 가능한 모든 설정을 보려면 다음 명령 중 하나를 실행합니다.

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

      앞의 사양에서 설정할 수 있는 경로에 사용 가능한 모든 설정을 보려면 다음 명령 중 하나를 실행합니다.

      ```
      aws appmesh create-route --generate-cli-skeleton yaml-input
      ```

   1. 가상 라우터를 배포합니다.

      ```
      kubectl apply -f virtual-router.yaml
      ```

   1. 생성된 Kubernetes 가상 라우터 리소스를 봅니다.

      ```
      kubectl describe virtualrouter {{my-service-a-virtual-router}} -n {{my-apps}}
      ```

      간략한 출력

      ```
      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>
      ```

   1. 컨트롤러가 App Mesh에 생성한 가상 라우터 리소스를 봅니다. 컨트롤러가 App Mesh에서 가상 라우터를 생성할 때 Kubernetes 네임스페이스 이름을 가상 라우터의 이름에 추가했기 때문에 `name`에 대해 `my-service-a-virtual-router_my-apps`를 지정합니다.

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

      출력

      ```
      {
          "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"
          }
      }
      ```

   1. 컨트롤러가 App Mesh에 생성한 경로 리소스를 봅니다. 경로가 Kubernetes에서 가상 라우터 구성의 일부이기 때문에 경로 리소스가 Kubernetes에서 생성되지 않았습니다. 경로 정보는 하위 단계 `c`에서 Kubernetes 리소스 세부 정보에 표시되었습니다. 경로 이름은 가상 라우터에 고유하기 때문에 컨트롤러는 App Mesh에서 경로를 생성할 App Mesh 경로 이름에 Kubernetes 네임스페이스 이름을 추가하지 않았습니다.

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

      출력

      ```
      {
          "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"
          }
      }
      ```

1. App Mesh 가상 서비스를 생성합니다. 가상 서비스는 가상 노드가 가상 라우터를 통해 직접 또는 간접적으로 제공하는 실제 서비스의 추상화입니다. 종속 서비스는 가상 서비스를 이름으로 호출합니다. 이름은 App Mesh에 중요하지 않지만 가상 서비스의 이름을 가상 서비스가 나타내는 실제 서비스의 정규화된 도메인 이름으로 지정하는 것이 좋습니다. 이러한 방식으로 가상 서비스의 이름을 지정하면 다른 이름을 참조하도록 애플리케이션 코드를 변경할 필요가 없습니다. 이 요청은 가상 서비스의 공급자로 지정된 가상 노드 또는 가상 라우터로 라우팅됩니다.

   1. 다음 콘텐츠를 컴퓨터에 `virtual-service.yaml`이라는 파일에 저장합니다. 이 파일은 가상 라우터 공급자를 사용하여 이전 단계에서 생성된 `my-service-a`라는 가상 노드로 트래픽을 라우팅하는 가상 서비스를 생성하는 데 사용됩니다. `spec`에서 `awsName`의 값은 이 가상 서비스가 추상화하는 실제 Kubernetes 서비스의 FQDN(정규화된 도메인 이름)입니다. Kubernetes 서비스는 [3단계: 서비스 생성 또는 업데이트](#create-update-services)에서 생성됩니다. 자세한 내용은 [가상 서비스](virtual_services.md) 단원을 참조하십시오.

      ```
      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}}
      ```

      앞의 사양에서 설정할 수 있는 가상 서비스에 사용 가능한 모든 설정을 보려면 다음 명령을 실행합니다.

      ```
      aws appmesh create-virtual-service --generate-cli-skeleton yaml-input
      ```

   1. 가상 서비스를 생성합니다.

      ```
      kubectl apply -f virtual-service.yaml
      ```

   1. 생성된 Kubernetes 가상 서비스 리소스의 세부 정보를 봅니다.

      ```
      kubectl describe virtualservice {{my-service-a}} -n {{my-apps}}
      ```

      출력

      ```
      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>
      ```

   1. 컨트롤러가 App Mesh에 생성한 가상 서비스 리소스의 세부 정보를 봅니다. 가상 서비스의 이름이 고유한 FQDN이기 때문에 Kubernetes 컨트롤러가 App Mesh에 가상 서비스를 만들 때 App Mesh 가상 서비스 이름에 Kubernetes 네임스페이스 이름을 추가하지 않았습니다.

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

      출력

      ```
      {
          "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"
          }
      }
      ```

이 자습서에서는 다루지 않지만 컨트롤러는 App Mesh [가상 게이트웨이](virtual_gateways.md) 및 [게이트웨이 경로](gateway-routes.md)를 배포할 수도 있습니다. 컨트롤러를 사용하여 이러한 리소스를 배포하는 과정에 대한 연습은 [인바운드 게이트웨이 구성](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-ingress-gateway) 또는 GitHub의 리소스가 포함된 [샘플 매니페스트](https://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-k8s-ingress-gateway/v1beta2/manifest.yaml.template)를 참조하세요.

## 3단계: 서비스 생성 또는 업데이트
<a name="create-update-services"></a>

App Mesh에서 사용할 모든 포드에는 App Mesh 사이드카 컨테이너가 추가되어 있어야 합니다. 인젝터는 사용자가 지정한 레이블에 배포된 모든 포드에 사이드카 컨테이너를 자동으로 추가합니다.

1. 프록시 권한 부여를 활성화합니다. 각 Kubernetes 배포를 활성화하여 자체 App Mesh 가상 노드에 대한 구성을 스트리밍하는 것이 좋습니다.

   1. 다음 콘텐츠를 컴퓨터에 `proxy-auth.json`이라는 파일에 저장합니다. {{대체 색상 값}}을 고유한 값으로 바꿔야 합니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "appmesh:StreamAggregatedResources",
                  "Resource": [
                      "arn:aws:appmesh:{{us-east-1}}:{{111122223333}}:mesh/my-mesh/virtualNode/my-service-a_my-apps"
                  ]
              }
          ]
      }
      ```

------

   1. 정책을 생성합니다.

      ```
      aws iam create-policy --policy-name {{my-policy}} --policy-document file://proxy-auth.json
      ```

   1. IAM 역할을 만들고, 이전 단계에서 생성한 정책을 연결하고, Kubernetes 서비스 계정을 만들고, 정책을 Kubernetes 서비스 계정에 바인딩합니다. 이 역할을 사용하면 컨트롤러가 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
      ```

       AWS Management Console 또는를 사용하여 서비스 계정을 생성하려면 *Amazon EKS 사용 설명서*의 서비스 계정에 대한 IAM 역할 및 정책 생성을 AWS CLI참조하세요. [https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role](https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role) AWS Management Console 또는를 사용하여 계정을 AWS CLI 생성하는 경우 역할을 Kubernetes 서비스 계정에 매핑해야 합니다. 자세한 내용을 알아보려면 Amazon EKS 사용 설명서의 [서비스 계정에 대한 IAM 역할 지정](https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html)를 참조하세요.**

1. (선택 사항) 배포를 Fargate 포드에 배포하려면 Fargate 프로필을 생성해야 합니다. `eksctl`을 설치하지 않은 경우 Amazon EKS 사용 설명서의 [`eksctl` 설치 또는 업그레이드](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl)의 지침에 따라 설치할 수 있습니다.** 콘솔을 사용하여 프로필을 생성하려면 Amazon EKS 사용 설명서의 [Fargate 프로필 생성](https://docs.aws.amazon.com/eks/latest/userguide/fargate-profile.html#create-fargate-profile)을 참조하세요.**

   ```
   eksctl create fargateprofile --cluster {{my-cluster}} --region {{Region-code}} --name {{my-service-a}} --namespace {{my-apps}}
   ```

1. Kubernetes 서비스 및 배포를 만듭니다. App Mesh와 함께 사용하려는 기존 배포가 있는 경우 [2단계: App Mesh 리소스 배포](#configure-app-mesh)의 하위 단계 `3`에서 수행한 것처럼 가상 노드를 배포해야 합니다. 배포의 레이블이 가상 노드에 설정한 레이블과 일치하도록 배포를 업데이트하여 사이드카 컨테이너가 자동으로 포드에 추가되고 포드가 재배포되도록 합니다.

   1. 다음 콘텐츠를 컴퓨터에 `example-service.yaml`이라는 파일에 저장합니다. 네임스페이스 이름을 변경하고 Fargate 포드를 사용하는 경우 네임스페이스 이름이 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}}
      ```
**중요**  
사양에서 `app` `matchLabels` `selector`의 값은 [2단계: App Mesh 리소스 배포](#configure-app-mesh)의 `3` 하위 단계에서 가상 노드를 생성할 때 지정한 값과 일치해야 합니다. 그렇지 않으면 사이드카 컨테이너가 포드에 삽입되지 않습니다. 앞의 예에서 레이블의 값은 `my-app-1`입니다. 가상 노드가 아닌 가상 게이트웨이를 배포하는 경우 `Deployment` 매니페스트에는 Envoy 컨테이너만 포함되어야 합니다. 사용할 이미지에 대한 자세한 내용은 [Envoy 이미지](envoy.md) 섹션을 참조하세요. 샘플 매니페스트는 GitHub의 [배포 예제](https://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-k8s-ingress-gateway/v1beta2/manifest.yaml.template#L585)를 참조하세요.

   1. 서비스를 배포합니다.

      ```
      kubectl apply -f {{example-service.yaml}}
      ```

   1. 서비스 및 배포를 봅니다.

      ```
      kubectl -n {{my-apps}} get pods
      ```

      출력

      ```
      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
      ```

   1. 배포된 포드 중 하나에 대한 세부 정보를 봅니다.

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

      간략한 출력

      ```
      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
      ```

      앞의 출력에서 `proxyinit` 및 `envoy` 컨테이너가 컨트롤러에 의해 포드에 추가되었는지 확인할 수 있습니다. 예제 서비스를 Fargate에 배포한 경우 컨트롤러에서 `envoy` 컨테이너를 포드에 추가했지만 `proxyinit` 컨테이너는 추가하지 않았습니다.

1. (선택 사항) Prometheus, Grafana, AWS X-Ray Jaeger, Datadog 등의 추가 기능을 설치합니다. 자세한 내용은 GitHub의 [App Mesh 추가 기능](https://github.com/aws/eks-charts#app-mesh-add-ons) 및 App Mesh 사용 설명서의 [관찰성](https://docs.aws.amazon.com/app-mesh/latest/userguide/observability.html) 섹션을 참조하세요.

**참고**  
App Mesh에 대한 더 많은 예제와 연습 내용을 보려면 [App Mesh 예제 리포지토리](https://github.com/aws/aws-app-mesh-examples)를 참조하세요.

## 4단계: 정리
<a name="remove-integration"></a>

이 자습서에서 만든 예제 리소스를 모두 제거합니다. 컨트롤러는 `my-mesh` App Mesh 서비스 메시에서 생성된 리소스도 제거합니다.

```
kubectl delete namespace {{my-apps}}
```

예제 서비스용 Fargate 프로필을 생성한 경우 해당 프로필을 제거하세요.

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

메시를 삭제합니다.

```
kubectl delete mesh {{my-mesh}}
```

(선택 사항) Kubernetes 통합 구성 요소를 제거할 수 있습니다.

```
helm delete appmesh-controller -n appmesh-system
```

(선택 사항) Kubernetes 통합 구성 요소를 Fargate에 배포한 경우 Fargate 프로필을 삭제하세요.

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