Kubernetes에 설치된 Prometheus는  additionalScrapeConfigs 기능 이외에 additionalPodMonitors 설정을 기반으로 POD를 모니터링 가능하다.

 

helm template 구성을 위한 additionalPodMonitors value 설정

kubernetes에 traefik로 Ingress를 구성하고 서비스 구성하기

위 traefik 설치를 진행했다면 아래 labelsports 기준으로 pod monitoring을 설정할 수 있다.

# kubectl get pod | grep traefik
traefik-664df7d9f4-6rj5q                                 1/1     Running   0          63m

# kubectl get pod traefik-664df7d9f4-6rj5q -o yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
...
    app.kubernetes.io/name: traefik
    helm.sh/chart: traefik-33.0.0
    pod-template-hash: 664df7d9f4
  name: traefik-664df7d9f4-6rj5q
  namespace: default
...
spec:
  containers:
...
    name: traefik
    ports:
    - containerPort: 9100
      name: metrics
      protocol: TCP
...

아래와 같이 additionalPodMonitors 설정용 파일을 구성한다.

prometheus-value-overide.yaml

prometheus:
  additionalPodMonitors:
  - name: "traefik-pod-monitor"
    selector:
      matchLabels:
        app.kubernetes.io/name: traefik
    namespaceSelector:
        matchNames:
          - default
    podMetricsEndpoints:
      - path: /metrics
        port: metrics

 

prometheus용 helm template 생성 및 배포

prometheus에 additionalPodMonitors를 추가한 template 생성

# helm template prometheus kube-prometheus-stack \
  --repo https://prometheus-community.github.io/helm-charts \
  --dependency-update --include-crds --skip-tests \
  -f prometheus-value-overide.yaml > prometheus-deploy.yaml

kubernetes에 배포

# kubectl apply -f prometheus-deploy.yaml --server-side

 

prometheus에 additionalPodMonitors 구성 확인

아래와 같이 podmonitors.monitoring.coreos.com 리소스에 traefik-pod-monitor 데이터가 생성된 것을 확인할 수 있다.

# kubectl get podmonitors.monitoring.coreos.com
NAME                  AGE
traefik-pod-monitor   21m

 

prometheus webui의 Target 정보에서는 아래와 같이 확인이 가능하다.

아래와 같이 매트릭이 수집된 것을 확인할 수 있다.

additionalPodMonitors로 수집된 metrics에 metric label 추가하기

prometheus에 수집된 메트릭을 보면 아래와 같이 라벨이 붙어 수집된다.

traefik_service_requests_bytes_total{code="200", container="traefik", endpoint="metrics", instance="10.233.71.2:9100", job="default/traefik-pod-monitor", method="GET", namespace="default", pod="traefik-664df7d9f4-6rj5q", protocol="http", service="default-echo-server-svc-80@kubernetes"}

만약에 우리가 아래와 같은 룰로 앱을 배포된다면 룰에 따라 라벨을 추가할 수도 있을 것이다.

app name : echo-server
deployment name : echo-server-dpm
service name : echo-server-svc
hpa name : echo-server-hpa

"default-echo-server-svc-80@kubernetes" 데이터에서 "echo-server"만 추출이 가능하다면 가능할 것 같다.

regexp로 룰을 생성해본다.

https://regex101.com/

Test string : default-echo-server-svc-80@kubernetes

Regular expression : ^[^-]+-(.*)-(.*)-[^@]+@.*$

Group 1에 "echo-server"가 추출된다.

이를 기반으로 라벨을 추가하는 additionalPodMonitors template는 아래와 같다.

prometheus-value-overide.yaml

prometheus:
  additionalPodMonitors:
  - name: "traefik-pod-monitor"
    selector:
      matchLabels:
        app.kubernetes.io/name: traefik
    namespaceSelector:
        matchNames:
          - default
    podMetricsEndpoints:
      - path: /metrics
        port: metrics
        metricRelabelings:
          - sourceLabels: [service]
            regex: "^[^-]+-(.*)-(.*)-[^@]+@.*$"
            replacement: ${1}-ing
            action: replace
            targetLabel: ingress

service 라벨의 데이터에서 regexp로 데이터를 추출하고 ingress 라벨에 첫번째 추출 데이터에 "-ing"로 데이터를 넣는다.

prometheus에 additionalPodMonitors를 추가한 template 생성

# helm template prometheus kube-prometheus-stack \
  --repo https://prometheus-community.github.io/helm-charts \
  --dependency-update --include-crds --skip-tests \
  -f prometheus-value-overide.yaml > prometheus-deploy.yaml

kubernetes에 배포

# kubectl apply -f prometheus-deploy.yaml --server-side

 

배포 후, 수집된 데이터를 확인해보면 아래와 같이 ingress 라벨이 추가되었다.

 

ingress 라벨이 추가되어 수집된 메트릭

traefik_router_requests_total{code="200", container="traefik", endpoint="metrics", ingress="echo-server-ing", instance="10.233.71.2:9100", job="default/traefik-pod-monitor", method="GET", namespace="default", pod="traefik-664df7d9f4-6rj5q", protocol="http", router="default-echo-server-ing-hello@kubernetes", service="default-echo-server-svc-80@kubernetes"}