Ingress のセットアップ
Ingressリソースを作成して、Ingressコンポーネントを設定し、リクエストのルーティングルールを定義し、アプリサービスのパスを指定します。 公開したいアプリやサービスを含む各ネームスペースごとに、個別のIngressリソースが必要です。
開始前に
作業を始める前に、以下の準備手順に従ってください。
-
Ingress をセットアップするために必要な権限が与えられていることを確認してください。 以下の IBM Cloud のIAMロール が必要です:
- クラスターに対する管理者のプラットフォーム・アクセス役割
- すべての名前空間に対するマネージャーのサービス・アクセス役割
-
IBM が提供するIngressサブドメインを使用するかどうかを決定してください。 提供されているサブドメインを使用したくない場合は、独自の カスタムドメイン を作成して登録する必要があります。
カスタムドメイン、またはプライベートALB経由でアプリを公開するために必要な、 IBM が提供するドメインの手動設定。
-
使用するALBが、想定されているバージョンであることを確認してください。
ibmcloud ks ingress alb versionsコマンドを実行して、現在サポートされているバージョンの一覧を表示し、ibmcloud ks ingress alb ls --cluster CLUSTERの出力結果と比較してください。 このドキュメントに従う場合は、Traefik ベースの Ingress を実行することが想定されています。Ingress- NGINX に関する具体的な手順については、 対応するドキュメント を参照してください。 -
プライベートALBを介してアプリを公開する場合は、CLIで各プライベートALBを有効にする必要があります。 ALB IDを取得するには、
ibmcloud ks ingress alb ls --cluster CLUSTERを実行してください。
クラシック・クラスター 詳細およびコマンドオプションについては、CLI リファレンス を参照してください。
sh {: pre} ibmcloud ks ingress alb enable classic --alb ALB_ID --cluster CLUSTER_NAME
VPC クラスター 詳細およびコマンドオプションについては、CLI リファレンス を参照してください。
sh {: pre} ibmcloud ks ingress alb enable vpc-gen2 --alb ALB_ID --cluster CLUSTER_NAME
-
高可用性を確保し、定期的な更新を適用するために、クラスタにはゾーンごとに少なくとも2つのワーカーノードが含まれていることを確認してください。 ゾーンにワーカーノードが1つしかない場合、ALBは自動更新を受け取ることができません。 詳細については、「 ALB のワーカーノードの要件 」を参照してください。
-
クラシッククラスターを使用している場合は、 IBM Cloud インフラストラクチャアカウントで 仮想ルーター機能(VRF) を有効にしてください。
- VRF を有効にするには、VRF の有効化を参照してください。
- VRF が既に有効になっているかどうかを確認するには、
ibmcloud account showコマンドを使用します。 - VRFを有効にできない、または有効にしたくない場合は、 VLANスパンニングを 有効にしてください。 VRF または VLAN スパンニングが有効になると、ALB は、アカウント内のさまざまなサブネットにパケットをルーティングできるようになります。
-
VPC クラスターの場合、VPC セキュリティグループで、Ingress によってルーティングされるトラフィックリクエストをノードポートが受信できるように設定されていることを確認してください。 詳細については、「 デフォルトでセキュアなクラスタ VPC ネットワークの概要 」を参照してください。
-
自動化やテストなどの目的で、同じまたは類似した名前のクラスターを 7 日以内に 5 回以上作成および削除すると、Let's Encrypt の重複証明書レート制限に達する可能性があります。 Ingress のサブドメインと証明書が正しく登録されるようにするには、クラスターの名前の最初の 24 文字が異なっている必要があります。
-
ネットワーク・トラフィックをエッジ・ワーカー・ノードに制限する場合は、ALB が均等にデプロイされるように、各ゾーンで 2 つ以上のエッジ・ワーカー・ノードを有効にしてください。
ゾーンで障害が発生した場合、そのゾーンの Ingress ALB への要求で断続的に障害が発生する可能性があります。
セットアップ・ステップ
以下の手順に従って、Ingressを設定してください。
手順 1: 「 ClusterIP 」サービスを作成する
公開するアプリ・デプロイメントごとに、Kubernetes ClusterIP サービスを作成します。 アプリを Ingress ロード・バランシングに含めるには、Kubernetes サービスを介してアプリを公開する必要があります。
kubectl 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コントローラーがアプリサービスへのトラフィックをルーティングする際に使用するルーティングルールを定義します。
-
YAML ファイルで Ingress リソースを作成します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress-resource spec: ingressClassName: public-iks-traefik tls: - hosts: - <domain_name> secretName: <tls_secret_name> rules: - host: HOSTNAME http: paths: - path: <app_path_1> pathType: Prefix backend: service: name: <app_service_1> port: number: 80 - path: <app_path_2> pathType: Prefix backend: service: name: <app_service_2> port: number: 80
リソースフィールド
ingressClassName- Ingressクラスの名前。 IBM が提供するIngressクラスは、パブリックALBの場合は
public-iks-traefik、プライベートALBの場合はprivate-iks-traefikです。 tls.hosts- TLS を使用するには、
<domain>を、IBM 提供の Ingress サブドメインまたはカスタム・ドメインで置き換えます。 tls.secretName- 「
<tls_secret_name>」を、 TLS の証明書 が保存されている Kubernetes のシークレット名に置き換えてください。 host<domain>を、IBM 提供の Ingress サブドメインまたはカスタム・ドメインに置き換えます。path<app_path>を、スラッシュまたはアプリが listen しているパスに置き換えます。 このパスは、指定されたIngressドメインに追加され、アプリへの一意のルートが作成されます。 この経路を Web ブラウザーに入力すると、ネットワーク・トラフィックが ALB にルーティングされます。 ALB は、関連付けられたサービスを検索し、ネットワーク・トラフィックをそのサービスに送信します。 そして、サービスが、アプリを実行するポッドにトラフィックを転送します。pathType- URL パス・マッチング方式。 サポートされている値は、
ImplementationSpecific、Exact、またはPrefixです。 各パス種別に関する詳細情報や例については、 コミュニティの「 Kubernetes 」ドキュメントを参照してください。 service.nameapp1_serviceおよびapp2_serviceなどを、アプリを公開するために作成したサービスの名前に置き換えます。 指定するアプリがすべて同じ名前空間にあることを確認してください。service.name<app1_service>および<app2_service>などを、アプリを公開するために作成したサービスの名前に置き換えます。 指定するアプリがすべて同じ名前空間にあることを確認してください。service.port.number- サービスが listen するポート。 アプリ用に Kubernetes サービスを作成したときに定義したものと同じポートを使用します。
- Ingressリソースをクラスターに適用します。 リソースで指定したアプリ・サービスと同じ名前空間にリソースがデプロイされていることを確認します。
kubectl apply -f community-ingress-resource.yaml -n <namespace>
ステップ 4: Ingress の設定を確認する
-
ALBの一覧を表示し、 Kubernetes Ingressイメージを実行しているALBのIPアドレス(クラシック)またはホスト名(VPC)をコピーしてください。 出力で、Build が形式
<community_version>_<ibm_build>_iksになっている ALB を選択します。ibmcloud ks ingress alb ls -c CLUSTER -
ALBのIPアドレス(クラシック)またはホスト名(VPC)、アプリのパス、およびご自身のドメインを使用して、このALBを経由してアプリにトラフィックを正常に送信できることを確認してください。
curl http://<ALB_IP>/<app_path> -H "Host: <ingress_subdomain>"たとえば、デフォルトのIngressサブドメインを使用して「
myapp」というアプリにリクエストを送信するには、次のコマンドを実行します。curl http://169.X.X.X/myapp -H "Host: mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud"
Ingress を介したアプリへの接続に問題が発生していますか? Ingress のトラブルシューティングを試してください。 ibmcloud ks ingress status-report get -c CLUSTER_NAME_OR_ID を実行すれば、Ingress コンポーネントの正常性と状況を確認できます。
Traefik CRD
Kubernetes のIngress関連リソースとともに。 Traefik ベースのインジェストコントローラーでは、Traefik のカスタムリソース定義(CRD)で定義されたリソースを使用することができます。 Traefik ベースの ALB を有効にすると、必要な CRD がクラスターに自動的にデプロイされます。 デプロイされたCRDのバージョンは、常にデプロイされたTraefik ALBの最高バージョンに対応しています。 カスタムリソースに関する詳細については、 Traefikのドキュメントをご覧ください。
設定によっては、Traefik CR でエントリポイント名を指定する必要がある場合があります。 IBM Cloud Kubernetes Service では、エントリポイントのデフォルト名は、平文の HTTP に対して web (デフォルトではポート 80 にバインド)、 TLS で暗号化された HTTPS トラフィックに対して websecure (デフォルトではポート 443 にバインド)となっています。 アプリケーションで必要に応じて、 ポートの設定や追加のエントリポイントの作成を行う ことができます。
Ingress - Traefikにおける NGINX アノテーションのサポート
Traefikには、Ingress( NGINX )固有のアノテーションを処理する互換性レイヤーが同梱されています。 IBM Cloud Kubernetes Service では、この機能はデフォルトで無効になっています。 これを有効にすると、Traefik固有のアノテーションの処理が無効になるため、ALBによって処理されるのはIngressおよび NGINX 固有のアノテーションのみとなります。 ingressProvider オプションは、
ibm-ingress-deploy-config ConfigMap で、この機能を有効または無効に切り替えることができます。
アノテーションのサポート状況に関する詳細については、 Traefikのドキュメントを参照してください。
Ingress でのカスタムドメイン
IBM が提供するIngressサブドメインを使用したくない場合は、Ingressリソースで指定した独自のカスタムドメインを使用することができます。 なお、プライベートALB経由でIngressを介して公開されるアプリについては、カスタムドメインを使用するか、 IBM が提供するドメインを手動で設定 する必要があります。
パブリック ALB 用のカスタムドメインの作成
以下の手順に従って、パブリック ALB 用のカスタムドメインを作成してください。
-
カスタム・ドメインを作成します。 カスタム・ドメインを登録する時には、Domain Name Service (DNS) プロバイダーまたは IBM Cloud DNS を使用してください。 Ingress で公開するアプリが 1 つのクラスター内の別々の名前空間にある場合は、カスタム・ドメインをワイルドカード・ドメイン (
*.custom_domain.netなど) として登録します。 Kubernetes のバージョン 1.20 以降では、ドメイン名は130文字以内に制限されている点にご注意ください。 -
IBM 提供サブドメインを正規名レコード (CNAME) として指定することで、カスタム・ドメインの別名を定義します。 IBM 提供の Ingress ドメインを確認するには、
ibmcloud ks cluster get --cluster CLUSTER_NAMEを実行し、Ingress サブドメインフィールドを見つけます。IBM が提供するサブドメインをCNAMEとして指定することは、自動ヘルスチェックによってDNS応答から正常に動作していないIPアドレスを除外し、ALBの追加や削除時にカスタムドメインが確実に更新されるようにするために必要です。
プライベートALB用のカスタムドメインの作成
以下の手順に従って、プライベートALB用のカスタムドメインを作成してください。 プライベートALBでIngressを使用するには、カスタムドメインが必要となる点にご注意ください。
プライベートVLANのみを使用する従来のクラスターを使用している場合は、まず独自の プライベートネットワーク上で利用可能なDNSサービス を設定する必要があります。
-
DNS サービス・プロバイダーを介してカスタム・ドメインを作成します。 IngressのURLは130文字以内である必要がある点にご注意ください。
-
プライベート ALB の IP アドレスを A レコードとして追加するか (クラシック・クラスター)、VPC ホスト名を CNAME として追加して (VPC クラスター)、カスタム・ドメインをプライベート ALB にマップします。 ALB の IP アドレス (クラシック) またはホスト名 (VPC) を見つけるには、
ibmcloud ks ingress alb ls -c CLUSTER_NAME_OR_IDを実行します。