マイクロサービス

NGINX Conf 2018 参加レポート in アトランタ

こんにちは、サイオステクノロジーの原です。
サイオステクノロジーは今年10月9日から10日(計2日間)、アトランタで開催されたNGINX Conf 2018に参加しました。

今年のカンファレンステーマは「Journey to Microservices」で、マイクロサービスへの転換の旅立ちに向けて
を開発者から運用者、アーキテクト達が有意義に情報を収集する時間であったと思います。

本記事では、ジェネラルセッションの内容を会場の雰囲気も交えながら要約してお伝え出来ればと思います。

会場

NGINX Conf 2018はジョージア州アトランタのLoews Atlanta Hotel Conference Roomにて執り行われました。

ジェネラルセッションの会場はこんな感じでした。
ロゴマークがいかにもマイクロサービスへの旅立ちを象徴しているようですね。

 

ジェネラルセッション(1日目)

初めにCEOのGus Robertson 氏が登壇しました。

内容としては、デジタル時代の企業に影響を与える最新動向、モダナイゼーションの手法、
そこでNGINXアプリケーションプラットフォームがどのように役立つか説明をされました。

デジタル時代を生き残っていくためには、インフラが柔軟性・俊敏性に富んでおり、サービスは独立化 / 分散化していくことが大切です。
今後、NGINXアプリケーションプラットフォームも動的なデリバリーゲートウェイ機能を重きに置いて展開されるようです。

続いてプロダクトマネージメントVP のSidney Rabsatt 氏が登壇しました。

NGINX,Inc が提供するテクノロジーと、ソリューションが企業組織に選択の自由を与え、モダナイゼーションを迅速にするために必要な要素、またアジャイルに実現する方法を説明されました。

ジェネラルセッション(2日目)

2日目はプロダクトマネージメント Sr.ディレクターの Owen Garrett氏が登壇し、
現在リリースされている製品全体の要約と今後の製品ロードマップ、コミュニティ版の主要な機能アップデートについて説明しました。

 

NGINX Controller 2.0では、各NGINX Plusで管理しているAPIもGUIベースで運用管理が行え、変更時に1台ずつ変更・修正を行う必要が無くなります。また、クライアントから各マイクロサービスへのAPI通信(1:n)も1回で済みます。そのため、数多のマイクロサービスを稼働しているユーザーには非常に運用管理コストが簡素化されます。

 

また、NGINX Unit 1.4では、SSL/TLS、Node.js対応により、セキュアでより軽量な動的アプリケーション作成が可能となり、マイクロサービス上でのパフォーマンス向上が見込まれます。

既存ユーザーでNGINX PlusはAPIゲートウェイとして40%も利用されているようです。その背景として、今年に入ってマイクロサービスへの移行化が本格的に始めている企業が増えていることにありそうです。

さいごに

海外では先行してマイクロサービス環境への投資/導入が進んでおり、来年度以降は“モノリシック / マイクロサービス”が混在したハイブリッド環境が主流となり、ますますサービスの独立化・Ingress Controller・APIゲートウェイの導入に拍車が掛かっているんだと思いました。

 

それとは裏腹に日本市場では、“マイクロサービス”への移行に踏み止まっている企業も多数あり、ロードバランサーでの提案で止まってしまっています。

そのため、現時点ではNGINX PlusでAPIゲートウェイの訴求が難しく、まずは“マイクロサービス”の費用対効果、移行プロセスをお客様、内部の経営層に理解・判断頂けるよう地道に啓蒙活動を行っていく必要性があると感じました。

NGINX PlusのAPIゲートウェイソリューション

こんにちわ、サイオステクノロジーの原です。

今回はNGINX PlusのAPIゲートウェイ機能に焦点を当てたいと思います。

 

APIゲートウェイとは

Web APIを用いたクラウドインテグレーションを行なう為に必要となるアーキテクチャです。

企業ネットワーク内にデプロイされているアプリケーションとパブリッククラウドサービスとの間
にゲートウェイとして機能し、全ての通信はこのAPIゲートウェイを介して行ないます。

例えば、通常はクライアントからバックエンドの各マイクロサービスのAPIを数回に渡って
呼び出すことが必要であり、クライアント側で各マイクロサービスのAPIを管理する必要が
ありました。
このAPIゲートウェイを導入することにより、クライアントはAPIゲートウェイに対して1回だけ
APIを呼び出すだけで、後はAPIゲートウェイが各マイクロサービスのAPIの呼び出しを肩代わり
してくれます。

APIゲートウェイの使用例

下記の表はAPIゲートウェイとしてのNGINX Plusが外部ソースからのAPIリクエストを管理し、
内部サービスにルーティングするための要件を満たす方法を示しています。

  APIゲートウェイ要件 NGINX Plusソリューション
コアプロトコル REST(HTTPS)、gRPC HTTP、HTTPS、HTTP / 2、gRPC
その他のプロトコル TCP-borneメッセージキュー WebSocket、TCP、UDP
リクエストルーティング リクエストは、サービス(ホストヘッダー)、APIメソッド(HTTP URL)、およびパラメーターに基づいてルーティングされます ホストヘッダー、URL、およびその他の要求ヘッダーに基づいた非常に柔軟なリクエストルーティング
APIライフサイクルの
管理
従来のAPIリクエストの書き換え、廃止予定のAPIへの呼び出しの拒否 要求に直接ルーティングまたは応答するための包括的な要求書き換えと豊富な意思決定エンジン
脆弱なアプリケーションの保護 APIとメソッドによるレート制限 送信元アドレス、要求パラメータを含む複数の基準によるレート制限。バックエンドサービスへの接続制限
オフロード認証 着信要求の認証トークンの検査 JWT、APIキー、外部認証サービス、OpenID Connectなどの複数の認証方法のサポート
変化するアプリケーショントポロジの管理 構成変更を受け入れ、青緑のワークフローをサポートするためのさまざまなAPIの実装 エンドポイントを特定するためのAPIとサービスディスカバリーの統合 ブルーグリーンデプロイメントやその他のユースケース用にAPIを編成できます

NGINX PlusではWebトラフィックを容易に管理出来、プロトコル(HTTP/2, HTTP, FastCGI, uwsgi)を変換し、一貫した設定とモニタリングGUIの提供が可能です。

NGINX PlusのAPIゲートウェイ機能

NGINXコミュニティ版はもとはHTTP(Web)トラフィックのゲートウェイとして開発されており、設定されているプリミティブはHTTPリクエストの観点から表現されています。
NGINX Plusではより複雑なAPIをマップし、多くの一般的なAPIゲートウェイタスクを処理します。

NGINX PlusによるAPIゲートウェイの各処理方法の詳細については以下のリンクを参照下さい。

【参考URL】

https://www.nginx.com/blog/consolidating-your-api-gateway-and-load-balancer-with-nginx/

Kubernetesによる負荷分散のための コミュニティ版NGINXおよびNGINX Plus Ingress Controller

この記事はNGINX,Inc.のブログ記事「NGINX and NGINX Plus Ingress Controllers for Kubernetes Load Balancing」を和訳した内容となります。

URL: https://www.nginx.com/blog/nginx-plus-ingress-controller-kubernetes-load-balancing/

マシンのクラスタ全体で、コンテナ内のマイクロサービスアプリケーションを実行して管理することは、困難な作業です。Kubernetesは、コンテナオーケストレーションのための強力なソリューションを提供することで、チャレンジを達成するのに役立ちます。フォールトトレランス、自動スケーリング、ローリングアップデート、ストレージ、サービスディスカバリ、ロードバランシングなどのいくつかの重要な機能が含まれています。

このブログ記事では、コミュニティ版NGINXまたはNGINX PlusIngressの使い方について説明します。Ingressは、HTTPトラフィック用のKubernetesロードバランシングフレームワークを内蔵しています。Ingressでは、Kubernetesクラスタ内のサービスへの外部トラフィックのルーティングを制御するルールを設定できます。Ingress Controllerは、クラスタに展開しKubernetesとロードバランサを統合するソフトウェアで、任意のロードバランサを選択できます。ここでは、Ingressを備えたマイクロサービスアプリケーションと、NGINX PlusおよびNGINX用で提供されているIngress Controllerのロードバランシングを設定する方法を説明します。

[編集者 – 以前はNGINXとNGINX Plus用に別々のControllerがありましたが、
現在両方のIngress Controllerに統合しました。]

このブログ記事では、KubernetesとIngressのHTTPロードバランシングのみを調査します。他のロードバランシングオプションの詳細については、ブログでLoad Balancing Kubernetes Services with NGINX Plusを参照してください。

注:このブログ記事で説明されている手順の詳細は、GitHubリポジトリを参照してください。この投稿はすべての必要なステップを追うものではなく、それらの指示へのリンクを提供します。

コミュニティ版NGINXおよびNGINX PlusのIngress Controllers

サンプルアプリケーションをデプロイしてロードバランシングを設定する前に、ロードバランサを選択し、対応するIngress Controllerをデプロイする必要があります。

Ingress Controllerは、特定のロードバランサとKubernetesを統合するソフトウェアです。私たちはコミュニティ版NGINXとNGINX Plusの両方のIngress Controllerを開発しました。GitHub リポジトリで利用できます。他にはサードパーティ製のものもあります。詳細については、KubernetesのGitHubリポジトリのIngress Controllersページを参照してください。

クラスタにNGINXまたはNGINX Plus Ingress Controllerを導入する方法の詳細については、GitHubリポジトリを参照してください。

サンプルマイクロサービスアプリケーション

サンプルアプリケーションは、それぞれが別々にデプロイされた複数のサービスで構成された典型的なマイクロサービス Webアプリケーションです。cafeと呼ばれるこのアプリケーションは、coffeeサービスを通じてteacoffeeを注文することができます。飲み物の好みをHTTPリクエストのURIで指定します。/ teaで終わるURIは、/ coffeeで終わるteaとURIで終わります。またアプリケーションへの接続はSSL / TLSで保護する必要があります。

以下の図は、NGINX Plusロードバランサがクライアントのリクエストを適切なサービスにルーティングする重要な役割を担い、SSL / TLSによるクライアント接続のセキュリティを確保しながら、アプリケーションを概念的に示しています。

クラスタにアプリケーションをデプロイするには、GitHubリポジトリの指示に従います。

IngressによるKubernetesロードバランシングの設定

私たちのcafeアプリでは、2つの機能を提供するためにロードバランサが必要です。

  • 要求URIに基づくルーティングパスベースルーティングとも呼ばれる)
  • SSL / TLSターミネーション

Ingressでロードバランシングを設定するには、Ingressリソースでルールを定義します。ルールは、外部トラフィックをクラスタ内のサービスにルーティングする方法を指定します。

リソースでは、それぞれ異なるドメイン名の複数の仮想サーバーを定義できます。仮想サーバーは、通常クラスタに展開された単一のマイクロサービスアプリケーションに対応しています。各サーバーについて、次のことができます。

  • 複数のパスベースのルールを指定します。リクエストURIに基づいて、
    アプリケーション内の異なるサービスにトラフィックが送信されます。
  • SSL / TLS証明書と鍵を参照してSSL / TLS終了を設定します。

Ingressの詳細については、Ingressのドキュメントページをご覧ください

cafeアプリ(cafe-ingress.yaml)のIngressリソースは次のとおりです。

1. apiVersion: extensions/v1beta1
2. kind: Ingress
3. metadata:
4.  name: cafe-ingress
5. spec:
6.  tls:
7.  – hosts:
8.    – cafe.example.com
9.    secretName: cafe-secret
10.  rules:
11.  – host: cafe.example.com
12.    http:
13.      paths:
14.      – path: /tea
15.        backend:
16.          serviceName: tea-svc
17.          servicePort: 80
18.      – path: /coffee
19.        backend:
20.          serviceName: coffee-svc
21.          servicePort: 80

