Ingress を使用したアプリの非公開公開
Ingressコントローラーによって管理されるIngressリソースを作成することで、 Red Hat® OpenShift® on IBM Cloud® クラスター内の複数のアプリをプライベートに公開できます。
前提条件
Ingress の使用を開始する前に、以下の前提条件を確認してください。
- Ingress をセットアップするには、以下の IBM Cloud IAM 役割が必要です。
- IBM Cloud Kubernetes Service におけるクラスタの管理者プラットフォームアクセスロール。
- すべての IBM Cloud Kubernetes Service ネームスペース( Red Hat OpenShift プロジェクト)における「 Manager 」サービスアクセスロール。
- ゾーンで障害が発生すると、そのゾーンの Ingress コントローラーによって公開されているアプリへの要求で断続的な障害が発生する可能性があります。
- 高可用性を確保するには、ゾーンごとにワーカー・ノードを 2 台以上配置することをお勧めします。
- VPC クラスター:Ingress によってルーティングされるトラフィックリクエストを、ワーカーノードのノードポートに許可します。 詳細については、 「デフォルトでセキュアなクラスタVPCネットワークについて 」および「 VPCセキュリティグループの作成と管理 」を参照してください。
- VPCマルチゾーンクラスター:CLIでクラスターを作成し、その後
ibmcloud oc zone add vpc-gen2コマンドを使用してワーカープールにゾーンを手動で追加した場合は、 Ingressコントローラーを公開しているVPCロードバランサーを更新し、クラスター内のすべてのゾーンのサブネットを含めるようにする必要があります。 - クラシック・クラスター: IBM Cloud インフラストラクチャー・アカウントの仮想ルーター機能 (VRF) を有効にする必要があります。 VRF が既に有効になっているかどうかを確認するには、
ibmcloud account showコマンドを使用します。 VRFを有効にできない、または有効にしたくない場合は、 VLANスパンニングを 有効にしてください。 VRF または VLAN のスパンニングを有効にすると、Ingress コントローラーは、アカウント内のさまざまなサブネットにパケットをルーティングできるようになります。
パブリック・クラウド・サービス・エンドポイントを使用してアプリをプライベートに公開する
定番のクラスター 仮想プライベートクラウド
クラスターがクラシック・インフラストラクチャー上で作成された場合、またはVPCインフラストラクチャ上で作成され、かつクラスター作成時にパブリッククラウドサービスエンドポイントを有効にした場合、そのクラスターはデフォルトでパブリックIngressコントローラーのみが設定された状態で作成されます。 アプリをプライベートに公開するには、まず、プライベート Ingress コントローラーを作成する必要があります。 その後、その Ingress コントローラーをサブドメインに登録する必要があります。オプションで独自の TLS 証明書をインポートします。
ステップ 1: アプリをデプロイしてアプリ・サービスを作成する
まず、アプリをデプロイし、それらを公開するための Kubernetes サービスを作成します。
-
アプリをクラスターにデプロイします。 構成ファイルの metadata セクションで、デプロイメントにラベルを追加しておく必要があります (例えば、
app: code)。 このラベルは、アプリが実行されるすべてのポッドを識別して、ポッドが Ingress ロード・バランシングに含まれるようにするために必要です。 -
公開するアプリ・デプロイメントごとに、Kubernetes
ClusterIPサービスを作成します。 アプリを Ingress ロード・バランシングに含めるには、Kubernetes サービスを介してアプリを公開する必要があります。
oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>
ステップ 2: TLS の証明書と Kubernetes のシークレットを使用して、 TLS ターミネーションを設定する
TLS の証明書は、アプリが存在する各ネームスペースに「 Kubernetes 」のシークレットとして保存する必要があります。
TLS カスタムドメインに関する秘訣
外部プロバイダーで登録したドメインなど、ご自身で作成したドメインの TLS シークレットを設定するには、「 カスタムサブドメインの TLS シークレットの設定」を 参照してください。 これらの手順は、クラシッククラスターとVPCクラスターの両方に適用されます。
TLS IBM で管理されるドメインの秘訣
-
クラシック・クラスター クラシック・クラスターで IBM が管理するIngressドメインを使用するには、「IBM が提供するIngressサブドメイン用の TLS シークレットの設定」を 参照してください。
-
VPC クラスター VPC クラスターで IBM管理の Ingress ドメインを使用するには、以下の手順を実行します。
- クラスター内の既存のサブドメインをリストします。 出力のサブドメイン列で、
000<n>値が最も高いサブドメインをコピーします。
この出力例では、ibmcloud oc nlb-dns ls --cluster CLUSTER_NAME_OR_IDmycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloudサブドメインの000<n>値が0002の最大値になっています。Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created mycluster-a1b2cdef345678g9hi012j3kl4567890-0000 mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["5678efgh-us-south.lb.appdomain.cloud"] None created mycluster-a1b2cdef345678g9hi012j3kl4567890-0001 mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloud ["9012ijkl-us-south.lb.appdomain.cloud"] None created mycluster-a1b2cdef345678g9hi012j3kl4567890-0002 - コピーしたサブドメインで、サブドメインの
000<n>値を000<n+1>に変更します。 例えば、mycluster-a1b2cdef345678g9hi012j3kl4567890-0002.us-south.containers.appdomain.cloudサブドメインはmycluster-a1b2cdef345678g9hi012j3kl4567890-0003.us-south.containers.appdomain.cloudに変更されます。n+1値は、このクラスターで次に連続して作成するサブドメインを示します。 後の手順でこのサブドメインを登録します。 ドメインを登録すると、そのドメイン用の TLS シークレットが自動的に生成されます。 シークレット名は、サブドメインを切り捨てた形式になります (mycluster-a1b2cdef345678g9hi012j3kl4567890-0003など)。
ステップ 3: プライベート Ingress コントローラーを作成して構成する
ドメインと TLS 証明書を準備できたら、プライベート Ingress コントローラーを作成し、そのコントローラーにドメインを構成する必要があります。
- プライベート Ingress コントローラーの構成ファイルを作成します。
apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: private-ingress-controller namespace: openshift-ingress-operator spec: #defaultCertificate: If you are using a custom domain, specify the domain certificate #name: custom-certs-default replicas: 2 domain: <domain> endpointPublishingStrategy: loadBalancer: scope: Internal type: LoadBalancerService - クラスターの
openshift-ingress-operatorプロジェクトに IngressController リソースを作成します。 IngressController,を作成すると、前のステップで設定したIngressControllerの設定に基づいて、openshift-ingressプロジェクトにプライベートIngressコントローラが自動的に作成され、デプロイされます。 さらに、IngressコントローラーをIPアドレス(クラシッククラスター)またはVPCホスト名(VPCクラスター)で公開するために、Ingressコントローラーサービスが作成されます。oc create -f private-ingress-controller.yaml -n openshift-ingress-operator oc getコマンドを実行し、router-private-ingress-controllerサービスの EXTERNAL IP フィールドで IP アドレスまたは VPC ホスト名を見つけます。
クラシック・クラスターの出力例。oc get svc router-private-ingress-controller -n openshift-ingress
VPC クラスターの出力例:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-private-ingress-controller LoadBalancer 172.21.57.132 10.XX.XX.XX 80/TCP,443/TCP,1940/TCP 3mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-private-ingress-controller LoadBalancer 172.21.57.132 1234abcd-us-south.lb.appdomain.cloud 80/TCP,443/TCP,1940/TCP 3m- サービスの外部 IP アドレスまたは VPC ホスト名を、事前に選択したドメインに登録します。
- カスタム・ドメイン: DNS プロバイダーと連携し、
router-private-ingress-controllerサービスの外部 IP アドレスを、カスタム・ドメインにマップする A レコードとして追加するか (クラシック・クラスターの場合)、VPC ホスト名を、カスタム・ドメインにマップする CNAME として追加します (VPC クラスターの場合) 。 - IBM 提供ドメイン:
router-private-ingress-controllerサービスの VPC ホスト名を DNS に登録します。 以下のコマンドを実行すると、private-ingress-controller.yamlファイルに指定したサブドメインが自動的に生成され、router-private-ingress-controllerサービスに登録されます。 このドメイン用の TLS シークレットが、アプリの実行先として指定したプロジェクトに自動的に生成されます。 シークレット名は、サブドメインを切り捨てた形式になります (mycluster-a1b2cdef345678g9hi012j3kl4567890-0003など)。
ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_ID> --lb-host <VPC_hostname> --secret-namespace <project> ``` - カスタム・ドメイン: DNS プロバイダーと連携し、
ステップ 4: Ingress リソースを作成する
Ingress リソースでは、Ingress コントローラーがトラフィックをアプリ・サービスにルーティングするために使用するルーティング・ルールを定義します。
-
IBM 提供のドメインまたはカスタム・ドメインを使用して着信ネットワーク・トラフィックを作成済みのサービスにルーティングするための Ingress リソース構成ファイルを定義します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myingressresource spec: tls: - hosts: - <subdomain> secretName: <custom_secret_name> rules: - host: <subdomain> http: paths: - path: /<app1_path> backend: service: name: <app1_service> port: number: 80 - path: /<app2_path> backend: serivce: name: <app2_service> port: number: 80tls-
- TLS を使用する場合は、この TLS セクションをリソースに含めます。
<domain>をサブドメインに置き換えます。 Ingress の作成中に障害が発生しないようにするために、ホストに*を使用したり、ホスト・プロパティーを空のままにしたりしないでください。 -
`<tls_secret_name>` は、以前に作成したシークレットに置き換えます。このシークレットには、カスタム・ドメインの TLS 証明書と鍵、または IBM 提供のサブドメイン用に自動的に生成された TLS シークレットが保持されます。
- TLS を使用する場合は、この TLS セクションをリソースに含めます。
host-
<domain>をサブドメインに置き換えます。- クラスター内の複数のプロジェクトでアプリを公開する場合は、プロジェクトごとに 1 つの Ingress リソースが必要になります。 各リソースで同じサブドメインを使用することも、リソースごとに異なるサブドメインを使用することもできます。 例えば、ワイルドカード・ドメインを使用する場合は、ドメインの先頭にワイルドカード・サブドメインを追加できます (
subdomain1.custom_domain.netなど)。 - Ingress の作成中に障害が発生しないようにするために、ホストに
*を使用したり、ホスト・プロパティーを空のままにしたりしないでください。
path-
<app_path>を、アプリがリスニングしているパスに置き換えてください。 IBM 提供のドメインまたはカスタム・ドメインにパスが追加され、アプリへの固有の経路が作成されます。 この経路を Web ブラウザーに入力すると、ネットワーク・トラフィックが Ingress コントローラーにルーティングされます。 Ingress コントローラーは、関連付けられたサービスを検索し、そのサービスにネットワーク・トラフィックを送信します。 そして、サービスが、アプリを実行するポッドにトラフィックを転送します。 多くのアプリは特定のパスで listen するのではなく、ルート・パスと特定のポートを使用します。 この場合、ルート・パスを/として定義します。アプリの個別のパスは指定しないでください。- 例えば、
http://domain/を使用するには、パスとして/と入力します。http://domain/app1_pathの場合、/app1_pathをパスとして入力します。
serviceName<app1_service>および<app2_service>などを、アプリを公開するために作成したサービスの名前に置き換えます。 クラスターの別々のプロジェクトにあるサービスによってアプリを公開する場合は、同じプロジェクトにあるアプリ・サービスだけを組み込んでください。 公開したいアプリを含むプロジェクトごとに、1つのIngressリソースを作成する必要があります。servicePort- サービスが listen するポート。 アプリ用に Kubernetes サービスを作成したときに定義したものと同じポートを使用します。
-
クラスターの Ingress リソースを作成します。 リソースで指定したアプリ・サービスと同じプロジェクトにリソースがデプロイされていることを確認します。
oc apply -f myingressresource.yaml -n <project> -
Ingress リソースが正常に作成されたことを確認します。 イベントのメッセージにリソース設定のエラーが記載されている場合は、リソースファイル内の値を修正し、そのリソースに対してファイルを再適用してください。
oc describe ingress myingressresource
Ingress リソースがアプリ・サービスと同じプロジェクト内に作成され、アプリが Ingress コントローラーに登録されます。
ステップ 5: プライベート・ネットワークからアプリにアクセスする
-
クラシック・クラスター: アプリにアクセスする前に、DNS サービスにアクセスできることを確認します。 デフォルトの外部DNSプロバイダーを使用するには、 パブリックアクセスが可能なエッジノードを設定し、 Virtual Router Appliance を設定する必要があります。
-
プライベート・ネットワーク内で、Web ブラウザーにアプリ・サービスの URL を入力します。
https://<domain>/<app1_path>複数のアプリを公開した場合は、URL に追加するパスを変更して、それぞれのアプリにアクセスしてください。
https://<domain>/<app2_path>ワイルドカード・ドメインを使用する場合は、それぞれのサブドメインを使用して各アプリにアクセスしてください。
http://<subdomain1>.<domain>/<app1_path>http://<subdomain2>.<domain>/<app1_path>
Ingress を介してアプリに接続できませんか? Ingress のトラブルシューティングを試してください。
プライベート・クラウド・サービス・エンドポイントしかない VPC クラスターでアプリをプライベートに公開する
クラスターがVPCインフラストラクチャ上で作成されており、クラスター作成時にプライベートクラウドサービスエンドポイントのみを有効にした場合は、デフォルトのプライベートIngressコントローラーを使用して、クラスター内のアプリケーションをプライベートネットワークからのリクエストに対して公開することができます。
ステップ 1: アプリをデプロイしてアプリ・サービスを作成する
まず、アプリをデプロイし、それらを公開するための Kubernetes サービスを作成します。
-
アプリをクラスターにデプロイします。 構成ファイルの metadata セクションで、デプロイメントにラベルを追加しておく必要があります (例えば、
app: code)。 このラベルは、アプリが実行されるすべてのポッドを識別して、ポッドが Ingress ロード・バランシングに含まれるようにするために必要です。 -
公開するアプリ・デプロイメントごとに、Kubernetes
ClusterIPサービスを作成します。 アプリを Ingress ロード・バランシングに含めるには、Kubernetes サービスを介してアプリを公開する必要があります。
oc expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>
ステップ 2: TLS の証明書と Kubernetes のシークレットを使用して、 TLS ターミネーションを設定する
TLS の証明書は、アプリが存在する各ネームスペースに「 Kubernetes 」のシークレットとして保存する必要があります。
-
IBM が管理するIngressドメインを使用するには、「 IBM が提供するIngressサブドメイン用の TLS シークレットの設定」を 参照してください。
-
外部プロバイダーで登録したドメインなど、ご自身で作成したドメインを使用する場合は、「 カスタムサブドメイン用の TLS シークレットの設定」を 参照してください。
ステップ 3: Ingress リソースを作成する
Ingress リソースでは、Ingress コントローラーがトラフィックをアプリ・サービスにルーティングするために使用するルーティング・ルールを定義します。
-
IBM 提供のドメインまたはカスタム・ドメインを使用して着信ネットワーク・トラフィックを作成済みのサービスにルーティングするための Ingress リソース構成ファイルを定義します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myingressresource spec: tls: - hosts: - <custom_domain> secretName: <custom_secret_name> rules: - host: <domain> http: paths: - path: /<app1_path> backend: service: name: <app1_service> port: number: 80 - path: /<app2_path> backend: service: name: <app2_service> port: number: 80tls-
- TLS を使用する場合は、この TLS セクションをリソースに含めます。
-
`<domain>` をサブドメインに置き換えます。 Ingress の作成中に障害が発生しないようにするために、ホストに * を使用したり、ホスト・プロパティーを空のままにしたりしないでください。 -
`<tls_secret_name>` は、以前に作成したシークレットに置き換えます。このシークレットには、カスタム・ドメインの TLS 証明書と鍵、または IBM 提供のサブドメイン用に自動的に生成された TLS シークレットが保持されます。
host-
<domain>を、IBM 提供の Ingress サブドメインまたはカスタム・ドメインに置き換えます。- クラスター内の複数のプロジェクトでアプリを公開する場合は、プロジェクトごとに 1 つの Ingress リソースが必要になります。 各リソースで同じサブドメインを使用することも、リソースごとに異なるサブドメインを使用することもできます。 例えば、ワイルドカード・ドメインを使用する場合、ドメインの先頭にワイルドカード・サブドメイン (
subdomain1.custom_domain.netまたはsubdomain1.mycluster-<hash>-0000.us-south.containers.appdomain.cloudなど) を追加できます。 Ingress の作成中に障害が発生しないようにするために、ホストに*を使用したり、ホスト・プロパティーを空のままにしたりしないでください。
path-
<app_path>を、アプリがリスニングしているパスに置き換えてください。 IBM 提供のドメインまたはカスタム・ドメインにパスが追加され、アプリへの固有の経路が作成されます。 この経路を Web ブラウザーに入力すると、ネットワーク・トラフィックが Ingress コントローラーにルーティングされます。 Ingress コントローラーは、関連付けられたサービスを検索し、そのサービスにネットワーク・トラフィックを送信します。 そして、サービスが、アプリを実行するポッドにトラフィックを転送します。 多くのアプリは特定のパスで listen するのではなく、ルート・パスと特定のポートを使用します。 この場合、ルート・パスを/として定義します。アプリの個別のパスは指定しないでください。- 例えば、
http://domain/を使用するには、パスとして/と入力します。http://domain/app1_pathの場合、/app1_pathをパスとして入力します。
name<app1_service>および<app2_service>などを、アプリを公開するために作成したサービスの名前に置き換えます。 クラスターの別々のプロジェクトにあるサービスによってアプリを公開する場合は、同じプロジェクトにあるアプリ・サービスだけを組み込んでください。 公開するアプリを入れるプロジェクトごとに 1 つの Ingress リソースを作成する必要があります。port- サービスが listen するポート。 アプリ用に Kubernetes サービスを作成したときに定義したものと同じポートを使用します。
-
クラスターの Ingress リソースを作成します。 リソースで指定したアプリ・サービスと同じプロジェクトにリソースがデプロイされていることを確認します。
oc apply -f myingressresource.yaml -n <project> -
Ingress リソースが正常に作成されたことを確認します。 イベントのメッセージにリソース設定のエラーが記載されている場合は、リソースファイル内の値を修正し、そのリソースに対してファイルを再適用してください。
oc describe ingress myingressresource
Ingress リソースがアプリ・サービスと同じプロジェクト内に作成され、アプリが Ingress コントローラーに登録されます。
ステップ4:アプリにアクセスする
Web ブラウザーに、アクセスするアプリ・サービスの URL を入力します。
https://<domain>/<app1_path>
複数のアプリを公開した場合は、URL に追加するパスを変更して、それぞれのアプリにアクセスしてください。
https://<domain>/<app2_path>
ワイルドカード・ドメインを使用する場合は、それぞれのサブドメインを使用して各アプリにアクセスしてください。
http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>
Ingress を介してアプリに接続できませんか? Ingress のトラブルシューティングを試してください。