この記事は、Huawei Cloud Community「Nginx Ingress インジケーターに基づいて指定されたバックエンドで HPA を実行する」から共有されたものです。著者: 友達を作ることができます。
背景
運用シナリオでは、Nginx Ingress トラフィックは最終的にドメイン名とパスを通じて別のアプリケーションに転送されます。場合によっては、CPU とメモリが nginx のパフォーマンスのボトルネックではない場合、nginx_ingress_controller_requests
Elasticly を達成するためのインジケーターに基づいて、対応するアプリケーション用に 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/home
nginx_ingress_controller_requests インジケーターはそれぞれ正常です。
外部タイプの 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
外部ルール: - 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
HPA ルールの作成
apiVersion: 自動スケーリング/v2 種類: horizontalPodAutoscaler 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 種類: horizontalPodAutoscaler metadata: 名前: テスト-hpa 仕様: スケールターゲット参照: APIバージョン: アプリ/v1 種類:展開 名前: テストアプリ 分 返信数: 1 最大レプリカ数: 10 メトリクス: - タイプ: 外部 外部の: メトリック: 名前: nginx_ingress_controller_requests_per_second セレクタ: マッチラベル: エクスポートされたサービス: テストアプリ ホスト: test.example.com 目標: タイプ: 平均値 平均値: 30
柔軟なデモ
コマンドを使用して、サンプル アプリに対応するアクセス ドメイン名とパスをストレス テストし、通常どおり、ドメイン名と ELB アドレス間のマッピングを構成してください。
ab -c 50 -n 5000 http://test.example.com/
同じ方法を使用して test-app をストレス テストし、通常どおり弾力性をトリガーします。
ab -c 50 -n 5000 http://test.example.com/home
ライナスは、カーネル開発者がタブをスペースに置き換えるのを防ぐことに自ら取り組みました。 彼の父親はコードを書くことができる数少ないリーダーの 1 人であり、次男はオープンソース テクノロジー部門のディレクターであり、末息子はオープンソース コアです。寄稿者Robin Li: 自然言語 は 新しいユニバーサル プログラミング言語になるでしょう。オープン ソース モデルは Huawei にますます後れをとっていきます 。一般的に使用されている 5,000 のモバイル アプリケーションを Honmeng に完全に移行するには 1 年かかります。 リッチテキスト エディタ Quill 2.0 が リリースされ、機能、信頼性、開発者は「恨みを取り除く 」 ために握手を交わしました。 Laoxiangji のソースはコードではありませんが、その背後にある理由は非常に心温まるものです。Googleは大規模な組織再編を発表しました。