Nginx Ingress メトリクスに基づいて、指定されたバックエンドで HPA を実行します。

この記事は、Huawei Cloud Community「Nginx Ingress インジケーターに基づいて指定されたバックエンドで HPA を実行する」から共有されたものです。著者: 友達を作ることができます。

背景

運用シナリオでは、Nginx Ingress トラフィックは最終的にドメイン名とパスを通じて別のアプリケーションに転送されます。場合によっては、CPU とメモリが nginx のパフォーマンスのボトルネックではない場合、nginx_ingress_controller_requestsElasticly を達成するためのインジケーターに基づいて、対応するアプリケーション用に HPA を構成できます。さまざまなドメイン名とパスのリクエスト量に基づいてバックエンドのワークロードを指定します。

導入

環境整備

  • nginx-ingress がデプロイされました
  • クラウド ネイティブ監視プラグイン kube-prometheus-stack がインストールされています (サーバー モード)。このプラグインはデフォルトで nginx-ingress を監視します。オープンソース環境の場合は、自分で監視を設定してください。
  • kubectl コマンドを構成するか、cloudshell を使用する

scaleTargetRef注: HPA ルールと2 つのフィールドでは名前空間を指定できないためdescribedObject、インジケーター ソース、HPA、およびエラスティック ターゲットは同じ名前空間にある必要がありますが、nginx-ingress とビジネス ワークロードは通常、異なる名前空間にあります。このソリューションでは外部名前空間が使用されます。 HPA と入力すると、インジケーター ソースの名前空間は無視できます。

ステップ

デモに必要なエラスティック ターゲット ワークロード、サービス、イングレスを作成する

APIバージョン: アプリ/v1
種類:展開
metadata: 
  名前: テスト-hpa
  ラベル:
    アプリ: テストアプリ
仕様:
  レプリカ: 1
  セレクタ:
    マッチラベル:
      アプリ: テストアプリ
  テンプレート:
    metadata: 
      ラベル:
        アプリ: テストアプリ
    仕様:
      コンテナ:
      - 画像: skto/サンプルアプリ:v2
        名前: メトリクスプロバイダー
        ポート:
        - 名前: http
          コンテナポート: 8080
---
APIバージョン: v1
種類: サービス
metadata:
  名前: テストアプリ
  名前空間: デフォルト
  ラベル:
    アプリ: テストアプリ
仕様:
  ポート:
    - ポート: 8080
      名前: http
      プロトコル: TCP
      ターゲットポート: 8080
  セレクタ:
    アプリ: テストアプリ
  タイプ: ClusterIP

---
APIバージョン: アプリ/v1
種類:展開
metadata:
  名前: サンプルアプリ
  ラベル:
    アプリ: サンプルアプリ
仕様:
  レプリカ: 1
  セレクタ:
    マッチラベル:
      アプリ: サンプルアプリ
  テンプレート:
    metadata:
      ラベル:
        アプリ: サンプルアプリ
    仕様:
      コンテナ:
      - 画像: skto/サンプルアプリ:v2
        名前: メトリクスプロバイダー
        ポート:
        - 名前: http
          コンテナポート: 8080
---
APIバージョン: v1
種類: サービス
metadata:
  名前: サンプルアプリ
  名前空間: デフォルト
  ラベル:
    アプリ: サンプルアプリ
仕様:
  ポート:
    - ポート: 80
      名前: http
      プロトコル: TCP
      ターゲットポート: 8080
  セレクタ:
    アプリ: サンプルアプリ
  タイプ: ClusterIP
---
APIバージョン: networking.k8s.io/v1
種類: イングレス
metadata:
  名前: テスト入力
  名前空間: デフォルト
仕様:
  イングレスクラス名: nginx
  ルール:
    - ホスト: test.example.com
      http:
        パス:
          - バックエンド:
              サービス:
                名前: サンプルアプリ
                ポート:
                  数: 80
            パス: /
            パスタイプ: 実装固有
          - バックエンド:
              サービス:
                名前: テストアプリ
                ポート:
                  番号: 8080
            パス: /home
            パスタイプ: 実装固有

Query インジケーターtest.example.com/test.example.com/homenginx_ingress_controller_requests インジケーターはそれぞれ正常です。

画像.png

画像.png

外部タイプの apiservices リソースを作成します。通常、externalRules を追加すると、apiservices のステータスは true になります。

apiバージョン: apiregistration.k8s.io/v1
種類: APIService
metadata:
  名前: v1beta1.external.metrics.k8s.io
仕様:
  グループ: external.metrics.k8s.io
  グループ優先度最小: 100
  insecureSkipTLSVerify: true
  service: #prometheus-adapter に対応するサービスを指定します。Huawei CCE プラグインのアダプター名は、custom-metrics-apiserver です。
    名前: カスタムメトリクス-apiserver
    名前空間:監視
    ポート: 443
  バージョン: v1beta1
  バージョン優先度: 100

