NGINX Full Version

Ingress Controllerの選択ガイド, Part 1: 要件の特定

この記事は10部構成の一部です。

  1. Reduce Complexity with Production-Grade Kubernetes(英語)
  2. 高度なトラフィック管理でKubernetesの耐障害性を向上させる方法
  3. Kubernetesの可視性を向上させる方法
  4. トラフィック管理ツールを使ってKubernetesを安全にする6つの方法
  5. Ingress Controllerの選択ガイド, Part 1: 要件の特定(この記事です)
  6. Ingress Controllerの選択ガイド, Part 2 : リスクと将来性
  7. Ingress Controllerの選び方ガイド, Part 3:オープンソース / デフォルト / 商用版
  8. Ingress Controllerの選択ガイド, Part 4 : NGINX Ingress Controllerのオプション
  9. サービスメッシュの選び方
  10. Performance Testing NGINX Ingress Controllers in a Dynamic Kubernetes Cloud Environment(英語)

これらのブログ一式を無料のebookとして下記よりダウンロードいただけます。– Kubernetes のテスト環境から本番環境への移行

組織で初めてKubernetesの利用を開始するとき、どのIngressコントローラーを使うか、あまり考慮しないことがみられます。Ingressコントローラーはどれも似たようなものであり、素早く稼働させるためには、選択したKubernetesフレームワークのデフォルトIngressコントローラーにそのまま使うのが一番簡単だ、と考えるかもしれません。テストや小規模な本番環境では、どのようなIngressコントローラーでも良いというのは事実です。

しかし、規模が大きくなるにつれて、Ingressコントローラーの選択はより重要になります。それは、Ingress コントローラーはトラフィックを A 地点から B 地点に移動させるという基本的な機能以上のものを提供できるからです。

高度なトラフィック管理から、組み込みのセキュリティの可視化まで、IngressコントローラーはKubernetesスタックの中で最も強力なツールの1つになり得ます。実際、F5 NGINXでは、IngressコントローラーはプロダクショングレードのKubernetes デプロイメントの基礎であると考えています。

しかし、多くの開発者とプラットフォームの運用チームは、Ingressコントローラーのフルパワー、言うなれば、スケールできないものを選択した際に遭遇する結果に気づいていません。

うまくスケールできない、あるいは、複雑な環境を保護できないIngressコントローラーを選択した場合、Kubernetesをテストから本番に移行することができなくなる可能性があります。このブログシリーズでは、Ingressコントローラーの基礎と、今後必要となる機能やセキュリティを提供する賢い選択方法について学ぶことを目的としています。

Ingressコントローラーとは?

Ingressコントローラーとは、Kubernetesクラスタに入るレイヤー4からレイヤー7 のトラフィック、クラスタから出ていく潜在的なトラフィックを管理する特徴をもつロードバランサーのことです。私たちが同じ理解を持てるように、NGINXで使用している用語を以下に示します(これらの用語は業界全体でほぼ同じです)。

なぜIngressコントローラーが必要なのか?

KubernetesのPod(コンテナ)内で動作するアプリケーションは、デフォルトでは外部ネットワークからアクセスできず、Kubernetesクラスタ内の他のポッドからしかアクセスできないようになっています。KubernetesにはIngressと呼ばれるHTTPロードバランシング用の設定オブジェクトが組み込まれており、Kubernetesクラスタの外部のエンティティが、1つ以上のKubernetesサービスが表すポッドに接続する方法を定義しています。

Kubernetesサービスに外部からのアクセスを提供する必要がある場合、Ingressリソースを作成して、URIパスや後段のサービス名などの接続ルールを定義します。しかし、Ingressリソース単体では何もできません。Ingressリソースで定義したルールを実装するために、Ingressコントローラーアプリケーションを(Kubernetes APIを使用して)デプロイし、設定する必要があります。

Ingressコントローラーの役割とは?

  • Kubernetes環境の外からトラフィックを受け入れ、潜在的にそれを修正(成形)し、環境内で動作するポッドに配信します。Ingressコントローラーは、デフォルトのkube-proxyトラフィック配信モデルを置き換え、非Kubernetes環境でアプリケーション配信コントローラー(ADC)やリバースプロキシが提供するような追加の制御を提供します。
  • サービスの個々のポッドを監視し、高度なルーティングを保証し、リクエストが “ブラックホール化“ するのを防ぎます。
  • 相互TLS(mTLS)でセキュリティを強化したり、特定のポッドから特定の外部サービスへの送信トラフィックを制限したりするためのEgressルールを実装します。

Ingressコントローラーを選ぶとき、機能リストから始めたくなるかもしれません。しかし、素晴らしい機能を持ったIngressコントローラーでも、ビジネスニーズを満たせないということになりかねません。その代わりに、Ingress コントローラーがチームやアプリにとってどれだけうまく機能するかに影響を与える2つの要素、すなわち、ユースケース(どんな問題を解決するか)と必要となるリソース(その運用で何を対価として支払うのか)を必ず検討しましょう。このブログの残りの部分で、この2つのトピックをカバーします。

Ingressコントローラーに解決してほしい問題とは?

Ingressコントローラーの中心となるユースケースはトラフィックマネジメントのため、Ingressコントローラーを用いて以下のような一般的なユースケースを処理したいとおそらく考えることでしょう。

しかし、「一芸に秀でた」ものを選択しなければいけないという理由はありません。ほとんどのIngressコントローラーは、トラフィックを管理する以上のことができます。Ingress コントローラーを複数の問題を解決するために使うことで、スタックのサイズと複雑さを減らすだけでなく、アプリから Ingress コントローラーに非機能的な要件をオフロードすることができるのです。

