Prometheus 형식으로 컨트롤 플레인 원시 지표 가져오기

Prometheus 형식으로 컨트롤 플레인 원시 지표 가져오기

Kubernetes 컨트롤 플레인은 Prometheus 형식으로 표현되는 여러 지표를 노출해요. 이러한 지표는 모니터링과 분석에 유용해요. 지표 엔드포인트를 통해 내부적으로 노출되며 Prometheus를 완전히 배포하지 않고도 접근할 수 있어요. 다만 Prometheus를 배포하면 시간에 따른 지표 분석이 더 쉬워져요.

원시 지표 출력을 보려면 endpoint를 바꾸고 다음 명령을 실행하세요.

kubectl get --raw endpoint

이 명령은 어떤 엔드포인트 경로든 전달할 수 있고 원시 응답을 반환해요. 출력은 서로 다른 지표를 줄 단위로 나열하며, 각 줄은 지표 이름, 태그, 값을 포함해요.

metric_name{tag="value"[,...]} value

출처: 문서

본문

API 서버에서 지표 가져오기

일반 API 서버 엔드포인트는 Amazon EKS 컨트롤 플레인에 노출돼요. 이 엔드포인트는 특정 지표를 볼 때 주로 유용해요.

kubectl get --raw /metrics

출력 예시는 다음과 같아요.

[...]
# HELP rest_client_requests_total Number of HTTP requests, partitioned by status code, method, and host.
# TYPE rest_client_requests_total counter
rest_client_requests_total{code="200",host="127.0.0.1:21362",method="POST"} 4994
rest_client_requests_total{code="200",host="127.0.0.1:443",method="DELETE"} 1
rest_client_requests_total{code="200",host="127.0.0.1:443",method="GET"} 1.326086e+06
rest_client_requests_total{code="200",host="127.0.0.1:443",method="PUT"} 862173
rest_client_requests_total{code="404",host="127.0.0.1:443",method="GET"} 2
rest_client_requests_total{code="409",host="127.0.0.1:443",method="POST"} 3
rest_client_requests_total{code="409",host="127.0.0.1:443",method="PUT"} 8
# HELP ssh_tunnel_open_count Counter of ssh tunnel total open attempts
# TYPE ssh_tunnel_open_count counter
ssh_tunnel_open_count 0
# HELP ssh_tunnel_open_fail_count Counter of ssh tunnel failed open attempts
# TYPE ssh_tunnel_open_fail_count counter
ssh_tunnel_open_fail_count 0

이 원시 출력은 API 서버가 노출하는 것을 그대로 반환해요.

metrics.eks.amazonaws.com로 컨트롤 플레인 지표 가져오기

Kubernetes 1.28 이상 버전의 클러스터에서 Amazon EKS는 metrics.eks.amazonaws.com API 그룹 아래에서도 지표를 노출해요. 이러한 지표에는 kube-scheduler, kube-controller-manager 같은 컨트롤 플레인 구성 요소가 포함돼요.

참고

클러스터에 새 APIService 리소스 v1.metrics.eks.amazonaws.com의 생성을 차단할 수 있는 웹훅 구성이 있다면 지표 엔드포인트 기능을 사용할 수 없을 수 있어요. kube-apiserver 감사 로그에서 v1.metrics.eks.amazonaws.com 키워드를 검색해 이를 확인할 수 있어요.

kube-scheduler 지표 가져오기

kube-scheduler 지표를 검색하려면 다음 명령을 사용하세요.

kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1/ksh/container/metrics"

출력 예시는 다음과 같아요.

# TYPE scheduler_pending_pods gauge
scheduler_pending_pods{queue="active"} 0
scheduler_pending_pods{queue="backoff"} 0
scheduler_pending_pods{queue="gated"} 0
scheduler_pending_pods{queue="unschedulable"} 18
# HELP scheduler_pod_scheduling_attempts [STABLE] Number of attempts to successfully schedule a pod.
# TYPE scheduler_pod_scheduling_attempts histogram
scheduler_pod_scheduling_attempts_bucket{le="1"} 79
scheduler_pod_scheduling_attempts_bucket{le="2"} 79
scheduler_pod_scheduling_attempts_bucket{le="4"} 79
scheduler_pod_scheduling_attempts_bucket{le="8"} 79
scheduler_pod_scheduling_attempts_bucket{le="16"} 79
scheduler_pod_scheduling_attempts_bucket{le="+Inf"} 81
[...]

