導入
Ingress
は、Kubernetes クラスター内のリソース タイプであり、ドメイン名を使用して Kubernetes 内部アプリケーションにアクセスするために使用されます。 Kubernetes クラスター内のサービスのエントリ ポイントを提供し、ロード バランシング、SSL 終了、名前ベースの仮想ホスティングを提供できます。運用環境で一般的に使用される Ingress には、Treafik
、Nginx
、HAProxy
、Istio
などが含まれます。基本的な概念は、Kubernetes v 1.1 で追加された Ingress は、クラスターの外部からクラスター内のサービスへの HTTP および HTTPS ルーティングに使用され、トラフィックはインターネットから Ingress、サービス、そして最終的にポッドに送信されます。通常、Ingress はすべてのノード ノードにデプロイされ、サービスへの外部アクセス、負荷分散、SSL の終了、およびドメイン名ベースの仮想ホストの提供のための URL を提供するように構成できますが、ポートやプロトコルは公開されません。
構成例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
Ingress では、apiVersion、kind、metadata、および spec フィールドを指定する必要があります。 Ingress オブジェクトの名前は、有効な DNS サブドメイン名である必要があります。構成ファイルの使用方法に関する一般的な情報については、「アプリケーションのデプロイ、コンテナの構成、およびリソースの管理」を参照してください。 Ingress は、rewrite-target アノテーションなど、Ingress コントローラーに応じていくつかのオプションを構成するためにアノテーションを使用することがよくあります。 Ingress コントローラーが異なれば、サポートされるアノテーションも異なります。選択した Ingress コントローラーのドキュメントを参照して、サポートされている注釈を確認してください。
Ingress 仕様は、ロード バランサーまたはプロキシ サーバーの構成に必要なすべての情報を提供します。最も重要なのは、すべての受信リクエストに一致するルールのリストが含まれていることです。 Ingress リソースは、HTTP(S) トラフィックを転送するためのルールのみをサポートします。
ingressClassName が省略された場合は、デフォルトの Ingress クラスを定義する必要があります。
一部の Ingress コントローラーでは、デフォルトの IngressClass を定義する必要がありません。例: Ingress-NGINX コントローラーは、パラメーター --watch-ingress-without-class を使用して構成できます。ただし、以下に示すようにデフォルトの IngressClass を設定することをお勧めします。
負荷分散の実装
Ingress はルールを定義することで外部トラフィックをクラスター内のサービスにルーティングできます。具体的な実装方法は次のとおりです。
- Ingress コントローラー コンポーネントを Kubernetes クラスターにデプロイします。これにより、Ingress で定義されたルールに基づいて、対応するプロキシ機能を提供できます。
- Ingress Controller は、Ingress で定義されたルールを解析して処理し、クラスター内の Ingress ルールの変更を動的に監視し、リアルタイムで更新操作を実行します。
- は、
HTTP
およびHTTPS
の形式でクラスタの内部サービスを公開します。指定されたドメイン名ルールの定義を通じて、クラスタの外部からのトラフィックはクラスターはクラスター内にルーティングおよび送信でき、サービスは最終的に Pod に到達し、アプリケーションによって受信および処理されます。
負荷分散戦略
Ingress の負荷分散戦略には主に次のようなものがあります。
- round_robin: デフォルトの負荷分散戦略であるラウンドロビン スケジューリングは、各バックエンド サービスの重みに従ってリクエストを割り当てます。
- ewma: 動的負荷分散戦略である指数関数的に重み付けされた移動平均戦略。重みの計算はバックエンド サービスの応答時間に基づいています。サービスの応答に時間がかかる場合、サービスの重みはそれに応じて減り、サービスに割り当てられるリクエストは少なくなります。
- chash: リクエストされた URL と HTTP メソッドをキーとして使用し、バックエンド サービスを値として使用するハッシュベースの負荷分散戦略。同じキーがマッピングされます。同じサービス。
- chashsubset: ハッシュ サブセットに基づく負荷分散戦略。要求された URL と HTTP メソッドをキーとして使用し、バックエンド サービスを値として使用します。同じキーは同じサービスにマッピングされます。同時に、バックエンド サービスのパフォーマンスと状態に基づいて重みを動的に調整します。
- sticky : クライアントの IP アドレス、要求された URL、HTTP メソッドに基づいてリクエストを分散するスティッキー ロード バランシング戦略。同じ IP アドレスを持つリクエストは同じバックエンド サービスにマッピングされます。
上記は Ingress でサポートされている負荷分散戦略の一部であり、実際のニーズに応じて適切な戦略を選択できます。
実装モデル
Ingress には、Kubernetes の 2 つの主な実装モード、つまりHostNetwork モードと NodePort モードがあります。
- HostNetwork モード: 各ノードにイングレス コントローラー コンテナーを作成し、コンテナーのネットワーク モードを hostNetwork に設定します。これは、アクセス リクエストがポート 80/443 を介してポッドに直接入力され、イングレス コントローラーがイングレス ルールに従ってトラフィックを対応するビジネス コンテナに転送することを意味します。
- NodePort モード: アクセス トラフィックは、最初に NodePort 経由でノードに入り、次に iptables (svc) 経由でイングレス コントローラー コンテナーに転送され、その後、ルールに従って各バックエンド ビジネスのコンテナーに転送されます。
実行計画
Ingress の実装には通常、次のコンポーネントが含まれます。
- Ingress リソース: これは Kubernetes の API オブジェクトであり、外部 HTTP/HTTPS リクエストをクラスタ内のサービスにルーティングするルーティング ルールを定義するために使用されます。 Ingress リソースは、どのホストとパスをどのサービスにルーティングするかを記述します。これは、Ingress 実装ソリューションの基礎です。
- Ingress コントローラ: Ingress コントローラは、ルーティング機能を実際に実行するコンポーネントです。 Ingress リソース内のルールを解析し、対応するプロキシまたは負荷分散ポリシーを設定する必要があります。 Ingress リソースが変更されると、Ingress コントローラーはその構成を動的に更新して、Ingress リソースとの同期を維持する必要があります。
具体的には、Ingress を実装するためのソリューションは通常次のとおりです。
- まず、Nginx、Traefik などの Ingress コントローラーをデプロイする必要があります。このコントローラーは Kubernetes クラスター内で実行され、Ingress リソースの変更を監視します。
- 次に、Ingress リソースを作成し、ルーティング ルールを定義します。たとえば、ドメイン名が example.com であるすべてのリクエストを my-service という名前のサービスにルーティングするルールを定義できます。
- Ingress コントローラーは Ingress リソースを解析し、定義されたルールに従ってプロキシまたはロード バランサーを設定します。たとえば、Ingress リソースで負荷分散のためのポーリング戦略が指定されている場合、Ingress コントローラーは、ポーリング方式でバックエンド サービスにリクエストを送信するようにプロキシ コンポーネントを構成します。
- 外部リクエストが Ingress コントローラーに到達すると、定義されたルールに従ってリクエストが対応するサービスに転送されます。このようにして、複雑なルーティングおよび負荷分散戦略を簡単な構成で実装できます。
Ingress の実装は、選択した Ingress コントローラーによって異なる場合があることに注意してください。 Ingress コントローラーが異なれば、サポートされる機能、パフォーマンス、スケーラビリティも異なる場合があります。したがって、Ingress コントローラーを選択するときは、実際のニーズに基づいて評価して選択する必要があります。
NginxタイプのIngress実装
Nginx タイプの Ingress 実装はNginx Ingress コントローラーによって完了します。 Nginx Ingress Controller は、Kubernetes Ingress 仕様に準拠した実装であり、Nginx をリバース プロキシとして使用して Ingress 機能を実装します。具体的な実装プロセスは次のとおりです。
- Nginx Ingress Controller のインストール: まず、Nginx Ingress Controller をインストールする必要があります。 Kubernetes の公式 Helm チャートまたはその他の方法を通じてインストールできます。インストールが完了すると、Nginx Ingress Controller がクラスター内で Kubernetes ポッドとして実行されます。
- Ingress リソースの作成: Ingress リソースを定義し、ルーティング ルールを説明します。 Ingress リソースには、リクエストを照合して対応するサービスにルーティングするために使用される、
host
、path
などのいくつかのフィールドが含まれます。たとえば、リクエストは、異なるホスト名とパスに基づいて異なるバックエンド サービスにルーティングできます。 - Nginx Ingress Controller は Ingress リソースを解析します: Nginx Ingress Controller は、Kubernetes API サーバーの Ingress リソースの変更を監視し、Ingress リソースのルールをタイムリーに解析します。
- Nginx の構成: 解析されたルールに基づいて、Nginx Ingress Controller は Nginx 構成ファイルを動的に生成し、Nginx 構成を更新します。このようにして、Nginx は構成ファイルのルールに従ってバックエンド サービスへのリクエストを正しくプロキシできます。 Ingress リソースが変更されると、Nginx Ingress コントローラーはそれに応じて Nginx 構成を更新し、実際のルーティング ルールとの一貫性を維持します。
- リクエスト ルーティング: Nginx 構成の更新が完了すると、外部リクエストが Nginx に到着すると、構成ファイル内のルールに従って正しいバックエンド サービスにルーティングされます。このように、Nginx Ingress ControllerとNginxの連携により、Ingressのルーティング機能が実現されます。
Nginx タイプの Ingress 実装では、Nginx Ingress Controller を拡張することで、認証、電流制限、リダイレクトなど、より多くの機能を実装できることに注意してください。同時に、特定のパフォーマンスとセキュリティの要件を満たすために、実際のニーズに応じて Nginx 構成パラメーターを調整することもできます。
Treafik タイプの Ingress 実装
Traefik タイプの Ingress 実装は、Traefik Ingress コントローラを通じて実現されます。 Traefik は、Kubernetes と適切に統合し、Ingress の機能を実装する最新の HTTP リバース プロキシおよびロード バランサーです。具体的な実装プロセスは次のとおりです。
- Traefik Ingress Controller のインストール: まず、Traefik Ingress Controller を Kubernetes クラスタにインストールする必要があります。 Kubernetes の公式 Helm チャートまたはその他の方法を通じてインストールできます。インストールが完了すると、Traefik はクラスター内で Kubernetes ポッドとして実行されます。
- Traefik の構成: 実際のニーズに応じて Traefik を構成します。 Traefik は、構成ファイル、環境変数、または Kubernetes カスタム リソースを介した構成をサポートします。リスニングポート、アクセスログ、SSL証明書などのいくつかのパラメータを設定できます。
- Ingress リソースの作成: Ingress リソースを定義し、ルーティング ルールを説明します。 Ingress リソースには、リクエストを照合して対応するサービスにルーティングするために使用される、
host
、path
などのいくつかのフィールドが含まれます。 - Traefik は Ingress リソースを解析します: Traefik は、Kubernetes API Server 内の Ingress リソースの変更を監視し、Ingress リソース内のルールをタイムリーに解析します。 Kubernetes サービスを自動的に検出し、Ingress リソースの定義に基づいて対応するルーティング構成を生成します。
- リクエスト ルーティング: Traefik の構成ルールとルーティング ルールが生成されると、外部リクエストが Traefik に到着すると、構成されたルールに従って正しいバックエンド サービスにルーティングされます。 Traefik は、要求されたホスト名、パス、その他の情報に基づいて Ingress リソース内のルールを照合し、要求を対応するサービスにプロキシします。
- 拡張機能: Traefik は、SSL 証明書の自動管理 (Let's Encrypt などによる)、認証と認可、電流制限、リダイレクトなど、多くの拡張機能もサポートしています。これらの機能は、実際のニーズに基づいて有効にして構成できます。
Traefik タイプの Ingress 実装は、カスタム ミドルウェアを通じてその機能を拡張できることに注意してください。ミドルウェアとは、リクエストがバックエンドサービスに到達する前または後に実行されるプラグインで、リクエストヘッダーの変更やリクエストボディの変換など、さまざまな機能を実装できます。
要約すると、Traefik Ingress Controller と Traefik の連携により、柔軟で機能豊富な Ingress ルーティング ソリューションを実現できます。
HAProxy タイプのイングレス実装
HAProxy タイプの Ingress 実装は、HAProxy Ingress コントローラを通じて実現されます。 HAProxy は、Ingress 機能を実装するための Ingress コントローラーとして使用できる高性能ロード バランサーおよびリバース プロキシ サーバーです。具体的な実装プロセスは次のとおりです。
- HAProxy Ingress Controller のインストール: まず、HAProxy Ingress Controller を Kubernetes クラスタにインストールする必要があります。 Kubernetes の公式 Helm チャートまたはその他の方法を通じてインストールできます。インストールが完了すると、HAProxy Ingress Controller がクラスター内で Kubernetes ポッドとして実行されます。
- HAProxy の構成: 実際のニーズに応じて HAProxy を構成します。 HAProxy は、構成ファイル、環境変数、または Kubernetes カスタム リソースを介した構成をサポートします。リスニングポート、セッション永続性、SSL証明書などのいくつかのパラメータを構成できます。
- Ingress リソースの作成: Ingress リソースを定義し、ルーティング ルールを説明します。 Ingress リソースには、リクエストを照合して対応するサービスにルーティングするために使用される、
host
、path
などのいくつかのフィールドが含まれます。 - HAProxy は Ingress リソースを解析します: HAProxy Ingress Controller は、Kubernetes API サーバーの Ingress リソースの変更を監視し、Ingress リソースのルールを適時に解析します。 Kubernetes サービスを自動的に検出し、Ingress リソースの定義に基づいて対応するルーティング構成を生成します。
- リクエスト ルーティング: HAProxy の構成とルーティング ルールの生成が完了すると、外部リクエストが HAProxy に到着すると、そのリクエストは、設定されたルール。 HAProxy は、要求されたホスト名、パス、その他の情報に基づいて Ingress リソース内のルールと照合し、要求を対応するサービスにプロキシします。
- 拡張機能: HAProxy は、自動 SSL 証明書管理 (Let's Encrypt などによる)、セッション永続化、リダイレクトなど、多くの拡張機能もサポートしています。これらの機能は、実際のニーズに基づいて有効にして構成できます。
HAProxy タイプの Ingress 実装は、カスタム ミドルウェアを通じてその機能を拡張することもできることに注意してください。ミドルウェアとは、リクエストがバックエンドサービスに到達する前または後に実行されるプラグインで、リクエストヘッダーの変更やリクエストボディの変換など、さまざまな機能を実装できます。
要約すると、HAProxy イングレス コントローラーと HAProxy の連携により、高性能、スケーラブル、機能豊富なイングレス ルーティング ソリューションを実現できます。
Istio タイプの Ingress 実装
Istio タイプの Ingress 実装はIstio Ingress コントローラを通じて実現されます。 Istio は、強力なトラフィック管理とセキュリティ機能を提供するサービス メッシュ プラットフォームです。 Kubernetes と統合された Ingress 機能を提供し、複雑なルーティングおよび負荷分散戦略の実装を容易にします。具体的な実装プロセスは次のとおりです。
- Istio のインストール: まず、Istio を Kubernetes クラスタにインストールする必要があります。 Kubernetes の公式 Helm チャートまたはその他の方法を通じてインストールできます。インストールが完了すると、Istio はクラスター内で Kubernetes ポッドとして実行され、Kubernetes サービスを自動的に検出します。
- Ingress リソースの作成: Ingress リソースを定義し、ルーティング ルールを説明します。 Ingress リソースには、リクエストを照合して対応するサービスにルーティングするために使用される、
host
、path
などのいくつかのフィールドが含まれます。 Istio は、v1alpha1 や networking.gRPC API など、複数のタイプの Ingress をサポートしています。 - Istio は Ingress リソースを解析します: Istio Ingress Controller は、Kubernetes API サーバー内の Ingress リソースの変更を監視し、Ingress リソース内のルールをタイムリーに解析します。 Kubernetes サービスを自動的に検出し、Ingress リソースの定義に基づいて対応するルーティング構成を生成します。
- Istio Ingress Controller の構成: 構成ファイルまたは Kubernetes カスタム リソースを通じて Istio Ingress Controller を構成します。リスニングポート、SSL証明書などのいくつかのパラメータを構成できます。 Istio では、イングレス コントローラーとエグレス コントローラーが連携して、強力なトラフィック管理およびセキュリティ機能を実装します。
- リクエスト ルーティング: Istio 構成とルーティング ルールが生成されると、外部リクエストが Istio に到着すると、構成されたルールに従って正しいバックエンド サービスにルーティングされます。 Istio は、要求されたホスト名、パス、その他の情報に基づいて Ingress リソース内のルールを照合し、要求を対応するサービスにプロキシします。また、認証、電流制限、リダイレクトなどの多くの拡張機能も提供します。これらの機能は、実際のニーズに基づいて有効にして構成できます。
Istio タイプの Ingress 実装には強力なトラフィック管理機能とセキュリティ機能がありますが、より多くの構成とメンテナンス作業も必要になることに注意してください。 Istio を使用する場合は、パフォーマンスとスケーラビリティへの影響を慎重に考慮し、実際のニーズに応じて構成および最適化する必要があります。
APISIX タイプの Ingress 実装
APISIX は、Alibaba がオープンソース化した高性能かつスケーラブルな API ゲートウェイであり、Ingress 機能を提供し、Kubernetes クラスターの Ingress コントローラーとして使用できます。 APISIX 型 Ingress の実装プロセスは次のとおりです。
- APISIX のインストール: APISIX を Kubernetes クラスタにインストールします。 Kubernetes の公式 Helm チャートまたはその他の方法を通じてインストールできます。インストールが完了すると、APISIX はクラスター内で Kubernetes ポッドとして実行されます。
- APISIX の構成: 実際のニーズに応じて APISIX を構成します。リスニングポート、アクセスログ、SSL証明書などのいくつかのパラメータを設定できます。 APISIXは豊富な設定項目とプラグイン機構を提供しており、さまざまなニーズに柔軟に対応できます。
- Ingress リソースの作成: Ingress リソースを定義し、ルーティング ルールを説明します。 Ingress リソースには、リクエストを照合して対応するサービスにルーティングするために使用される、
host
、path
などのいくつかのフィールドが含まれます。 - APISIX は Ingress リソースを解析します: APISIX は、Kubernetes API Server 内の Ingress リソースの変更を監視し、Ingress リソース内のルールをタイムリーに解析します。 Kubernetes サービスを自動的に検出し、Ingress リソースの定義に基づいて対応するルーティング構成を生成します。
- リクエスト ルーティング: APISIX 構成とルーティング ルールが生成されると、外部リクエストが APISIX に到着すると、構成されたルールに従って正しいバックエンド サービスにルーティングされます。 APISIX は、要求されたホスト名、パス、その他の情報に基づいて Ingress リソース内のルールと照合し、要求を対応するサービスにプロキシします。複数のプロトコルと負荷分散アルゴリズムをサポートしており、実際のニーズに応じて構成できます。
- 拡張機能: APISIX は、自動 SSL 証明書管理 (Let's Encrypt などによる)、認証と認可、電流制限、リダイレクトなど、多くの拡張機能もサポートしています。これらの機能は、実際のニーズに基づいて有効にして構成できます。
APISIX を Ingress コントローラーとして使用する場合は、パフォーマンスとスケーラビリティへの影響を考慮する必要があることに注意してください。 APISIX は高いパフォーマンスと拡張性を備えていますが、実際のニーズに応じて構成および最適化する必要もあります。同時に、Kubernetes との統合や自動デプロイメントなどの問題を慎重に検討する必要があります。