Kubernetes向けNGINX Agentを組み込んだNGINX PlusのDockerイメージを構築する

NGINX | 2023年4月18日

F5 NGINX Management Suiteは、単一の画面からNGINXデータプレーンを管理するためのモジュール群です。NGINX Open SourceおよびNGINX Plusインスタンスの管理を簡素化することで、アプリケーションとAPIのスケーリング、セキュリティ確保、監視のプロセスを効率化します。

NGINX Management Suiteで管理する各NGINXインスタンスには、コントロールプレーンとの通信およびリモート構成管理を有効にするために、NGINX Agentをインストールする必要があります。

ベアメタルまたは仮想マシン(VM)上で稼働するNGINXインスタンスについては、ドキュメントでインストール手順を提供しています。この記事では、Kubernetesやその他のマイクロサービスインフラストラクチャにデプロイされたNGINX PlusインスタンスもNGINX Management Suiteで管理できるようにするため、NGINX PlusとNGINX AgentのDockerイメージをビルドする方法を紹介します。

生成するDockerイメージに含める内容に応じて、3つのビルドオプションがあります。

[編集者 – この記事は2023年4月に更新され、手順が明確化されたほか、 ACM_DEVPORTALフィールドが「KubernetesでのDockerイメージの実行」のステップ1に追加されました。]

前提条件

NGINX PlusとNGINX AgentのDockerイメージを作成するために必要なリソースを収録したGitHubリポジトリを提供しています。このイメージは、NGINX Management SuiteのInstance Managerモジュールのバージョン2.8.0以降をサポートします。

Dockerイメージをビルドするには、以下が必要です。

  • Linuxホスト(ベアメタルまたはVM)
  • Docker 20.10+
  • 対象のDockerイメージをプッシュできるプライベートレジストリ
  • Instance Managerを備えた稼働中のNGINX Management Suiteインスタンス。開発者ポータルのサポートを利用する場合は、API Connectivity Managerも必要です
  • NGINX Plusのサブスクリプション(または30日間の無料トライアル)。必要に応じてNGINX App Protectのサブスクリプションも必要です

Dockerイメージを実行するには、以下が必要です。

  • 稼働中のKubernetesクラスター
  • kubectl(Kubernetesクラスターへのアクセス権が必要)

Dockerイメージのビルド

以下の手順に従ってDockerイメージをビルドします。

  1. GitHubリポジトリをクローンします:
$ git clone https://github.com/nginxinc/NGINX-Demos Cloning into 'NGINX-Demos'... 
remote: Enumerating objects: 126, done. 
remote: Counting objects: 100% (126/126), done. 
remote: Compressing objects: 100% (85/85), done. 
remote: Total 126 (delta 61), reused 102 (delta 37), pack-reused 0 
Receiving objects: 100% (126/126), 20.44 KiB | 1.02 MiB/s, done. 
Resolving deltas: 100% (61/61), done.
  1. ビルドディレクトリに移動します:
$ cd NGINX-Demos/nginx-agent-docker/
  1. Dockerが実行中であることを確認するために、docker psを実行します。次に、Dockerイメージに必要なソフトウェアを含めるため、build.shスクリプトを実行します。基本オプションは次のとおりです。追加オプションは次のとおりです。ソフトウェアの組み合わせごとのコマンドを以下に示します。基本イメージのビルドトレース例を以下に示します。末尾の「Build complete」メッセージは、ビルドが正常に完了したことを示します。
$ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -n https://nim.f5.ff.lan => Target docker image is nginx-plus-with-agent:2.7.0 
[+] Building 415.1s (10/10) FINISHED 
=> [internal] load build definition from Dockerfile
=> transferring dockerfile: 38B
=> [internal] load .dockerignore 
=> transferring context: 2B 
=> [internal] load metadata for docker.io/library/centos:7
=> [auth] library/centos:pull token for registry-1.docker.io
=> CACHED [1/4] FROM docker.io/library /centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
=> [internal] load build context 
=> transferring context: 69B 
=> [2/4] RUN yum -y update  && yum install -y wget ca-certificates epel-release curl  && mkdir -p /deployment /etc/ssl/nginx  && bash -c 'curl -k $NMS_URL/install/nginx-agent | sh' && echo "A  299.1s 
=> [3/4] COPY ./container/start.sh /deployment/
=> [4/4] RUN --mount=type=secret,id=nginx-crt,dst=/etc/ssl/nginx/nginx-repo.crt  --mount=type=secret,id=nginx-key,dst=/etc/ssl/nginx/nginx-repo.key  set -x  && chmod +x /deployment/start.sh &  102.4s  
=> exporting to image 
=> exporting layers 
=> writing image sha256:9246de4af659596a290b078e6443a19b8988ca77f36ab90af3b67c03d27068ff 
=> naming to registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 
=> Build complete for registry.ff.lan:31005/nginx-plus-with-agent:2.7.0
  1. KubernetesでDockerイメージを実行する 以下の手順に従ってDeploymentマニフェストを準備し、Kubernetes上でNGINX Agentを搭載したNGINX Plusを起動します。 今すぐ始める この記事で紹介したNGINXソリューションをお試しいただくには、今すぐ30日間の無料トライアルを開始するか、ユースケースについてお問い合わせください:ダウンロード:NGINX Agent – 無料のオープンソースです。
    • ‑C – NGINX Plusライセンス証明書ファイルの名前(nginx-repo.crt:以下のサンプルコマンドで使用)
    • ‑K – NGINX Plusライセンスキーファイルの名前(nginx-repo.key:以下のサンプルコマンドで使用)
    • ‑t – レジストリとターゲットイメージ。形式は「<registry_name>/<image_name>:<tag>」(以下のサンプルコマンドでは「registry.ff.lan:31005/nginx-plus-with-agent:2.7.0」)
    • ‑n – NGINX Management SuiteインスタンスのベースURL(https://nim.f5.ff.lan。以下のサンプルコマンドで使用)
    • ‑d – NGINX API Connectivity Managerの使用時に、開発者ポータルのデータプレーン対応を追加
    • ‑w – NGINX App Protect WAFを追加
    • NGINX PlusおよびNGINX Agent:
$ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \ -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 \ -n https://nim.f5.ff.lan
  • NGINX Plus、NGINX Agent、NGINX App Protect WAF(‑wオプションを追加):
$ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \-t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -w \ -n https://nim.f5.ff.lan
  • NGINX Plus、NGINX Agent、デベロッパーポータルのサポート(‑dオプションを追加):
$ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \ -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -d \ -n https://nim.f5.ff.lan
  1. 任意のテキストエディターで「manifests/1.nginx-with-agent.yaml」を開き、以下の変更を行います(コードスニペットでは、変更可能または変更が必要なデフォルト値がオレンジ色で強調表示されています)。
    • In the spec.template.spec.containersセクションで、デフォルトのイメージ名(your.registry.tld/nginx-with-nim2-agent:tag)を、‑tオプションを使用して「Dockerイメージのビルド」のステップ3で指定したDockerイメージ名(この例ではregistry.ff.lan:31005/nginx-plus-with-agent:2.7.0)に置き換えます。
spec:
  ...
  template:
    ...    
    spec:
      containers:
      - name: nginx-nim
        image: your.registry.tld/nginx-with-nim2-agent:tag
  • In the spec.template.spec.containers.envセクションで、指定された各valueフィールドのnameについて、次のように置き換えます。
spec:
  ...
  template:
    ...    
  spec:
    containers:
      ...
      env:
        - name: NIM_HOST
        ...
          value: "nginx-nim2.nginx-nim2"
        - name: NIM_GRPC_PORT
          value: "443"
        - name: NIM_INSTANCEGROUP
          value: "lab"
        - name: NIM_TAGS
          value: "preprod,devops"
  • NIM_HOST –(必須)デフォルト値(nginx-nim2.nginx-nim2)をNGINX Management SuiteインスタンスのFQDNまたはIPアドレスに置き換えます(この例ではnim2.f5.ff.lan)。
  • NIM_GRPC_PORT –(任意)デフォルト値(443)をgRPCトラフィック用の別のポート番号に置き換えます。
  • NIM_INSTANCEGROUP – (任意)デフォルト値(lab)を、NGINX Plusインスタンスが属するインスタンスグループに置き換えます。
  • NIM_TAGS – (任意)デフォルト値(preprod,devops)を、NGINX Plusインスタンス用のタグをカンマで区切ったリストに置き換えます。
  • また、spec.template.spec.containers.envセクションで、該当する条件が当てはまる場合は、次のname‑valueフィールドのペアをコメント解除します:
spec:
  ...
  template:
    ...    
  spec:
    containers:
      ...
      env:
        - name: NIM_HOST
        ...
        #- name: NAP_WAF # value: "true" #- name: NAP_WAF_PRECOMPILED_POLICIES # value: "true"
        ...
        #- name: ACM_DEVPORTAL # value: "true"
  • NIM_WAF と NIM_WAF_PRECOMPILED_POLICIES – NGINX App Protect WAFはイメージに含まれているため(「-w」オプションを「Dockerイメージのビルド」のステップ3で指定済み)、値は "true" です。
  • ACM_DEVPORTAL – App Connectivity Manager開発者ポータルのサポートがイメージに含まれているため(「-dDockerイメージのビルド」のステップ3でオプションを指定)、値は"true"です。
  1. 指示に従ってnginxwithAgentStart.shスクリプトを実行し、マニフェストを適用して2つのPodを起動します(マニフェストのreplicas: 2という指定がspecセクションにあるため)。各PodではNGINX PlusとNGINX Agentが実行されます:
$ ./scripts/nginxWithAgentStart.sh start$ ./scripts/nginxWithAgentStart.sh stop
  1. 2つのPodが実行中であることを確認します。各Podでは、NGINX Management Suiteのコントロールプレーンと通信するために、NGINX PlusインスタンスとNGINX Agentが実行されています。
$ kubectl get pods -n nim-test  NAME                        READY  STATUS   RESTARTS  AGE 
nginx-nim-7f77c8bdc9-hkkck  1/1    Running  0         1m 
nginx-nim-7f77c8bdc9-p2s94  1/1    Running  0         1m
  1. NGINX Management SuiteのNGINX Instance Manager GUIにアクセスし、2つのNGINX Plusインスタンスがステータス「オンライン」で実行されていることを確認します。この例では、NGINX App Protect WAFは有効になっていません。
    NGINX Management Suite Instance Managerバージョン2.7.0の[Instances Overview]ウィンドウのスクリーンショット


共有
タグ: F5 NGINX, Tech, 2023

著者について

Fabrizio Fiorucci
Fabrizio FiorucciNGINXソリューションアーキテクト | F5 (EMEA)

Fabrizio Fiorucciのその他のブログ記事

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります