BLOG

AWS X-Ray를 사용하여 Kubernetes에서 애플리케이션 추적하기
작성일: 2018-03-14

이 글은 AWS Solutions Architect인 Christoph Kassen이 작성하였습니다.

 

마이크로서비스 아키텍쳐(편집자: 이는 한글버전이니 참고바랍니다.)의 출현과 함께, 웹 애플리케이션의 일부인 서비스가 많이 증가했습니다. 동일한 애플리케이션의 일부로 수백개의 마이크로서비스를 구축하고 운영하는 것이 더 이상 드문 일이 아닙니다.

 

제품을 표시하고, 관련 항목을 추천하며, 검색 및 패시팅 기능을 제공하고, 카트를 유지하는 전형적인 전자 상거래 애플리케이션에 대해 생각해 보십시오. 배후에는 클릭스트림 추적, 광고 디스플레이, 타깃 및 로깅과 같은 더 많은 서비스가 포함되어 있습니다. 단일 사용자의 요청을 처리할 때, 이러한 많은 마이크로서비스가 응답하는 데에 포함됩니다. 이에 따라 환경에 대한 이해, 분석 및 디버깅이 복잡해지고 있습니다.

 

AWS X-Ray는 애플리케이션 추적 기능을 제공하여, 구현된 모든 마이크로사이트에 대한 깊은 통찰력을 제공합니다. X-Ray를 사용하면 포함된 마이크로서비스를 통해 모든 요청을 추적할 수 있습니다. 이를 통해 DevOps팀에게 서비스가 동료들과 어떻게 상호 작용하는지 파악하여 문제를 훨씬 빠르게 분석하고 디버그 할 수 있도록 팀에 필요한 통찰력을 제공합니다.

 

마이크로서비스 아키텍쳐를 사용하는 경우, 모든 서비스는 독립적이어야 하며 문제 영역에 가장 적합한 기술을 사용해야 합니다. 서비스가 구축되는 방식에 따라 다르게 구축, 호스팅됩니다.

 

현재 가장 인기 있는 마이크로서비스 포장 및 배치 방법 중 하나는 컨테이너입니다. 애플리케이션과 해당 종속성이 명확하게 정의되어 있고, 컨테이너가 CI 인프라에 구축될 수 있으며, 구축이 크게 간소화되어 있습니다. Kubernetes 및 Amazon ECS(Amazon Elastic Container Service)와 같은 컨테이너 스케줄러는 규모에 맞게 컨테이너를 배포하고 실행하는 작업을 크게 간소화합니다.

 

Kubernetes에서 X-Ray를 실행하기

Kubernetes는 컨테이너형 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 컨테이너 관리 플랫폼입니다.

 

이 포스트는 Kubernetes 클러스터에서 호스팅된 서비스에 애플리케이션 추적 기능을 제공하는 Kubernetes 위에서 X-Ray를 실행하는 방법을 보여줍니다. 또한 X-Ray는 Amazon ECS, AWS Elastic Beanstalk, Amazon EC2에서 호스팅되는 애플리케이션에도 사용할 수 있으며, AWS Lambda 기능으로 서비스를 구축할 때도 마찬가지입니다. 이 유연성은 AWS 환경에서 실행 중인 모든 서비스에서 요청을 추적할 수 있도록 하면서 필요한 기술을 선택하는 데 도움이 됩니다.

간단한 Node.js 기반 데모 애플리케이션을 포함한 전체 코드는 해당하는 aws-xray-kubernetes GitHub 저장소에서 사용할 수 있으므로, X-Ray를 빨리 시작할 수 있습니다.

 

저장소 내의 샘플 애플리케이션은 서비스 A와 서비스 B의 두 가지 간단한 마이크로서비스로 구성됩니다. 다음의 아키텍처 다이어그램은 각 서비스가 어떻게 두 포드를 사용하여 Kubernetes 클러스터에 배치되는지 보여줍니다.

 

  1. 의뢰인의 요청은 서비스 A로 보내집니다.
  2. 서비스 A는 서비스-B에 문의합니다.
  3. 요청은 서비스 B에서 처리합니다.
  4. 서비스 B는 각 요청에 무작위 지연을 추가해 X-Ray에 다양한 응답 시간을 보여 줍니다

 

 

사용자 고유의 Kubernetes 클러스터에서 샘플 애플리케이션을 테스트하려면 GitHub 저장소에 제공된 Dockerfiles를 사용하여 두 컨테이너를 구축하고, 컨테이너 저장소로 보낸 다음 yaml 배치를 kubectl를 이용하여 Kubernetes 클러스터에 적용합니다.

 

선행 조건

현재 AWS 환경에서 실행 중인 클러스터가 없는 경우, Kubernetes용 Amazon Elastic Container Service (Amazon EKS)를 확인하거나 자체 관리되는 Kubernetes 클러스터를 돌리기 위해 Manage Kubernetes Clusters on AWS Using Kops 블로그 포스트의 지침에 따라 사용합니다.

 

X-Ray에 대한 보안 설정

