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プロジェクト)すべてで、マネージャサービスのアクセスロールを使用します。
- ゾーンで障害が発生すると、そのゾーンの Ingress コントローラーによって公開されているアプリへの要求で断続的な障害が発生する可能性があります。
- 高可用性を確保するには、ゾーンごとにワーカー・ノードを 2 台以上配置することをお勧めします。
- VPCクラスタ:Ingressからワーカーノードのノードポートにルーティングされたトラフィックリクエストを許可します。
- VPC マルチゾーンクラスター:CLI でクラスタを作成し、後で '
ibmcloud oc zone add vpc-gen2
コマンドでワーカープールに手動でゾーンを追加した場合、Ingress コントローラを公開する VPC ロードバランサを更新し て、クラスタ内のすべてのゾーンのサブネットを含める必要があります。 - クラシック・クラスター: IBM Cloud インフラストラクチャー・アカウントの仮想ルーター機能 (VRF) を有効にする必要があります。 VRF を有効にするには、VRF の有効化を参照してください。
VRF が既に有効になっているかどうかを確認するには、
ibmcloud account show
コマンドを使用します。 VRF を有効にできない、または有効にしない場合は、VLAN スパンニングを有効にします。 VRF または VLAN のスパンニングを有効にすると、Ingress コントローラーは、アカウント内のさまざまなサブネットにパケットをルーティングできるようになります。
パブリック・クラウド・サービスのエンドポイントを使用してクラスタ内のアプリを公開する
クラシック・クラスター 仮想プライベート・クラウド
クラスタがクラシック・インフラストラクチャ上に作成されている場合、またはクラスタがVPCインフラストラクチャ上に作成され、作成時にパブリック・クラウド・サービスのエンドポイントを有効にした場合、デフォルトのパブリックIngressコントローラを使用して、クラスタ内のアプリを公開し、パブリック・ネットワークからのリクエストを受け取ることができます。
始める前に
- Ingress の前提条件を確認します。
- Red Hat OpenShift クラスターにアクセスします。
ステップ 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: - <domain> secretName: <secret_name> rules: - host: <domain> http: paths: - path: /<app1_path> pathType: Prefix backend: service: name: test port: number: 80 - path: /<app2_path> backend: service: name: <app2_service> port: number: 80
tls
- 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 コントローラーは関連付けられたサービスを検索し、Ingress コントローラーはネットワーク・トラフィックをサービスに送信します。 そして、サービスが、アプリを実行するポッドにトラフィックを転送します。 多くのアプリは特定のパスで listen するのではなく、ルート・パスと特定のポートを使用します。 この場合、ルート・パスを/
として定義します。アプリの個別のパスは指定しないでください。http://domain/
の場合、/
をパスとして入力します。http://domain/app1_path
の場合、/app1_path
をパスとして入力します。pathType
- URL パス・マッチング方式。 サポートされている値は、
ImplementationSpecific
、Exact
、またはPrefix
です。 各パスタイプの詳細と例については、コミュニティKubernetesドキュメントを/span>のを参照してください。 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 のトラブルシューティングを試してください。
プライベート・クラウド・サービス・エンドポイントしかない VPC クラスターでアプリをパブリックに公開する
Virtual Private Cloud
クラスタが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 シークレットとして保管する必要があります。
カスタム Ingress ドメインの TLS シークレット
自分で作成したドメイン (外部プロバイダーに登録されているドメインなど) を使用するには、 カスタム・サブドメインの TLS シークレットのセットアップ を参照してください。
IBM管理対象 Ingress ドメインの TLS シークレット
以下の手順に従って、 IBM管理対象 Ingress ドメインの TLS シークレットをセットアップします。
- クラスター内の既存のサブドメインをリストします。 出力のサブドメイン列で、
000<n>
値が最も高いサブドメインをコピーします。
この出力例では、ibmcloud oc nlb-dns ls --cluster <cluster_name_or_id>
mycluster-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: public-ingress-controller namespace: openshift-ingress-operator spec: replicas: 2 domain: <domain> endpointPublishingStrategy: loadBalancer: scope: External type: LoadBalancerService
-
クラスターの
openshift-ingress-operator
プロジェクトに IngressController リソースを作成します。 IngressController を作成すると、IngressController の設定に基づいて、パブリック Ingress コントローラーが自動的に作成され、openshift-ingress
プロジェクトにデプロイされます。 さらに、Ingress コントローラーを公開するために Ingress コントローラー・サービスが作成されます。oc create -f public-ingress-controller.yaml -n openshift-ingress-operator
-
oc get
コマンドを実行し、router-public-ingress-controller
サービスの EXTERNAL IP フィールドで VPC ホスト名を見つけます。 VPC クラスターでは、サービスの外部 IP アドレスは非静的であるため、VPC で割り当てられるホスト名が代わりに使用されます。oc get svc router-public-ingress-controller -n openshift-ingress
出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-public-ingress-controller LoadBalancer 172.21.57.132 1234abcd-us-south.lb.appdomain.cloud 80/TCP,443/TCP,1940/TCP 3m
-
サービスの VPC ホスト名を、事前に選択したドメインに登録します。
- カスタム・ドメイン: DNS プロバイダーと連携して、
router-public-ingress-controller
サービスの VPC ホスト名を、カスタム・ドメインにマップする CNAME として追加します。 - IBM 提供ドメイン:
router-public-ingress-controller
サービスの VPC ホスト名を DNS に登録します。 以下のコマンドを実行すると、public-ingress-controller.yaml
ファイルに指定したサブドメインが自動的に生成され、router-public-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> pathType: Prefix backend: service: name: <app1_service> port: number: 80 - path: /<app2_path> backend: service: name: <app2_service> port: number: 80
tls
-
- TLS を使用する場合は、この TLS セクションをリソースに含めます。
-
`<domain>` をサブドメインに置き換えます。 Ingress の作成中に障害が発生しないようにするために、ホストに * を使用したり、ホスト・プロパティーを空のままにしたりしないでください。
-
`<tls_secret_name>` は、以前に作成したシークレットに置き換えます。このシークレットには、カスタム・ドメインの TLS 証明書と鍵、または IBM 提供のサブドメイン用に自動的に生成された 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
をパスとして入力します。pathType
- URL パス・マッチング方式。 サポートされている値は、
ImplementationSpecific
、Exact
、またはPrefix
です。 各パスタイプの詳細と例については、コミュニティKubernetesドキュメントを/span>のを参照してください。 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 コントローラーに登録されます。
ステップ 5: インターネットからアプリにアクセスする
Web ブラウザーに、アクセスするアプリ・サービスの URL を入力します。
https://<domain>/<app1_path>
複数のアプリを公開した場合は、URL に追加するパスを変更して、それぞれのアプリにアクセスしてください。
https://<domain>/<app2_path>
ワイルドカード・ドメインを使用する場合は、それぞれのサブドメインを使用して各アプリにアクセスしてください。
http://<subdomain1>.<domain>/<app1_path>
http://<subdomain2>.<domain>/<app1_path>
Ingress を介してアプリに接続できませんか? Ingress のトラブルシューティングを試してください。
クラスター外のアプリをパブリックに公開する
クラスター外にあるアプリをパブリック Ingress のロード・バランシングに組み込んでパブリックに公開します。 IBM 提供のドメインまたはカスタム・ドメインに着信したパブリック要求が自動的にその外部アプリに転送されます。
開始する前に、クラスタのロードバランシングに含めたい外部アプリがパブリックIPアドレスを使用してアクセスできることを確認してください。
クラスタの外部にあるアプリを公開するには、以下の手順に従ってください。
-
Ingressコントローラーが公開するアプリのKubernetesサービス設定ファイルを定義する。 このサービスが、後の手順で作成する外部エンドポイントに着信要求を転送します。
apiVersion: v1 kind: Service metadata: name: myexternalservice spec: ports: - protocol: TCP port: <app_port>
-
クラスター内にサービスを作成します。
oc apply -f myexternalservice.yaml
-
外部エンドポイントの構成ファイルを定義します。 外部アプリにアクセスするために使用可能な、すべてのパブリック IP アドレスとポートを含めます。 Note that the name of the endpoint must be the same as the name of the service that you created in the previous step, for example,
myexternalservice
.kind: Endpoints apiVersion: v1 metadata: name: myexternalservice subsets: - addresses: - ip: <external_IP1> - ip: <external_IP2> ports: - port: <external_port>
name
<myexternalendpoint>
を、先ほど作成した Kubernetes service の名前に置き換えます。ip
<external_IP>
を、外部アプリに接続するためのパブリック IP アドレスに置き換えます。port
<external_port>
を、外部アプリが listen するポートに置き換えます。
-
クラスター内にエンドポイントを作成します。
oc apply -f myexternalendpoint.yaml
-
プライベート・クラウド・サービス・エンドポイントのみを使用して VPC クラスターでアプリをパブリックに公開する 、または パブリック・クラウド・サービス・エンドポイントを使用してクラスターでアプリをパブリックに公開する の 2 番目のステップに進みます。