tencent cloud

Tencent Kubernetes Engine

ドキュメントTencent Kubernetes Engine実践チュートリアルオートスケーリングTKE上でカスタム指標を使用して自動スケーリングします

TKE上でカスタム指標を使用して自動スケーリングします

PDF
フォーカスモード
フォントサイズ
最終更新日: 2023-04-27 18:15:01

ユースケース

Tencent Kubernetes Engine(TKE)はCustom MetricsAPIに基づいて複数の自動スケーリングに使用される指標をサポートします。CPU、メモリ、ハードディスク、ネットワークおよびGPUに関連する指標をカバーし、大部分のHPA自動スケーリングのシナリオをカバーします。詳細なリストについては、自動スケーリング指標説明をご参照ください。例えば業務の単一レプリカのQPSサイズに基づいて自動スケーリングなどを行う複雑なシナリオに対し、prometheus-adapterをインストールすることによって自動スケーリングを実現します。KubernetesがCustom Metrics APIとExternal Metrics APIを提供することによってHPA指標を拡張し、ユーザーが実際のニーズに応じてカスタマイズできるようにします。prometheus-adapterは上記の2種類のAPIをサポートし、実際の環境では、Custom Metrics APIを使用すれば大部分のシナリオに対応することができます。ここではCustom Metrics APIによってカスタム指標を使用して自動スケーリングを行う方法についてご説明します。

前提条件

バージョン1.12以上のTKEクラスターを作成済みであること。詳細については、クラスターの作成をご参照ください。
Prometheusをデプロイし、対応するカスタム指標を収集済みであること。
Helmをインストール済みであること。

操作手順

監視指標の公開

本文ではGolang業務プログラムを例とします。この例ではプログラムがhttpserver_requests_total指標を公開し、HTTPのリクエストを記録し、この指標によって業務プログラムのQPS値を算出することができます。次のとおりです。
package main

import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"strconv"
)

var (
HTTPRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "httpserver_requests_total",
Help: "Number of the http requests received since the server started",
},
[]string{"status"},
)
)

func init() {
prometheus.MustRegister(HTTPRequests)
}

func main(){
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
code := 200
switch path {
case "/test":
w.WriteHeader(200)
w.Write([]byte("OK"))
case "/metrics":
promhttp.Handler().ServeHTTP(w, r)
default:
w.WriteHeader(404)
w.Write([]byte("Not Found"))
}
HTTPRequests.WithLabelValues(strconv.Itoa(code)).Inc()
})
http.ListenAndServe(":80", nil)
}

業務プログラムのデプロイ

前記のプログラムをコンテナイメージにパッケージ化し、その後クラスターにデプロイします。例えばDeploymentを使用してデプロイします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpserver
namespace: httpserver
spec:
replicas: 1
selector:
matchLabels:
app: httpserver
template:
metadata:
labels:
app: httpserver
spec:
containers:
- name: httpserver
image: registry.imroc.cc/test/httpserver:custom-metrics
imagePullPolicy: Always

---

apiVersion: v1
kind: Service
metadata:
name: httpserver
namespace: httpserver
labels:
app: httpserver
annotations:
prometheus.io/scrape: "true"
prometheus.io/path: "/metrics"
prometheus.io/port: "http"
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
name: http
selector:
app: httpserver

Prometheusによる業務モニタリングの収集

Promtheus収集ルールまたはServiceMonitorによってPromtheusを設定して業務が公開する監視指標を収集することができます。

方式1:Promtheus収集ルールを設定する

Promtheusの収集ルール設定ファイル内に以下の収集ルールを追加します。次のとおりです。
- job_name: httpserver
scrape_interval: 5s
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- httpserver
relabel_configs:
- action: keep
source_labels:
- __meta_kubernetes_service_label_app
regex: httpserver
- action: keep
source_labels:
- __meta_kubernetes_endpoint_port_name
regex: http

方式2:ServiceMonitorを設定する

prometheus-operatorがインストールされている場合、ServiceMonitorのCRDのオブジェクトを作成することによってPrometheusを設定することができます。次のとおりです。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: httpserver
spec:
endpoints:
- port: http
interval: 5s
namespaceSelector:
matchNames:
- httpserver
selector:
matchLabels:
app: httpserver

