Yebali

k8s 환경에서 pinpoint 적용하기 (feat. NCP) 본문

Backend Common

k8s 환경에서 pinpoint 적용하기 (feat. NCP)

예발이 2023. 12. 31. 01:03

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