行ごとに調べると、次のようになります。

  • 4行目では、リソースのcafe-ingressの名前を付けます。
  • 6-9行目で、SSL / TLS終了を設定します。
    • 9行目では、Secretリソースをその名前cafe-secretで参照しています。このリソースにはSSL / TLS証明書とキーが含まれており、Ingressリソースの前に展開する必要があります。
    • 8行目で証明書とキーをcafe.example.com仮想サーバーに適用します。
  • 11行目では、ドメイン名cafe.example.comを持つ仮想サーバーを定義します。
  • 13行目から21行目では、2つのパスベースのルールを定義しています。
    • 14-17行目で定義されているルールは、tea-svcという名前でデプロイされている、Tea Serviceのコンテナに/ tea URI とともにリクエストを分散するようにロードバランサに指示します。
    • 18行目〜21行目で定義されているルールは、クラスタ内にcoffee-svcという名前でデプロイされているCoffee Service
      コンテナに、/ coffee URI とともにリクエストを分散するようロードバランサに指示します。
    • どちらのルールも、対応するサービスのポート80に要求を分散するようにロードバランサに指示します。

IngressおよびSecretリソースをクラスタに導入する方法の詳細については、GitHubリポジトリを参照してください。

アプリケーションのテスト

NGINX Plus Ingress Controller、アプリケーション、Ingressリソース、およびSecretリソースを導入すると、アプリケーションをテストできます。

/ tea URIでteaをリクエストすると、ブラウザーにはTea Serviceによって生成されたページが表示されます。

teacoffeeのサービスが実際に飲み物を提供するだけではなく、これらサービスを
起動してコンテナやあなたのリクエストの詳細についての情報が欠損していないことが望ましいです。これらには、コンテナのホスト名とIPアドレス、要求URI、およびクライアントのIPアドレスが含まれます。ページを更新するたびに、別のコンテナから応答が返されます。

また、NGINX Plus ライブアクティビティモニタリングダッシュボードに接続して、NGINX Plusとアプリケーションの各コンテナからのリアルタイム負荷分散メトリックを参照することもできます。

Ingress Controllerの拡張

Ingressは、基本的なHTTPロードバランシング機能を提供します。ただし、アプリケーションのロードバランシング要件が複雑でIngressでサポートされていないことがよくあります。これらの要件の一部に対応するため、Ingressコントローラにいくつかの拡張機能を追加しました。このようにして、Kubernetesリソースを使用してロードバランサを構成すること(ロードバランサを直接構成するのではなく)もでき、かつ高度なロードバランシング機能を活用することもできます。

利用可能な拡張機能の完全なリストについては、GitHubリポジトリを参照してください。

さらに、Kubernetesのリソースを使用してConfig Mapsリソースまたは注釈を使用してNGINX設定カスタマイズするメカニズムを提供します。たとえば、proxy_connect_timeoutまたはproxy_read_timeoutディレクティブの値をカスタマイズすることができます。

ロードバランシングの要件がIngressおよび拡張機能でサポートされている要件がある場合は、Ingressコントローラを使用しないNGINX Plusをデプロイおよび設定するための方法を提案します。私たちのブログではNGINX Plusを使ってKubernetesサービスのロードバランシングを読むことができます。

ControllerによるNGINX Plusの利点

NGINX Plus Ingress ControllerはNGINXで得られるものに加えて、以下の利点を提供します。

  • 高度に動的な環境での安定性  – Ingressを介して公開されているサービスのPod数が変更されるたびに、Ingress Controllerは変更を反映するためにNGINXまたはNGINX Plusの設定を更新する必要があります。コミュニティ版のNGINXでは、設定ファイルを手動で変更して設定をリロードする必要があります。しかし、NGINX Plusを使用すると、オンザフライで再構成 APIを使用して、設定ファイルをリロードせずに設定を更新できます。これにより、構成リロードが頻繁に発生する場合に発生する可能性のあるメモリ使用量の増加やシステム全体のオーバーロードを防ぐことができます。
  • リアルタイム統計  – NGINX Plusは高度なリアルタイム統計を提供し、APIまたは内蔵ダッシュボードのいずれかにアクセスできます。これにより、NGINX Plusとアプリケーションがどのように実行されているかを知ることができます。
  • セッション・パーシステンス  – セッション・パーシステンスを有効にすると、NGINX Plusは同じクライアントからのすべての要求が常にスティッキクッキー方式を使用して同じバックエンドのコンテナに渡されるようにします。

概要