반환되는 데이터가 잠재적으로 큰 양이기 때문에 kube_pod_resource_request와 kube_pod_resource_limit 지표를 검색하기 위한 추가 kube-scheduler 지표 엔드포인트가 있어요. 이러한 지표를 검색하려면 다음 명령을 사용하세요.

kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1/ksh/container/resourcemetrics"

출력 예시는 다음과 같아요.

# HELP kube_pod_resource_limit [STABLE] Resources limit for workloads on the cluster, broken down by pod. This shows the resource usage the scheduler and kubelet expect per pod for resources along with the unit for the resource if any.
# TYPE kube_pod_resource_limit gauge
kube_pod_resource_limit{namespace="kube-system",node="ip-192-168-87-3.us-west-2.compute.internal",pod="coredns-7bf648ff5d-dj4ss",priority="2000000000",resource="memory",scheduler="default-scheduler",unit="bytes"} 1.7825792e+08
# HELP kube_pod_resource_request [STABLE] Resources requested by workloads on the cluster, broken down by pod. This shows the resource usage the scheduler and kubelet expect per pod for resources along with the unit for the resource if any.
# TYPE kube_pod_resource_request gauge
kube_pod_resource_request{namespace="kube-system",node="ip-192-168-87-3.us-west-2.compute.internal",pod="aws-node-x7znh",priority="2000001000",resource="cpu",scheduler="default-scheduler",unit="cores"} 0.05
kube_pod_resource_request{namespace="kube-system",node="ip-192-168-87-3.us-west-2.compute.internal",pod="coredns-7bf648ff5d-dj4ss",priority="2000000000",resource="cpu",scheduler="default-scheduler",unit="cores"} 0.1
[...]

kube-controller-manager 지표 가져오기

kube-controller-manager 지표를 검색하려면 다음 명령을 사용하세요.

kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1/kcm/container/metrics"

출력 예시는 다음과 같아요.

[...]
workqueue_work_duration_seconds_sum{name="pvprotection"} 0
workqueue_work_duration_seconds_count{name="pvprotection"} 0
workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-08"} 0
workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-07"} 0
workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-06"} 0
workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 0
workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 19
workqueue_work_duration_seconds_bucket{name="replicaset",le="0.001"} 109
workqueue_work_duration_seconds_bucket{name="replicaset",le="0.01"} 139
workqueue_work_duration_seconds_bucket{name="replicaset",le="0.1"} 181
workqueue_work_duration_seconds_bucket{name="replicaset",le="1"} 191
workqueue_work_duration_seconds_bucket{name="replicaset",le="10"} 191
workqueue_work_duration_seconds_bucket{name="replicaset",le="+Inf"} 191
workqueue_work_duration_seconds_sum{name="replicaset"} 4.265655885000002
[...]

스케줄러와 컨트롤러 매니저 지표 이해하기

다음 표는 Prometheus 스타일 스크래핑을 위해 제공되는 스케줄러 및 컨트롤러 매니저 지표를 설명해요. 이러한 지표에 대한 자세한 내용은 Kubernetes 문서의 Kubernetes Metrics Reference를 참고하세요.

지표 컨트롤 플레인 구성 요소 설명
scheduler_pending_pods scheduler 노드에 스케줄되어 실행되기를 기다리는 Pod 수
scheduler_schedule_attempts_total scheduler Pod를 스케줄하기 위해 시도한 횟수
scheduler_preemption_attempts_total scheduler 스케줄러가 우선순위가 낮은 Pod를 축출해 우선순위가 더 높은 Pod를 스케줄하려고 시도한 횟수
scheduler_preemption_victims scheduler 우선순위가 더 높은 Pod를 위한 공간을 만들기 위해 축출 대상으로 선택된 Pod 수
scheduler_pod_scheduling_attempts scheduler Pod를 성공적으로 스케줄하기 위해 시도한 횟수
scheduler_scheduling_attempt_duration_seconds scheduler 리소스 가용성과 스케줄링 규칙 같은 다양한 요소를 기반으로 스케줄러가 Pod가 실행될 적합한 위치를 얼마나 빠르거나 느리게 찾는지 나타냄
scheduler_pod_scheduling_sli_duration_seconds scheduler Pod가 스케줄링 큐에 들어간 시점부터 스케줄되는 데 걸리는 엔드투엔드 지연 시간. 여러 스케줄링 시도가 포함될 수 있음
kube_pod_resource_limit scheduler 클러스터 워크로드의 리소스 한도(테이블 Pod별 분류). 스케줄러와 kubelet이 Pod별로 기대하는 리소스 사용량과 해당 단위(있는 경우)를 보여줌
kube_pod_resource_request scheduler 클러스터 워크로드가 요청한 리소스(테이블 Pod별 분류). 스케줄러와 kubelet이 Pod별로 기대하는 리소스 사용량과 해당 단위(있는 경우)를 보여줌
cronjob_controller_job_creation_skew_duration_seconds controller manager cronjob이 실행되도록 예약된 시점과 해당 job이 생성된 시점 사이의 시간
workqueue_depth controller manager 큐의 현재 깊이
workqueue_adds_total controller manager workqueue가 처리한 총 add 수
workqueue_queue_duration_seconds controller manager 항목이 요청되기 전에 workqueue에 남아 있는 시간(초)
workqueue_work_duration_seconds controller manager workqueue에서 항목을 처리하는 데 걸리는 시간(초)

지표를 지속적으로 스크래핑하도록 Prometheus 스크레이퍼 배포

지표를 지속적으로 스크래핑하도록 Prometheus 스크레이퍼를 배포하려면 다음 구성을 사용하세요.

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-conf
data:
  prometheus.yml: |-
    global:
      scrape_interval: 30s
    scrape_configs:
    # apiserver metrics
    - job_name: apiserver-metrics
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels:
          [
            __meta_kubernetes_namespace,
            __meta_kubernetes_service_name,
            __meta_kubernetes_endpoint_port_name,
          ]
        action: keep
        regex: default;kubernetes;https
    # Scheduler metrics
    - job_name: 'ksh-metrics'
      kubernetes_sd_configs:
      - role: endpoints
      metrics_path: /apis/metrics.eks.amazonaws.com/v1/ksh/container/metrics
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels:
          [
            __meta_kubernetes_namespace,
            __meta_kubernetes_service_name,
            __meta_kubernetes_endpoint_port_name,
          ]
        action: keep
        regex: default;kubernetes;https
    # Controller Manager metrics
    - job_name: 'kcm-metrics'
      kubernetes_sd_configs:
      - role: endpoints
      metrics_path: /apis/metrics.eks.amazonaws.com/v1/kcm/container/metrics
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels:
          [
            __meta_kubernetes_namespace,
            __meta_kubernetes_service_name,
            __meta_kubernetes_endpoint_port_name,
          ]
        action: keep
        regex: default;kubernetes;https
---
apiVersion: v1
kind: Pod
metadata:
  name: prom-pod
spec:
  containers:
  - name: prom-container
    image: prom/prometheus
    ports:
    - containerPort: 9090
    volumeMounts:
    - name: config-volume
      mountPath: /etc/prometheus/
  volumes:
  - name: config-volume
    configMap:
      name: prometheus-conf

Pod가 새 지표 엔드포인트에 접근하려면 다음 권한이 필요해요.

{
  "effect": "allow",
  "apiGroups": [
    "metrics.eks.amazonaws.com"
  ],
  "resources": [
    "kcm/metrics",
    "ksh/metrics"
  ],
  "verbs": [
    "get"
  ] },

사용 중인 역할을 패치하려면 다음 명령을 사용할 수 있어요.

kubectl patch clusterrole  --type=json -p='[
  {
    "op": "add",
    "path": "/rules/-",
    "value": {
      "verbs": ["get"],
      "apiGroups": ["metrics.eks.amazonaws.com"],
      "resources": ["kcm/metrics", "ksh/metrics"]
    }
  }
]'

그런 다음 Prometheus 스크레이퍼의 포트를 로컬 포트로 프록시해 Prometheus 대시보드를 볼 수 있어요.

kubectl port-forward pods/prom-pod 9090:9090

Amazon EKS 클러스터의 경우 핵심 Kubernetes 컨트롤 플레인 지표도 AWS/EKS 네임스페이스 아래의 Amazon CloudWatch Metrics로 수집돼요. 이를 보려면 CloudWatch 콘솔을 열고 왼쪽 탐색 창에서 All metrics를 선택하세요. Metrics 선택 페이지에서 AWS/EKS 네임스페이스와 클러스터의 지표 차원을 선택하세요.

더 알아보기 (Learn more)