일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- topic생성
- JPA
- bean
- Kotlin
- spring kafka
- AWS
- Entity
- offsetdatetime
- kafka
- Streams
- entity graph
- producer
- Spring JPA
- spring
- mirror maker2
- Kubernetes
- centos7
- PAGING
- API
- git
- cd
- CodePipeline
- transactionaleventlistener
- mysql
- ECS
- K8s
- Spring Data JPA
- CI
- consumer
- QueryDSL
- Today
- Total
Yebali
k8s 환경에서 pinpoint 적용하기 (feat. NCP) 본문
pinpoint란?
Pinpoint는 대규모 분산 시스템의 성능을 분석하고 문제를 진단/처리하는 플랫폼으로
네이버에서 2012년 7월에 개발을 시작해 2015년 1월 9일에 오픈소스로 공개한 프로젝트이다.
갓영한 선생님께서도 추천하는 모니터링 프로그램이기도 하다.
Collector 설정
각 서버들이 보내는 지표를 수집하는 서버를 Collector라고 한다.
직접 Collector를 설치하는 방법도 있지만 여기서는 Naver Cloud Platform을 사용해 간단히 만들었다.
https://www.ncloud.com/product/applicationService/pinpoint
NCP에서는 Collector 서버를 Repository라고 부르는 듯하다.
Collector 설정은 이게 끝이다.
Agent 준비
Repository에 로그인하고 설정 > Installation에 들어가면 아래와 같은 화면이 나온다.
DownloadLink에서 pinpoint-agent jar를 다운로드할 수 있다.
다운로드한 파일의 압축을 풀면 아래처럼 agent jar 등 여러 파일이 들어있는데
그중 pinpoint.license 파일에 repository의 Agent License key를 넣어주어야 한다.
그리고 해당 파일을 다시 압축해 준 뒤 다운로드할 수 있게 S3나 NAS에 저장한다
주의사항
'pinpoint.license'파일을 수정하고 MacOS환경에서 압축했을 때
alpine linux에서 압출을 풀면 아래 사진처럼 '_.'으로 시작하는 파일들이 생긴 것을 볼 수 있다.
위 파일들은 MacOS에서 파일들의 메타정보를 저장하고 있는 파일이다.
문제는 다른 linux 환경에서는 저 파일들을 일반적인 파일로 인식하고 실행하려고 하기 때문에
함께 있으면 문제가 될 수 있어, 저 파일들이 압축파일에 포함되지 않도록 해야 한다.
Pod에 적용하기
k8s에는 앱 컨테이너가 실행되기 전에 실행되는 'init container'라는 것이 존재한다.
init container를 사용해 'pinpoint-agent.tar.gz'를 다운하고 압축을 풀어두면 앱 컨테이너에서 pinpoint-agent를 사용할 수 있다.
yaml에 아래와 같이 init container에서 pinpoint-agent파일을 다운로드할 볼륨을 정의하고,
alpine linux에서 마운트 한 볼륨에 'pinpoint-agent.tar.gz'을 다운로드하고 압축을 푸는 동작을 정의한다.
# pinpoint volume 정의
volumes:
- name: pinpoint-apm-agent
emptyDir: { }
# initContainer 정의
initContainers:
- name: pinpoint-apm-agent
image: alpine
command: [ "/bin/sh", "-c" ]
args:
- "wget -O /pinpoint/apm/agent/pinpoint-agent.tar.gz <pinpoint down url> && tar -zxvf /pinpoint/apm/agent/pinpoint-agent.tar.gz -C /pinpoint/apm/agent"
volumeMounts:
- name: pinpoint-apm-agent
mountPath: /pinpoint/apm/agent
그 후 앱 컨테이너에서는 pinpoint-apm-agent 볼륨을 마운트하고 'JAVA_TOOL_OPTIONS'에 javaagent로 pinpoint를 붙여준다.
pinpoint의 agentId는 유니크해야 하기 때문에 Pod의 'metadata.name'를 사용했다.
containers:
- name: product-service
volumeMounts:
- name: pinpoint-apm-agent
mountPath: /pinpoint/apm/agent
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: JAVA_TOOL_OPTIONS
value: "
-javaagent:/pinpoint/apm/agent/pinpoint-agent/pinpoint-bootstrap-2.3.3-NCP-RC1.jar
-Dpinpoint.applicationName={{ .Values.global.namespace }}-product-service
-Dpinpoint.agentId=$(POD_NAME)
"
확인
위 설정 후 Pod가 무사히 떴다면 https://fin.ncloud-pinpoint.com/ 에 접속하여 메트릭이 잘 수집되고 있는 것을 볼 수 있다.
참고
'Backend Common' 카테고리의 다른 글
Kubernetes의 Pod와 Controller (0) | 2024.03.03 |
---|---|
Kubernetes의 Control Plane와 Node, Namespace (0) | 2024.03.03 |
Sync/Async, Blocking/Non-Blocking (0) | 2023.10.09 |
백엔드 면접 질문 (0) | 2023.08.09 |
docker-compose (0) | 2023.07.09 |