AWS App Mesh 쿠버네티스 시작하기 - AWS App Mesh

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

AWS App Mesh 쿠버네티스 시작하기

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

컨트롤러에는 Kubernetes 사용자 지정 리소스 정의(meshes, virtual services, virtual nodesvirtual routers)의 배포가 포함됩니다. 컨트롤러는 사용자 지정 리소스의 생성, 수정 및 삭제를 감시하고 App Mesh를 통해 해당 App Mesh 서비스 메시 가상 서비스 가상 노드 가상 게이트웨이게이트웨이 경로,,,, 가상 라우터 (포함경로) 리소스를 변경합니다API. 컨트롤러에 대해 자세히 알아보거나 컨트롤러에 기여하려면 GitHub프로젝트를 참조하십시오.

또한 컨트롤러는 사용자가 지정한 이름으로 레이블이 지정된 Kubernetes 포드에 다음 컨테이너를 삽입하는 웹훅을 설치합니다.

  • App Mesh Envoy 프록시 - Envoy는 App Mesh 컨트롤 영역에 정의된 구성을 사용하여 애플리케이션 트래픽을 전송할 위치를 결정합니다.

  • App Mesh 프록시 경로 관리자 - 포드의 네트워크 네임스페이스에서 Envoy를 통한 인바운드 및 아웃바운드 트래픽을 라우팅하는 iptables 규칙을 업데이트합니다. 이 컨테이너는 포드 내부의 Kubernetes 초기화 컨테이너로 실행됩니다.

사전 조건

  • App Mesh 개념에 대한 기존의 이해. 자세한 내용은 AWS App Mesh란? 단원을 참조하십시오.

  • Kubernetes 개념에 대한 기존의 이해. 자세한 내용은 Kubernetes 설명서의 Kubernetes란?을 참조하세요.

  • 기존 Kubernetes 클러스터. 기존 클러스터가 없는 경우 Amazon EKS사용 설명서의 Amazon EKS 시작하기를 참조하십시오. Amazon에서 자체 Kubernetes 클러스터를 실행하는 경우 Envoy 이미지가 있는 ECR Amazon EC2 리포지토리에 Docker가 인증되었는지 확인하십시오. 자세한 내용은 Amazon Elastic Container Registry 사용 설명서의 Envoy 이미지, 레지스트리 인증 및 Kubernetes 설명서의 프라이빗 레지스트리에서 이미지 가져오기를 참조하세요.

  • App Mesh는 DNS AWS Cloud Map, 또는 둘 다에 등록된 리눅스 서비스를 지원합니다. 이 시작 안내서를 사용하려면 기존 서비스 3개를 등록해 두는 것이 좋습니다DNS. 이 주제의 절차에서는 기존 서비스의 이름이 serviceA, serviceBserviceBv2이고 apps.local이라는 네임스페이스를 통해 모든 서비스를 검색할 수 있다고 가정합니다.

    서비스가 존재하지 않더라도 서비스 메시 및 해당 리소스를 생성할 수 있지만 실제 서비스를 배포할 때까지 메시를 사용할 수 없습니다.

  • AWS CLI 버전 1.18.116 이상 또는 2.0.38 이상이 설치되어 있습니다. 를 설치 또는 업그레이드하려면 설치를 참조하십시오. AWS CLIAWS CLI

  • Kubernetes 클러스터와 통신하도록 구성된 kubectl 클라이언트. Amazon Elastic Kubernetes Service를 사용하는 경우 kubectl 설치 및 kubeconfig 파일 구성에 대한 지침을 사용할 수 있습니다.

  • Helm 버전 3.0 이상이 설치되어 있어야 합니다. Helm이 설치되어 있지 않은 경우 Amazon 사용 EKS설명서의 EKS Amazon에서 Helm 사용하기 섹션을 참조하십시오.

  • Amazon은 EKS 현재 IP 기본 IPv6_ONLY 설정만 지원합니다IPv4_ONLY. Amazon은 EKS 현재 트래픽만 처리하거나 IPv4 트래픽만 처리할 수 있는 포드만 지원하기 때문입니다. IPv6

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

1단계: 통합 구성 요소 설치

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를 반환하면 다음 단계로 진행할 수 있습니다. 다른 메시지가 반환되면 계속하기 전에 업그레이드 단계를 완료해야 합니다. 시험판 버전 업그레이드에 대한 자세한 내용은 Upgrade on을 참조하십시오. GitHub

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

    helm repo add eks https://aws.github.io/eks-charts
  3. App Mesh 쿠버네티스 사용자 지정 리소스 정의 () 를 설치합니다. CRD

    kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller/crds?ref=master"
  4. 컨트롤러에 대한 Kubernetes 네임스페이스를 만듭니다.

    kubectl create ns appmesh-system
  5. 이후 단계에서 사용할 수 있도록 다음 변수를 설정합니다. cluster-nameRegion-code를 기존 클러스터의 값으로 바꿉니다.

    export CLUSTER_NAME=cluster-name export AWS_REGION=Region-code
  6. (선택 사항) Fargate에서 컨트롤러를 실행하려면 Fargate 프로필을 생성해야 합니다. 아직 eksctl 설치하지 않은 경우 Amazon EKS 사용 설명서의 설치 또는 업그레이드를 eksctl 참조하십시오. 콘솔을 사용하여 프로필을 생성하려면 Amazon 사용 EKS 설명서의 Fargate 프로필 생성을 참조하십시오.

    eksctl create fargateprofile --cluster $CLUSTER_NAME --name appmesh-system --namespace appmesh-system
  7. 클러스터의 OpenID Connect (OIDC) 아이덴티티 공급자를 생성합니다. 아직 eksctl 설치하지 않은 경우 Amazon 사용 EKS 설명서의 설치 또는 업그레이드 eksctl 지침에 따라 설치할 수 있습니다. 콘솔을 사용하여 공급자를 생성하려는 경우 Amazon EKS User Guide의 클러스터의 서비스 계정에 대한 IAM 역할 활성화를 참조하십시오.

    eksctl utils associate-iam-oidc-provider \ --region=$AWS_REGION \ --cluster $CLUSTER_NAME \ --approve
  8. IAM역할을 생성하고, 여기에 AWSCloudMapFullAccess AWS 관리형 정책을 연결하고, appmesh-controller Kubernetes 서비스 계정에 바인딩하십시오. AWSAppMeshFullAccess 이 역할을 사용하면 컨트롤러가 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 AWS CLI OR를 사용하여 서비스 계정을 생성하려는 경우 Amazon EKS User Guide의 서비스 계정에 대한 IAM 역할 및 정책 생성을 참조하십시오. OR를 사용하여 계정을 생성하는 경우 Kubernetes 서비스 계정에도 역할을 매핑해야 합니다. AWS Management Console AWS CLI 자세한 내용은 Amazon EKS 사용 설명서의 서비스 계정 IAM 역할 지정을 참조하십시오.

  9. App Mesh 컨트롤러를 배포합니다. 모든 구성 옵션 목록은 구성 설정을 참조하십시오 GitHub.
    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 저장소로 푸시하십시오.

      참고

      Amazon VPC 엔드포인트는 현재 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 사용 설명서의 프라이빗 클러스터를 참조하십시오.

    2. 다른 클러스터용 App Mesh 컨트롤러를 배포합니다. 모든 구성 옵션 목록은 구성 켜기를 참조하십시오 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
    참고

    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 리전에 있는 경우, 이전 명령에 다음 옵션을 추가해야 합니다.

    Replace 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 /: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

    • 이전 이미지는 변경 로그온에서 URIs 찾을 수 있습니다. GitHub 이미지가 있는 AWS 계정의 버전이 변경되었습니다v1.5.0. 이전 버전의 이미지는 Amazon Elastic Kubernetes Service Amazon 컨테이너 이미지 레지스트리에 있는 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 /아마존/앱메시-컨트롤러: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 /아마존/앱메시-컨트롤러: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/-매니저:v7-prod aws-appmesh-proxy-route

      • 856666278305.dkr. ecr.ap-east-1.amazonaws.com/-매니저: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/-매니저: v7-prod aws-appmesh-proxy-route

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

    중요

    v1.9.0.0-prod 이상 버전만 App Mesh에서 사용할 수 있습니다.

  10. 컨트롤러 버전이 v1.4.0 이상인지 확인합니다. 변경 로그온을 검토할 수 있습니다. GitHub

    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 리소스 배포

Kubernetes에 애플리케이션을 배포할 때 Kubernetes 사용자 지정 리소스도 생성되므로 컨트롤러가 해당 App Mesh 리소스를 생성할 수 있습니다. 다음 절차는 일부 기능을 사용하여 App Mesh 리소스를 배포하는 데 도움이 됩니다. 다른 App Mesh 리소스 기능을 배포하기 위한 예제 매니페스트는 App Mesh 안내 페이지에 나열된 여러 기능 v1beta2 폴더의 하위 폴더에서 찾을 수 있습니다. GitHub

중요

컨트롤러가 App Mesh 리소스를 생성한 후에는 컨트롤러를 사용하여 해당 App Mesh 리소스만 변경하거나 삭제하는 것이 좋습니다. App Mesh를 사용하여 리소스를 변경하거나 삭제하면 컨트롤러는 기본적으로 10시간 동안 변경되거나 삭제된 App Mesh 리소스를 변경하거나 다시 생성하지 않습니다. 이 기간을 더 짧게 구성할 수 있습니다. 자세한 내용은 구성 설정을 참조하십시오. GitHub

앱 메시 리소스를 배포하려면
  1. App Mesh 리소스를 배포할 Kubernetes 네임스페이스를 생성합니다.

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

      apiVersion: v1 kind: Namespace metadata: name: my-apps labels: mesh: my-mesh appmesh.k8s.aws/sidecarInjectorWebhook: enabled
    2. 네임스페이스를 생성합니다.

      kubectl apply -f namespace.yaml
  2. App Mesh 서비스 메시를 생성합니다.

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

      apiVersion: appmesh.k8s.aws/v1beta2 kind: Mesh metadata: name: my-mesh spec: namespaceSelector: matchLabels: mesh: my-mesh
    2. 메시를 생성합니다.

      kubectl apply -f mesh.yaml
    3. 생성된 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>
    4. 컨트롤러가 생성한 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" } } }
  3. 앱 메시 가상 노드를 만듭니다. 가상 노드는 Kubernetes 배포에 대한 논리적 포인터 역할을 합니다.

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

      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

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

      aws appmesh create-virtual-node --generate-cli-skeleton yaml-input
    2. 가상 노드를 배포합니다.

      kubectl apply -f virtual-node.yaml
    3. 생성된 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>
    4. 컨트롤러가 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" } }
  4. App Mesh 가상 라우터를 생성합니다. 가상 라우터는 메시 내에 있는 하나 이상의 가상 서비스에 대한 트래픽을 처리합니다.

    1. 다음 콘텐츠를 컴퓨터에 virtual-router.yaml이라는 파일에 저장합니다. 이 파일은 이전 단계에서 생성된 my-service-a라는 가상 노드로 트래픽을 라우팅하는 가상 라우터를 생성하는 데 사용됩니다. 컨트롤러는 App Mesh 가상 라우터 및 경로 리소스를 생성합니다. 경로에 대해 더 많은 기능을 지정하고 http 이외의 프로토콜을 사용할 수 있습니다. 자세한 내용은 가상 라우터경로 단원을 참조하세요. 참조된 가상 노드 이름은 컨트롤러에서 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
    2. 가상 라우터를 배포합니다.

      kubectl apply -f virtual-router.yaml
    3. 생성된 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>
    4. 컨트롤러가 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" } }
    5. 컨트롤러가 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" } }
  5. App Mesh 가상 서비스를 생성합니다. 가상 서비스는 가상 노드가 가상 라우터를 통해 직접 또는 간접적으로 제공하는 실제 서비스의 추상화입니다. 종속 서비스는 가상 서비스를 이름으로 호출합니다. 이름은 App Mesh에 중요하지 않지만 가상 서비스의 이름을 가상 서비스가 나타내는 실제 서비스의 정규화된 도메인 이름으로 지정하는 것이 좋습니다. 이러한 방식으로 가상 서비스의 이름을 지정하면 다른 이름을 참조하도록 애플리케이션 코드를 변경할 필요가 없습니다. 이 요청은 가상 서비스의 공급자로 지정된 가상 노드 또는 가상 라우터로 라우팅됩니다.

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

      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
    2. 가상 서비스를 생성합니다.

      kubectl apply -f virtual-service.yaml
    3. 생성된 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>
    4. 컨트롤러가 App Mesh에 생성한 가상 서비스 리소스의 세부 정보를 봅니다. Kubernetes 컨트롤러는 App Mesh에서 가상 서비스를 생성할 때 가상 서비스 이름이 고유하기 때문에 App Mesh 가상 서비스 이름에 Kubernetes 네임스페이스 이름을 추가하지 않았습니다. FQDN

      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 가상 게이트웨이게이트웨이 경로를 배포할 수도 있습니다. 컨트롤러를 사용하여 이러한 리소스를 배포하는 방법에 대한 자세한 내용은 인바운드 게이트웨이 구성 또는 리소스가 포함된 샘플 매니페스트를 참조하십시오. GitHub

3단계: 서비스 생성 또는 업데이트

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

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

    1. 다음 콘텐츠를 컴퓨터에 proxy-auth.json이라는 파일에 저장합니다. 반드시 교체하십시오.alternate-colored values 직접 구매하세요.

      { "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. 정책을 생성합니다.

      aws iam create-policy --policy-name my-policy --policy-document file://proxy-auth.json
    3. 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 AWS CLI OR를 사용하여 서비스 계정을 생성하려는 경우 Amazon 사용 EKS 설명서의 서비스 계정에 대한 IAM 역할 및 정책 생성을 참조하십시오. OR를 사용하여 계정을 생성하는 경우 Kubernetes 서비스 계정에도 역할을 매핑해야 합니다. AWS Management Console AWS CLI 자세한 내용은 Amazon EKS 사용 설명서의 서비스 계정 IAM 역할 지정을 참조하십시오.

  2. (선택 사항) 배포를 Fargate 포드에 배포하려면 Fargate 프로필을 생성해야 합니다. 아직 eksctl 설치하지 않은 경우 Amazon 사용 EKS 설명서의 설치 또는 업그레이드 eksctl 지침에 따라 설치할 수 있습니다. 콘솔을 사용하여 프로필을 생성하려면 Amazon 사용 EKS 설명서의 Fargate 프로필 생성을 참조하십시오.

    eksctl create fargateprofile --cluster my-cluster --region Region-code --name my-service-a --namespace my-apps
  3. Kubernetes 서비스 및 배포를 만듭니다. App Mesh와 함께 사용하려는 기존 배포가 있는 경우 2단계: 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 리소스 배포3 하위 단계에서 가상 노드를 생성할 때 지정한 값과 일치해야 합니다. 그렇지 않으면 사이드카 컨테이너가 포드에 삽입되지 않습니다. 앞의 예에서 레이블의 값은 my-app-1입니다. 가상 노드가 아닌 가상 게이트웨이를 배포하는 경우 Deployment 매니페스트에는 Envoy 컨테이너만 포함되어야 합니다. 사용할 이미지에 대한 자세한 내용은 Envoy 이미지 섹션을 참조하세요. 샘플 매니페스트는 의 배포 예를 참조하십시오. GitHub

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

      kubectl apply -f example-service.yaml
    3. 서비스 및 배포를 봅니다.

      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
    4. 배포된 포드 중 하나에 대한 세부 정보를 봅니다.

      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

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

  4. (선택 사항) 프로메테우스, 그라파나, 예거, 데이터독과 같은 애드온을 설치합니다. AWS X-Ray자세한 내용은 App Mesh 애드온 GitHub 및 App Mesh 사용 설명서의 Observability 섹션을 참조하십시오.

참고

App Mesh에 대한 더 많은 예제와 연습 내용을 보려면 App Mesh 예제 리포지토리를 참조하세요.

4단계: 정리

이 자습서에서 만든 예제 리소스를 모두 제거합니다. 컨트롤러는 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