웹 애플리케이션 포드를 호스팅하는 Kubernetes 클러스터의 노드는 X-Ray daemon을 호스팅하는 포드가 X-Ray 서비스 백엔드에 추적을 전송할 수 있도록 IAM 권한을 필요로 합니다.

 

가장 쉬운 방법은 Kubernetes 클러스터 내의 모든 작업자 노드가 X-Ray에 데이터를 쓸 수 있도록 하는 새 IAM 정책을 설정하는 것입니다. IAM 콘솔 또는 AWS CLI에서 다음과 같은 새 정책을 생성합니다.

 

 

 

리소스 내에서 AWS 계정 ID를 조정합니다. 정책에 설명적인 이름(예시: k8s-nodes-XrayWriteAccess)을 지정합니다.

 

그런 다음 Kubernetes 작업자 노드의 인스턴스 프로파일에 정책을 연결합니다. 따라서 작업자 인스턴스에 할당된 IAM 역할을 선택하고(확실하지 않은 경우 EC2 콘솔을 확인하십시오.) 이전에 생성한 IAM 정책을 연결하십시오. 명령줄에서 다음 명령을 IAM 권한에 직접 연결할 수 있습니다.

 

aws iam attach-role-policy –role-name k8s-nodes –policy-arn arn:aws:iam::000000000000:policy/k8s-nodes-XrayWriteAccess

 

X-Ray daemon Docker 이미지 구축하기

X-Ray daemon은 정적으로 편집된 단일 바이너리로 사용할 수 있으며, AWS 웹 사이트에서 직접 다운로드할 수 있습니다.

 

첫 번째 단계는 X-Ray daemon 바이너리 파일을 호스팅하고 UDP를 통해 포트 2000을 노출하는 Docker 컨테이너를 생성하는 것입니다. daemon은 명령줄 매개 변수를 통해 구성되거나 구성 파일을 통해 구성됩니다. 가장 중요한 옵션은 애플리케이션 포드의 추적 요청을 수락할 수 있도록 수신 포트를 올바른 IP주소로 설정하는 것입니다.

 

X-Ray daemon을 포함한 고유한 Docker 이미지를 구축하려면 아래에 표시된 Dockerfile을 사용하십시오.

 

 

이 컨테이너 이미지는 작은 컨테이너 이미지를 생성하는 Amazon 리눅스를 기반으로 합니다. 컨테이너 이미지를 생성하고 태그를 지정하려면, docker build -t xray:latest를 실행합니다.

 

Amazon ECR 저장소 만들기

Amazon Elastic Container Registry(Amazon ECR)에 저장소를 생성하여 X-Ray Docker이미지를 저장합니다. Kubernetes 클러스터가 이 저장소를 사용하여 X-Ray 포드를 배포할 때 이 이미지를 가져옵니다.

 

다음 CLI 명령을 사용하여 저장소를 생성하거나 AWS 관리 콘솔을 생성합니다.

 

aws ecr create-repository –repository-name xray-daemon

 

그러면 사용자를 위해 xray-daemon이라는 저장소가 생성되고 이미지를 누를 때 사용되는 저장소 URI가 인쇄됩니다.

 

컨테이너 빌드가 완료되면 방금 생성한 저장소에 대해 다음 푸시 명령을 사용하여 ECR 저장소로 전송합니다.

 

docker tag xray-daemon:latest 000000000000.dkr.ecr.eu-west-1.amazonaws.com/xray-daemon:latest
docker push 000000000000.dkr.ecr.eu-west-1.amazonaws.com/xray-daemon:latest

 

결과 저장소는 다음 스크린 샷에 표시된 저장소와 비슷해야 합니다.

 

 

AWS CodeBuildAWS CodePipeline을 사용하여 이 프로세스를 자동화할 수 있습니다. Docker컨테이너를 자동으로 구축하고 ECR로 푸시하는 방법에 대한 지침은 AWS CodeBuild의 Docker 샘플을 참조하십시오.

 

Kubernetes에 X-Ray daemon 배포하기

당신의 클러스터가 Kubernetes 클러스터에 X-Ray 포드를 배포할 수 있도록 kubectl 도구를 적절하게 구성해야 합니다. X-Ray 포드가 Kubernetes 클러스터에 배포된 후 애플리케이션은 호스트의 X-Ray daemon에 추적 정보를 보낼 수 있습니다. 가장 큰 장점은 애플리케이션 옆에 X-Ray 컨테이너를 제공하지 않아도 된다는 점입니다. 이를 통해 애플리케이션의 구성 및 구축을 간소화하고 클러스터의 전체적인 리소스를 절약할 수 있습니다.
Kubernetes 클러스터에 X-Ray daemon을 포드로 배포하려면 복제된 GitHb 저장소에서 다음을 실행합니다.

kubectl apply -f xray-k8s-daemonset.yaml

 

