Рубрики
Uncategorized

Горизонтальный стручок AutoShale с пользовательскими метриками PROMETHEUS🚀

0. 前言 這 篇 章 文章 會 分享 如何 在 在 篇 章 章 透過 分享 如何 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 自訂 自訂 的 的 的 的 的 prometheus metrics 來 實作 HPA — Горизонтальный стручок AutoShale 首先 來講 … Теги с Куберовщиками, DevOps, Premetheus, AutoScale.

0. 前言.

這 篇 文章 會 分享 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 在 的 的 的 Prometheus Metrics 來 實作 HPA — Горизонтальный стручок автонастройки

首先 來講講 為什麼 會 需要 пользовательские метрики 很 簡單, 就 是 內建 的 不 夠夠 其實 單純 用 內建 內建 的 的 CPU/RAM 作為 作為 指標 其實 其實 其實 其實 其實 其實 其實

可 參考 Утилизация ЦП неверна Бесполезные метрики

所以 些 一些 原生 K8S 沒有 的 指標, 像是 使原 使 的 數有 提供 的 指標, 像是像是 使 的 數有 提供 的 指標, 像是像是 使服務 的 數有 的 的 指標, 像是像是 使 的 數有 的 的 指標, 像是像是 使 的 數有 提供 的 指標, 像是像是 使 的 數有 提供 的 指標, 像是像是 使 的 數有 提供 的 指標, 像是像是 使 的 數有 的 指標, 像是 使 使 的 數有 的 的 指標, 像是像是 使 的 數有 的 指標, 像是像是 使 的 數有 的 指標, 像是 使 使 的 數有 提供 的 指標, 像是像是 使 的 數有 的 的 的 指標, 像是像是 使服務 服務 的 數有 的 的 指標, 像是 使像是 服務 的 數有 的 指標, 像是 使像是 使 的 人數 就 必須 使必須 пользовательские метрики 來 執行 масштабирование.

下列 操作 基於 於 於 kubernetes v1.14

1. HPA через пользовательские метрики

免 下不 了 的, 一定 得 下 下 了 的, 一定 得 一下 HPA 透過 Настраиваемые метрики 做 Scaling 的 機制 單純 透過 CPU или RAM 其實 甚麼 好 好 講 很多 章 章 章 的 網路 清楚 清楚 章 章 章 章 很很 其實 是 我 懶 得 寫 k8s.doc ithome.

重點 在於 HPA 是 如何 取得 пользовательские метрики 的, 以及 如何 將們 自訂 的 метрики 吐 出來 給 自訂 自訂 的 Метрика 吐 出來 給 HPA контроллер

大致 運作 邏輯 是 這樣 這樣

首先 講解 пользовательские метрики 的 部分, 在 Kubernetes 中, 目前 有關 пользовательские метрики 的 操作 主要 是 對

custom-metrics.metrics.k8s.io/v1beta1 

這個 API конечная точка 來 註冊 以及 取得 的.

也就 是 說, 們們 的 POD 暴露 出 出 的 Пользовательские метрики 要 想 辦法 註冊 到 這個 API Конечная точка 上 HPA Контроллер 就 可以 從 這個 Конечная точка 取得 們們 自定 的 Метрики, 來 做 他 該 做 的 事情

2. Premetheus Operator & Premetheus-адаптер

先 從 架設 環境 開始, 在 這邊 我 會 透過 Prometheus 來 集中 接收 Метрики 應應 服務 對 prometheus 暴露 метрики 而 會 有 個 PROMETHEUS-ADAPTER 把 Метрики 註冊 到 述 述 的 Конечная точка

其實 也 可以 讓 讓讓 直接 對 對 對 對 的 的 Пользовательские API-сервер 直接 註冊 Пользовательские метрики 但 統一 將 Метрики 交給 Prometheus 後, 可以 更 方便 們們 整合 grafana панель инструментов

2.1 安裝 Оператор Прометея

Оператор Premetheus 是 由 Coreos 開發 打包 推出 的 以下 是 官方 的 簡介

Оператор Premetheus для Kubernetes обеспечивает легкие определения мониторинга для услуг и развертывания Kubernetes и управление экземплярами PROMETHEUS.