externalRules ルールをアダプターの構成マップに追加したら、prometheus-adapter サービスを再起動する必要があります。

kubectl -n 監視編集 configmap user-adapter-config

画像.png

外部ルール:
- metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
  名前:
    として: ${1}_per_秒
    一致: ^(.*)
  リソース:
    namespaced: false #インジケーター ソースの名前空間を無視します。この設定ではルールが適用されません。
  シリーズクエリ: nginx_ingress_controller_requests

 

seriesQuery : 元のインジケーター。インジケーター名を直接記述することも、{labelKey=labelValue} を使用して元のインジケーターを除外することもできます。

metricsQuery : PromQL を使用してインジケーターをフィルター処理および集計します。.Series元のインジケーターを表し、.LabelMatchersインジケーターのラベル フィルターを表します。特定のフィルター ルールは hpa で構成できます。

name : インジケーターの名前を変更します

resource : hpa がインジケーターをクエリするときに API を通じて呼び出されます。呼び出しパスは次のとおりです。

 

リソースの機能は、パス内の ${namespace} をインジケーター内の名前空間タグの値に置き換えることです。このソリューションでは、インジケーターのソース名前空間を無視する必要があります。

Custom-metrics-apiserver サービスを再起動した後、1 分ほど待ってからコマンドを実行し、インジケーターが正常であるかどうかを確認する必要があります。

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_requests_per_second

画像.png

HPA ルールの作成

apiVersion: 自動スケーリング/v2
種類: horizo​​ntalPodAutoscaler
metadata: 
  名前: サンプル-hpa
仕様:
  スケールターゲット参照:
    APIバージョン: アプリ/v1
    種類:展開
    名前: サンプルアプリ
  分 返信数: 1
  最大レプリカ数: 10
  メトリクス:
    - タイプ: 外部
      外部の:
        メトリック:
          名前: nginx_ingress_controller_requests_per_second
          セレクタ:
            matchLabels: #このフィールドを通じてインジケーターをフィルターできます。ここでのラベル フィルター条件は externalRules の <<.LabelMatchers>> に追加されます。
              exported_service:sample-app #バックエンドサービスがsample-appであるリクエストをフィルタリングします
              ホスト: test.example.com #ドメイン名 test.example.com にアクセスするリクエストをフィルターします
        目標:
          type: AverageValue #外部インジケーター タイプは、Value タイプと AverageValue タイプのターゲット値のみをサポートします。
          平均値: 30
---
apiVersion: 自動スケーリング/v2
種類: horizo​​ntalPodAutoscaler
metadata:
  名前: テスト-hpa
仕様:
  スケールターゲット参照:
    APIバージョン: アプリ/v1
    種類:展開
    名前: テストアプリ
  分 返信数: 1
  最大レプリカ数: 10
  メトリクス:
    - タイプ: 外部
      外部の:
        メトリック:
          名前: nginx_ingress_controller_requests_per_second
          セレクタ:
            マッチラベル:
              エクスポートされたサービス: テストアプリ
              ホスト: test.example.com
        目標:
          タイプ: 平均値
          平均値: 30

画像.png

柔軟なデモ

コマンドを使用して、サンプル アプリに対応するアクセス ドメイン名とパスをストレス テストし、通常どおり、ドメイン名と ELB アドレス間のマッピングを構成してください。

ab -c 50 -n 5000 http://test.example.com/

画像.png

同じ方法を使用して test-app をストレス テストし、通常どおり弾力性をトリガーします。

ab -c 50 -n 5000 http://test.example.com/home

画像.png

 

クリックしてフォローし、できるだけ早くHuawei Cloudの新しいテクノロジーについて学びましょう~

 

ライナスは、カーネル開発者がタブをスペースに置き換えるのを防ぐことに自ら取り組みました。 彼の父親はコードを書くことができる数少ないリーダーの 1 人であり、次男はオープンソース テクノロジー部門のディレクターであり、末息子はオープンソース コアです。寄稿者Robin Li: 自然言語 新しいユニバーサル プログラミング言語になるでしょう。オープン ソース モデルは Huawei にますます後れをとっていきます 。一般的に使用されている 5,000 のモバイル アプリケーションを Honmeng に完全に移行するには 1 年かかります。 リッチテキスト エディタ Quill 2.0 リリースされ、機能、信頼性、開発者は「恨みを取り除く ために握手を交わしました。 Laoxiangji のソースはコードではありませんが、その背後にある理由は非常に心温まるものです。Googleは大規模な組織再編を発表しました。
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4526289/blog/11053992