Kubernetesのデプロイメントをよりセキュアに、アジャイルに、スケーラブルにしながら、リソースをより効率的に利用するのに役立つ、従来とは異なる4つのIngressコントローラーの使用例を見ていきましょう。

モニタリングと可視性

Kubernetesクラスタに対する可視性の欠如は、本番環境における最大の課題の1つであり、トラブルシューティングと復旧を難しくする一因となっています。IngressコントローラーはKubernetesクラスタのエッジで動作し、あらゆるトラフィックに触れるため、Kubernetesクラスタやプラットフォームにおけるアプリの遅延やリソースの枯渇といった問題に対するトラブルシューティング(および回避)に役立つデータを提供できる絶好の位置に存在します。Ingressコントローラーが可視性を向上させるためには、次のことが必要です。

APIゲートウェイ

Kubernetesでリクエスト・レスポンスの操作を行いたいのでなければ、IngressコントローラーがAPIゲートウェイを兼ねている可能性が濃厚です。その機能セットによっては、IngressコントローラーはTLS終端、クライアント認証、レート制限、きめ細かいアクセス制御、レイヤー4からレイヤー7でのリクエストルーティングを含む、APIゲートウェイ機能のコアを提供できる可能性があります。

認証とシングルサインオン

KubernetesサービスからIngressコントローラーへログイン認証のオフロードを行うことで、2つの問題を解決することができます。

Webアプリケーションファイアウォールの統合

Ingress コントローラーがWebアプリケーションファイアウォール(WAF)の役割を果たすのではなく、WAFをIngress コントローラーに統合することができます。WAFはKubernetesの外部や内部の多くの場所にデプロイできますが、ほとんどの組織にとって、最も効率的で効果的な場所はIngress コントローラーと同じポッド内です。

セキュリティポリシーがSecOpsやDevSecOpsの指示の下にあり、サービスごとやURIごとのきめ細かなアプローチが必要な場合に、このユースケースは最適です。すなわち、Kubernetes APIを使用してポリシーを定義し、サービスと関連付けることができる、ということです。さらに、Ingressコントローラーのロールベースアクセスコントロール(RBAC)機能により、DevOpsユーザーがIngressリソースごとにポリシーを設定する一方で、SecOpsがリスナーごとにポリシーを適用することができます。

Ingress コントローラーに求められるリソースをどのように扱うか?

すべてのIngress コントローラーにはコストがかかります。たとえ無料でオープンソースのものであってもです。いくらかのコストは、予算項目として予測可能な金額を割り当てることができますが、その他のコストは、あなたが選んだIngressコントローラーの結果(複雑化、ポータビリティの欠如など)に対処するために、チームがどれだけの時間を費やさなければならないかに依存します。Ingress コントローラーの予算を立てる際に考慮すべきコスト、すなわち時間とお金の両面について見ていきましょう。

時間コストの予算化

人員にかける予算は、特に慣れない環境でプロジェクトのリソースを確保しようとする場合、固定費項目よりもはるかに難しいことがあります。

次のような質問をする必要があります。

Kubernetesツールの管理者に関する注意点

業界では、NetOpsチームの管轄にツールや所有権を集約する傾向が見られます。これは、スタックを簡素化し、セキュリティを向上させる上では大きな役割を果たしますが、私たちは、チームの目標に基づいたツールの重複を考慮するように推奨しています。NetOps チームが境界ツール(外部ロードバランサーなど)を管理するのは、より広範なプラットフォームに焦点を当てるため理にはかなっていますが、DevOps チームはアプリコードの近くに展開されるサービスに最も関心を持ち、NetOps ツールから得られる以上の俊敏性ときめ細かい制御を必要としています。Ingressコントローラーを含むKubernetesツールは、DevOpsによって選択されたときに、成功する可能性が最も高くなります。だからといって、開発者にツールの選択の自由を完全に認めなければならないとは言いません。Kubernetes内のツールをある程度厳格に標準化することこそが、現状のベストプラクティスです。

必要となるコストの予算化

組織が初めてKubernetesを試すとき、ツールやサポートにあまり予算を割かないことがよくあります。もし、「手取り足取り」のサポートが求められるIngress コントローラーをしっかりと管理できる人的リソースがあるのなら、初期フェーズにおいては、金銭的な予算がなくても大丈夫です。しかし、Kubernetesへの投資が増えるにつれ、ツールの機能に制限されたり、他の優先事項にチームの稼働を割り当てたくなったりすることがあります。そうなると、より使いやすく、より安定した、エンタープライズ向けの機能とサポートを備えたツールにお金を払う方向にスケールが傾いてきます。

Ingress コントローラーにお金を払う準備ができたら、ライセンスモデルが重要であることを意識してください。Kubernetes以外の昔からの価格設定モデルに倣い、Ingress コントローラーの価格設定は、多くの場合、「インスタンスごと」または「Ingressプロキシごと」となっています。Kubernetesでもこれが理にかなっているユースケースはありますが、代わりにIngress コントローラーを「クラスタ単位」でライセンスすると、「プロキシの数」ではなく、アプリケーションのテナントに基づいて支払うことになります。

ここでは、さまざまなシナリオに対する私たちの推奨事項を紹介します。

次のステップ リスク許容度と将来性

要件が把握できたので、次のステップは、Ingress コントローラーがもたらすかもしれないリスクに対する許容範囲をチームで決定し、Kubernetesデプロイの成長に合わせて、Ingress コントローラーをどのように拡張する必要があるかを把握することです。これらのトピックについては、パート2で取り上げます。