본문 바로가기
Service Mesh/Linkerd

Linkerd + Prometheus 통합 구성

by wlsdn3004 2023. 4. 29.
728x90
반응형

 

 

Linkerd-viz는 기본적으로 Prometheus와 함께 설치된다. 하지만 이미 기존에 운영 중인 Prometheus가 있다면, 이를 통합하여 Linkerd-viz 대시보드에 표시되는 메트릭 데이터를 수집할 수 있다.

 

본 글에서는 외부 Prometheus와 Linkerd 대시보드를 통합하는 실습을 다룬다.

 

전제 조건

- [Prometheus + Grafana 설치]

- [Linkerd 설치]

- [Linkerd 대시보드 구성]

- 쿠버네티스 클러스터

 

 

실습

1. Likerd 메트릭 수집을 위한 Prometheus 설정


Linkerd 관련 메트릭을 가져올 수 있게 targets 설정을 위한 Helm 차트 values파일을 생성한다.

## prometheus-config.yaml
prometheus:
  prometheusSpec:
    additionalScrapeConfigs:
    - job_name: 'linkerd-controller'
      kubernetes_sd_configs:
      - role: pod
        namespaces:
          names:
          ## linkerd control plane, linkerd-viz 설치된 namespace 입력
          - 'linkerd'
          - 'linkerd-viz'
      relabel_configs:
      - source_labels:
        - __meta_kubernetes_pod_container_port_name
        action: keep
        regex: admin-http
      - source_labels: [__meta_kubernetes_pod_container_name]
        action: replace
        target_label: component

    - job_name: 'linkerd-service-mirror'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels:
        - __meta_kubernetes_pod_label_linkerd_io_control_plane_component
        - __meta_kubernetes_pod_container_port_name
        action: keep
        regex: linkerd-service-mirror;admin-http$
      - source_labels: [__meta_kubernetes_pod_container_name]
        action: replace
        target_label: component

    - job_name: 'linkerd-proxy'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels:
        - __meta_kubernetes_pod_container_name
        - __meta_kubernetes_pod_container_port_name
        - __meta_kubernetes_pod_label_linkerd_io_control_plane_ns
        action: keep
        regex: ^linkerd-proxy;linkerd-admin;linkerd$
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod
      # special case k8s' "job" label, to not interfere with prometheus' "job"
      # label
      # __meta_kubernetes_pod_label_linkerd_io_proxy_job=foo =>
      # k8s_job=foo
      - source_labels: [__meta_kubernetes_pod_label_linkerd_io_proxy_job]
        action: replace
        target_label: k8s_job
      # drop __meta_kubernetes_pod_label_linkerd_io_proxy_job
      - action: labeldrop
        regex: __meta_kubernetes_pod_label_linkerd_io_proxy_job
      # __meta_kubernetes_pod_label_linkerd_io_proxy_deployment=foo =>
      # deployment=foo
      - action: labelmap
        regex: __meta_kubernetes_pod_label_linkerd_io_proxy_(.+)
      # drop all labels that we just made copies of in the previous labelmap
      - action: labeldrop
        regex: __meta_kubernetes_pod_label_linkerd_io_proxy_(.+)
      # __meta_kubernetes_pod_label_linkerd_io_foo=bar =>
      # foo=bar
      - action: labelmap
        regex: __meta_kubernetes_pod_label_linkerd_io_(.+)
      # Copy all pod labels to tmp labels
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
        replacement: __tmp_pod_label_$1
      # Take `linkerd_io_` prefixed labels and copy them without the prefix
      - action: labelmap
        regex: __tmp_pod_label_linkerd_io_(.+)
        replacement:  __tmp_pod_label_$1
      # Drop the `linkerd_io_` originals
      - action: labeldrop
        regex: __tmp_pod_label_linkerd_io_(.+)
      # Copy tmp labels into real labels
      - action: labelmap
        regex: __tmp_pod_label_(.+)

 

위에서 만든 파일을 사용하여 Prometheus를 업데이트한다.

$ helm upgrade -i prometheus -f prometheus-config.yaml prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
--set fullnameOverride=prometheus

 

 

2. Linkerd-viz 설정


기존 Linkerd Prometheus는 false로 하고, 외부 Prometheus를 url을 입력한다.

## linkerd-viz-config.yaml
prometheus:
  enabled: false

prometheusUrl: "http://prometheus-prometheus.monitoring.svc.cluster.local:9090"

 

위에서 생성한 linkerd-viz-config.yaml 파일을 사용하여 linkerd-viz 업데이트 진행한다.

$ helm upgrade linkerd-viz -n linkerd-viz -f linkerd-viz-config.yaml linkerd/linkerd-viz

 

 

3. 문제 해결


[참고]

해당 문제는 [Linkerd 멀티클러스터 통신] 구성 시 나오는 증상으로 해당 구성을 안 했을 경우 에러가 발생하지 않는다.

 

linkerd-proxy Targets 부분에서 하나의 상태가 비정상이다.

 

linkerd-gateway에 접근할 때 403 Forbidden 에러를 확인할 수 있다.

 

Linkerd의 linkerd-gateway 관련 인증 정보를 확인해 보자.

Linkerd의 Servers 설정을 확인해 보면 다음과 같다.

$ kubectl describe servers.policy.linkerd.io -n linkerd-multicluster  linkerd-gateway
Spec:
  Pod Selector:
    Match Labels:
      App:         linkerd-gateway
  Port:            linkerd-proxy

 

Linkerd의 authorizationpolicies를 확인해 보면 MeshTLSAuthentication, NetworkAuthentication 두 개가 설정되어 있다.

$ kubectl describe  authorizationpolicies.policy.linkerd.io -n linkerd-multicluster linkerd-gateway
Spec:
  Required Authentication Refs:
    Group:      policy.linkerd.io
    Kind:       MeshTLSAuthentication
    Name:       any-meshed
    Namespace:  linkerd-multicluster
    Group:      policy.linkerd.io
    Kind:       NetworkAuthentication
    Name:       source-cluster
    Namespace:  linkerd-multicluster
  Target Ref:
    Group:  policy.linkerd.io
    Kind:   Server
    Name:   linkerd-gateway

 

MeshTLSAuthentication를 확인해 보면 Linkerd Mesh에 포함되어야 인증되는 설정이 있다.

즉, Linkerd proxy 사이드카를 주입하여 Linkerd Mesh에 포함되어야 접근할 수 있는 권한을 얻게 된다.

$ kubectl describe  meshtlsauthentications.policy.linkerd.io -n linkerd-multicluster any-meshed
Spec:
  Identities:
    *

 

Linkerd proxy 사이드카를 주입하기 위해 monitoring namespace에 lnkerd proxy inject를 활성화하고, 모든 pod를 삭제하여 재생성한다.

$ kubectl annotate ns monitoring linkerd.io/inject=enabled
namespace/monitoring annotated

$ kubectl delete po -n monitoring --all

 

정상으로 Targets 설정이 된 걸 확인할 수 있다.

 

Linkerd Web 대시보드에서 정상적으로 메트릭 정보를 읽어오는 걸 확인할 수 있다.

반응형

댓글