tencent cloud

Tencent Kubernetes Engine

お知らせ・リリースノート
製品アップデート情報
製品リリース記録
製品の説明
製品の優位性
製品アーキテクチャ
ユースケース
製品機能
リージョンとアベイラビリティーゾーン
クイックスタート
初心者ガイド
標準クラスターのクイック作成
ビギナー向け事例
コンテナアプリケーションのクラウドへのデプロイ Check List
TKE標準クラスターガイド
テンセントクバネティスエンジン
クラスター管理
ネットワーク管理
ストレージ管理
Worker ノードの概要
Kubernetes Object Management
ワークロード
クラウドネイティブサービスガイド
Prometheus監視サービス
TKE Serverlessクラスターガイド
TKE登録クラスターガイド
実践チュートリアル
Serverlessクラスター
ネットワーク
ログ
監視
運用・保守
DevOps
オートスケーリング
よくあるご質問
クラスター類
TKE Serverlessクラスター
運用保守系
サービス類
イメージリポジトリ類
リモート端末類
ドキュメント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が業務カスタム指標に基づいて自動スケーリングを行ったことを表します。

ヘルプとサポート

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

フィードバック