GKE Autoscaling с пользовательской метрикой c из развертывания - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь автоматически масштабировать работников Redis на основе размера очереди. Я собираю метрики с помощью redis_exporter и promethues-to-sd колясок в моем развертывании Redis следующим образом:

spec:
  containers:
    - name: master
      image: redis
      env:
        - name: MASTER
          value: "true"
      ports:
        - containerPort: 6379
      resources:
        limits:
          cpu: "100m"
        requests:
          cpu: "100m"
    - name: redis-exporter
      image: oliver006/redis_exporter:v0.21.1
      env:
      ports:
        - containerPort: 9121
      args: ["--check-keys=rq*"]
      resources:
        requests:
          cpu: 100m
          memory: 100Mi
    - name: prometheus-to-sd
      image: gcr.io/google-containers/prometheus-to-sd:v0.9.2
      command:
        - /monitor
        - --source=:http://localhost:9121
        - --stackdriver-prefix=custom.googleapis.com
        - --pod-id=$(POD_ID)
        - --namespace-id=$(POD_NAMESPACE)
        - --scrape-interval=15s
        - --export-interval=15s
      env:
        - name: POD_ID
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.uid
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
      resources:
        requests:
          cpu: 100m
          memory: 100Mi

Я могу затем просмотрите метри c (redis_key_size) в Metrics Explorer как:

metric.type="custom.googleapis.com/redis_key_size" 
resource.type="gke_container"

(я НЕ МОГУ смотреть метри c, если я изменю resource.type=k8_pod)

Однако я не может заставить HPA читать эти метрики, получая failed to get metrics error, и не может определить правильное определение Object.

Я пробовал .object.target.kind=Pod и Deployment, при развертывании я получаю дополнительную ошибку "Get namespaced metric by name for resource \"deployments\"" is not implemented.

Я не знаю, связана ли эта проблема с resource.type="gke_container" и как это изменить?

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ template "webapp.backend.fullname" . }}-workers
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ template "webapp.backend.fullname" . }}-workers
  minReplicas: 1
  maxReplicas: 4
  metrics:
    - type: Object
      object:
        target:
          kind: <not sure>
          name: <not sure>
        metricName: redis_key_size
        targetValue: 4

--- Обновление ---

Это работает, если я использую kind: Pod и вручную устанавливаю name для имени модуля, созданного развертывание, однако это далеко от совершенства.

Я также пробовал эту настройку, используя тип Pods, однако HPA говорит, что не может читать метрики horizontal-pod-autoscaler failed to get object metric value: unable to get metric redis_key_size: no metrics returned from custom metrics API

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ template "webapp.backend.fullname" . }}-workers
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ template "webapp.backend.fullname" . }}-workers
  minReplicas: 1
  maxReplicas: 4
  metrics:
  - type: Pods
    pods:
      metricName: redis_key_size
      targetAverageValue: 4

1 Ответ

1 голос
/ 01 апреля 2020

В качестве обходного пути для развертываний представляется, что метрики необходимо экспортировать из модулей в целевом развертывании.

Чтобы это работало, мне пришлось переместить контейнер prometheus-to-sd в развертывание, которое я хотел масштабировать, а затем очистить открытые метрики из Redis-Exporter в развертывании Redis через службу Redis, выставив 9121 на Redis обслуживание и изменение CLA для контейнера prometheus-to-sd таким образом:

- --source=:http://localhost:9121 -> - --source=:http://my-redis-service:9121

, а затем с использованием HPA

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ template "webapp.backend.fullname" . }}-workers
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ template "webapp.backend.fullname" . }}-workers
  minReplicas: 1
  maxReplicas: 4
  metrics:
  - type: Pods
    pods:
      metricName: redis_key_size
      targetAverageValue: 4
...