본문 바로가기

Data&Processing

커스텀 측정항목을 통한 쿠버네티스 오토스케일링(custom metrics kuberntes autoscaling) - presto(2/2) - 적용

presto에서 어떤항목을 수집할지 결정

prometheus-adapter

  • https://github.com/DirectXMan12/k8s-prometheus-adapter
  • prometheus metrics를 kubernetes의 custom metrics로 보내주는 package
  • helm install --name prometheus-adapter-presto1 stable/prometheus-adapter -f presto-custom-metrics-values.yaml --namespace prometheus
    • seriesQuery값이나 metricsQuery 연산은 prometheus server에서 실제로 수집되는지, 집계가 되는지에 대해서 확인/검증 가능합니다.
    • values.yaml - 60분간의 "15분동안 실행한 쿼리" max

       

      prometheus
      rules:
        default: false
        custom:
        - seriesQuery: '{__name__="presto_execution_querymanager_StartedQueries_FifteenMinute_Count",kubernetes_namespace="presto",kubernetes_pod_name=~"prestosql1.*"}'
          # seriesFilters:
          # - is: ^presto_clustermemory.*
          resources: 
            overrides:
              kubernetes_pod_name: {resource: "pod"}
              kubernetes_namespace: {resource: "namespace"}
          name:
            matches: ^presto_execution_querymanager.*
            as: "presto_query_status"
          metricsQuery: 'max_over_time(presto_execution_querymanager_StartedQueries_FifteenMinute_Count [60m])'
      prometheus:
        url: http://prometheus-server # make sure the url is correct
        port: 80
      

custom metrics수집확인

  • 어떤 항목이 수집되는지 확인
    • kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
  • 수집되는 gauge를 kubernetes 에서 확인하려면
    • pod일 경우
      kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/pods/*/presto_query_status"
    • namespace일 경우
      kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/metrics/presto_query_status"
      kubectl get --raw “/apis/custom.metrics.k8s.io/v1beta1/namespaces/*/metrics/presto_query_status”
    • prometheus-adapter pod를 log모니터링 해보면 metrics서버에서 prometheus-adapter pod로 위와같은 요청하는걸 확인할수 있습니다

HPA적용

  • HPA type종류에는 Resource, Pod, Object, External이 있는데
  • Resource는 안되니까 지금과 같은 작업을 하는 것이고,
  • Pod type
    • prometheus-adapter log를 확인하면 /apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/pods/%2A/presto_query_status?labelSelector=app%3Dprestosql1-worker-pod
    • 와 같이 API가 call이 되는걸 확인할 수 있는데 이는 HPA할 Deployments의 meta 입니다.
    • 즉, HPA는 labelSelector는 HPA에서 지정하는 Deployments의 meta를 사용하므로 coordinator의 metrics는 가져올수가 없게되고 따라서 Pod type으로는 Pod와 scale-out 하는 deployment가 동일해야 HPA를 사용할수 있습니다.
  • External metrics는 여기서는 만들지 않아서 해당사항 없고 만드려면, 이전문서에 external-metrics-api확인
  • Object
    - type: Object
        object:
          metricName: presto_query_status
          averageValue: 1
          targetValue: 11
          target:
            apiVersion: v1
            kind: Pod
            name: "*"
    • 위와같이 하면 우리가 원하는 api로 call을 하게 되고 target에서 coordinator pod name은 임의로 생성되는 값이라 지정할수 없으니 “*” 로 설정했으며 다른 metrics를 사용하고자 한다면 namespace 상관없이 unique한 이름으로 설정해야 다른 HPA에서도 사용할수 있을듯 합니다.
    • API call 형태 : /apis/custom.metrics.k8s.io/v1beta1/namespaces/presto/pods/%2A/presto_query_status