和 一般 Prometheus 最 大 的 不同, оператор прометея 會 順帶 安裝 Grafana 並且 還 多 加入 了 一 個 монитор обслуживания

Монитор службы 會 負責 將 Pod 暴露 出來 的 Метрика 導入 到 Prometheus 內 有點 類似 Prometheus 的 соскребация

們們 可以 直接 用 helm 安裝 安裝 primetheus оператор

helm install --name po stable/prometheus-operator

安裝 好 後 可以 連進 連進 連進 連進 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 取得 如果 Kube-Proxy 有 異常 的 話 可 參考 這邊.

2.2 安裝 Прометеус-адаптер

安裝 完 Оператор PormeTheus 後 們們 打通 了 Pod Export Metrics 到 到 將 將 將 將 將 將 將 將 將 將 將 內 將 到 到 k8s 的 Пользовательские метрики API Конечная точка API

同樣 的 可以 透過 helm 來 安裝 primetheus-адаптер

helm install --name pa stable/prometheus-adapter

要 額外 注意 的 一點 是 額外 注意 的 一點 是 PROMETHEUS.URLPROMETHEUS.PORT 必須 配合 們們 剛剛 安裝 安裝 好 的 Prometheus Оператор. 可以 在 安裝 的 時候 指定 這些 安裝 的 時候時候

helm install --name pa --set prometheus.url=http://po-prometheus-operator-prometheus.default.svc,prometheus.port=9090 stable/prometheus-adapter

安裝 好 好 從 從 從 從 從 從 從 從 ap ap ap 資訊 有 一 一 一 東西 的 就 是 一 一 了成功

kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1

如果 有 回傳, 但 沒 沒 看到 Metrics. 表示 你 的 PROMETHEUS Оператор 有 安裝 成功, 正確 註冊 了 API пользовательских метрик API API, 但 адаптер 沒有 從 Prometheus 撈到 資料 註冊 回去.

至此 為止, 加加 加加 rometheus 以及 以及 以及 的 關係 圖 會 這樣子 的 關係 圖 會 變成子

接下來 會 介紹 如何 如何 將 Метрики выставляют 到 Prometheus 內

3. POD обнажает пользовательские метрики.

POD 暴露 Metrics 的 方法 大致 可 分為 幾 種 種

  1. 透過 lib 自行 輸出 метрики 例如 FLASK_PROMETHEUS_METRICS 就 是 會 幫 你 輸出 flask 裡面 的 相關 指標
  2. 自己 按照 PROMETHEUS 所 需 的們 的 輸出 輸出 輸出 輸出 接下來 接下來 如此 用 的 範例 就 是 如此 如此接下來
  3. 由 Ingress 或 Сервисная сетка 幫 你 暴露 Metrics (可自 訂性 較 低)

3.1 Запустите образец POD.

Создать Образец-развертывание.yaml.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
  labels:
    app: sample-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - image: luxas/autoscale-demo:v0.1.2
        name: metrics-provider
        ports:
        - name: http
          containerPort: 8080
kubectl apply -f sample-deploy.yaml

Создать svc.ЯМЛ

apiVersion: v1
kind: Service
metadata:
  labels:
    app: sample-app
    release: po
  name: sample-svc
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: sample-app
  type: ClusterIP
kubectl apply -f svc.yaml

等 POD 建立好 後, 可以 透過 下列 指令 來 觀察 POD 的 Метрики

curl http://$(kubectl get service sample-svc -o jsonpath='{ .spec.clusterIP }')/metrics

Output >>>
# HELP http_requests_total The amount of requests served by the server in total
# TYPE http_requests_total counter
http_requests_total 1

3.2 ServiceMonitor

Сервисный монитор 主要 將 ProMetheus 內 吐出 的 資料 倒到 Prometheus 內 類似 Scrape 的 方式

Создать Сервис-монитор.yaml.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app: sample-app
    release: po
  name: sample-app
  namespace: default
spec:
  endpoints:
  - port: http
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      app: sample-app
      release: po
kubectl create -f service-monitor.yaml

到 這 一步 需要 開啟 開啟 開啟 的 的 開啟 prometheus 的 Приборная панель 檢查 Цель 內 有 沒有 們們 定義 的 Цель 這裡 附附 Selectoritor 的 除錯 方法 其實 不 外乎 就 是 метка 沒 對 上 罷 了 了 了

