1.8. ルートと Ingress
ルートおよび Ingress は、どちらもアプリケーションを外部トラフィックに公開するために使用されます。ただし、その目的は若干異なり、機能も異なります。
1.8.1. ルート
ルートは、外部クライアントが名前でサービスにアクセスできるように、ホスト名でサービスを公開する OpenShift Container Platform リソースに固有のものです。
ルートは、ホスト名をサービスにマッピングします。ルート名のマッピングにより、外部クライアントはホスト名を使用してサービスにアクセスできます。ルートは、サービスに向けられたトラフィックの負荷分散を行います。ルートで使用されるホスト名は、ルーターの IP アドレスに解決されます。その後、ルートはトラフィックを適切なサービスに転送します。ルートは、SSL/TLS を使用してクライアントとサービス間のトラフィックを暗号化することで保護することもできます。
1.8.2. Ingress
Ingress は、負荷分散、SSL/TLS Termination、名前ベースの仮想ホスティングなどの高度なルーティング機能を提供するリソースです。Ingress に関する重要なポイントは次のとおりです。
- HTTP/HTTPS ルーティング: Ingress を使用して、クラスター内のサービスに HTTP および HTTPS トラフィックをルーティングするためのルールを定義できます。
- 負荷分散: NGINX や HAProxy などの Ingress コントローラーは、ユーザーが定義したルールに基づいてトラフィックルーティングと負荷分散を管理します。
- SSL/TLS Termination: SSL/TLS Termination は、着信 SSL/TLS トラフィックをバックエンドサービスに渡す前に復号するプロセスです。
- 複数のドメインとパス: Ingress は、複数のドメインとパスのトラフィックルーティングをサポートします。
1.8.3. ルートと Ingress の比較
ルートは、Ingress に比べて柔軟性が高く、高度な機能を提供します。そのため、ルートは複雑なルーティングシナリオに適しています。ルートは、特に基本的な外部アクセスのニーズの場合、簡単に設定および使用できます。Ingress は、よりシンプルで直接的な外部アクセスによく使用されます。ルートは、高度なルーティングと SSL/TLS Termination を必要とするより複雑なシナリオに使用されます。
1.8.4. 例: ウェブアプリケーションを公開するためのルートと Ingress の設定
OpenShift Container Platform クラスター上で Web アプリケーションが実行されています。外部ユーザーがアプリケーションにアクセスできるようにしたいと考えています。アプリケーションは特定のドメイン名を通じてアクセスできる必要があり、トラフィックは TLS を使用して安全に暗号化される必要があります。次の例は、ルートと Ingress の両方を設定して、Web アプリケーションを外部トラフィックに安全に公開する方法を示しています。
1.8.4.1. ルートの作成
新しいプロジェクトを作成する。
$ oc new-project webapp-project
Web アプリケーションをデプロイします。
$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git --name=webapp
ルートを使用してサービスを公開します。
$ oc expose svc/webapp --hostname=webapp.example.com
TLS を使用してルートを保護します。
証明書と鍵を使用して TLS シークレットを作成します。
$ oc create secret tls webapp-tls --cert=path/to/tls.crt --key=path/to/tls.key
TLS シークレットを使用するようにルートを更新します。
$ oc patch route/webapp -p '{"spec":{"tls":{"termination":"edge","certificate":"path/to/tls.crt","key":"path/to/tls.key"}}}'
1.8.4.2. Ingress の設定
Ingress リソースを作成します。
Ingress コントローラーがクラスターにインストールされ、実行されていることを確認します。
Web アプリケーション用のサービスを作成します。まだ作成されていない場合は、アプリケーションをサービスとして公開します。
apiVersion: v1 kind: Service metadata: name: webapp-service namespace: webapp-project spec: selector: app: webapp ports: - protocol: TCP port: 80 targetPort: 8080
Ingress リソースを作成します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: webapp-ingress namespace: webapp-project annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: webapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: webapp-service port: number: 80
TLS を使用して Ingress を保護します。
証明書と鍵を使用して TLS シークレットを作成します。
$ oc create secret tls webapp-tls --cert=path/to/tls.crt --key=path/to/tls.key -n webapp-project
TLS シークレットを使用するように Ingress リソースを更新します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: webapp-ingress namespace: webapp-project spec: tls: 1 - hosts: - webapp.example.com secretName: webapp-tls 2 rules: - host: webapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: webapp-service port: number: 80