1. 概要Horizontal Pod Autoscaler (HPA) は、平均 CPU 使用率、平均メモリ使用率、または指定したその他のカスタム メトリックに基づいて、Deployment、ReplicaSet、StatefulSet などのリソースを自動的に調整し、デプロイメントの自動拡張と縮小を実現して、デプロイメントのスケールが実際のサービス負荷に近くなるようにしています。 HPA は、DaemonSet などのスケーリングできないオブジェクトには適していません。 公式ドキュメント: https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/ 実際の生産では、一般的に次の 4 種類の指標が使用されます。 - リソース メトリック - CPU コアとメモリの使用率メトリック。
- ポッド メトリック (ネットワーク使用率やトラフィックなど)。
- オブジェクト メトリック - Ingress などの特定のオブジェクトのメトリックを使用して、1 秒あたりのリクエスト数でコンテナーをスケーリングできます。
- カスタム メトリック - サービス応答時間の定義や、応答時間が特定の指標に達したときに自動的にスケールアップするなどのカスタマイズされた監視。
2. metrics-serverをインストールする1) HPAの前提条件デフォルトでは、Horizontal Pod Autoscaler コントローラーは一連の API からメトリックを取得します。クラスター管理者は、HPA コントローラーがこれらの API にアクセスできるようにするために、次の条件を確認する必要があります。 - リソース メトリックの場合、通常は metrics-server によって提供される metrics.k8s.io API が使用されます。クラスタープラグインとして起動できます。
- カスタム メトリックの場合は、custom.metrics.k8s.io API が使用されます。これは、他のメトリック ソリューション ベンダーの「アダプタ」API サーバーによって提供されます。メトリクス パイプラインをチェックして、Kubernetes メトリクス アダプターが利用可能かどうかを確認します。
- 外部メトリックの場合、external.metrics.k8s.io API が使用されます。上記のカスタム メトリック アダプターによって提供される可能性があります。
Kubernetes メトリクス サーバー: - Kubernetes Metrics Server は、クラスターのコア監視データを集約するサーバーです。デフォルトでは kubeadm によってデプロイされません。
- メトリック サーバーは、ダッシュボードなどの他のコンポーネントによって使用されます。これは拡張された APIServer であり、API Aggregator に依存します。したがって、Metrics Server をインストールする前に、kube-apiserver で API Aggregator を有効にする必要があります。
- Metrics API は現在のメトリック データのみを照会でき、履歴データは保存しません。
- Metrics API URI は /apis/metrics.k8s.io/ であり、k8s.io/metrics で管理されています。
- この API を使用するには、Metrics-server をデプロイする必要があります。 Metrics-server は、kubelet Summary API を呼び出してデータを取得します。
2) APIアグリゲータを有効にする # この行を追加 # --enable-aggregator-routing=true ### 各 API サーバーの kube - apiserver.yaml構成を変更して、アグリゲーター ルーティングを有効にします。マニフェスト構成を変更すると、API サーバーは自動的に再起動して変更が有効になります。 /etc/kubernetes/manifests/kube-apiserver.yamlを編集します。 3) metrics-serverのインストールを開始するGitHubアドレス: https://github.com/kubernetes-sigs/metrics-server/releases ダウンロード https://github.com/kubernetes-sigs/metrics-server/releases/download/metrics-server-helm-chart-3.8.2/components.yamlを取得します。 改訂 ... テンプレート: メタデータ: ラベル: k8s -アプリ:メトリクス-サーバー 仕様: コンテナ: -引数: - --cert-dir=/tmp - --secure-port=4443 - --kubelet-preferred-address-types=内部IP、外部IP、ホスト名 - --kubelet-use-node-status-port - --kubelet-insecure-tls # この起動パラメータを追加します。そうでない場合、エラーが発生する可能性があります。 イメージ: registry .aliyuncs .com / google_containers / metrics - server : v0.6.1 # イメージアドレスは状況に応じて変更できます imagePullPolicy : IfNotPresent ... メトリック サーバー ポッドを起動できず、ログ「メトリックを完全に収集できません: ... x509: 証明書を検証できません。IP SAN が含まれていないためです...」が表示されます。解決策: 証明書の検証をスキップするには、metrics-server に --kubelet-insecure-tls パラメータを追加します。
インストールを開始 kubectl apply -fコンポーネント.yaml kubectl get ポッド- n kube -システム| grep メトリック-サーバー # チェック kubectl get ポッド- n kube -システム| grep メトリック-サーバー # ノードとポッドのリソース使用状況を表示する kubectl トップノード kubectl トップポッド III.水平ポッドオートスケーラーの仕組み1) 原理アーキテクチャ図- 自動検出期間は、kube-controller-manager の --horizontal-pod-autoscaler-sync-period パラメータによって設定されます (デフォルトの間隔は 15 秒です)。
- metrics-server は、ポッド リソースの使用をサポートする metrics.k8s.io API を提供します。
- 15 秒/サイクル -> metrics.k8s.io API をクエリ -> アルゴリズムの計算 -> スケール スケジューリングの呼び出し -> 特定のスケーリング戦略の実行。
2) HPAスケーリングアルゴリズム最も基本的なレベルでは、Horizontal Pod Autoscaling コントローラーは、現在のメトリックと目的のメトリックに基づいてスケーリング比率を計算します。
予想されるレプリカ数= ceil [現在のレプリカ数* (現在のインデックス/予想されるインデックス) ] 1. 能力拡大- 計算されたスケーリング比率が 1.0 に近い場合、スケーリングは中止され、メトリック/期待される指標は 1.0 に近くなります。
2. 縮小- クールダウン/遅延: 遅延(クールダウン)時間を短く設定しすぎると、レプリカの数が以前と同様に変動する可能性があります。デフォルト値は5分(5m0s)です --horizontal-pod-autoscaler-downscale-stabilization
3. 特別扱い- 損失メトリック: スケールダウンする場合は、これらのポッドがターゲット値の 100% を消費すると想定し、スケールアップする場合は、これらのポッドがターゲット値の 0% を消費すると想定します。これにより、膨張と収縮をある程度抑制することができます。
- 準備ができていないポッドがある場合: 準備ができていないポッドは必要なメトリックの 0% を消費すると保守的に想定し、スケーリングをさらに削減します。
- 準備ができていないポッドとメトリックが欠落しているポッドが考慮され、使用率が再計算されます。新しい比率がスケーリングの反対方向であるか、許容範囲内である場合、スケーリングはスキップされます。それ以外の場合は、新しいスケーリング係数を使用します。
- 複数のインジケーターを指定した場合、スケールインおよびスケールアウトするレプリカの数はインジケーターごとに計算され、その最大値がスケーリングに使用されます。
3) HPAオブジェクト定義 apiバージョン:自動スケーリング/ v2beta2 種類: HorizontalPodAutoscaler メタデータ: 名前: nginx 仕様: 行動: スケールダウン: ポリシー: -タイプ:ポッド 値: 4 期間秒数: 60 -タイプ:パーセント 値: 10 期間秒数: 60 安定化ウィンドウ秒数: 300
スケールターゲット参照: apiバージョン:アプリ/ v1 種類:デプロイメント 名前: nginx 最小レプリカ数: 1 最大レプリカ数: 10 メトリクス: -タイプ:リソース リソース: 名前: CPU ターゲット: タイプ:利用 平均使用率: 50 HPAオブジェクトのデフォルトの動作 行動: スケールダウン: 安定化ウィンドウ秒数: 300 ポリシー: -タイプ:パーセント 値: 100 期間秒数: 15 スケールアップ: 安定化ウィンドウ秒数: 0 ポリシー: -タイプ:パーセント 値: 100 期間秒数: 15 -タイプ:ポッド 値: 4 期間秒数: 15 選択ポリシー:最大 4. 例のデモンストレーション1) YAMLをオーケストレーションする apiバージョン:自動スケーリング/ v2 種類: HorizontalPodAutoscaler メタデータ: 名前: hpa - nginx 仕様: maxReplicas : 10 # 最大容量拡張は 10 ノード (ポッド) まで minReplicas : 1 # 1ノード(ポッド)の最小拡張 メトリクス: -リソース: 名前: CPU ターゲット: averageUtilization : 40 # CPU リソース使用率が 40 %に達し、容量が拡張されます。 40 %未満の場合、容量が減少します。 # メモリを設定する # 平均値: 40 タイプ:利用 タイプ:リソース スケールターゲット参照: apiバージョン:アプリ/ v1 種類:デプロイメント 名前: hpa - nginx --- APIバージョン: v1 種類:サービス メタデータ: 名前: hpa - nginx 仕様: タイプ: NodePort ポート: -名前: "http" ポート: 80 ターゲットポート: 80 ノードポート: 30080 セレクター: サービス: hpa - nginx --- apiバージョン:アプリ/ v1 種類:デプロイメント メタデータ: 名前: hpa - nginx 仕様: レプリカ: 1 セレクター: マッチラベル: サービス: hpa - nginx テンプレート: メタデータ: ラベル: サービス: hpa - nginx 仕様: コンテナ: -名前: hpa - nginx 画像: nginx :最新 リソース: リクエスト: CPU : 100m メモリ: 100マイル 制限: CPU : 200m メモリ: 200マイル 主なパラメータの説明は次のとおりです。 - scaleTargetRef: ターゲット オブジェクト。Deployment、ReplicationController、または ReplicaSet のいずれかになります。
- minReplicas と maxReplicas: Pod レプリカの最小数と最大数。システムはこの範囲内で自動的にスケールアップおよびスケールダウンし、各ポッドのメモリ使用量を上記で設定されたしきい値 averageUtilization である 40% に維持します。
- メトリック: ターゲット メトリック値。メトリックでは、インジケーターのタイプはパラメータ タイプによって定義されます。インジケーターの対応するターゲット値は、パラメーター target によって定義されます。インジケーター データが目標値に達すると、システムは拡張および収縮操作をトリガーします (許容範囲を考慮すると、前のアルゴリズム セクションの説明を参照)。
- CPU 使用率については、ターゲット パラメータに averageUtilization を設定して、目標の平均 CPU 使用率を定義します。
- メモリ リソースの場合、ターゲット パラメータに AverageValue を設定して、ターゲットの平均メモリ使用量の値を定義します。
埋め込む kubectl apply -fテスト.yaml 2) ストレステストに腹筋ツールを使用するApache の公式 Web サイト http://httpd.apache.org/ にアクセスして Apache をダウンロードするか、yum を使用して Apache を直接インストールすることもできます。ここでは、yumをインストールする最も簡単な方法を選択します。 yum インストール httpd -y ストレステストを開始する ab - n 100000 - c 800 http : //ローカル- 168-182-112 : 30080 /
# - c: 同時接続数 # - n: リクエストの総数 |