ㅡ.ㅡ

[K8S Resource] Goldilocks 본문

ETC

[K8S Resource] Goldilocks

ekwkqk12 2023. 10. 22. 14:42

QOS Class

파드에 할당되는 리소스의 우선순위를 결정하는 방법으로 노드에 메모리 자원이 부족해지면 우선 순위가 가장 낮은 파드나 프로세스가 먼저 종료되며 우선 순위는 QOS Class 및 메모리 사용량에 따라 정해진다.

  • Best-Effort Class resources 항목을 사용하지 않을 경우로 노드에 존재하는 모든 자원을 사용할 수도 있지만, 자원을 전혀 사용하지 못할 수도 있다.
  • Guaranteed Class resources 항목에서 limits와 request의 값이 완전히 동일한 경우로 Request와 limit이 동일하여 자원의 오버커밋이 허용되지 않기 때문에 자원 사용을 안정적으로 보장받을 수 있으며 OOM 점수가 -998로 지정된다(OOM kill 우선 순위값은 OOM 점수가 높을 수록 먼저 죽임)
  • Burstable Class resources 항목에서 limits가 requests 둘중 하나만 선언되거나 같지 않을 경우로 최소한의 리소스 보장을 받지만, limit값에 의해 필요한 경우 더 많은 리소스를 할당받을 수 있다.
  • 우선 순위 Guaranteed > Burstable > BestEffort 순이지만 Burstable과 BestEffort 간에는 메모리의 사용량에 따라 우선 순위가 변동된다.

 

goldilocks(리소스 권장 값 추천 도구)

goldilocks-controller가 라벨 값을 기반으로 VPA 리소스를 생성하며 메트릭 수집기에서 제공해주는 값과 이전 기록들을 참고하여 VPA Recommender는 앱의 적정 리소스 값을 추천해줌

  • metric-server
  • kubernetes api server에서 제공해주는 메트릭 값을 수집
  • goldilocks-controller
  • 네임스페이스별로 활성화된 label을 추적하여 VPA를 생성
  • VPA Recommender
  • metric-server와 prometheus 리소스 값을 기반으로 권장 값을 추천해주는 도구
  • prometheus&kube-state-metris
  • 이전 메트릭값을 조회 및 권장 값에 활용
  • goldilocks-dashboard or Grafana Dashboard(16294)
  • VPA Recommender 에서 제공 해주는 값을 볼 수 있는 대시보드

Helm Chart

Goldilocks
helm repo add fairwinds-stable https://charts.fairwinds.com/stable

# fairwinds-stable/goldilocks values.yaml
uninstallVPA: false

vpa:
  enabled: true
  updater:
    enabled: false
  recommender:
    extraArgs:
      # 프로메테우스 오퍼레이터 서비스 주소 지정 및 프로메테우스와 동일한 라벨값 정의
      prometheus-address: |
        http://prometheus-operated.prom-stack.svc.cluster.local:9090
      storage: prometheus
      v: "3"
      # prometheus에 저장된 메트릭과 매칭시킬 라벨 지정
      prometheus-cadvisor-job-name: kubelet
      pod-namespace-label: namespace
      pod-name-label: pod
      container-namespace-label: namespace
      container-pod-name-label: pod
      container-name-label: container
      metric-for-pod-labels: kube_pod_labels{job="kube-state-metrics"}[8d]

controller:
  enabled: true
  flags:
    # 전체 네임스페이스에 VPA 생성
    on-by-default: true

metrics-server:
  enabled: false

dashboard:
  enabled: false

 

(OLD)Prometheus Stack(kube-state-metris)

# kube-prometheus-stack values.yaml
kube-state-metrics: 
  collectors:
    - certificatesigningrequests
    .
    .
    .
    - volumeattachments
    # vpa 메트릭 값 노출 설정 추가
    - verticalpodautoscalers

 

(New)Prometheus Stack(kube-state-metris)

최신 버전에서는 VPA메트릭 지원이 종료되어 커스텀리소스로 생성

kube-state-metrics:
  rbac:
    extraRules:
      - apiGroups: ["autoscaling.k8s.io"]
        resources: ["verticalpodautoscalers"]
        verbs: ["list", "watch"]
  prometheus:
    monitor:
      enabled: true
  selfMonitor:
    enabled: true
  customResourceState:
    enabled: true
    config:
      kind: CustomResourceStateMetrics
      spec:
        resources:
        - groupVersionKind:
            group: autoscaling.k8s.io
            kind: VerticalPodAutoscaler
            version: v1
          labelsFromPath:
            verticalpodautoscaler:
            - metadata
            - name
            namespace:
            - metadata
            - namespace
            target_api_version:
            - apiVersion
            target_kind:
            - spec
            - targetRef
            - kind
            target_name:
            - spec
            - targetRef
            - name
          metrics:
          - name: vpa_containerrecommendations_target_mem
            help: Kubernetes labels converted to Prometheus labels target mem.
            each:
              type: Gauge
              gauge:
                path:
                - status
                - recommendation
                - containerRecommendations
                valueFrom:
                - target
                - memory
                labelsFromPath:
                  container:
                  - containerName
              commonLabels:
                resource: memory
                unit: byte
          - name: vpa_containerrecommendations_target_cpu
            help: Kubernetes labels converted to Prometheus labels target cpu.
            each:
              type: Gauge
              gauge:
                path:
                - status
                - recommendation
                - containerRecommendations
                valueFrom:
                - target
                - cpu
                labelsFromPath:
                  container:
                  - containerName
              commonLabels:
                resource: cpu
                unit: core
          - name: vpa_containerrecommendations_upper_mem
            help: Kubernetes labels converted to Prometheus labels upper mem.
            each:
              type: Gauge
              gauge:
                path:
                - status
                - recommendation
                - containerRecommendations
                valueFrom:
                - upperBound
                - memory
                labelsFromPath:
                  container:
                  - containerName
              commonLabels:
                resource: memory
                unit: byte
          - name: vpa_containerrecommendations_upper_cpu
            help: Kubernetes labels converted to Prometheus labels upper cpu.
            each:
              type: Gauge
              gauge:
                path:
                - status
                - recommendation
                - containerRecommendations
                valueFrom:
                - upperBound
                - cpu
                labelsFromPath:
                  container:
                  - containerName
              commonLabels:
                resource: cpu
                unit: core
          - name: vpa_containerrecommendations_lower_mem
            help: Kubernetes labels converted to Prometheus labels lower mem.
            each:
              type: Gauge
              gauge:
                path:
                - status
                - recommendation
                - containerRecommendations
                valueFrom:
                - lowerBound
                - memory
                labelsFromPath:
                  container:
                  - containerName
              commonLabels:
                resource: memory
                unit: byte
          - name: vpa_containerrecommendations_lower_cpu
            help: Kubernetes labels converted to Prometheus labels lower cpu.
            each:
              type: Gauge
              gauge:
                path:
                - status
                - recommendation
                - containerRecommendations
                valueFrom:
                - lowerBound
                - cpu
                labelsFromPath:
                  container:
                  - containerName
              commonLabels:
                resource: cpu
                unit: core

 

Reference

'ETC' 카테고리의 다른 글

[K8S Event] kubernetes-event-exporter  (0) 2023.10.22
[K8S Resource] ClusterAutoScaler  (0) 2023.10.22
[K8S Resource] Descheduler  (0) 2023.10.22
[AWS] EFS  (0) 2021.10.21
[Kubernetes Management] Rancher  (0) 2021.09.29