Datadog Cluster Agent

K8s 와 dd-agent

Datadog agent를 사용하면 수많은 Integration Plugin을 통해 단순 설정만으로 모니터링을 구성할 수 있습니다. RDS나 Elasticache 같은 클러스터 외부에 있는 자원이나 단순 HTTP Check도 Integration 을 이용하여 모니터링할 수 있습니다. 여기서 Datadog Agent에 모니터링을 추가하면 Daemonset 특성상 이미 노드가 많거나 노드가 추가될 때마다 리소스 모니터링한다고 DDOS를 날리는 꼴이 됩니다. 그래서 예전에는 외부 리소스를 별도의 Deployment를 구성해 모니터링했습니다. 하지만 매우 세심하게 설정하지 않으면 Deployment와 Daemonset의 Datadog이 동일한 메트릭을 중복으로 수집하는 문제가 발생합니다.

Datadog Cluster Agent

기본적으로 Kubernetes 환경에서 Datadog Agent는 노드 별로 각각 하나씩 배포되어(Daemonset) 각자의 노드 안에 있는 Pod를 모니터링합니다. Datadog에서는 이 기능을 Auto Discovery라고 합니다. Pod에 ad.datadoghq.com/으로 시작하는 Annotation을 설정하면, 각 노드에 있는 Datadog Agent가 메트릭을 수집합니다. 그런데 이러한 방식은 다음과 같은 상황에서는 앞서 서술한 바와 같이 메트릭의 중복 수집, 과도한 모니터링 트래픽 유발 등의 문제를 일으킵니다.

  1. AWS RDS 혹은 Elasticache 처럼 Kubernetes 외부에 있는 리소스를 모니터링해야 하는 상황
  2. Datadog Metric을 사용하여 Horizontal Pod Autoscaler HPA를 구성할 때

이러한 상황을 우아하게 해결하기 위해 Cluster Agent가 등장했습니다. Cluster Datadog Agent는 Node Agent를 Worker Pool로 두고 모니터링할 리소스를 분배합니다. 예를 들어 Cluster Agent 는 모니터링 대상과 Datadog Agent의 배포 현황을 보고 Elasticache 의 모니터링은 datadog #1에게 맡기고, RDS #1은 datadog #2에게 맡기는 식으로 중앙에서 조율합니다.

최소 요구사항

Datadog Cluster Agent의 최소 요구사항은 Kubernetes v1.10+ 입니다.

여기서는 Daemonset으로 설정한 Datadog Agent를 Node Agent, Cluster Datadog Agent를 Cluster Agent라고 정의하겠습니다.

Cluster Agent 띄우기

Cluster Agent 가 사용할 RBAC 를 설정하고, Node Agent 와 Cluster Agent 가 통신할 토큰을 생성합니다. 세부사항은 위의 문서를 참고하면 됩니다.

K8s Event Collection

Cluster Agent 이전 시절에는 Node Agent에서 Kubernetes Event를 수집했습니다. 이제는 Cluster Agent에서 이벤트를 수집하도록 설정해야 합니다.

  1. Node Agent는 DD_LEADER_ELECTION: false로 설정하고
  2. Cluster Agent는 DD_LEADER_ELECTION: true로 설정합니다.

Cluster Agent는 Node Agent와 달리 환경 변수 DD_TAGS를 설정할 수 없습니다. Kubernetes Event에 태그를 달려면 수동으로 설정파일을 손봅니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: datadog-cluster-ad-config
data:
  kubernetes_apiserver.yaml: |
    init_config
    instances:
    - tags:
       - Env:Prod

외부 자원 모니터링하기

Cluster Agent는 Node Agent를 Worker Pool로 두고 모니터링할 리소스를 분배합니다. Cluster Agent의 conf.d/에 모니터링할 리소스를 정의하면 됩니다. 잊지 말고 YAML 파일에 cluster_check: true를 정의합시다.

cluster_check: true
init_config:
instances:
    - server: '<PRIVATE_IP_ADDRESS>'
      port: 3306
      user: datadog
      pass: '<YOUR_CHOSEN_PASSWORD>'

컨테이너 안으로 들어가 agent clusterchecks 명령어를 치면 어떤 Node Agent에서 어떤 리소스를 모니터링하는지 알 수 있습니다. 이렇게 찾아낸 Node Agent에 들어가서 agent status 명령을 실행하면 모니터링이 정상작동하는지 확인가능합니다.

정리

Datadog Agent는 근래에 변화가 많습니다. v5에서 v7까지 순식간에 넘어왔고 그 과정에서 플러그인은 Python 2에서 Python 3로, 코어는 Python에서 Golang으로 업그레이드됐습니다. 그 과정에서 안정성과 동시성이 모두 향상됐다고 봅니다. 그리고 Cluster Agent처럼 컨테이너 오케스트레이션 환경에도 잘 대응했습니다. 단지 변화가 빠른만큼 최신 문서를 빨리 학습하고 제때 적용하는데 에너지를 꽤 쏟아야 합니다.

Thanks to

이 글은 우리 팀원 ggu의 기술 문서를 재구성한 것입니다.

Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments