質問: ### 知りたいこと この本で`Docker`と`Kubernetes`のキャッチアップをしています。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/f3550f7629aa48e9e344d0f980462631.jpeg) 書籍内に下記の`K8S`構成のTODOアプリケーションがあるのですが、 `Nginx`が2つあることがとても気になりました。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2c4ba065a7bc5186c4e2451edb797bcf.png) 特に「赤部分」の`Nginx`がとても気になります。 ちなみに下記画像赤色`Nginx`の隣の`API`はnodeJSです。 ### 気になる理由 表現が難しいのですが、 * `todoweb`ノード: `Web`の手前に`nginx`があるのは**わかる** * `todoapi`ノード: `API`の手前に`nginx`があるのは**わからない** という感じです。というのも以前`Rails`のアプリをデプロイした際に、 * Webサーバーに `Nginx` * アプリケーションサーバに `Unicorn` を利用しました。この`Rails`のデプロイ環境は基本的な`Web`三層かと思いますが、 当然ウェブサーバーとアプリケーションサーバが異なるソフトを用いています。 しかし上記`K8S`環境において、どうしてバックエンド手前にウェブサーバーがあるのか いまいち説明ができません。ざっくばらんな質問になりますが、 インフラに詳しい方ご教授を頂けると幸いです。 よろしくお願いします。
回答: コンテナのデザインパターンの1つ、アダプターパターンに従ったものです。 コンテナ/マイクロサービスの分野におけるデザインパターンとしては、 論文「Design patterns for container-based distributed systems」 が非常に有名でここで紹介されています。 アダプターパターンのメリットは外部からのアクセスを標準化することです。 APIのようなサービスは必要に応じて追加される可能性が高いですが このAPIの実装(node/rails/golang/...)によってアクセス方法が異なると面倒です。 全部ゼロから作るのであればインタフェースを予め定めてそれに合わせて実装するのがよいですが、 当然既存アプリやOSSなどを流用するとき、その修正が必要になると面倒です。 これを解決するために同一pod内にインタフェースを変換するアダプターとして nginxプロキシを導入すると既存のアプリは修正なしに インタフェースを統一し利便性を向上することができます。