Kubernetesには、組み込みのHTTPロードバランシング機能があり、外部トラフィックをIngressでクラスタ内のサービスにルーティングします。コミュニティ版NGINXとNGINX Plusは、Kubernetesロードバランシングと統合され、Ingress機能を完全にサポートし、拡張ロードバランシング要件をサポートする拡張機能も提供します。

NGINX PlusとIngress Controllerを試すには、今すぐ無料の30日間のトライアル
開始するか、ライブデモをご連絡ください

***************************************************************************

本ブログサイトの”ホワイトペーパー一覧”ページにeBOOKを公開致しました。
https://nginx.sios.jp/white-paper

***************************************************************************

サービスメッシュとは?

この記事はNGINX,Inc.のブログ記事「What Is a Service Mesh?」を和訳した内容となります。

URL: https://www.nginx.com/blog/what-is-a-service-mesh/

サービスメッシュは 、マイクロサービスアプリケーションの構成ができるインフラストラクチャ層です。これにより、サービスインスタンス間の通信が柔軟で信頼性が高く、高速になります。このメッシュは、サービスのディスカバリ、ロードバランシング、暗号化、認証と認可、サーキットブレーカーパターンのサポート、およびその他の機能を提供します。

サービスメッシュは、通常、各サービスインスタンスに対して、サイドカーと呼ばれるプロキシインスタンスを提供して実装されます。サイドカーは、サービス間の通信、監視、セキュリティ関連の懸念(個々のサービスから抽象化できるもの)を処理します。このようにして、開発者はサービス内のアプリケーションコードの開発、サポート、メンテナンスを処理し、運用担当者はサービスメッシュを維持して、アプリケーションを実行できます。

Google、IBM、Lyftの支援を受けているIstioは、現在、最もよく知られているサービスメッシュアーキテクチャです。もともとGoogleによってデザインされたKubernetesは、現在Istioにサポートされている唯一のコンテナオーケストレーションフレームワークです。

サービスメッシュには、コンポーネントサービスと機能に関する独自の用語があります。

  • コンテナ オーケストレーション フレームワーク アプリケーションインフラに次々とコンテナが追加されるにつれ、一連のコンテナを監視および管理するための別のツールである、コンテナ オーケストレーション フレームワークが不可欠になります。Kubernetesは、この市場を独占したようです。主要な競合相手であるDocker SwarmやMesosphere DC / OSでさえ、Kubernetesとの統合を代案として提示しています。
  • サービスとサービスインスタンス  具体的に言うと、開発者が作成するのはサービスではなく、サービスインスタンスのサービス定義またはテンプレートです。アプリケーションはこれらからサービスインスタンスを作成し、インスタンスは実際の作業を行います。ただし、サービスという用語は、多くの場合、インスタンス定義とインスタンス自体の両方に使用されます。
  • サイドカープロキシ  サイドカープロキシは、特定のサービスインスタンス専用のプロキシインスタンスです。他のサイドカープロキシと通信し、オーケストレーションフレームワークによって管理されます。
  • サービス・ディスカバリ インスタンスが別のサービスとやりとりする必要がある場合、他のサービスの健全で利用可能なインスタンスを見つける必要があります。コンテナ管理フレームワークは、リクエストを受信する準備ができているインスタンスのリストを保持します。
  • ロードバランシング サービスメッシュでは、ロードバランシングは一番下から機能します。サービスメッシュが管理している利用可能なインスタンスは、順に並べてリスト化され、最も負荷の軽いインスタンス(ここが負荷分散部分になります)が一番上に配置されます。
  • 暗号化 サービスメッシュは、リクエストとレスポンスを暗号化および復号化し、各サービスからその負担を取り除くことができます。サービスメッシュは、既存のパーシステントコネクションの再利用に優先順位を付け、コンピューティングリソース的に高価となる新規の接続を作る必要性を低減することで、パフォーマンスを向上させることができます。
  • 認証と承認 サービスメッシュは、アプリケーションの外部と内部の両方から行われたリクエストを認証し、検証されたリクエストのみをサービスインスタンスに送信することができます。
  • サーキットブレーカーパターンのサポート サービスメッシュは、不健全なインスタンスを分離し、それらが保証された段階で、健全なインスタンスプールに徐々に戻していくサーキットブレーカーパターンをサポートします。

