데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [AWS EKS-연재7] Kubernetes/Istio 를 위한 Datadog 설정

      Thomas 22.05.06
      5,221 6 2

      AWS EKS 에 상용을 위한 Kubernetes 서비스 설정 시리즈

      1. eksctl을 사용한 AWS EKS 생성

      2. AWS EKS 에 Istio 설치 및 설정

      3. AWS EKS 에서 Istio 와 Application Load Balancer 연결

      4. Kubernetes 의 Resources 설정을 위한 VPA 및 Goldilocks 

      5. AWS EKS 의 Cluster Autoscaler 설정

      6. Loki를 이용한 손쉬운 Kubernetes Logging

      7. Kubernetes/Istio 를 위한 Datadog 설정

      8. Argo CD 설치 및 설정


       

      Datadog은 Helm 또는 Operator를 통해 설정 가능하다. 여기에도 역시 Operator를 사용한다. Datadog을 통해 Logging, APM, Kubernetes, Istio Monitoring, Alerting 등 많은 기능을 한번에 해결 할 수 있다. (하지만 매우 비싸다) 예전에 Grafana, Prometheus, AlertManager 등을 사용하여 Monitoring을 구축하였는데... Datadog은 Agent만 설치하면 모든게 가능해진다. 정말 간편하다.

       

      Datadog Operator 설치

      우선 Datadog Operator를 Helm을 통해 설치한다. https://github.com/DataDog/datadog-operator/blob/main/docs/getting_started.md

      $ helm repo add datadog https://helm.datadoghq.com
      $ helm install -n datadog --create-namespace --set fullnameOverride="dd-op" mwp-datadog-operator datadog/datadog-operator
      

      이렇게 설치하면 datadog namespace에 datadog operator 가 설치된다.


       

      Datadog Configuration 설정

      Datadog credential 을 Kubernetes Secret으로 생성

      Datadog API, APP Key를 이용하여 Kubernetes secret을 생성

      $ kubectl create secret generic datadog-secrets --from-literal api-key= --from-literal app-key=
      

      생성된 kubernetes secret을 아래에서 사용

       

      Datadog Agent 및 Cluster Agent 설치 및 설정

      datadog-operator.yaml 파일을 생성한다.

      apiVersion: datadoghq.com/v1alpha1
      kind: DatadogAgent
      metadata:
        namespace: datadog
        name: datadog
      spec:
        credentials:
          apiSecret:
            secretName: datadog-secrets
            keyName: api-key
          appSecret:
            secretName: datadog-secrets
            keyName: app-key
        agent:
          image:
            name: "gcr.io/datadoghq/agent:latest"
          config:
            hostPort: 8125
            collectEvents: true
            tolerations:
              - operator: Exists
            env:
            - name: DD_DOGSTATSD_NON_LOCAL_TRAFFIC # Java JVM Metrics를 받기 위해 필요
              value: "true"
          log:
            enabled: true
            logsConfigContainerCollectAll: true
          apm:
            enabled: true
            hostPort: 8126
          process:
            enabled: true
            processCollectionEnabled: true
          systemProbe:
            bpfDebugEnabled: true
        features:
          kubeStateMetricsCore:
            enabled: true
          networkMonitoring:
            enabled: true
        clusterAgent:
          image:
            name: "gcr.io/datadoghq/cluster-agent:latest"
          config:
            clusterChecksEnabled: true
          replicas: 2
        clusterChecksRunner:
          image:
            name: "gcr.io/datadoghq/agent:latest"
          replicas: 2
        clusterName: eks-demo
      
      • Datadog agent가 DaemonSet 형태로 각 node 설치된다.
      • Datadog cluster agent도 설치되어 효율적인 운영이 가능하다

      설정을 적용한다.

      $ kubectl apply -f datadog-operator.yaml
      

      이렇게 적용하고 나면 Datadog agent는 auto discovery를 통해 가능한 모든 metrics를 가져온다. 설정 파일을 보면 알겠지만, kubernetes 로깅, 모니터링, 그리고 application 에 Datadog APM 을 적용하면 port 8126으로 받을 수 있도록 설정을 한다.

      Agent는 DaemonSet 형태로 각 노드에 하나씩 배포된다. 직접 해당 Pod를 kubectl describe pod datadog-agent-~~~ -n datadog 확인해보면 agent, trace-agent, process-agent, system-probe 이렇게 4개의 container가 올라가 있는걸 볼 수 있다.


       

      Istio 설정 변경

      이렇게 하면 Kubernets monitoring 및 Logging 이 모두 가능해진다. 하지만 Istio 는 제대로 monitoring 되지 않고, Envoy proxy tracing 도 불가능하다. Istio 를 위해 Istio operator 설정을 변경해 주어야 한다. 현재의 상황은 Datadog은 Istio의 Metrics도 받을 준비가 되어있지만 Istio가 보내고 있지 않는 상황이다. 아래와 같이 변경이 필요하다. https://www.datadoghq.com/blog/how-to-monitor-istiod/#monitoring-istiod-with-datadog

      Istio monitoring을 위한 변경

      아래와 같이 Datadog 이 Istio 관련 지표를 모니터링 할 수 있게 수정

      $ kubectl -n istio-system patch service istiod --patch "$(cat<<EOF
      metadata:
        annotations:
          ad.datadoghq.com/endpoints.check_names: '["istio"]'
          ad.datadoghq.com/endpoints.init_configs: '[{}]'
          ad.datadoghq.com/endpoints.instances: |
            [
              {
                "istiod_endpoint": "http://%%host%%:15014/metrics",
                "send_histograms_buckets": true
              }
            ]
      EOF
      )"

       

      Istio tracing 설정

      istio-operator.yaml 파일을 아래와 같이 수정하여 APM 에서 Envoy proxy tracing 을 가능하게 한다.
      (Istio 관련 설치 및 설정은 EKS 에 Istio 설치 및 설정 참고)

      istio-operator.yaml 파일을 아래와 같이 수정하여 APM 에서 Envoy proxy tracing 을 가능하게 한다. (Istio 관련 설치 및 설정은 EKS 에 Istio 설치 및 설정 참고)

      apiVersion: install.istio.io/v1alpha1
      kind: IstioOperator
      metadata:
        namespace: istio-system
        name: istiocontrolplane
      spec:
        profile: default
        components:
          egressGateways:
          - name: istio-egressgateway
            enabled: true
            k8s:
              hpaSpec:
                minReplicas: 2
          ingressGateways:
          - name: istio-ingressgateway
            enabled: true
            k8s:
              hpaSpec:
                minReplicas: 2
              service:
                type: NodePort
              serviceAnnotations:
                alb.ingress.kubernetes.io/healthcheck-path: /healthz/ready
                alb.ingress.kubernetes.io/healthcheck-port: "32197"
          pilot:
            enabled: true
            k8s:
              hpaSpec:
                minReplicas: 2
        meshConfig:
          enableTracing: true
          defaultConfig:
            holdApplicationUntilProxyStarts: true
            tracing:  # Enable Datadog Tracing
              datadog:
                address: $(HOST_IP):8126
              sampling: 100.0  # 모든 request를 tracing 한다
          accessLogFile: /dev/stdout
          outboundTrafficPolicy:
            mode: REGISTRY_ONLY
      

      meshConfig 에 위와 같이 Tracing 관련 설정을 추가한다. 이렇게 하면 Istio는 tracing 정보를 각 node 에 DaemonSet 으로 올라가 있는 Datadog Agent로 Tracing 정보를 보내게 된다. 그리고 Agent는 Datadog으로 모든 data를 전송한다. 이제 해당 설정을 반영한다.

      $ istioctl install -f istio-operator.yaml
      

      sampling rate을 100%로 하였기 때문에 모든 request에 대해 tracing 이 가능해야 한다. 하지만 Istio 버전에 따라 해당 설정을 적용하기 위해 istio-proxy가 올라가 있는 Pod들을 restart 해줘야 하는 경우가 있다. 1.11, 1.12 에서는 바로 적용 되는거 같다. 하지만 1.10 버전에서는 다시 시작해줘야 한다.

       

      Istio ServiceEntry 설정

      만약, Istio 의 mesh 설정 중에 outboundTrafficPolicy 의 mode 가 REGISTRY_ONLY 이고 (default 설정은 ALLOW_ANY 이다), Datadog APM 을 사용하여 Java, Go, Python 등과 같은 Application 의 APM 을 사용하려면 반드시 ServiceEntry를 추가해서 application pod에서 각 node에 daemonset으로 올라가 있는 datadog agent 의 container 중 하나인 tracing-agent로 outbound 가 설정되어야 한다. (이 내용은 Datadog 의 문서에도 없고, Istio 에서도 특별히 명시되어 있지 않다) 이렇게 하지 않으면 절대 APM 을 확인 할수 없다. EKS 기준 손쉽게 할 수 있는 방법은 아래와 같다.

      apiVersion: networking.istio.io/v1alpha3
      kind: ServiceEntry
      metadata:
        name: internal-ext
      spec:
        hosts:
          - ignored.com
        addresses:
          - 192.168.0.0/16
        ports:
          - number: 8126
            name: tcp-datadog
            protocol: TCP
        resolution: NONE
      

      🤚 팀에서 특별한 이유로 네이버 클라우드를 사용하는 프로젝트가 있는데, 여기에서는 이렇게 모든 설정을 하여도 APM 을 확인할 수 없었다. 그래서 네이버 클라우드와 연락하여 확인해본 결과 네이버 클라우드는 AWS EKS 와 달리 Kubernetes Service의 CNI인 Cilium 을 사용하고 있어서 동작하지 않았던 것이다. 결국 Cilium의 설정을 변경 (cilium-config의 kube-proxy-replacement를 disabled 에서 probe 로 변경) 하거나 Datadog의 설정 중 hostNetwork를 'true' 로 변경하는 방법이 있다.


      여기 까지 하면 Datadog 의 APM 에서 Envoy proxy의 tracing 정보를 모두 볼 수 있다. 하지만 이건 istio-proxy의 tracing 정보이고 application 의 APM은 아니다... 물론 Istio는 모든 request가 istio-proxy를 통해 들어가고 나가기 때문에 이에 대한 tracing 은 가능하지만 (Istio 공식문서의 Jaeger tracing과 같은) aplication 자체에 대한 APM을 위해서는 각 language에 맞는 Datadog APM 을 사용해야 한다.

       

      Datadog Integration 추가

      이제 Datadog 에 로그인 하여 Integration tab으로 가서 Kubernetes 및 Istio를 추가해 주면 관련 모니터링을 위한 Dashboard가 추가된다.

       

      Kubernetes Overview Image description

       

      Log Image description

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      Thomas 님의 최신 블로그

      더보기