X-Ray기반 추적
X-Ray 소개
AWS X-Ray는 개발자가 마이크로 서비스 아키텍처를 사용해 구축된 애플리케이션과 같은 프로덕션 분산 애플리케이션을 분석하고 디버그하는 데 도움이 됩니다. X-Ray를 사용해 자신이 개발한 애플리케이션과 기본 서비스가 성능 문제와 오류의 근본 원인 식별과 문제 해결을 올바로 수행하는지 파악할 수 있습니다. X-Ray는 요청이 애플리케이션을 통과함에 따라 요청에 대한 엔드 투 엔드 뷰를 제공하고 애플리케이션의 기본 구성 요소를 맵으로 보여줍니다. X-Ray를 사용하여 간단한 3-티어 애플리케이션에서부터 수천 개의 서비스로 구성된 복잡한 마이크로 서비스 애플리케이션에 이르기까지 개발 중인 애플리케이션과 프로덕션에 적용된 애플리케이션 모두 분석할 수 있습니다.
IAM 역할(Role) 구성
X-Ray 데몬셋이 서비스 되기 위해서는, Kubernetes 서비스 어카운트와 IAM 역할과 정책이 있어야 합니다.
1.서비스 어카운트 생성.
X-Ray를 위해 서비스 어카운트를 생성합니다.
eksctl create iamserviceaccount --name xray-daemon --namespace default --cluster ${ekscluster_name} --attach-policy-arn arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess --approve --override-existing-serviceaccounts
2. 서비스 어카운트에 Label생성.
서비스 어카운트에 Label 생성을 합니다.
kubectl label serviceaccount xray-daemon app=xray-daemon
X-Ray 데몬셋 배포
EKS Cluster에 X-Ray 데몬셋을 배포합니다. X-Ray 데몬셋은 EKS Cluster 의 각 Worker Node에 배포합니다.
AWS X-Ray SDK는 마이크로서비스 어플리케이션을 분석하는 데 사용되며, 데몬셋은 xray-service.default:2000을 가리키도록 구성될 것입니다. 다음은 Go를 위한 X-Ray SDK에 대한 구성방법의 예입니다. 이 랩에서는 필수 구성조건이 아닙니다.
func init() {
xray.Configure(xray.Config{
DaemonAddr: "xray-service.default:2000",
LogLevel: "info",
})
}
X-Ray 데몬세트를 배포합니다.
설치시 에러가 발생한다면, https://github.com/whchoi98/myeks.git 에서 xray-k8s-daemonset.yaml 파일을 내려 받아서 배포합니다.
kubectl create -f https://eksworkshop.com/intermediate/245_x-ray/daemonset.files/xray-k8s-daemonset.yaml
X-Ray 데몬셋의 상태를 확인합니다.
kubectl describe daemonset xray-daemon
아래와 같은 결과를 확인 할 수 있습니다.
whchoi98:~/environment $ kubectl describe daemonset xray-daemon
Name: xray-daemon
Selector: app=xray-daemon
Node-Selector: <none>
Labels: <none>
Annotations: deprecated.daemonset.template.generation: 1
Desired Number of Nodes Scheduled: 6
Current Number of Nodes Scheduled: 6
Number of Nodes Scheduled with Up-to-date Pods: 6
Number of Nodes Scheduled with Available Pods: 0
Number of Nodes Misscheduled: 0
Pods Status: 0 Running / 6 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=xray-daemon
Service Account: xray-daemon
Containers:
xray-daemon:
Image: trevorrobertsjr/eks-workshop-x-ray-daemon:02d13ce10add55081c68b6b76a19b7dfeea00dad
Port: 2000/UDP
Host Port: 2000/UDP
Command:
/usr/bin/xray
-c
/aws/xray/config.yaml
Limits:
memory: 24Mi
Environment: <none>
Mounts:
/aws/xray from config-volume (ro)
Volumes:
config-volume:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: xray-config
Optional: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 5s daemonset-controller Created pod: xray-daemon-k7lll
Normal SuccessfulCreate 5s daemonset-controller Created pod: xray-daemon-k2xpt
Normal SuccessfulCreate 5s daemonset-controller Created pod: xray-daemon-5l4jp
Normal SuccessfulCreate 5s daemonset-controller Created pod: xray-daemon-nmh64
Normal SuccessfulCreate 5s daemonset-controller Created pod: xray-daemon-kb2x9
Normal SuccessfulCreate 5s daemonset-controller Created pod: xray-daemon-hp8c6
X-Ray에 대한 데몬 Pod의 로그는 아래와 같은 명령으로 확인 할 수 있습니다.
kubectl logs -l app=xray-daemon
어플리케이션 배포
3.어플리케이션 배포.
Front-end & Back-end용 어플리케이션을 배포합니다. X-Ray 는 Go,Python,Node.js, Ruby. .NET, Java용 SDK를 지원합니다.
아래와 같이 어플리케이션을 배포합니다.
kubectl apply -f https://eksworkshop.com/intermediate/245_x-ray/sample-front.files/x-ray-sample-front-k8s.yml
kubectl apply -f https://eksworkshop.com/intermediate/245_x-ray/sample-back.files/x-ray-sample-back-k8s.yml
정상적으로 배포되었는지를 확인해 봅니다.
kubectl describe deployments x-ray-sample-front-k8s x-ray-sample-back-k8s
아래와 같은 결과가 출력된 것을 확인 할 수 있습니다.
whchoi98:~/environment $ kubectl describe deployments x-ray-sample-front-k8s x-ray-sample-back-k8s
Name: x-ray-sample-front-k8s
Namespace: default
CreationTimestamp: Sat, 25 Jul 2020 13:04:58 +0000
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"x-ray-sample-front-k8s","namespace":"default"},"sp c":{"r...
Selector: app=x-ray-sample-front-k8s,tier=frontend
Replicas: 3 desired | 3 updated | 3 total | 2 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 2 max unavailable, 2 max surge
Pod Template:
Labels: app=x-ray-sample-front-k8s
tier=frontend
Containers:
x-ray-sample-front-k8s:
Image: rnzdocker1/eks-workshop-x-ray-sample-front:ba01b042766edb5fc794733b0af28d92d99b63dd
Port: 8080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True ReplicaSetUpdated
OldReplicaSets: <none>
NewReplicaSet: x-ray-sample-front-k8s-f845ffd7b (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 19s deployment-controller Scaled up replica set x-ray-sample-front-k8s-f845ffd7b to 3
Name: x-ray-sample-back-k8s
Namespace: default
CreationTimestamp: Sat, 25 Jul 2020 13:05:00 +0000
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"x-ray-sample-back-k8s","namespace":"default"},"spec":{"re...
Selector: app=x-ray-sample-back-k8s,tier=backend
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 2 max unavailable, 2 max surge
Pod Template:
Labels: app=x-ray-sample-back-k8s
tier=backend
Containers:
x-ray-sample-back-k8s:
Image: rnzdocker1/eks-workshop-x-ray-sample-back:ba01b042766edb5fc794733b0af28d92d99b63dd
Port: 8080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: x-ray-sample-back-k8s-65b7f4c46d (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 17s deployment-controller Scaled up replica set x-ray-sample-back-k8s-65b7f4c46d to 3
4.Front-End 접속.
접속을 위해서 , ELB DNS 레코드를 확인합니다.
kubectl get service x-ray-sample-front-k8s -o wide
export XRAY_APP_SERVICE_URL=$(kubectl get svc x-ray-sample-front-k8s --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo "X-RAY MSA Front-end APP URL = $XRAY_APP_SERVICE_URL"
다음과 같은 결과를 얻을 수 있습니다.
X-RAY MSA Front-end APP URL = aefb69fa01e574f1a949c6a18c423ee2-1078192765.ap-northeast-2.elb.amazonaws.com
브라우저에 정상적으로 접속되는 지 확인합니다.
ELB 배포 시간으로 3분 정도 시간이 소요 될 수 있습니다.
front-end App은 1초에 한번씩 백엔드로 요청하게 됩니다.

X-Ray 콘솔 확인
X-RAY 서비스 대시보드에서 "서비스 맵"을 선택합니다.
아래와 같이 Client-FrontEnd App- BackEnd App의 연결구성과 어플리케이션 간 응답시간, 분당 트랜잭션 수를 확인 할 수 있습니다.


Analyze trace를 선택하게 되면 , 상세 분석을 할 수 있습니다. 테이블 구성 옵션을 필터하면 HTTP Code 및 Client IP 등을 상세하게 분석할 수 있습니다.


트레이스를 선택하면, 각 트랜잭션 당 더욱 상세한 내용을 살펴 볼 수 있습니다. 트레이스 목록에서 1개를 선택해서 클릭합니다.

Time line 및 소스 데이터를 상세하게 분석 할 수 있습니다.

Last updated
Was this helpful?