4. Двойная проверка

做到 這邊, 們們 整個 路 算是 都 打通 打通. 可以 從 從 從 打通 撈 撈 一下, 檢查檢查 的 Метрика 有 沒有 註冊 的去

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests?selector=app%3Dsample-app"

註: 們們 安裝 安裝 Adapter Prometheus 時 只 用 了 預設 的 Config, 如果 你 的 METRIC 沒有 出現. 或是 希望 在 註冊 回 回 算 時要 些 一些 運算 運算, 如 算 算 些 些 一些 運算, 如 算 算 類 的. 可以 參考 這邊.

5. Создать HPA

.

Создайте и подать заявку Образец-HPA.YAML.

kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
  name: sample-app
spec:
  scaleTargetRef:
    # point the HPA at the sample application
    # you created above
    apiVersion: apps/v1
    kind: Deployment
    name: sample-app
  # autoscale between 1 and 10 replicas
  minReplicas: 1
  maxReplicas: 10
  metrics:
  # use a "Pods" metric, which takes the average of the
  # given metric across all pods controlled by the autoscaling target
  - type: Pods
    pods:
      # use the metric that you used above: pods/http_requests
      metricName: http_requests
      # target 500 milli-requests per second,
      # which is 1 request every two seconds
      targetAverageValue: 500m

И попытаться получить нашу HPA

kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
sample-app   Deployment/sample-app   0/500m    1         10        1          24h

6. Машина запускается.

先 開 兩 個 視窗 分別 觀察 hpa 以及 развертывание

watch kubectl get hpa
watch kubectl get deploy sample-app

接著 再 打 一 個 Curl 的 無窮 迴圈 迴圈

while true; do  curl -s "http://$(kubectl get service sample-svc -o jsonpath='{ .spec.clusterIP }')" > /dev/null; done

沒 意外 的 話 就 會 看到 看到 被 被 觸發 然後 進 進 進 進 進 進 進行 масштабировать 了

7. Разное.

最 先 是 打算 做 http Запрос Задержки HPA 的, 所以 拿 了 FLASK_PROMETHEUS_METRICS 來 做 範例 其實 最後 也 算是 有 弄 出來, 但 中間 會 牽扯 到 Prometheus адаптер 的 metricsQuery 語法 撰寫 礙於 篇幅 的 關係 就 不 的 的 關係 就 不 寫 了寫. 而且 發現 Admetheus Adapter 的 metricsquery 其實 還是 有 侷限 性. 他 只 能 針對 一 一 個 метрика 來 做 做 做 或是 或是 Гистограмма, 然後 再 註冊 到 k8s Пользовательские API Конечная точка 不 像像們 用 Grafana 時, 可以 拿 很多 Metric 組合 運算 得 出 們們 想要 想要 的 數據

所以 就 直接 這個 這個 例子 分享.

結論, 最 好 的 方法 還是 還是 自己 自己 要 就 到 的 的 你 要 註冊 註冊 到 的 的 метрические

Устранение неполадок

  1. Оператор Premetheus 重裝 失敗 再 重裝 Оператор прометея 時 可能 會 遇到 CRD 相關 的 錯誤 先先 Helm Удалить —purge 的 方式 清空 再 刪除 所有 的 CRD https://github.com/coreos/PromeTheus-operator#Removal 然後 重新 安裝 時 先 手動 建立 CRD

    接著 Helm Установить 時 不 要 產生 CRD

  2. 我 的 Prometheus Dashboard 內 Kube-Proxy Target 錯誤 https://github.com/helm/charts/tree/master/stable/prometheus-operator#kubeproxy.

Ссылка

  1. https://github.com/DirectXMan12/k8s-prometheus-adapter/blob/master/docs/walkthrough.md
  2. https://github.com/coreos/prometheus-operator
  3. https://github.com/DirectXMan12/k8s-prometheus-adapter
  4. https://github.com/helm/charts/tree/master/stable/prometheus-operator
  5. https://www.youtube.com/watch?v=gSiGFH4ZnS8

Оригинал: «https://dev.to/mjace/horizontal-pod-autoscale-with-custom-prometheus-metrics-5gem»