サービスインスタンス、サイドカープロキシ、それらの間の相互作用など、サービスメッシュで作業を実行している部分は、サービスメッシュアプ​​リケーションのデータプレーンと呼ばれます。(名前には含まれませんが、データプレーンも処理を実行します)。でも、サービスメッシュアプ​​リケーションには、コントロールプレーンと呼ばれる監視および管理レイヤーも含まれています。

コントロールプレーンは、新しいインスタンスの作成、不健全または不必要なインスタンスの終了、監視、監視と管理の統合、アプリケーション全体のポリシーの実装、およびアプリケーション全体の正常なシャットダウンなどのタスクを処理します。コントロールプレーンは、通常、アプリケーションプログラミングインタフェース、コマンドラインインタフェース、およびアプリケーションを管理するためのグラフィカルユーザインタフェースを含むか、またはそれらに接続するように設計されています。

nginMesh、コントロールプレーン、データプレーン、サイドカープロキシとしてのNGINXを含むIstioサービスメッシュ

 

NGINXには、nginMeshと呼ばれるIstio互換のサービスメッシュがあります。このnginMeshアーキテクチャの図は、典型的なIstioコンポーネントとともに、サイドカープロキシの役割を果たすNGINXを示しています。

サービスメッシュアーキテクチャの一般的な使用例は、コンテナとマイクロサービスを使用して非常に要求の厳しいアプリケーション開発の問題を解決する場合です。マイクロサービスの先駆者には、Lyft、Netflix、Twitterなどの企業があります。これらの企業は、1時間単位で出入りする世界中の何百万人ものユーザーに、堅牢なサービスを提供しています。(Netflixが直面しているいくつかのアーキテクチャ上の課題についての詳細な説明を参照してください)。アプリケーションのニーズがそれほど厳しくない場合、より単純なアーキテクチャで十分でしょう。

サービスメッシュ・アーキテクチャーが、すべてのアプリケーション開発およびデリバリーの問題に対する答えとなることはないでしょう。建築家や開発者は非常に多くのツールを持っていますが、ハンマーはそのうちの1つに過ぎず、彼らが対処しなければならないたくさんの問題の中で、釘もまたそのうちの1つにすぎないからです。たとえば、NGINX Microservices Reference Architectureには、マイクロサービスで問題を解決するために、連続的なアプローチを提供するいくつかの異なるモデルが含まれています。

サービスメッシュアーキテクチャ(NGINX、コンテナ、Kubernetes、構造的なアプローチとしてのマイクロサービスなど)に付随する要素は、非サービスメッシュ実装で生産的に使用できます。たとえば、サービスメッシュアーキテクチャとして開発されたIstioはモジュール式に設計されているため、開発者は必要なものを選択して使えます。サービスメッシュアプ​​リケーションをいつ、完全に実装するかどうかわからなくても、これを念頭に置いて、サービスメッシュの概念を確実に理解する価値はあります。

このブログの投稿は、シリーズの最初のものになります。現在、予定されている投稿は次のとおりです:

  1. サービスメッシュとは?ー  本投稿です。
  2. サービスメッシュアーキテクチャの利点と欠点 いつサービスメッシュが正解か、代替案がより良いかもしれないかを説明します。
  3. サービスメッシュとAPIゲートウェイ  APIゲートウェイが問題の大部分を解決しうる時、サービスメッシュに直ちに移行するべき時、およびそれらをミックスしたアプローチを使用する時を示します。
  4. KubernetesとService Meshアーキテクチャ サービスメッシュを含むさまざまなアーキテクチャでKubernetesを使用する方法について説明します。
  5. サービスメッシュアーキテクチャにおけるNGINXの使用 NGINXは、サービスメッシュ・アーキテクチャ(サイドカー・プロキシIngressコントローラ、またはその両方)の中で、ロードバランシング、サービス・ディスカバリ、キャッシングなどの機能を提供しながら、いくつかの重要な役割を果たします

***************************************************************************

本ブログサイトの”ホワイトペーパー一覧”ページにeBOOKを公開致しました。
https://nginx.sios.jp/white-paper

***************************************************************************