著者:キューブクラウド、説明リンク
HPAについて
HPA(水平ポッドAutoscaler)Kubernetes(以下K8Sをいう)がサービスは、インデックスの上で動作するように、特定の指標に応じて設定ように、さらにreplicaSetポッドstatefulSet、replicaControllerの数に動的にスケーラブルであることができるリソース・オブジェクト適応能力で特定の変更があります。
HPAは、現在の指標、すなわち、リソース、オブジェクト、外部、ポッドの4種類をサポートしています。安定版自動スケーリング/ v1のサポートは、動的テストバージョンの自動スケーリング/ v2beta2に延伸するCPU指標、サポートメモリとカスタム指標の動的な、注釈および方法自動スケーリング/ v1のリリースで仕事ににストレッチします。
HPA構造K8S
まず、あなたがK8S HPAの公式が与えるの例を見つけるために、K8SにHPA構造で見ることができ、私は理解を容易にするために、キーフィールドにいくつかのコメントを与えます。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
namespace: default
spec:
# HPA的伸缩对象描述,HPA会动态修改该对象的pod数量
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
# HPA的最小pod数量和最大pod数量
minReplicas: 1
maxReplicas: 10
# 监控的指标数组,支持多种类型的指标共存
metrics:
# Object类型的指标
- type: Object
object:
metric:
# 指标名称
name: requests-per-second
# 监控指标的对象描述,指标数据来源于该对象
describedObject:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
name: main-route
# Value类型的目标值,Object类型的指标只支持Value和AverageValue类型的目标值
target:
type: Value
value: 10k
# Resource类型的指标
- type: Resource
resource:
name: cpu
# Utilization类型的目标值,Resource类型的指标只支持Utilization和AverageValue类型的目标值
target:
type: Utilization
averageUtilization: 50
# Pods类型的指标
- type: Pods
pods:
metric:
name: packets-per-second
# AverageValue类型的目标值,Pods指标类型下只支持AverageValue类型的目标值
target:
type: AverageValue
averageValue: 1k
# External类型的指标
- type: External
external:
metric:
name: queue_messages_ready
# 该字段与第三方的指标标签相关联,(此处官方文档有问题,正确的写法如下)
selector:
matchLabels:
env: "stage"
app: "myapp"
# External指标类型下只支持Value和AverageValue类型的目标值
target:
type: AverageValue
averageValue: 30
- 処理のための注釈のメトリックフィールドの自動スケーリング/ v1のバージョン。
- 活用、値、平均値:ターゲットの3つのタイプがあります。利用率は、平均利用率を表し、裸の値が値を表し、平均値は、平均値を表します。
- オブジェクト、ポッド、リソース、外部:メトリックがタイプフィールドの値の4つのタイプがあります。
- リソースが伸縮オブジェクトの下にポッド現在のCPUとメモリの指標を指し、唯一利用ターゲットの平均値タイプをサポートします。
- 指定されたオブジェクトのみが平均値値と目標のタイプをサポートするサード・パーティ・アダプタを提供する内部指標、データニーズをK8Sすることを目的といいます。
- ポッドポッドインデックスは、アダプタが第三者にデータを提供し、そしてのみ平均値型ターゲットを可能にし、オブジェクト(statefulSet、replicaController、さらにreplicaSet)の下で延伸を指します。
- 外部K8S外部指標を意味し、データは、サードパーティのアダプタを提供する必要がある唯一の平均値値と目標の種類をサポートしています。
ストレッチのダイナミックのHPA原理
K8SにおけるHPAもHPA間隔コントローラ制御、コントローラ意志サイクルから成り、HPAは伸縮状態、15Sのデフォルト間隔をトリガするかどうかを各監視インジケータをチェック。トリガ条件伸縮すると、コントローラは、フィールドのオブジェクトスケール伸縮制御ポッド番号(statefulSet、replicaController、さらにreplicaSet)サブオブジェクトを変更し、K8Sに要求を送信します。要求に応答K8S、スケールの構造を変更し、その後、ポッドは、伸縮オブジェクトの数を更新します。スケールオブジェクトが変更され、自然にストレッチダイナミックの目的を達成するために、リスト/時計機構を介してポッドの数を増減します。
HPAの拡張処理について説明します
次のようにHPA伸縮主なプロセスです。
- HPAの現在の数が、ポッド設定された間隔の数をポッドかどうかを決定し、そうでない場合は、最小値が最大戻り、テレスコピック端大きすぎる、小さすぎる返します。
- 判定指標を入力し、要求に対応するAPIサーバに送信し、モニタリング指標のセットを取得します。metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io:一般的指標は、三の凝集のAPIから予め設定された指標に応じて得られます。一般的に、CPU、メモリ使用率、サードパーティ製のアダプタを提供するために、他の二つの必要性主に、K8S独自のメトリック・サーバーによって提供されMetrics.k8s.io。custom.metrics.k8s.ioは、特定のポッドに関連付けられているように、一般的に関連K8Sクラスタと、カスタム・インデックス・データを提供します。external.metrics.k8s.ioはまた、一般K8Sクラスタとは何の関係もカスタムインデックスのデータを提供しない、しかし。多くのよく知られているサードパーティの監視プラットフォームは、アダプタが、監視およびK8Sは、クラスタ内のサービスを提供し、さらに指標の上記の3つの種類を提供するために、元のメトリックサーバAPIを置き換えるために展開することができると共に、上記のAPIを(例えばプロメテウスなど)を達成するためのアダプタを提供しますカスタマイズデータの深さを監視するため。
- 利用可能な指標によれば、対応するアルゴリズムは、ワープ係数を算出し、現在のポッドの数で乗算するポッドの所望の数を得ます。因子が期待値であり、膨張場合は1よりも屈折率の比以上の電流値を示し、1未満の体積減少を表します。平均値(平均値)、平均利用率(利用)、裸値(値)は、3種類の指標値は、各タイプは、対応する数値アルゴリズムを有しています。以下の点に注目すべきです:係数はユニティに、小数点がある場合は、係数が一定の許容値に達していない場合、HPAは変更は、この変更を無視するには小さすぎると考えている、デフォルトの許容値は0.1です。
HPA拡張アルゴリズムは非常に保守的なアルゴリズムです。これが表示されますが、インデックスを取得していない場合とき最小拡張、減容化するときの最大数、と考えられ、無準備が出現ポッド平均値を計算する必要がある場合は、平均ポッドの分母に含まれていません。
複数のインジケータを監視HPA支持体は、HPAサイクルは、すべての指標を取得し、所望の数のポッドをカウントし、ポッドの数は、期待される結果から、最終的なストレッチをポッドとして最大数を取得します。伸縮オブジェクトは、K8Sが複数のHPAに対応することができますが、それはただK8Sを文句はありません、実際には、同じ伸縮オブジェクトに互いにHPA独自のモニタを知らない、この伸縮オブジェクト内のポッドは、より意味のHPAになります前後にシステムの消費を高めるために、ポッドの数を変更するには、あなたが複数のモニタ指標を指定したい場合はHPAは言った上で、モニタリング指標を複数に追加することができます。 - ポッドHPAセット内のポッドの最終的な数の数値範囲かどうかのチェック間隔、最大値が最小値を超える場合未満又は修飾最大値または最小値です。K8S次いで、HPAの終了を確認し、サブオブジェクトポッドスケール伸縮オブジェクトの数を変更する次のHPAを取得するための要求を発行し、延伸処理を終了します。
HPAのアプリケーションシナリオ
HPA伸縮オブジェクト(statefulSet、replicaController、さらにreplicaSet)上に配備されているサードパーティ監視アプリケーションのHPA特性組み合わせサービスは、特定の指標に対処するために、一定の限度内で複数のコピーを複製するために非常に柔軟で適応能力となっています高騰、あなたはまた、より多くのリソースを使用する他のアプリケーションのためのコンピューティングリソースは、システム全体の安定性を維持するために必要な作るために小さな指標でコピーを削除することができます。一部のトラフィックの変動、タイトなマシンのリソースのために非常に適した、などのサービスビジネスシナリオの数:電力供給サービス、ラッシュチケット・サービス、金融サービスなど。
K8S-プロメテウスアダプタ
HPAのインデックスデータを提供するために、実装するアダプタ早く、多くの監視システムにインターフェースを話します。ここでは、特定のアダプタプロメテウスの監視システムを導入します。
プロメテウスは、使いやすいなど、ストレージ効率の良い、複数のデータ寸法を有するよく知られたオープンソースの監視システムです。ユーザーは表情を豊かにし、組み込み関数、カスタム、彼らが必要とするデータを監視することができます。
プロメテウス・アダプタは、プロメテウスとAPIサーバでフィッターとして機能します。プロメテウス・アダプタは、インデックスプロメテウスは、データ、使用後HPAに戻るを取得するコンテンツに係るHPAインデックスクエリ要求から送信されたapiserverアグリゲータ遷移によって受け入れられ、そして、対応する要求を送信します。プロメテウスmetrics.k8s.ioは、インデックスデータサービスを提供する、代わりK8S自身MATRICSサーバと同時に、custom.metrics.k8s.io、external.metrics.k8s.io三種類のAPIインターフェースで達成することができます。
設定ファイル内のキープロメテウスアダプタ展開の成功嘘は正しいです。プロファイルは、治療の指標の必要性の指標としても設定することができ、次のように少し説明するコメントを追加するには、簡単な設定ファイルです。
# 指标规则,可以多个规则共存,上一个规则的结果会传给下一个规则
rules:
# 计算指标数据的表达式
- metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)
# 指标重命名,支持正则表达式。这里表示删除指标名字中的"_seconds_total"
name:
as: ""
matches: (.*)_seconds_total$
# 指标与k8s资源通过标签关联,这里将指标通过标签与k8s的namspace和pod相互关联
resources:
overrides:
namespace:
resource: namespace
pod:
resource: pod
# 过滤指标条件
seriesFilters: []
# 指标查询表达式,可以根据标签等条件,筛选特定的指标
seriesQuery: '{namespace!="",pod!=""}'
metricsQueryフィールドはGROUPBYは、合併の価値の指標、K8S要求、ここで、「<<」「>>」は、外出先のテンプレートの構文であるとき、シリーズは、オブジェクトマッチングタグキーと値のペアの名前を示す指標名、LabelMatchers K8Sインデックスを表して実行されますタグ名。
非常によく、傍受公式ドキュメントを説明するための例を理解していない、あなたは理解して読んでください。
たとえば、私たちはラベルサービス、ポッド、進入、名前空間と動詞と直列http_requests_total(APIにhttp_requests_per_secondとして公開)を有していたとします。Kubernetesリソースへの最初の4つの対応。名前空間をsomensに誰かがポッドPOD1とPOD2のメトリックポッド/ http_request_per_secondを要求した場合次に、私たちは持っていると思います。
- シリーズ: "http_requests_total"
- LabelMatchers: "ポッド=〜" POD1 | POD2" 、名前空間= "somens"
- GROUPBY:ポッド
リソースフィールドがリソースオブジェクトとターゲットに関連する重要なフィールドK8Sで、本質的には、ラベル値K8Sリソース・オブジェクト名インデックスの下に一致する、リソースフィールドを使用すると、K8Sリソースのオブジェクト名と一致するラベル、タグ値のインデックスを使用する必要があり、システムに指示します。K8Sインジケータを要求するときに上書きすることによって、リソースAに関連する2つの方法、特定のリソース・オブジェクト・ラベルK8Sバインドは、特にインデックスを区別するために、リソース・オブジェクトの名前は、この特定のタグ値と比較され、存在しますどのオブジェクト、他のテンプレートで、一致させるために、タグ名にK8Sリソース・オブジェクト名を変換するためのテンプレート言語の構文を経ます。
第二の方法、本当に理解していない、また説明する公式ドキュメントの例を傍受:
# any label `kube_<group>_<resource>` becomes <group>.<resource> in Kubernetes
resources:
template: "kube_<<.Group>>_<<.Resource>>"
展開の指標を監視するカスタムHPA
プロメテウスのデプロイアプリケーションは、それが正常に動作します。アプリケーションは、基本的な方法ヘルムバッグ展開された後、あなたはそれらを繰り返さない、公式ヘルム迅速な展開パッケージを使用することができます。
スケーラブルなアプリケーションをデプロイする必要があります。ここで私はストレッチ目標として展開として展開シンプルnginxのサービスを、選択しました。
アプリケーションの名前空間では、カスタム指標を提供するために、アプリケーションをデプロイします。ここで私は、カスタム指標データのソースとして、公式プロメテウス・ノード・輸出国を選び、道nodeport露光データポートインチ このアプリケーションは、daemonSetの方法は、各クラスタノードK8S上で実行している、と自分自身のノードに指標を得るために開かれます。
あなたは既にプロメテウスインタフェースでノード・輸出暴露の指標を見ることができます。
展開プロメテウスアダプタアプリケーション。次のようにそのプロファイル値ヘルムパケット、設定ファイルを変更します。
rules:
- metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)
name:
as: ""
matches: (.*)_seconds_total$
resources:
template: <<.Resource>>
seriesFilters: []
seriesQuery: '{namespace!="",pod!=""}'
- metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)
name:
as: ""
matches: (.*)_total$
resources:
template: <<.Resource>>
seriesFilters:
- isNot: (.*)_seconds_total$
seriesQuery: '{namespace!="",pod!=""}'
- metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
name:
as: ""
matches: (.*)$
resources:
template: <<.Resource>>
seriesFilters:
- isNot: (.*)_total$
seriesQuery: '{namespace!="",pod!=""}'
上記の設定ファイルとインデックス_Total secondstotal端プロメテウスは、組み込み関数の速度を用いて計算し、インデックスとして、対応する名前サフィックスを除去しました。
我々はK8Sビューメトリックでkubectlを使用していることは、インデックスを取得することができます
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/
あなたは、インデックスを取得することができますすべての名前が表示されますが、我々はアダプター構成ファイルに変更をある程度行うために、名前と元のデータと指標は、多少異なっていました。
その後、我々は正確に表示することができるかどうか、この指標をnode_cpuものを手に入れます
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/my-nginx/pods/*/node_cpu | jq .
このコマンドデータには次のような結果、私の-nginxのnamspaceの下ですべてのメトリックnode_cpuポッドのために表示することができます
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/my-nginx/pods/%2A/node_cpu"
},
"items": [
{
"describedObject": {
"kind": "Pod",
"namespace": "my-nginx",
"name": "prometheus-node-exporter-b25zl",
"apiVersion": "/v1"
},
"metricName": "node_cpu",
"timestamp": "2019-10-29T03:33:47Z",
"value": "3822m"
}
]
}
すべてのコンポーネントの記述が正しく動作OK、ここでは、HPAはスムーズにこの指標を得ることができます。注HPAと、監視対象のオブジェクトは、オブジェクトが同じ名前空間にスケーラブルに展開する必要があること、またはあなたは、対応するインデックスよりも取得します。次のように展開HPAは、ファイルYAML:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-asdfvs
namespace: my-nginx
spec:
scaleTargetRef:
apiVersion: apps/v1beta1
kind: Deployment
name: my-nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Object
object:
metric:
name: node_cpu
describedObject:
apiVersion: v1
kind: Pod
name: prometheus-node-exporter-b25zl
target:
type: Value
value: 9805m
私たちは、このポッドのこのインジケータプロメテウス・ノード・輸出国node_cpu当社nginxのに基づいて動的にスケーラブルなアプリケーションになります。
私たちは、このHPAを見てもらいます
kubectl get horizontalPodAutoscaler -n my-nginx hpa-asdfvs -o yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-29T02:54:50Z","reason":"ReadyForNewScale","message":"recommended
size matches current size"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-29T03:05:24Z","reason":"ValidMetricFound","message":"the
HPA was able to successfully calculate a replica count from Pod metric node_cpu"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-29T02:54:50Z","reason":"DesiredWithinRange","message":"the
desired count is within the acceptable range"}]'
autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Object","object":{"target":{"kind":"Pod","name":"prometheus-node-exporter-b25zl","apiVersion":"v1"},"metricName":"node_cpu","currentValue":"3822m"}}]'
autoscaling.alpha.kubernetes.io/metrics: '[{"type":"Object","object":{"target":{"kind":"Pod","name":"prometheus-node-exporter-b25zl","apiVersion":"v1"},"metricName":"node_cpu","targetValue":"9805m"}}]'
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"hpa-asdfvs","namespace":"my-nginx"},"spec":{"maxReplicas":10,"metrics":[{"object":{"describedObject":{"apiVersion":"v1","kind":"Pod","name":"prometheus-node-exporter-b25zl"},"metric":{"name":"node_cpu"},"target":{"type":"Value","value":"9805m"}},"type":"Object"}],"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1beta1","kind":"Deployment","name":"my-nginx"}}}
creationTimestamp: "2019-10-29T02:54:45Z"
name: hpa-asdfvs
namespace: my-nginx
resourceVersion: "164701"
selfLink: "/apis/autoscaling/v1/namespaces/my-nginx/horizontalpodautoscalers/hpa-asdfvs"
uid: 76fa6a19-f9f7-11e9-8930-0242c5ccd054
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1beta1
kind: Deployment
name: my-nginx
status:
currentReplicas: 1
desiredReplicas: 1
lastScaleTime: "2019-10-29T03:06:10Z"
HPAアノテーションは道v1のバージョンでの仕事で見ることができ、かつMATRICSは、フィールド内の注釈を書きます。フィールドの条件の注釈では、我々は明らかにHPAは、この指標に取得されている参照してください。その後、我々は、ポッドが拡張またはポッドを減らすために、目標値を増加させるために、目標値を小さくしようとすることができます。ここでは、モニタのカスタムメトリックHPAは成功した展開しました。