이는 각 작업자 노드에 X-Ray daemon을 배포하고 유지하며, 이는 마이크로서비스로부터 추적 데이터를 받아 X-Ray 포드 중 하나로 라우팅하는 것입니다. DaemonSet을 사용하여 컨테이너를 배포할 때도 X-Ray 포트가 호스트에 직접 노출됩니다. 이렇게 하면 클라이언트가 노드의 daemon에 직접 연결할 수 있습니다. 이렇게 하면 불필요한 네트워크 트래픽이 클러스터를 가로지르는 것을 방지할 수 있습니다.

 

 

X-Ray daemon에 연결하기

당신의 애플리케이션에 애플리케이션 추적기능을 통합하려면 지원되는 프로그래밍 언어 중 하나인 X-Ray SDK를 사용해야 합니다.

 

  • Java
  • Node.js
  • .NET (Framework and Core)
  • Go
  • Python

 

SDK에서는 추적 데이터를 생성하고 X-Ray daemon에 전송하기 위한 클래스 및 방법을 제공합니다. 추적 데이터에는 애플리케이션에서 제공하는 수신 HTTP요청에 대한 정보와, AWS SDK또는 HTTP클라이언트를 사용하여 애플리케이션이 다운스트림 서비스에 제공하는 호출이 포함됩니다.

 

기본적으로 X-Ray SDK에서는 daemon을 127.0.0.1:2000에서 사용가능할 것이라고 예상합니다. daemon이 각 포드의 일부가 아니라 자체 포드 내에 호스팅되어 있기 때문에 이 설정에서 변경해야 합니다.

구축된 X-Ray DaemonSet는 Kubernetes 서비스 검색을 통해 모든 포드를 표시하므로 애플리케이션이 엔드포인트를 사용하여 X-Ray daemon을 검색할 수 있습니다. 기본 네임스페이스에 배포된 경우 엔드포인트는 다음과 같습니다.

 

xray-service.default

 

이제 애플리케이션에서 AWS_XRAY_DAEMON_ADDRESS환경 변수(기본 설정)를 사용하거나 SDK설정 코드에 직접 포함된 daemon 주소를 설정해야 합니다.

 

AWSXRay.setDaemonAddress(‘xray-service.default:2000’);

 

환경 변수를 설정하려면 Kubernetes애플리케이션 배포 설명 YAML에 다음 정보를 포함시킵니다. 이는 SDK에서 자동으로 선택하는 환경 변수를 통해 X-Ray 서비스 주소를 표시합니다.

 

 

 

AWS X-Ray에 추적 정보 전송하기

애플리케이션에서 추적 정보를 전송하는 것은 X-Ray SDK에 있어 간단합니다. 아래의 예제 코드는 추적을 사용하여 어플리케이션을 측정하는 시작점 역할을 합니다. 서비스 A에서 서비스 B로 추적을 보내는 방법에 대해 GitHub저장소에 있는 두 개의 샘플 어플리케이션을 살펴보십시오. 아래 다이어그램은 서비스 간의 요청 흐름을 나타냅니다.

 

 

에플리케이션이 컨테이너 내에서 실행되고 있으므로, 포드를 호스팅하는 Kubernetes 노드와 컨테이너 이름에 대한 정보를 제공하는 ECSPlugin및 ECSPlugin을 모두 사용할 수 있도록 설정하십시오. ECSPlugin이라는 이름에도 불구하고 이 플러그인은 Kubernetes에서 애플리케이션을 실행할 때 컨테이너에 대한 추가 정보를 제공합니다.

 

 

애플리케이션 코드를 측정하는 모든 옵션과 가능성에 대한 자세한 내용은 해당 SDK정보의 X-Ray 설명서를 참조하십시오.

 

아래의 그림은 마이크로사이트 환경을 통과하는 요청 흐름에 대한 통찰력을 제공하는 서비스 맵을 보여 줍니다. 여기서 개별 추적을 드릴 다운하고 각 요청이 어떤 경로로 이동했는지 확인할 수 있습니다.

 

 

서비스 맵에서 개별 요청을 드릴 다운하여 해당 요청의 출처와 요청을 처리하는 각 서비스에 소요된 시간을 확인할 수 있습니다.

 

 

추적의 모든 개별 세그먼트에 대한 상세 내역을 클릭하여 조회하실 수도 있습니다.

 

 

리소스 탭에는 ECSPlugin이 수집한 Kubernetes Pod가 표시되며, 이 포드는 요청을 처리했고 포드가 실행 중인 인스턴스도 처리했습니다.

 

요약
이 포스트에서 기존의 Kubernetes클러스터에서 X-Ray을 구현하고 실행하는 방법에 대해 공유했습니다. 추적 기능을 사용하면 애플리케이션에 대한 심층적인 통찰력을 확보하여 분석을 간소화하고 잠재적인 문제를 조기에 찾아낼 수 있습니다. X-Ray을 사용하면 Amazon ECS, AWS Lambda 또는 Kubernetes 클러스터에서 호스팅되는 애플리케이션에 관계 없이 AWS에서 실행되는 모든 애플리케이션에 대해 통찰력을 얻을 수 있습니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/compute/application-tracing-on-kubernetes-with-aws-x-ray/

 

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.