prometheus-adapterをインストールする

1. Helmを使用してprometheus-adapterをインストールし、インストール前にカスタム指標を確認して設定してください。上記の監視指標の公開の例に従い、業務内でhttpserver_requests_total指標を使用してHTTPリクエストを記録するため、以下のようなPromQLによって各業務のPodのQPSモニタリングを算出することができます。次のとおりです。
sum(rate(http_requests_total[2m])) by (pod)
2. それをprometheus-adapterの設定に変換し、values.yamlを作成します。内容は以下のとおりです。
rules:
default: false
custom:
- seriesQuery: 'httpserver_requests_total'
resources:
template: <<.Resource>>
name:
matches: "httpserver_requests_total"
as: "httpserver_requests_qps" # PromQLが算出したQPS指標
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)
prometheus:
url: http://prometheus.monitoring.svc.cluster.local # Prometheus APIのアドレスを置換する(ポートは書き込まない)
port: 9090
3. 以下のHelmコマンドを実行して prometheus-adapterをインストールします。次のとおりです。
注意
インストール前にTKEが登録したCustom Metrics APIを削除する必要があります。削除コマンドは次のとおりです。
kubectl delete apiservice v1beta1.custom.metrics.k8s.io
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Helm 3
helm install prometheus-adapter prometheus-community/prometheus-adapter -f values.yaml
# Helm 2
# helm install --name prometheus-adapter prometheus-community/prometheus-adapter -f values.yaml

テストの検証

正確にインストールされていれば、以下のコマンドを実行し、Custom Metrics APIが返した設定されたQPS関連指標を確認することができます。次のとおりです。
$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "custom.metrics.k8s.io/v1beta1",
"resources": [
{
"name": "jobs.batch/httpserver_requests_qps",
"singularName": "",
"namespaced": true,
"kind": "MetricValueList",
"verbs": [
"get"
]
},
{
"name": "pods/httpserver_requests_qps",
"singularName": "",
"namespaced": true,
"kind": "MetricValueList",
"verbs": [
"get"
]
},
{
"name": "namespaces/httpserver_requests_qps",
"singularName": "",
"namespaced": false,
"kind": "MetricValueList",
"verbs": [
"get"
]
}
]
}
以下のコマンドを実行すると、PodのQPS値を確認することができます。次のとおりです。
説明
下記の例ではQPSが500mで、QPS値が0.5であることを表します。
$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/httpserver/pods/*/httpserver_requests_qps
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/httpserver/pods/%2A/httpserver_requests_qps"
},
"items": [
{
"describedObject": {
"kind": "Pod",
"namespace": "httpserver",
"name": "httpserver-6f94475d45-7rln9",
"apiVersion": "/v1"
},
"metricName": "httpserver_requests_qps",
"timestamp": "2020-11-17T09:14:36Z",
"value": "500m",
"selector": null
}
]
}

HPAのテスト

各業務Podの平均QPSが50に達した時にスケーリングをトリガーすると設定した場合、最小レプリカは1個、最大レプリカは1000個です。設定は次のとおりです。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: httpserver
namespace: httpserver
spec:
minReplicas: 1
maxReplicas: 1000
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: httpserver
metrics:
- type: Pods
pods:
metric:
name: httpserver_requests_qps
target:
averageValue: 50
type: AverageValue
以下のコマンドを実行して業務にストレステストを行い、自動スケーリングされたかどうかを観察します。次のとおりです。
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
httpserver Deployment/httpserver 83933m/50 1 1000 2 18h
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
httpserver-6f94475d45-47d5w 1/1 Running 0 3m41s
httpserver-6f94475d45-7rln9 1/1 Running 0 37h
httpserver-6f94475d45-6c5xm 0/1 ContainerCreating 0 1s
httpserver-6f94475d45-wl78d 0/1 ContainerCreating 0 1s
正常にスケーリングされた場合、HPAが業務カスタム指標に基づいて自動スケーリングを行ったことを表します。

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック