ブログ | NGINX

マーラ: お近くのワークステーションで実行中

NGINX-F5 水平黒タイプ RGB の一部
ジェイソン・シュミット サムネイル
ジェイソン・シュミット
2022年4月22日公開

NGINX モダン アプリ リファレンス アーキテクチャ(MARA) プロジェクトに取り組み始めたとき、私たちはすでにこのプラットフォームに精通しており、部門予算を使用して支払うことができたため、IaaS プロバイダーとして AWS を選択しました。 もちろん、誰もが同じ経験や予算を持っているわけではありません。そのため、多くの方から、 K3sCanonical MicroK8sminikubeなどの Kubernetes ディストリビューションを使用して、ラボベースの環境やワークステーションで MARA をローカルに実行するためのオプションを提供するよう要望がありました。

皆様のご要望にお応えして、本日、MicroK8s で MARA をテストし、ご自身で導入できるように手順を提供できたことをお知らせいたします。

ワークステーション上で実行される NGINX モダン アプリ リファレンス アーキテクチャのトポロジを示す図

テストに MicroK8s を選んだのはなぜですか? MARA に必要な DNS、ストレージ、および出力機能を、メモリ フットプリントの小さい、簡単に導入できるモデルで提供するためです。 MicroK8s を使用すると、テスト シナリオを簡単に繰り返し実行して、適切なレベルのパフォーマンスを実現する展開の最小要件を決定できます。

この作業により、他の Kubernetes ディストリビューションのテストが容易になると期待しています。さまざまなディストリビューションの現在のステータスについては、 GitHub リポジトリを参照してください。 リストに載せたいお気に入りのディストリビューションがある場合は、フォークしてテストし、プル リクエストを作成してください。

リソース制約への対処

MARA をローカルで実行する場合の最大の制約は、メモリと CPU です。 予備テスト中に、メモリ枯渇の問題の大部分は Elasticsearch に関連していることがわかりました。 Kibana は、メモリ量が極めて少ない構成 ( 16 GB未満) ではほとんど使用できません。 この問題に対処するために、完全な Elasticsearch デプロイメントに通常備わっている冗長性保護を排除する設定を MARA 構成ファイルに用意しました。 これにより障害モードの数が増えますが、これはリソースが制限された環境では必要なトレードオフです。

CPU の制約は、サンプルのBank of Siriusアプリケーションにかかる負荷の量に直接関連しています。 MARA の導入には、Bank of Sirius に負荷を生成するLocustが含まれており、ユーザー数と新規ユーザーの生成率はユーザーが制御する設定になっています。

Bank of Sirius の負荷が増加すると、システムの残りの部分にも影響が及ぶことに注意してください。 ユーザー数または生成率のいずれかが高すぎる場合、MARA のパフォーマンスが低下し、コンポーネントがクラッシュしたり停止したりする可能性が高くなります。 この動作を引き起こす値は使用可能な CPU によって異なりますが、要件で指定された容量以上の展開では、最大 64 人のユーザーと一度に 16 人のユーザーのスパンのレートによって生じる負荷を処理できると予想されます。

MicroK8s への MARA の導入

背景知識が整いましたので、MicroK8s で MARA を立ち上げる準備が整いました。

要件

  • Ubuntu 20.04 (Focal)以降を実行しているシステム (ベアメタル Linux サーバー、仮想化、またはクラウド) のルートアクセス。最低限、次のものが必要です。

    • 20 GB ディスク
    • 16 GB メモリ
    • 4つのCPUに相当
  • MARA に必要なすべてのライブラリとバイナリを備えたローカル システム上の Python 3 仮想環境。 Python 3 がまだインストールされていない場合は、次のコマンドを実行します。

    $ sudo apt アップデート$ sudo apt インストール -y python3-venv
  • NGINX Ingress Controller の出力に割り当てる MicroK8s の統合MetalLBロード バランサー用の空き IPv4 アドレスが少なくとも 1 つ。 Bank of Sirius アプリケーションに localhost 経由でアクセスする場合は、使用可能な任意のプライベート( RFC 1918準拠)アドレスが受け入れられます。 たとえば、ネットワークが 192.168.100.0/24 の場合、10.10.10.10 などのアドレスを使用できます。

  • Pulumi アカウントとアクセス トークン。 これらがまだない場合は、 MARA のデプロイ手順 1で作成します。

    Pulumi では状態ファイルを S3 互換のオブジェクト ストアまたはローカル ファイル システムに保存できますが、執筆時点では MARA はこれをサポートしていないことに注意してください。 この制限は、MARA または Pulumi の将来のリリースでは削除される予定です。

MicroK8s のインストールと設定

  1. MicroK8sをインストールします。

    $ sudo snap install microk8s --classic microk8s (1.23/stable) v1.23.3 from Canonical✓ インストール済み
  2. microk8sコマンドを実行するために必要な権限を設定します。 のために <ユーザー名>、あなたのアカウントを置き換えてください システム上の権限:

    $ sudo usermod -a -G microk8s <ユーザー名> $ sudo chown -f -R <ユーザー名> ~/.kube $ newgrp microk8s
  3. 新しい権限を有効にするには、ルート権限を持つアカウントからログアウトして再度ログインしてください。

  4. DNSストレージMetalLB用の MicroK8s アドオンを有効にします。

    プロンプトで、次のいずれかを表すX . X . X . XX . X . X . Yの形式で IP アドレス範囲を指定します。

    • 実際のプライベートIPアドレスの範囲(例:192.168.100.100-192.168.100.110 (以下で使用される値)
    • 単一のプライベートIPアドレス(例:192.168.100.100-192.168.100.100
    $ microk8s enable dns storage metallb DNS を有効にしています マニフェストを適用しています...
    kubelet の再起動 DNS が有効になっています デフォルトのストレージ クラスを有効にしています...
    ストレージはまもなく利用可能になります MetalLBを有効にする 各IPアドレス範囲をカンマで区切って入力します(例: '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'): 192.168.100.100-192.168.100.110
    Metallb マニフェストを適用しています...
    MetalLBが有効になっています
  5. MicroK8s が実行されていることを確認します。

    $ microk8s status microk8s は高可用性を実行しています: データストア マスター ノードがありません: 127.0.0.1:19001 データストア スタンバイ ノード: なし アドオン: 有効: dns # CoreDNS ha-cluster # 現在のノードで高可用性を構成します metallb # Kubernetes クラスターのロードバランサー storage # ストレージ クラス。ホスト ディレクトリからストレージを割り当てます...
  6. ほとんどのユーティリティが見つけられると想定されるファイル ( ~/.kube/config ) に MicroK8s 構成をロードし、ディレクトリとファイルに推奨される権限を設定します。

    $ microk8s 設定 > ~/.kube/config $ sudo chmod 0644 ~/.kube/config

MARA リポジトリをクローンして MicroK8s クラスターをセットアップする

  1. MARA リポジトリをクローンし、Bank of Sirius サブモジュールを初期化します。

    $ git clone https://github.com/nginxinc/kic-reference-architectures.git $ cd kic-reference-architectures/ $ git サブモジュール更新 --init --recursive --remote
  2. クローンされた MARA リポジトリのルート ディレクトリ (前の手順でディレクトリを変更しました) で作業し、MicroK8s クラスターの Python 仮想環境を設定します。

    $ ./bin/setup_venv.sh

    このコマンドは長いトレースを生成します。 エラーがある場合は、MARA GitHub リポジトリの既知の問題/警告セクションで提案を確認してください。

  3. Python 仮想環境をアクティブにします。 このコマンドは、仮想環境を使用するためにPATHおよびその他の環境変数を設定します。

    $ソース ./pulumi/python/venv/bin/activate
  4. MicroK8s クラスターが MARA デプロイメント用に正しく構成されていることを確認します。

    $ ./bin/testcap.shこのスクリプトは、現在アクティブな Kubernetes 構成とコンテキストを使用して、現在の Kubernetes インストールでテストを実行します。
    失敗はインストールが MARA を実行するために必要な最小限の機能セットを満たしていないことを示しているため、調査する必要があります。... ===================================================================== | すべてのテストに合格しました。 このシステムは、MARA を展開するための基本要件を満たしています。 | ===================================================================

MARAを展開する

このセクションで MARA をデプロイするために使用されるstart.shスクリプトには、デプロイを成功させるために追加のアクションを必要とするオプションが含まれています。 簡単にするために、ここでは次のような基本的な展開を想定します。

  • サポートされている他のデプロイメント オプションではなく、kubeconfig ファイルを使用します。 その他のオプションの詳細については、GitHub リポジトリの「スタートガイド」を参照してください。
  • MARA をテストした最新バージョンの NGINX Open Source を使用します (必ずしも最新バージョンである必要はありません)。
  • NGINX オープンソースに基づく NGINX Ingress コントローラーを使用します。 NGINX Plus に基づく NGINX Ingress Controller を使用する場合は、Kubernetes クラスター内の F5 Docker レジストリからNGINX Plus ベースのイメージを使用する必要があります。 詳細については、以下のステップ 3の最初の「お知らせ」を参照してください。
  • 単一の標準 Kubernetes コンテキストを使用します。 ステップ 3 の 2 番目の「NOTE!」を参照してください。

MicroK8s クラスターに MARA をデプロイします。

  1. start.shスクリプトを実行します。

    Pulumi を使用するようにワークステーションをまだ設定していない場合は、Pulumi にログインするように指示され (必要に応じてアカウントを作成)、Pulumi アカウントに関連付けられた API トークンの入力を求められます。

    $ ./bin/start.sh [/home/ubuntu/kic-reference-architectures/bin/venv/bin] を PATH に追加します。ログインして Pulumi スタックを管理します。
    代替ログイン オプションについては、`pulumi login --help` を実行してください。
    https://app.pulumi.com/account/tokens からアクセス トークンを入力するか、<ENTER> を押してブラウザを使用してログインします。 <トークン>
    
    詳細についてはドキュメントをお読みください。
  2. デプロイメント タイプを選択し、プロンプトでkと入力して、kubeconfig ファイルを使用してデプロイメントを構築します。 makeと Docker がインストールされていないことに関する警告は無視してください。デプロイメントでは代わりにレジストリからの NGINX Ingress Controller イメージが使用されます。

    AWS の場合は a、kubeconfig の場合は k と入力します。k kubeconfig起動スクリプト make を呼び出していますが、インストールされていません。ソースから NGINX Kubernetes Ingress Controller を構築する場合は、これをインストールする必要があります。docker がインストールされていません。ソースから NGINX Kubernetes Ingress Controller を構築する場合は、これをインストールする必要があります。
  3. プロンプトで、作成する Pulumi スタックの名前を指定します (ここではmara )。 Pulumi アカウント内で一意である必要があります。

    すべてのプロジェクトで使用する Pulumi スタックの名前を入力してください: maraサブモジュール ソースが見つかりました スタックを使用するようにすべての Pulumi プロジェクトを構成しています: mara スタック 'mara' が作成されました 注意! 現在、kubeconfig 経由のデプロイメントでは、レジストリからのイメージのプルのみがサポートされています。 NGINX Plus リポジトリにアクセスするには JWT が必要です。 これは、ルートの extras ディレクトリ内の jwt.token という名前のファイルに配置する必要があります。詳細と例については、https://docs.nginx.com/nginx-ingress-controller/installation/using-the-jwt-token-docker-secret/ を参照してください。
    
    JWT が見つかりません。プレースホルダー マニフェストの書き込み中。注意! kubeconfig ファイルを使用する場合は、環境が Kubernetes に適切に接続するように構成されていることを確認する必要があります。 複数の Kubernetes コンテキスト (またはカスタム コンテキスト) がある場合は、それらを削除して、単純な ~/.kube/config ファイルに置き換える必要がある場合があります。 これは将来のリリースで対処される予定です。
  4. プロンプトで、kubeconfig ファイルへのフルパスとクラスターの名前を指定します。 ここにあります /家/<ユーザー名>設定ファイル そして microk8s クラスター

    kubeconfig ファイル値への絶対パスを指定します: /家/<ユーザー名>設定ファイル
    クラスター名
    値を入力してください: microk8s クラスター
    Kubernetes クラスタに接続しようとしています
  5. 次のプロンプトで、クラスターの完全修飾ドメイン名 (FQDN) を指定します。 このスクリプトは、NGINX Ingress Controller を構成することと、自己署名証明書を作成することの 2 つの目的で FQDN を使用します (2 番目の用途では、値を IP アドレスにすることはできません)。 mara.example.comを別の FQDN に置き換える場合は、次の手順でもそれを使用することを忘れないでください。

  6. デプロイメント値の FQDN を作成します: mara.example.com
  7. Grafana 管理者パスワードを指定します:

    Grafana 管理者ユーザーのパスワードを作成します。このパスワードは Grafana ダッシュボードにアクセスするために使用されます。これはシェル特殊文字を含まない英数字の文字列である必要があります。Pulumi シークレットの現在の制限により、プレーンテキストで表示されます。 Grafana ダッシュボードにアクセスするにはこのパスワードが必要です。値: <パスワード>
  8. インストール プロセスのトレースが表示され、各ステップで次の情報が表示されます。

    • ステップで実行される主要なアクションを説明するバナー(たとえば、 Logstore はElasticsearch デプロイメントの開始を通知します)
    • Pulumiが実行するタスクのリスト
    • Pulumiの各タスクのリアルタイムステータスインジケーター
    • PulumiとMARAによって生成された診断(定義されたホスト名とIPアドレスなど)
    • 影響を受けるリソースの数
    • 経過時間

    最後のステップ(Bank of Siriusの場合)が完了すると、トレースはMetalLBによってNGINX Ingress Controllerに割り当てられたIPアドレスを報告します(ここでは192.168.100.100) と、デプロイメント用に選択した FQDN (ここではmara.example.com ) に加えて、デプロイメントに関するその他の情報を入力します。

    起動プロセスが正常に終了しました
    次の手順:
    1. Ingress コントローラーの IP アドレス (192.168.100.100) を FQDN (mara.example.com) にマッピングします。
    2. ./bin/test-forward.sh プログラムを使用して、管理ツールへの接続に使用できるトンネルを確立します。
    3. kubectl、k9s、または Kubernetes ダッシュボードを使用して、デプロイメントを調査します。
    
    定義されたパスワードを含む構成オプションを確認するには、次のコマンドを使用して pulumi シークレットにアクセスできます。
    
    メイン構成: pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/config
    
    Bank of Sirius (サンプル アプリケーション) 構成: pulumi config -C /jenkins/workspace/jaytest/bin/../pulumi/python/kubernetes/applications/sirius
    
    K8 ロードバランサー IP: kubectl get services --namespace nginx-ingress
    
    詳細については、github リポジトリのドキュメントをご覧ください
  9. FQDN の解決に使用するツール (ローカルの/etc/hostsファイルや DNS サーバーなど) で、前の手順で報告された FQDN と IP アドレス間のマッピングを作成します。

  10. MARA デプロイメントへのリクエストが成功したことを確認します。 curl が自己署名証明書を受け入れるように、 -kオプションを含めます。 証明書の詳細情報を表示するには、 -vオプションを追加します。

    $ curl -k -I https://mara.example.com HTTP/1.1 200 OK サーバー: nginx/1.21.5 日付: DD 月 YYYY hh:mm:ss TZコンテンツタイプ: text/html; charset=utf-8 コンテンツ長: 7016 接続: キープアライブ
  11. ブラウザでhttps://mara.example.comに移動し、Bank of Sirius の Web サイトを表示します。 本稿執筆時点では、多くのブラウザ (Firefox や Safari を含む) では、自己署名証明書を使用しているサイトに関する警告を安全にクリックスルーできます。 Chrome を使用しないことをお勧めします。最近のセキュリティの変更により、サイトにアクセスできなくなる可能性があります。

  12. test-forward.shスクリプトを実行して Kubernetes ポート転送を設定し、MARA 管理スイートのツール ( ElasticsearchGrafanaKibanaLocustPrometheus)にアクセスできるようにします。 スクリプトは適切なサービス名を決定し、 kubectlコマンドを実行してそれらをローカル ポートに転送します。

    注記: ポート転送が正しく機能するには、このコマンドを実行するコマンド シェルと同じシステム上でブラウザーが実行されている必要があります。 そうでない場合(たとえば、仮想化環境を使用している場合)、コマンドは成功したように見えますが、ポート転送は実際には機能しません。 詳細については、GitHub リポジトリの「MARA の管理ツールへのアクセス」を参照してください。

    $ ./bin/test-forward.sh接続の詳細 ==================================== Kibana: http://localhost:5601 Grafana: http://localhost:3000 Locust: http://localhost:8089 Prometheus: http://localhost:9090 Elasticsearch: http://localhost:9200 ====================================== 終了するには Ctrl-C を発行します

まとめ

それでおしまい! これらの手順に従うと、約 20 分以内に MARA デプロイメントが環境内で稼働します。 この時点で、他の Kubernetes アプリケーションと同様に、Bank of Sirius アプリケーションと対話できます。 まず、組み込みの可観測性ツールを使用して、Locust でさまざまな量の負荷を生成したときに環境がどのように動作するかをテストすることをお勧めします。

私たちの目標は、できるだけ多くの Kubernetes ユーザーにとって MARA をできるだけ便利なものにすることです。 一部のコンポーネントの選択が気に入らないですか? 共有したい場合は、コンポーネントを置き換えてプル リクエストを開くことをお勧めします。 また、私たちのリポジトリの「問題ディスカッション」ページで、ご意見やご質問(私たちが行った疑わしい仮定など)をお寄せください。

関連記事

この投稿はシリーズの一部です。 今後 MARA に機能が追加されるにつれて、その詳細をブログで公開していきます。


「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"