Kubernetes에 설치된 Prometheus는 additionalScrapeConfigs 기능 이외에 additionalPodMonitors 설정을 기반으로 POD를 모니터링 가능하다.
helm template 구성을 위한 additionalPodMonitors value 설정
kubernetes에 traefik로 Ingress를 구성하고 서비스 구성하기
위 traefik 설치를 진행했다면 아래 labels
와 ports
기준으로 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로 룰을 생성해본다.
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"}