チュートリアル


Red Hat OpenShift Service on AWS 4

Red Hat OpenShift Service on AWS のチュートリアル

Red Hat OpenShift Documentation Team

概要

初めての Red Hat OpenShift Service on AWS (ROSA) クラスター作成に関するチュートリアルです。

第1章 チュートリアルの概要

マネージド OpenShift クラスターを最大限に活用するのに役立つ、Red Hat のエキスパートによるステップバイステップのチュートリアルです。

クラウドエキスパートによるこのチュートリアルコンテンツの一部は、迅速な提供のために、サポート対象のすべての構成でテストされていない場合があります。

第2章 チュートリアル: ROSA with HCP のアクティベーションとアカウントのリンク

このチュートリアルでは、最初のクラスターをデプロイする前に、Hosted Control Plane (HCP) を使用して Red Hat OpenShift Service on AWS (ROSA) をアクティブ化し、AWS アカウントにリンクするプロセスを説明します。

重要

製品のプライベートオファーを受け取っている場合、このチュートリアルを始める前に、プライベートオファーに記載されている手順に従ってください。プライベートオファーは、製品がすでにアクティブ化されている場合 (この場合はアクティブなサブスクリプションを置き換えます)、また初めてアクティブ化する場合に利用できるように設計されています。

2.1. 前提条件

  • 前の手順で ROSA with HCP をアクティブ化した AWS アカウントに関連付ける予定の Red Hat アカウントにログインしてください。
  • サービスの請求に使用する AWS アカウントは、1 つの Red Hat アカウントにのみ関連付けることができます。通常は、AWS 支払者のアカウントが、ROSA へのサブスクライブと、アカウントのリンクおよび請求に使用されます。
  • 同じ Red Hat 組織に属するすべてのチームメンバーが、ROSA with HCP クラスターの作成中に、サービスの請求用にリンクされた AWS アカウントを使用できます。

2.2. サブスクリプションの有効化と AWS アカウントのセットアップ

  1. AWS コンソールページGet started ボタンをクリックして、ROSA with HCP 製品をアクティブ化します。

    図2.1 使用してみる

    rosa get started

    以前に ROSA をアクティブ化したが、プロセスを完了していない場合は、ボタンをクリックして、次の手順で説明するようにアカウントのリンクを完了できます。

  2. 連絡先情報を Red Hat と共有することを確認し、サービスを有効にします。

    図2.2 ROSA の有効化

    rosa enable 2
    • このステップでサービスを有効にしても料金は発生しません。課金と計測が連携されるのは、最初のクラスターをデプロイした後のみです。これには数分かかる場合があります。
  3. プロセスが完了すると、確認メッセージが表示されます。

    図2.3 ROSA 有効化の確認

    rosa prereq enable 3
  4. この検証ページの他のセクションには、追加の前提条件 (が満たされているかどうか) のステータスが表示されます。これらの前提条件のいずれかが満たされていない場合は、対応するメッセージが表示されます。選択したリージョンで割り当てが不十分な例を次に示します。

    図2.4 サービスクォータ

    rosa service quota 4
    1. Increase service quotas ボタンをクリックするか、Learn more リンクを使用して、サービスクォータの管理方法に関する詳細情報を取得します。クォータが不十分な場合、クォータはリージョン固有であることに注意してください。Web コンソールの右上隅にあるリージョンスイッチャーを使用して、関心のあるリージョンのクォータチェックを再実行し、必要に応じてサービスクォータの増加リクエストを送信できます。
  5. すべての前提条件が満たされている場合、ページは次のようになります。

    図2.5 ROSA の前提条件の確認

    rosa prereq 5

    ELB サービスにリンクされたロールは自動的に作成されます。青色の小さな Info リンクをクリックすると、状況に応じたヘルプやリソースが表示されます。

2.3. AWS と Red Hat のアカウントとサブスクリプションのリンク

  1. オレンジ色の Continue to Red Hat ボタンをクリックして、アカウントのリンクを続行します。

    図2.6 Red Hat に進む

    rosa continue rh 6
  2. 現在のブラウザーのセッションで Red Hat アカウントにまだログインしていない場合は、アカウントにログインするように求められます。

    注記

    お使いの AWS アカウントが 1 つの Red Hat 組織にリンクされている必要があります。

    図2.7 Red Hat アカウントへのログイン

    rosa login rh account 7
    • このページでは、新しい Red Hat アカウントに登録したり、パスワードをリセットしたりすることもできます。
    • 前の手順で ROSA with HCP をアクティブ化した AWS アカウントに関連付ける予定の Red Hat アカウントにログインしてください。
    • サービスの請求に使用する AWS アカウントは、1 つの Red Hat アカウントにのみ関連付けることができます。通常は、AWS 支払者のアカウントが、ROSA へのサブスクライブと、アカウントのリンクおよび請求に使用されます。
    • 同じ Red Hat 組織に属するすべてのチームメンバーが、ROSA with HCP クラスターの作成中に、サービスの請求用にリンクされた AWS アカウントを使用できます。
  3. 利用規約を確認した後、Red Hat アカウントの連携を完了させます。

    注記

    この手順は、AWS アカウントが以前にどの Red Hat アカウントにもリンクされていない場合にのみ使用できます。

    ユーザーがログイン中の Red Hat アカウントに AWS アカウントがすでにリンクされている場合、この手順はスキップされます。

    AWS アカウントが別の Red Hat アカウントにリンクされている場合は、エラーが表示されます。トラブルシューティングについては、Correcting Billing Account Information for HCP clusters を参照してください。

    図2.8 アカウント連携の完了

    rosa rh account connection 8

    Red Hat と AWS の両方のアカウント番号がこの画面に表示されます。

  4. サービス規約に同意する場合は、Connect accounts ボタンをクリックします。

    Red Hat Hybrid Cloud Console を初めて使用する場合は、最初の ROSA クラスターを作成する前に、一般的なマネージドサービスの利用規約に同意するよう求められます。

    図2.9 利用規約

    rosa terms conditions 9

    View Terms and Conditions ボタンをクリックすると、確認して同意する必要がある追加の利用規約が表示されます。

    図2.10 Red Hat の利用規約

    rosa terms conditions 9 5

    この時点で追加の条件を確認し、プロンプトが表示されたら同意を確定します。

  5. Hybrid Cloud Console に、AWS アカウントのセットアップ完了に関する確認メッセージと、クラスターのデプロイの前提条件が表示されます。

    図2.11 ROSA の前提条件の完了

    rosa cluster create 10

    このページの最後のセクションでは、rosa CLI または Web コンソールを使用したクラスターデプロイメントオプションを示します。

    図2.12 クラスターのデプロイとアクセスの設定

    rosa cli ui 12

2.4. CLI を使用したクラスターデプロイ時に ROSA with HCP の AWS 請求先アカウントを選択する

重要

最新の ROSA コマンドラインインターフェイス (CLI) と AWS CLI がインストールされており、前のセクションで説明した ROSA の前提条件を完了していることを確認してください。詳細は、ROSA CLI セットアップのヘルプ および AWS CLI のインストール手順 を参照してください。

  1. rosa create cluster コマンドを使用してクラスターのデプロイを開始します。コンソールの Set up Red Hat OpenShift Service on AWS (ROSA) ページコピー ボタンをクリックし、コマンドをターミナルに貼り付けることができます。これにより、クラスター作成プロセスが対話モードで起動します。

    図2.13 クラスターのデプロイとアクセスの設定

    rosa cli 15
  2. カスタムの AWS プロファイルを使用するには、~/.aws/credentials で指定したデフォルト以外のプロファイルのいずれかを使用します。rosa create cluster コマンドに –profile <profile_name> のセレクターを追加すると、コマンドは rosa create cluster –profile stage のようになります。このオプションを使用して、AWS CLI プロファイルが指定されていない場合は、デフォルトの AWS CLI プロファイルにより、AWS インフラストラクチャーのプロファイルがどのクラスターにデプロイされるかが決定されます。請求用 AWS プロファイルは、次のいずれかの手順で選択します。
  3. ROSA with HCP クラスターをデプロイする場合、請求先の AWS アカウントを指定する必要があります。

    図2.14 請求先アカウントの指定

    rosa create cli billing 17
    • ユーザーがログイン中の Red Hat アカウントにリンクされている AWS アカウントのみが表示されます。
    • 指定した AWS アカウントに ROSA サービスの使用料が課金されます。
    • 特定の AWS 請求先アカウントに対して ROSA の契約が有効になっているかどうかが表示されます。

      • Contract enabled というラベルが表示されている AWS 請求先アカウントを選択した場合、前払い済みの契約の容量が消費されるまで、オンデマンドの消費料金は課金されません。
      • Contract enabled というラベルのない AWS アカウントには、該当するオンデマンド消費料金が課金されます。

関連情報

2.5. Web コンソールを使用したクラスターデプロイ時に ROSA with HCP の AWS 請求先アカウントを選択する

  1. Web コンソールを使用してクラスターを作成するには、ROSA のセットアップ ページの下部セクションにある 2 番目のオプションを選択します。

    図2.15 Web インターフェイスでのデプロイ

    rosa deploy ui 19
    注記

    Web コンソールでのデプロイプロセスを開始する前に、前提条件を完了してください。

    アカウントロールの作成など、一部のタスクには rosa CLI が必要です。ROSA を初めてデプロイする場合は、CLI の手順に従い、rosa whoami コマンドを実行した後に、Web コンソールでのデプロイ手順を開始してください。

  2. Web コンソールを使用して ROSA クラスターを作成する場合の最初のステップは、コントロールプレーンの選択です。Next ボタンをクリックする前に、Hosted オプションが選択されていることを確認してください。

    図2.16 Hosted オプションの選択

    rosa deploy ui hcp 20
  3. 次のステップ Accounts and roles では、インフラストラクチャー AWS アカウントを指定できます。このアカウントが ROSA クラスターのデプロイ先となり、そこでリソースが消費および管理されます。

    図2.17 AWS インフラストラクチャーアカウント

    rosa ui account 21
    • ROSA クラスターのデプロイ先のアカウントが表示されない場合は、How to associate a new AWS account をクリックして、この関連付けに関して、アカウントロールの作成またはリンクの情報を参照してください。
    • これには rosa CLI を使用します。
    • 複数の AWS アカウントを使用しており、それらのプロファイルが AWS CLI 用に設定されている場合は、rosa CLI コマンドを使用するときに --profile セレクターを使用して AWS プロファイルを指定できます。
  4. 請求先の AWS アカウントは、すぐ次のセクションで選択されます。

    図2.18 AWS 請求先アカウント

    rosa ui billing 22
    • ユーザーがログイン中の Red Hat アカウントにリンクされている AWS アカウントのみが表示されます。
    • 指定した AWS アカウントに ROSA サービスの使用料が課金されます。
    • 特定の AWS 請求先アカウントに対して ROSA の契約が有効になっているかどうかが表示されます。

      • Contract enabled というラベルが表示されている AWS 請求先アカウントを選択した場合、前払い済みの契約の容量が消費されるまで、オンデマンドの消費料金は課金されません。
      • Contract enabled というラベルのない AWS アカウントには、該当するオンデマンド消費料金が課金されます。

請求先の AWS アカウントの選択以降の手順は、このチュートリアルの範囲外です。

関連情報

第3章 チュートリアル: ROSA with HCP プライベートオファーの承認と共有

このガイドでは、Red Hat OpenShift Service on AWS (ROSA) with Hosted Control Plane (HCP) のプライベートオファーを承認する方法と、すべてのチームメンバーがプロビジョニングするクラスターでプライベートオファーを使用できるようにする方法について説明します。

ROSA with HCP のコストは、AWS インフラストラクチャーコストと ROSA with HCP サービスコストで構成されます。必要なワークロードを実行している EC2 インスタンスなどの AWS インフラストラクチャーのコストは、インフラストラクチャーがデプロイされている AWS アカウントに課金されます。ROSA サービスのコストは、クラスターをデプロイするときに "AWS 請求先アカウント" として指定した AWS アカウントに課金されます。

各コストの請求先を、別々の AWS アカウントにすることができます。ROSA サービスのコストと AWS インフラストラクチャーのコストの計算方法の詳細は、Red Hat OpenShift Service on AWS の料金ページ を参照してください。

3.1. プライベートオファーの承認

  1. ROSA with HCP のプライベートオファーを承認すると、販売者が指定した特定の AWS アカウント ID でのみアクセスできる一意の URL が提供されます。

    注記

    購入者として指定された AWS アカウントを使用してログインしていることを確認してください。別の AWS アカウントを使用してオファーにアクセスしようとすると、以下のトラブルシューティングセクションの図 11 に示すように、"page not found" というエラーメッセージが表示されます。

    1. 図 1 はオファー選択ドロップダウンメニューを示しています。通常のプライベートオファーが事前に選択されています。このタイプのオファーは、パブリックオファーまたは別のプライベートオファーを使用する前に ROSA with HCP がアクティブ化されていない場合にのみ承認することができます。

      図3.1 通常のプライベートオファー

      rosa regular private offer
    2. 図 2 は、以前にパブリックオファーを使用して ROSA with HCP をアクティブ化した AWS アカウント用に作成されたプライベートオファーを示しています。製品名が表示され、"Upgrade" というラベルの付いたプライベートオファーが選択されています。このオファーを承認すると、現在締結中の ROSA with HCP の契約が置き換えられます。

      図3.2 プライベートオファー選択画面

      rosa private offer selection selection screen
    3. ドロップダウンメニューを使用して、複数のオファーから選択できます (利用可能な場合)。以前にアクティブ化されたパブリックオファーは、図 3 のように、"Upgrade" というラベルが付いた、新しく提供された同意ベースのオファーと一緒に表示されます。

      図3.3 プライベートオファー選択ドロップダウン

      rosa private offer selection dropdown
  2. オファー設定が選択されていることを確認します。図 4 は、オファーの詳細が記載されたオファーページの下部を示しています。

    注記

    契約終了日、オファーに含まれるユニット数、および支払いスケジュールが表示されます。この例には、1 つのクラスターと、4 つの仮想 CPU を使用する最大 3 つのノードが含まれています。

    図3.4 プライベートオファーの詳細

    rosa private offer details
  3. オプション: 購入するサブスクリプションに 独自の注文書 (PO) 番号を追加 して、後の AWS 請求書にその番号を含めることができます。また、"New offer configuration details" の範囲を超える使用量に対して課金される "Additional usage fees" を確認します。

    注記

    プライベートオファーには、利用可能な設定がいくつかあります。

    • 承認するプライベートオファーに、固定された将来の開始日が設定されている可能性があります。
    • プライベートオファー、パブリックオファー、または古いプライベートオファーのエンタイトルメントを承認する時点で、別のアクティブな ROSA with HCP サブスクリプションがない場合は、プライベートオファー自体を承認し、指定されたサービス開始日以降にアカウントのリンク手順とクラスターのデプロイ手順を続行します。

    これらの手順を完了するには、ROSA with HCP の有効なエンタイトルメントが必要です。サービス開始日は、常に UTC タイムゾーンで表示されます。

  4. 契約を作成またはアップグレードします。

    1. ROSA with HCP をまだアクティブ化しておらず、このサービス用の契約を初めて作成する AWS アカウントによってプライベートオファーを承認する場合は、Create contract ボタンをクリックします。

      図3.5 Create contract ボタン

      rosa create contract button
    2. 同意ベースのオファーの場合は、Upgrade current contract ボタンをクリックします (図 4 および 6 を参照)。

      図3.6 Upgrade current contract ボタン

      rosa upgrade contract button
  5. Confirm をクリックします。

    図3.7 プライベートオファー承認の確認ウィンドウ

    rosa private offer acceptance confirmation window
  6. 承認するプライベートオファーのサービス開始日がオファー承認の直後に設定されている場合、確認モーダルウィンドウで Set up your account ボタンをクリックします。

    図3.8 サブスクリプションの確認

    rosa subscription contfirmation
  7. 承認するプライベートオファーに将来の開始日が指定されている場合は、サービス開始日後にプライベートオファーページに戻り、Setup your account ボタンをクリックして、Red Hat と AWS アカウントのリンクを続行します。

    注記

    同意が有効でない場合、以下に説明するアカウントリンクがトリガーされず、"アカウントのセットアップ" プロセスを "Service start date" 以降まで実行できません。

    これらの日付は常に UTC タイムゾーンの日付です。

3.2. プライベートオファーの共有

  1. 前の手順で Set up your account ボタンをクリックすると、AWS と Red Hat のアカウントをリンクする手順に進みます。この時点で、オファーを承認した AWS アカウントですでにログインしています。Red Hat アカウントでログインしていない場合は、ログインするように求められます。

    ROSA with HCP のエンタイトルメントは、Red Hat 組織アカウントを通じて他のチームメンバーと共有されます。同じ Red Hat 組織内の既存の全ユーザーは、上記の手順に従って、プライベートオファーを承認した請求 AWS アカウントを選択できます。Red Hat 組織管理者としてログインしている場合は、Red Hat 組織内のユーザーを管理 し、新しいユーザーを招待したり作成したりできます。

    注記

    ROSA with HCP のプライベートオファーは、AWS License Manager を通じて AWS にリンクされたアカウントと共有することはできません。

  2. ROSA クラスターをデプロイするユーザーを追加します。Red Hat アカウントのユーザー管理タスクの詳細は、こちらのユーザー管理に関する FAQ を参照してください。
  3. すでにログインしている Red Hat アカウントに、承認されたプライベートオファーを利用し、ROSA クラスターをデプロイするユーザーがすべて含まれていることを確認します。
  4. Red Hat アカウント番号と AWS アカウント ID が、リンクさせる目的のアカウントであることを確認します。このリンクは一意であり、Red Hat アカウントと連携できるのは 1 つの AWS (請求先) アカウントだけです。

    図3.9 AWS と Red Hat アカウントの連携

    rosa aws and red hat accounts connection
  5. AWS アカウントを、このページの図 9 に示されているもの以外の Red Hat アカウントにリンクする場合は、アカウントを連携する前に Red Hat Hybrid Cloud Console からログアウトし、すでに承認されているプライベートオファー URL に戻ってアカウントの設定手順を再度実行します。

    AWS アカウントと連携できるのは、1 つの Red Hat アカウントだけです。Red Hat アカウントと AWS アカウントを連携すると、ユーザーはこれを変更できなくなります。変更が必要な場合、ユーザーはサポートチケットを作成する必要があります。

  6. 利用規約に同意して、Connect accounts をクリックします。

3.3. AWS 請求先アカウントの選択

  • ROSA with HCP クラスターをデプロイする際に、プライベートオファーを承認した AWS 請求先アカウントをエンドユーザーが選択していることを確認してください。
  • Web インターフェイスを使用して ROSA with HCP をデプロイする場合、"Associated AWS infrastructure account" は、通常、作成するクラスターの管理者が使用する AWS アカウント ID に設定します。

    • これは、請求 AWS アカウントと同じ AWS アカウントにすることができます。
    • このアカウントに AWS リソースがデプロイされます。これにより、そのリソースに関連するすべての請求が処理されます。

      図3.10 ROSA with HCP クラスターのデプロイ時のインフラストラクチャーおよび請求先 AWS アカウントの選択

      rosa infrastructure and billing aws account selection during rosa with hcp cluster deployment
    • 購入したクォータを作成中のクラスターで使用することを想定している場合は、上記のスクリーンショットの AWS 請求先アカウントのドロップダウンを、プライベートオファーを承認した AWS アカウントに設定する必要があります。インフラストラクチャーと請求先の "ロール" として別々の AWS アカウントを選択した場合は、図 10 のような青色の注記が表示されます。

3.4. トラブルシューティング

プライベートオファーの承認と Red Hat アカウントのリンクに関連する最もよくある問題を紹介します。

3.4.1. 別の AWS アカウントを使用してプライベートオファーにアクセスする

  • オファーで定義されていない AWS アカウント ID でログインしてプライベートオファーにアクセスしようとし、図 11 のようなメッセージが表示された場合は、目的の AWS 請求先アカウントとしてログインしていることを確認してください。

    図3.11 プライベートオファー URL 使用時の HTTP 404 エラー

    rosa http 404 error when using the private offer url
    • プライベートオファーを別の AWS アカウントに拡張する必要がある場合は、販売者に問い合わせてください。

3.4.2. アクティブなサブスクリプションのため、プライベートオファーを承認できない

  • 別のパブリックオファーまたはプライベートオファーを使用して ROSA with HCP をすでにアクティブ化している状態で、ROSA with HCP を初めてアクティブ化するために作成されたプライベートオファーにアクセスしようとして次の通知が表示された場合は、オファーを提供した販売者に問い合わせてください。

    販売者は、以前のサブスクリプションをキャンセルする必要なく、新しいオファーを提供し、現在の同意をシームレスに置き換えることができます。

    図3.12 既存のサブスクリプションによりプライベートオファーの承認が妨げられる

    rosa existing subscription preventing private offer acceptance

3.4.3. AWS アカウントがすでに別の Red Hat アカウントにリンクされている

  • プライベートオファーを承認した AWS アカウントを現在ログイン中の Red Hat ユーザーに接続しようとしたときに、"AWS account is already linked to a different Red Hat account" というエラーメッセージが表示された場合、その AWS アカウントはすでに別の Red Hat ユーザーと連携しています。

    図3.13 AWS アカウントがすでに別の Red Hat アカウントにリンクされている

    rosa aws account is already linked to a different red hat account
  • 別の Red Hat アカウントか別の AWS アカウントを使用すると、ログインできます。

    • ただし、このガイドはプライベートオファーに関するものであるため、購入者として指定された AWS アカウントでログインし、すでにプライベートオファーを承認していることを想定しています。そのため、このアカウントを請求先アカウントとして使用することを想定しています。プライベートオファーを承認した後、別の AWS アカウントとしてログインすることは想定していません。
  • プライベートオファーを承認した AWS アカウントにすでに連携している別の Red Hat ユーザーでログインすることもできます。同じ Red Hat 組織に属する他の Red Hat ユーザーは、図 10 に示すように、クラスターを作成するときに、リンクされた AWS アカウントを ROSA with HCP の AWS 請求先アカウントとして使用できます。
  • 既存のアカウントのリンクが正しくないと思われる場合は、以下の "チームメンバーが別の Red Hat 組織に属している" という質問を参照して、対処方法のヒントを確認してください。

3.4.4. チームメンバーが別の Red Hat 組織に属している

  • AWS アカウントと連携できるのは、1 つの Red Hat アカウントだけです。クラスターを作成し、この AWS アカウントに付与されたプライベートオファーを利用するユーザーは、同じ Red Hat アカウントに属している必要があります。これを実現するには、ユーザーを同じ Red Hat アカウントに招待し、新しい Red Hat ユーザーを作成します。

3.4.5. クラスターの作成時に間違った AWS 請求先アカウントを選択した

  • ユーザーが間違った AWS 請求先アカウントを選択した場合、これを修正する最も早い方法は、クラスターを削除し、正しい AWS 請求先アカウントを選択して新しいクラスターを作成することです。
  • 簡単に削除できない実稼働クラスターの場合は、Red Hat サポートに問い合わせて、既存のクラスターの請求先アカウントを変更してください。この問題を解決するには、ある程度の時間がかかることが予想されます。

第4章 チュートリアル: ROSA STS デプロイメントの権限の検証

ROSA クラスターのデプロイに進むには、アカウントによって必要なロールと権限がサポートされている必要があります。AWS Service Control Policies (SCP) は、インストーラーまたは Operator ロールによって行われる API 呼び出しをブロックできません。

ROSA の STS 対応インストールに必要な IAM リソースの詳細は、STS を使用する ROSA クラスターの IAM リソースについて を参照してください。

このガイドは ROSA v4.11.X で検証されています。

4.1. 前提条件

4.2. ROSA 権限の検証

ROSA に必要な権限を検証するには、AWS リソースを作成していない状態で、次のセクションに示すスクリプトを実行します。

このスクリプトは、rosaaws、および jq CLI コマンドを使用して、現在の AWS 設定に接続されているアカウントの権限の検証に使用されるファイルを作業ディレクトリーに作成します。

AWS Policy Simulator を使用して、jq によって抽出された API 呼び出しに対して各ロールポリシーの権限を検証します。結果は、.results が追加されたテキストファイルに保存されます。

このスクリプトは、現在のアカウントとリージョンの権限を確認するように設計されています。

4.3. 使用手順

  1. スクリプトを使用するには、bash ターミナルで次のコマンドを実行します (-p オプションはロールの接頭辞を定義します)。

    $ mkdir scratch
    $ cd scratch
    $ cat << 'EOF' > verify-permissions.sh
    #!/bin/bash
    while getopts 'p:' OPTION; do
      case "$OPTION" in
        p)
          PREFIX="$OPTARG"
          ;;
        ?)
          echo "script usage: $(basename \$0) [-p PREFIX]" >&2
          exit 1
          ;;
      esac
    done
    shift "$(($OPTIND -1))"
    rosa create account-roles --mode manual --prefix $PREFIX
    INSTALLER_POLICY=$(cat sts_installer_permission_policy.json | jq )
    CONTROL_PLANE_POLICY=$(cat sts_instance_controlplane_permission_policy.json | jq)
    WORKER_POLICY=$(cat sts_instance_worker_permission_policy.json | jq)
    SUPPORT_POLICY=$(cat sts_support_permission_policy.json | jq)
    simulatePolicy () {
        outputFile="${2}.results"
        echo $2
        aws iam simulate-custom-policy --policy-input-list "$1" --action-names $(jq '.Statement | map(select(.Effect == "Allow"))[].Action | if type == "string" then . else .[] end' "$2" -r) --output text > $outputFile
    }
    simulatePolicy "$INSTALLER_POLICY" "sts_installer_permission_policy.json"
    simulatePolicy "$CONTROL_PLANE_POLICY" "sts_instance_controlplane_permission_policy.json"
    simulatePolicy "$WORKER_POLICY" "sts_instance_worker_permission_policy.json"
    simulatePolicy "$SUPPORT_POLICY" "sts_support_permission_policy.json"
    EOF
    $ chmod +x verify-permissions.sh
    $ ./verify-permissions.sh -p SimPolTest
  2. スクリプトが完了したら、各結果ファイルを確認して、必要な API 呼び出しがブロックされていないことを確認します。

    $ for file in $(ls *.results); do echo $file; cat $file; done

    出力は以下のようになります。

    sts_installer_permission_policy.json.results
    EVALUATIONRESULTS       autoscaling:DescribeAutoScalingGroups   allowed *
    MATCHEDSTATEMENTS       PolicyInputList.1       IAM Policy
    ENDPOSITION     6       195
    STARTPOSITION   17      3
    EVALUATIONRESULTS       ec2:AllocateAddress     allowed *
    MATCHEDSTATEMENTS       PolicyInputList.1       IAM Policy
    ENDPOSITION     6       195
    STARTPOSITION   17      3
    EVALUATIONRESULTS       ec2:AssociateAddress    allowed *
    MATCHEDSTATEMENTS       PolicyInputList.1       IAM Policy
    ...
    注記

    アクションがブロックされている場合は、AWS が提供するエラーを確認し、管理者に相談して、SCP によって必要な API 呼び出しがブロックされているかどうかを判断してください。

第5章 チュートリアル: カスタム DNS リゾルバーを使用した ROSA のデプロイ

カスタムの DHCP オプションセットを使用 すると、独自の DNS サーバー、ドメイン名などを使用して VPC をカスタマイズできます。Red Hat OpenShift Service on AWS (ROSA) クラスターは、カスタムの DHCP オプションセットの使用をサポートしています。デフォルトでは、ROSA クラスターの場合、クラスターの作成と操作を正常に行うために、"domain name servers" オプションを AmazonProvidedDNS に設定する必要があります。DNS 解決にカスタム DNS サーバーを使用するお客様は、ROSA クラスターの作成と操作を正常に実行できるように、追加の設定を行う必要があります。

このチュートリアルでは、特定の DNS ゾーン (詳細は後述) の DNS ルックアップを Amazon Route 53 Inbound Resolver に転送するように DNS サーバーを設定します。

注記

このチュートリアルでは、オープンソースの BIND DNS サーバー (named) を使用して、ROSA クラスターのデプロイ先の VPC にある Amazon Route 53 Inbound Resolver に DNS ルックアップを転送するために必要な設定を示します。ゾーン転送を設定する方法については、希望する DNS サーバーのドキュメントを参照してください。

5.1. 前提条件

  • ROSA CLI (rosa)
  • AWS CLI (aws)
  • 手動で作成した AWS VPC
  • カスタム DNS サーバーを参照するように設定され、VPC のデフォルトとして設定されている DHCP オプションセット

5.2. 環境の設定

  1. 次の環境変数を設定します。

    $ export VPC_ID=<vpc_ID> 1
    $ export REGION=<region> 2
    $ export VPC_CIDR=<vpc_CIDR> 3
    1
    <vpc_ID> は、クラスターをインストールする VPC の ID に置き換えます。
    2
    <region> は、クラスターをインストールする AWS リージョンに置き換えます。
    3
    <vpc_CIDR> は、VPC の CIDR 範囲に置き換えます。
  2. 次のセクションに進む前に、すべてのフィールドが正しく出力されていることを確認してください。

    $ echo "VPC ID: ${VPC_ID}, VPC CIDR Range: ${VPC_CIDR}, Region: ${REGION}"

5.3. Amazon Route 53 Inbound Resolver の作成

次の手順を使用して、クラスターのデプロイ先の VPC に Amazon Route 53 Inbound Resolver をデプロイします。

警告

この例では、クラスターが使用するのと同じ VPC に Amazon Route 53 Inbound Resolver をデプロイします。別の VPC にデプロイする場合は、クラスターの作成を開始してから、以下に詳述するプライベートホストゾーンを手動で関連付ける必要があります。クラスター作成プロセスを開始する前にゾーンを関連付けることはできません。クラスター作成プロセス中にプライベートホストゾーンを関連付けないと、クラスター作成が失敗します。

  1. セキュリティーグループを作成し、VPC からポート 53/tcp および 53/udp へのアクセスを許可します。

    $ SG_ID=$(aws ec2 create-security-group --group-name rosa-inbound-resolver --description "Security group for ROSA inbound resolver" --vpc-id ${VPC_ID} --region ${REGION} --output text)
    $ aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol tcp --port 53 --cidr ${VPC_CIDR} --region ${REGION}
    $ aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol udp --port 53 --cidr ${VPC_CIDR} --region ${REGION}
  2. VPC に Amazon Route 53 Inbound Resolver を作成します。

    $ RESOLVER_ID=$(aws route53resolver create-resolver-endpoint \
      --name rosa-inbound-resolver \
      --creator-request-id rosa-$(date '+%Y-%m-%d') \
      --security-group-ids ${SG_ID} \
      --direction INBOUND \
      --ip-addresses $(aws ec2 describe-subnets --filter Name=vpc-id,Values=${VPC_ID} --region ${REGION} | jq -jr '.Subnets | map("SubnetId=\(.SubnetId) ") | .[]') \
      --region ${REGION} \
      --output text \
      --query 'ResolverEndpoint.Id')
    注記

    上記のコマンドは、動的に割り当てられた IP アドレスを使用して、指定した VPC 内の すべてのサブネット に Amazon Route 53 Inbound Resolver エンドポイントをアタッチします。サブネットや IP アドレスを手動で指定する場合は、代わりに次のコマンドを実行します。

    $ RESOLVER_ID=$(aws route53resolver create-resolver-endpoint \
      --name rosa-inbound-resolver \
      --creator-request-id rosa-$(date '+%Y-%m-%d') \
      --security-group-ids ${SG_ID} \
      --direction INBOUND \
      --ip-addresses SubnetId=<subnet_ID>,Ip=<endpoint_IP> SubnetId=<subnet_ID>,Ip=<endpoint_IP> \1
      --region ${REGION} \
      --output text \
      --query 'ResolverEndpoint.Id')
    1
    <subnet_ID> はサブネット ID に、<endpoint_IP> はインバウンドリゾルバーエンドポイントを追加する静的 IP アドレスに置き換えます。
  3. DNS サーバー設定で指定するインバウンドリゾルバーエンドポイントの IP アドレスを取得します。

    $ aws route53resolver list-resolver-endpoint-ip-addresses \
      --resolver-endpoint-id ${RESOLVER_ID} \
      --region=${REGION} \
      --query 'IpAddresses[*].Ip'

    出力例

    [
        "10.0.45.253",
        "10.0.23.131",
        "10.0.148.159"
    ]

5.4. DNS サーバーの設定

次の手順を使用して、必要なプライベートホストゾーンを Amazon Route 53 Inbound Resolver に転送するように DNS サーバーを設定します。

5.4.1. ROSA with HCP

ROSA with HCP クラスターでは、2 つのプライベートホストゾーンの DNS 転送を設定する必要があります。

  • <cluster-name>.hypershift.local
  • rosa.<domain-prefix>.<unique-ID>.p3.openshiftapps.com

これらの Amazon Route 53 プライベートホストゾーンは、クラスターの作成中に作成されます。cluster-namedomain-prefix はお客様が指定する値ですが、unique-ID はクラスターの作成中にランダムに生成され、事前に選択することはできません。そのため、クラスター作成プロセスが開始してから、p3.openshiftapps.com プライベートホストゾーンの転送を設定する必要があります。

  1. クラスターを作成する前に、<cluster-name>.hypershift.local のすべての DNS 要求を Amazon Route 53 Inbound Resolver エンドポイントに転送するように DNS サーバーを設定します。BIND DNS サーバーの場合は、任意のテキストエディターで /etc/named.conf ファイルを編集し、以下の例を使用して新しいゾーンを追加します。

    zone "<cluster-name>.hypershift.local" { 1
      type forward;
      forward only;
      forwarders { 2
        10.0.45.253;
        10.0.23.131;
        10.0.148.159;
      };
    };

    1
    <cluster-name> は、ROSA HCP クラスター名に置き換えます。
    2
    上記で取得したインバウンドリゾルバーエンドポイントの IP アドレスに置き換えます。各 IP アドレスの後に必ず ; を付けます。
  2. クラスターを作成します
  3. クラスターの作成プロセスが開始したら、新しく作成されたプライベートホストゾーンを特定します。

    $ aws route53 list-hosted-zones-by-vpc \
      --vpc-id ${VPC_ID} \
      --vpc-region ${REGION} \
      --query 'HostedZoneSummaries[*].Name' \
      --output table

    出力例

    --------------------------------------------------
    |             ListHostedZonesByVPC               |
    +------------------------------------------------+
    |  rosa.domain-prefix.lkmb.p3.openshiftapps.com. |
    |  cluster-name.hypershift.local.                |
    +------------------------------------------------+

    注記

    クラスター作成プロセスで Route 53 にプライベートホストゾーンが作成されるまでに、数分かかる場合があります。p3.openshiftapps.com ドメインが表示されない場合は、数分待ってからコマンドを再度実行してください。

  4. クラスタードメインの一意の ID を調べたら、rosa.<domain-prefix>.<unique-ID>.p3.openshiftapps.com のすべての DNS 要求を Amazon Route 53 Inbound Resolver エンドポイントに転送するように DNS サーバーを設定します。BIND DNS サーバーの場合は、任意のテキストエディターで /etc/named.conf ファイルを編集し、以下の例を使用して新しいゾーンを追加します。

    zone "rosa.<domain-prefix>.<unique-ID>.p3.openshiftapps.com" { 1
      type forward;
      forward only;
      forwarders { 2
        10.0.45.253;
        10.0.23.131;
        10.0.148.159;
      };
    };

    1
    <domain-prefix> はクラスターのドメイン接頭辞に、<unique-ID> は上記で取得した一意の ID に置き換えます。
    2
    上記で取得したインバウンドリゾルバーエンドポイントの IP アドレスに置き換えます。各 IP アドレスの後に必ず ; を付けます。

5.4.2. ROSA Classic

ROSA Classic クラスターでは、1 つのプライベートホストゾーンの DNS 転送を設定する必要があります。

  • <domain-prefix>.<unique-ID>.p1.openshiftapps.com

この Amazon Route 53 プライベートホストゾーンは、クラスターの作成中に作成されます。domain-prefix はお客様が指定する値ですが、unique-ID はクラスターの作成中にランダムに生成され、事前に選択することはできません。そのため、クラスター作成プロセスが開始してから、p1.openshiftapps.com プライベートホストゾーンの転送を設定する必要があります。

  1. クラスターを作成します
  2. クラスターの作成プロセスが開始したら、新しく作成されたプライベートホストゾーンを特定します。

    $ aws route53 list-hosted-zones-by-vpc \
      --vpc-id ${VPC_ID} \
      --vpc-region ${REGION} \
      --query 'HostedZoneSummaries[*].Name' \
      --output table

    出力例

    ----------------------------------------------
    |           ListHostedZonesByVPC             |
    +--------------------------------------------+
    |  domain-prefix.agls.p3.openshiftapps.com.  |
    +--------------------------------------------+

    注記

    クラスター作成プロセスで Route 53 にプライベートホストゾーンが作成されるまでに、数分かかる場合があります。p1.openshiftapps.com ドメインが表示されない場合は、数分待ってからコマンドを再度実行してください。

  3. クラスタードメインの一意の ID を調べたら、<domain-prefix>.<unique-ID>.p1.openshiftapps.com のすべての DNS 要求を Amazon Route 53 Inbound Resolver エンドポイントに転送するように DNS サーバーを設定します。BIND DNS サーバーの場合は、任意のテキストエディターで /etc/named.conf ファイルを編集し、以下の例を使用して新しいゾーンを追加します。

    zone "<domain-prefix>.<unique-ID>.p1.openshiftapps.com" { 1
      type forward;
      forward only;
      forwarders { 2
        10.0.45.253;
        10.0.23.131;
        10.0.148.159;
      };
    };

    1
    <domain-prefix> はクラスターのドメイン接頭辞に、<unique-ID> は上記で取得した一意の ID に置き換えます。
    2
    上記で取得したインバウンドリゾルバーエンドポイントの IP アドレスに置き換えます。各 IP アドレスの後に必ず ; を付けます。

第6章 チュートリアル: AWS WAF と Amazon CloudFront を使用した ROSA ワークロードの保護

AWS WAF は Web アプリケーションファイアウォールです。保護対象の Web アプリケーションリソースに転送される HTTP および HTTPS 要求を監視できます。

Amazon CloudFront を使用して、Web Application Firewall (WAF) を Red Hat OpenShift Service on AWS (ROSA) ワークロードに追加できます。外部ソリューションを使用すると、WAF の処理によるサービス拒否から ROSA リソースを保護できます。

6.1. 前提条件

  • ROSA (HCP または Classic) クラスター。
  • OpenShift CLI (oc) にアクセスできる。
  • AWS CLI (aws) にアクセスできる。

6.1.1. 環境設定

  • 環境変数を準備します。

    $ export DOMAIN=apps.example.com 1
    $ export AWS_PAGER=""
    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER}/cloudfront-waf"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: ${CLUSTER}, Region: ${REGION}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    1
    IngressController に使用するカスタムドメインに置き換えます。
    注記

    前のコマンドからの "Cluster" の出力は、クラスターの名前、クラスターの内部 ID、またはクラスターのドメイン接頭辞である可能性があります。別の識別子を使用する場合は、次のコマンドを実行して手動でこの値を設定できます。

    $ export CLUSTER=my-custom-value

6.2. セカンダリー Ingress Controller の設定

標準 (およびデフォルト) クラスター Ingress Controller からの WAF 保護対象の外部トラフィックをセグメント化するために、セカンダリー Ingress Controller を設定する必要があります。

前提条件

  • カスタムドメイン用の公的に信頼された SAN 証明書またはワイルドカード証明書 (例: CN=*.apps.example.com)

    重要

    Amazon CloudFront は HTTPS を使用してクラスターのセカンダリー Ingress Controller と通信します。Amazon CloudFront のドキュメント で説明されているように、CloudFront とクラスター間の HTTPS 通信には自己署名証明書を使用できません。Amazon CloudFront は、証明書が信頼できる認証局によって発行されたことを確認します。

手順

  1. 秘密鍵と公開証明書から新しい TLS シークレットを作成します。fullchain.pem は完全なワイルドカード証明書チェーン (中間証明書を含む)、privkey.pem はワイルドカード証明書の秘密鍵です。

    $ oc -n openshift-ingress create secret tls waf-tls --cert=fullchain.pem --key=privkey.pem

  2. 新規の IngressController リソースを作成します。

    waf-Ingress-controller.yaml の例

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: cloudfront-waf
      namespace: openshift-ingress-operator
    spec:
      domain: apps.example.com 1
      defaultCertificate:
        name: waf-tls
      endpointPublishingStrategy:
        loadBalancer:
          dnsManagementPolicy: Unmanaged
          providerParameters:
            aws:
              type: NLB
            type: AWS
          scope: External
        type: LoadBalancerService
      routeSelector: 2
        matchLabels:
         route: waf

    1
    IngressController に使用するカスタムドメインに置き換えます。
    2
    Ingress Controller によって提供されるルートのセットをフィルタリングします。このチュートリアルでは waf ルートセレクターを使用しますが、値を指定しないと、フィルター処理は行われません。
  3. IngressController を適用します。

    $ oc apply -f waf-ingress-controller.yaml

  4. IngressController が外部ロードバランサーを正常に作成したことを確認します。

    $ oc -n openshift-ingress get service/router-cloudfront-waf

    出力例

    NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     PORT(S)                      AGE
    router-cloudfront-waf   LoadBalancer   172.30.16.141   a68a838a7f26440bf8647809b61c4bc8-4225395f488830bd.elb.us-east-1.amazonaws.com   80:30606/TCP,443:31065/TCP   2m19s

6.2.1. AWS WAF の設定

AWS WAF サービスは Web アプリケーションファイアウォールです。ROSA などの保護対象の Web アプリケーションリソースに転送される HTTP および HTTPS 要求を監視、保護、制御できます。

  1. Web ACL に適用する AWS WAF ルールファイルを作成します。

    $ cat << EOF > ${SCRATCH}/waf-rules.json
    [
        {
          "Name": "AWS-AWSManagedRulesCommonRuleSet",
          "Priority": 0,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesCommonRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesCommonRuleSet"
          }
        },
        {
          "Name": "AWS-AWSManagedRulesSQLiRuleSet",
          "Priority": 1,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesSQLiRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesSQLiRuleSet"
          }
        }
    ]
    EOF

    これにより、コア (共通) および SQL AWS マネージドルールセットが有効になります。

  2. 上記で指定したルールを使用して、AWS WAF の Web ACL を作成します。

    $ WAF_WACL=$(aws wafv2 create-web-acl \
      --name cloudfront-waf \
      --region ${REGION} \
      --default-action Allow={} \
      --scope CLOUDFRONT \
      --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=${CLUSTER}-waf-metrics \
      --rules file://${SCRATCH}/waf-rules.json \
      --query 'Summary.Name' \
      --output text)

6.3. Amazon CloudFront の設定

  1. 新しく作成されたカスタム Ingress Controller の NLB ホスト名を取得します。

    $ NLB=$(oc -n openshift-ingress get service router-cloudfront-waf \
      -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
  2. 証明書を Amazon Certificate Manager にインポートします。cert.pem はワイルドカード証明書、fullchain.pem はワイルドカード証明書のチェーン、privkey.pem はワイルドカード証明書の秘密鍵です。

    注記

    この証明書は、クラスターがデプロイされているリージョンに関係なく us-east-1 にインポートする必要があります。Amazon CloudFront はグローバル AWS サービスであるためです。

    $ aws acm import-certificate --certificate file://cert.pem \
      --certificate-chain file://fullchain.pem \
      --private-key file://privkey.pem \
      --region us-east-1

  3. AWS コンソール にログインして、CloudFront ディストリビューションを作成します。
  4. 次の情報を使用して、CloudFront ディストリビューションを設定します。

    注記

    以下の表でオプションが指定されていない場合は、デフォルトのままにしておきます (空白でも構いません)。

    オプション

    Origin domain

    前のコマンドからの出力[1]

    名前

    rosa-waf-ingress [2]

    Viewer protocol policy

    Redirect HTTP to HTTPS

    Allowed HTTP methods

    GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE

    Cache policy

    CachingDisabled

    Origin request policy

    AllViewer

    Web Application Firewall (WAF)

    Enable security protections

    Use existing WAF configuration

    true

    Choose a web ACL

    cloudfront-waf

    Alternate domain name (CNAME)

    *.apps.example.com [3]

    Custom SSL certificate

    上のステップでインポートした証明書を選択 [4]

    1. origin domain を取得するには、echo ${NLB} を実行します。
    2. 複数のクラスターがある場合は、オリジンの名前が一意であることを確認してください。
    3. これは、カスタム Ingress Controller の作成に使用したワイルドカードドメインと同じである必要があります。
    4. これは、上で入力した alternate domain name と同じである必要があります。
  5. Amazon CloudFront ディストリビューションエンドポイントを取得します。

    $ aws cloudfront list-distributions --query "DistributionList.Items[?Origins.Items[?DomainName=='${NLB}']].DomainName" --output text
  6. CNAME を持つカスタムのワイルドカードドメインの DNS を、前述のステップの Amazon CloudFront ディストリビューションエンドポイントに更新します。

    *.apps.example.com CNAME d1b2c3d4e5f6g7.cloudfront.net

6.4. サンプルアプリケーションのデプロイ

  1. 次のコマンドを実行して、サンプルアプリケーション用の新しいプロジェクトを作成します。

    $ oc new-project hello-world
  2. Hello World アプリケーションをデプロイします。

    $ oc -n hello-world new-app --image=docker.io/openshift/hello-openshift
  3. カスタムドメイン名を指定してアプリケーションのルートを作成します。

    $ oc -n hello-world create route edge --service=hello-openshift hello-openshift-tls \
    --hostname hello-openshift.${DOMAIN}

  4. ルートにラベルを付けて、カスタム Ingress Controller へのアクセスを許可します。

    $ oc -n hello-world label route.route.openshift.io/hello-openshift-tls route=waf

6.5. WAF のテスト

  1. アプリが Amazon CloudFront の背後でアクセスできることをテストします。

    $ curl "https://hello-openshift.${DOMAIN}"

    出力例

    Hello OpenShift!

  2. WAF が不正な要求を拒否することをテストします。

    $ curl -X POST "https://hello-openshift.${DOMAIN}" \
      -F "user='<script><alert>Hello></alert></script>'"

    出力例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
    <TITLE>ERROR: The request could not be satisfied</TITLE>
    </HEAD><BODY>
    <H1>403 ERROR</H1>
    <H2>The request could not be satisfied.</H2>
    <HR noshade size="1px">
    Request blocked.
    We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
    <BR clear="all">
    If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
    <BR clear="all">
    <HR noshade size="1px">
    <PRE>
    Generated by cloudfront (CloudFront)
    Request ID: nFk9q2yB8jddI6FZOTjdliexzx-FwZtr8xUQUNT75HThPlrALDxbag==
    </PRE>
    <ADDRESS>
    </ADDRESS>
    </BODY></HTML>

    予期される結果は 403 ERROR エラーです。このエラーが返されれば、アプリケーションは AWS WAF によって保護されています。

6.6. 関連情報

第7章 チュートリアル: AWS WAF と AWS ALB を使用した ROSA ワークロードの保護

AWS WAF は Web アプリケーションファイアウォールです。保護対象の Web アプリケーションリソースに転送される HTTP および HTTPS 要求を監視できます。

AWS Application Load Balancer (ALB) を使用して、Red Hat OpenShift Service on AWS (ROSA) ワークロードに Web Application Firewall (WAF) を追加できます。外部ソリューションを使用すると、WAF の処理によるサービス拒否から ROSA リソースを保護できます。

重要

ALB ベースのソリューションを絶対に使用する必要がある場合を除き、より柔軟な CloudFront メソッド を使用することを推奨します。

7.1. 前提条件

  • 複数のアベイラビリティーゾーン (AZ) ROSA (HCP または Classic) クラスター。

    注記

    AWS ドキュメントによると、AWS ALB には AZ 全体にわたって少なくとも 2 つの public サブネットが必要です。このため、ALB では複数の AZ ROSA クラスターのみを使用できます。

  • OpenShift CLI (oc) にアクセスできる。
  • AWS CLI (aws) にアクセスできる。

7.1.1. 環境設定

  • 環境変数を準備します。

    $ export AWS_PAGER=""
    $ export CLUSTER=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}")
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER}/alb-waf"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: $(echo ${CLUSTER} | sed 's/-[a-z0-9]\{5\}$//'), Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

7.1.2. AWS VPC とサブネット

注記

このセクションは、既存の VPC にデプロイされたクラスターにのみ適用されます。クラスターを既存の VPC にデプロイしなかった場合は、このセクションをスキップして、その後のインストールセクションに進んでください。

  1. 以下の変数を、ROSA デプロイメントに合わせて適切な値に設定します。

    $ export VPC_ID=<vpc-id> 1
    $ export PUBLIC_SUBNET_IDS=(<space-separated-list-of-ids>) 2
    $ export PRIVATE_SUBNET_IDS=(<space-separated-list-of-ids>) 3
    1
    クラスターの VPC ID に置き換えます (例: export VPC_ID=vpc-04c429b7dbc4680ba)。
    2
    クラスターのプライベートサブネット ID のスペース区切りリストに置き換えます。() は必ず保持してください。例: export PUBLIC_SUBNET_IDS=(subnet-056fd6861ad332ba2 subnet-08ce3b4ec753fe74c subnet-071aa28228664972f)
    3
    クラスターのプライベートサブネット ID のスペース区切りリストに置き換えます。() は必ず保持してください。たとえば、export PRIVATE_SUBNET_IDS=(subnet-0b933d72a8d72c36a subnet-0817eb72070f1d3c2 subnet-0806e64159b66665a) です。
  2. クラスター識別子を使用して、クラスターの VPC にタグを追加します。

    $ aws ec2 create-tags --resources ${VPC_ID} \
      --tags Key=kubernetes.io/cluster/${CLUSTER},Value=shared --region ${REGION}
  3. パブリックサブネットにタグを追加します。

    $ aws ec2 create-tags \
      --resources ${PUBLIC_SUBNET_IDS} \
      --tags Key=kubernetes.io/role/elb,Value='1' \
            Key=kubernetes.io/cluster/${CLUSTER},Value=shared \
      --region ${REGION}
  4. プライベートサブネットにタグを追加します。

    $ aws ec2 create-tags \
      --resources ${PRIVATE_SUBNET_IDS} \
      --tags Key=kubernetes.io/role/internal-elb,Value='1' \
            Key=kubernetes.io/cluster/${CLUSTER},Value=shared \
      --region ${REGION}

7.2. AWS Load Balancer Operator のデプロイ

AWS Load Balancer Operator は、ROSA クラスター内の aws-load-balancer-controller のインスタンスをインストール、管理、設定するために使用します。ROSA に ALB をデプロイするには、まず AWS Load Balancer Operator をデプロイする必要があります。

  1. 次のコマンドを実行して、AWS Load Balancer Operator をデプロイする新しいプロジェクトを作成します。

    $ oc new-project aws-load-balancer-operator
  2. 次のコマンドを実行して、AWS Load Balancer Controller の AWS IAM ポリシーを作成します (まだ存在しない場合)。

    注記

    ポリシーは アップストリームの AWS Load Balancer Controller ポリシー から取得されます。これは Operator が機能するために必要です。

    $ POLICY_ARN=$(aws iam list-policies --query \
         "Policies[?PolicyName=='aws-load-balancer-operator-policy'].{ARN:Arn}" \
         --output text)
    $ if [[ -z "${POLICY_ARN}" ]]; then
        wget -O "${SCRATCH}/load-balancer-operator-policy.json" \
           https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
         POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
         --output text iam create-policy \
         --policy-name aws-load-balancer-operator-policy \
         --policy-document "file://${SCRATCH}/load-balancer-operator-policy.json")
    fi
  3. AWS Load Balancer Operator の AWS IAM 信頼ポリシーを作成します。

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager", "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-cluster"]
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  4. AWS Load Balancer Operator の AWS IAM ロールを作成します。

    $ ROLE_ARN=$(aws iam create-role --role-name "${CLUSTER}-alb-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
  5. 次のコマンドを実行して、以前に作成した IAM ロールに AWS Load Balancer Operator ポリシーを割り当てます。

    $ aws iam attach-role-policy --role-name "${CLUSTER}-alb-operator" \
         --policy-arn ${POLICY_ARN}
  6. 新しく作成した AWS IAM ロールを引き受けるための AWS Load Balancer Operator 用のシークレットを作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    stringData:
      credentials: |
        [default]
        role_arn = ${ROLE_ARN}
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    EOF
  7. AWS Load Balancer Operator をインストールします。

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      upgradeStrategy: Default
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      channel: stable-v1.0
      installPlanApproval: Automatic
      name: aws-load-balancer-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: aws-load-balancer-operator.v1.0.0
    EOF
  8. 次の Operator を使用して、AWS Load Balancer Controller のインスタンスをデプロイします。

    注記

    ここでエラーが発生した場合は、少し待ってから再試行してください。エラーが発生するのは、Operator がまだインストールを完了していないためです。

    $ cat << EOF | oc apply -f -
    apiVersion: networking.olm.openshift.io/v1
    kind: AWSLoadBalancerController
    metadata:
      name: cluster
    spec:
      credentials:
        name: aws-load-balancer-operator
      enabledAddons:
        - AWSWAFv2
    EOF
  9. Operator Pod とコントローラー Pod の両方が実行されていることを確認します。

    $ oc -n aws-load-balancer-operator get pods

    次のようなメッセージが表示されます。表示されない場合は、少し待ってから再試行してください。

    NAME                                                             READY   STATUS    RESTARTS   AGE
    aws-load-balancer-controller-cluster-6ddf658785-pdp5d            1/1     Running   0          99s
    aws-load-balancer-operator-controller-manager-577d9ffcb9-w6zqn   2/2     Running   0          2m4s

7.3. サンプルアプリケーションのデプロイ

  1. サンプルアプリケーション用に新しいプロジェクトを作成します。

    $ oc new-project hello-world
  2. Hello World アプリケーションをデプロイします。

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  3. 事前に作成済みのサービスリソースを NodePort サービスタイプに変換します。

    $ oc -n hello-world patch service hello-openshift -p '{"spec":{"type":"NodePort"}}'
  4. AWS Load Balancer Operator を使用して AWS ALB をデプロイします。

    $ cat << EOF | oc apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: hello-openshift-alb
      namespace: hello-world
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: hello-openshift
                    port:
                      number: 8080
    EOF
  5. AWS ALB Ingress エンドポイントを curl して、Hello World アプリケーションにアクセスできることを確認します。

    注記

    AWS ALB のプロビジョニングには数分かかります。curl: (6) Could not resolve host というエラーが表示された場合は、待機してから再試行してください。

    $ INGRESS=$(oc -n hello-world get ingress hello-openshift-alb -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${INGRESS}"

    出力例

    Hello OpenShift!

7.3.1. AWS WAF の設定

AWS WAF サービスは Web アプリケーションファイアウォールです。ROSA などの保護対象の Web アプリケーションリソースに転送される HTTP および HTTPS 要求を監視、保護、制御できます。

  1. Web ACL に適用する AWS WAF ルールファイルを作成します。

    $ cat << EOF > ${SCRATCH}/waf-rules.json
    [
        {
          "Name": "AWS-AWSManagedRulesCommonRuleSet",
          "Priority": 0,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesCommonRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesCommonRuleSet"
          }
        },
        {
          "Name": "AWS-AWSManagedRulesSQLiRuleSet",
          "Priority": 1,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesSQLiRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesSQLiRuleSet"
          }
        }
    ]
    EOF

    これにより、コア (共通) および SQL AWS マネージドルールセットが有効になります。

  2. 上記で指定したルールを使用して、AWS WAF の Web ACL を作成します。

    $ WAF_ARN=$(aws wafv2 create-web-acl \
      --name ${CLUSTER}-waf \
      --region ${REGION} \
      --default-action Allow={} \
      --scope REGIONAL \
      --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=${CLUSTER}-waf-metrics \
      --rules file://${SCRATCH}/waf-rules.json \
      --query 'Summary.ARN' \
      --output text)
  3. Ingress リソースに AWS WAF の Web ACL ARN のアノテーションを付けます。

    $ oc annotate -n hello-world ingress.networking.k8s.io/hello-openshift-alb \
      alb.ingress.kubernetes.io/wafv2-acl-arn=${WAF_ARN}
  4. ルールが反映されるまで 10 秒待ち、アプリケーションがまだ動作するかテストします。

    $ curl "http://${INGRESS}"

    出力例

    Hello OpenShift!

  5. WAF が不正な要求を拒否することをテストします。

    $ curl -X POST "http://${INGRESS}" \
      -F "user='<script><alert>Hello></alert></script>'"

    出力例

    <html>
    <head><title>403 Forbidden</title></head>
    <body>
    <center><h1>403 Forbidden</h1></center>
    </body>
    </html

    注記

    AWS WAF 統合の有効化には数分かかる場合があります。403 Forbidden エラーが表示されない場合は、数秒待ってからもう一度お試しください。

    予期される結果は 403 Forbidden エラーです。このエラーが返されれば、アプリケーションは AWS WAF によって保護されています。

7.4. 関連情報

第8章 チュートリアル: ROSA クラスターへの OpenShift API for Data Protection のデプロイ

重要

このコンテンツは Red Hat のエキスパートが作成したものですが、サポート対象のすべての設定でまだテストされていません。

環境

  • 環境変数を準備します。

    注記

    ROSA クラスターに一致するようにクラスター名を変更し、管理者としてクラスターにログインしていることを確認してください。次に進む前に、すべてのフィールドが正しく出力されていることを確認してください。

    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export ROSA_CLUSTER_ID=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .id)
    $ export REGION=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .region.id)
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export CLUSTER_VERSION=`rosa describe cluster -c ${CLUSTER_NAME} -o json | jq -r .version.raw_id | cut -f -2 -d '.'`
    $ export ROLE_NAME="${CLUSTER_NAME}-openshift-oadp-aws-cloud-credentials"
    $ export AWS_PAGER=""
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/oadp"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster ID: ${ROSA_CLUSTER_ID}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

8.1. AWS アカウントの準備

  1. S3 アクセスを許可する IAM ポリシーを作成します。

    $ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='RosaOadpVer1'].{ARN:Arn}" --output text)
    if [[ -z "${POLICY_ARN}" ]]; then
    $ cat << EOF > ${SCRATCH}/policy.json
    {
    "Version": "2012-10-17",
    "Statement": [
     {
       "Effect": "Allow",
       "Action": [
         "s3:CreateBucket",
         "s3:DeleteBucket",
         "s3:PutBucketTagging",
         "s3:GetBucketTagging",
         "s3:PutEncryptionConfiguration",
         "s3:GetEncryptionConfiguration",
         "s3:PutLifecycleConfiguration",
         "s3:GetLifecycleConfiguration",
         "s3:GetBucketLocation",
         "s3:ListBucket",
         "s3:GetObject",
         "s3:PutObject",
         "s3:DeleteObject",
         "s3:ListBucketMultipartUploads",
         "s3:AbortMultipartUpload",
         "s3:ListMultipartUploadParts",
         "ec2:DescribeSnapshots",
         "ec2:DescribeVolumes",
         "ec2:DescribeVolumeAttribute",
         "ec2:DescribeVolumesModifications",
         "ec2:DescribeVolumeStatus",
         "ec2:CreateTags",
         "ec2:CreateVolume",
         "ec2:CreateSnapshot",
         "ec2:DeleteSnapshot"
       ],
       "Resource": "*"
     }
    ]}
    EOF
    $ POLICY_ARN=$(aws iam create-policy --policy-name "RosaOadpVer1" \
    --policy-document file:///${SCRATCH}/policy.json --query Policy.Arn \
    --tags Key=rosa_openshift_version,Value=${CLUSTER_VERSION} Key=rosa_role_prefix,Value=ManagedOpenShift Key=operator_namespace,Value=openshift-oadp Key=operator_name,Value=openshift-oadp \
    --output text)
    fi
    $ echo ${POLICY_ARN}
  2. クラスターの IAM ロール信頼ポリシーを作成します。

    $ cat <<EOF > ${SCRATCH}/trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_ENDPOINT}"
        },
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {
          "StringEquals": {
             "${OIDC_ENDPOINT}:sub": [
               "system:serviceaccount:openshift-adp:openshift-adp-controller-manager",
               "system:serviceaccount:openshift-adp:velero"]
          }
        }
      }]
    }
    EOF
    $ ROLE_ARN=$(aws iam create-role --role-name \
     "${ROLE_NAME}" \
      --assume-role-policy-document file://${SCRATCH}/trust-policy.json \
      --tags Key=rosa_cluster_id,Value=${ROSA_CLUSTER_ID} Key=rosa_openshift_version,Value=${CLUSTER_VERSION} Key=rosa_role_prefix,Value=ManagedOpenShift Key=operator_namespace,Value=openshift-adp Key=operator_name,Value=openshift-oadp \
      --query Role.Arn --output text)
    
    $ echo ${ROLE_ARN}
  3. IAM ポリシーを IAM ロールに割り当てます。

    $ aws iam attach-role-policy --role-name "${ROLE_NAME}" \
     --policy-arn ${POLICY_ARN}

8.2. クラスターへの OADP のデプロイ

  1. OADP の namespace を作成します。

    $ oc create namespace openshift-adp
  2. 認証情報のシークレットを作成します。

    $ cat <<EOF > ${SCRATCH}/credentials
    [default]
    role_arn = ${ROLE_ARN}
    web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    region=<aws_region> 1
    EOF
    $ oc -n openshift-adp create secret generic cloud-credentials \
     --from-file=${SCRATCH}/credentials
    1
    <aws_region> は、Security Token Service (STS) エンドポイントに使用する AWS リージョンに置き換えます。
  3. OADP Operator をデプロイします。

    注記

    現在、Operator のバージョン 1.1 では、バックアップが PartiallyFailed ステータスになるという問題があります。これはバックアップと復元のプロセスには影響しないと思われますが、それに関連する問題があるため注意が必要です。

    $ cat << EOF | oc create -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
     generateName: openshift-adp-
     namespace: openshift-adp
     name: oadp
    spec:
     targetNamespaces:
     - openshift-adp
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
     name: redhat-oadp-operator
     namespace: openshift-adp
    spec:
     channel: stable-1.2
     installPlanApproval: Automatic
     name: redhat-oadp-operator
     source: redhat-operators
     sourceNamespace: openshift-marketplace
    EOF
  4. Operator の準備が整うまで待ちます。

    $ watch oc -n openshift-adp get pods

    出力例

    NAME                                                READY   STATUS    RESTARTS   AGE
    openshift-adp-controller-manager-546684844f-qqjhn   1/1     Running   0          22s

  5. クラウドストレージを作成します。

    $ cat << EOF | oc create -f -
    apiVersion: oadp.openshift.io/v1alpha1
    kind: CloudStorage
    metadata:
     name: ${CLUSTER_NAME}-oadp
     namespace: openshift-adp
    spec:
     creationSecret:
       key: credentials
       name: cloud-credentials
     enableSharedConfig: true
     name: ${CLUSTER_NAME}-oadp
     provider: aws
     region: $REGION
    EOF
  6. アプリケーションのストレージのデフォルトのストレージクラスを確認します。

    $ oc get pvc -n <namespace> 1
    1
    アプリケーションの namespace を入力します。

    出力例

    NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    applog   Bound    pvc-351791ae-b6ab-4e8b-88a4-30f73caf5ef8   1Gi        RWO            gp3-csi        4d19h
    mysql    Bound    pvc-16b8e009-a20a-4379-accc-bc81fedd0621   1Gi        RWO            gp3-csi        4d19h

    $ oc get storageclass

    出力例

    NAME                PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    gp2                 kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   4d21h
    gp2-csi             ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3                 ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3-csi (default)   ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h

    gp3-csi、gp2-csi、gp3、または gp2 のいずれかを使用すると機能します。バックアップ対象のアプリケーションがすべて CSI を使用した PV を使用している場合は、OADP の DPA 設定に CSI プラグインを含めます。

  7. CSI のみ: Data Protection Application をデプロイします。

    $ cat << EOF | oc create -f -
    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
     name: ${CLUSTER_NAME}-dpa
     namespace: openshift-adp
    spec:
     backupImages: true
     features:
       dataMover:
         enable: false
     backupLocations:
     - bucket:
         cloudStorageRef:
           name: ${CLUSTER_NAME}-oadp
         credential:
           key: credentials
           name: cloud-credentials
         prefix: velero
         default: true
         config:
           region: ${REGION}
     configuration:
       velero:
         defaultPlugins:
         - openshift
         - aws
         - csi
       restic:
         enable: false
    EOF
    注記

    CSI ボリュームに対してこのコマンドを実行する場合は、次のステップをスキップできます。

  8. 非 CSI ボリューム: Data Protection Application をデプロイします。

    $ cat << EOF | oc create -f -
    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
     name: ${CLUSTER_NAME}-dpa
     namespace: openshift-adp
    spec:
     backupImages: true
     features:
       dataMover:
         enable: false
     backupLocations:
     - bucket:
         cloudStorageRef:
           name: ${CLUSTER_NAME}-oadp
         credential:
           key: credentials
           name: cloud-credentials
         prefix: velero
         default: true
         config:
           region: ${REGION}
     configuration:
       velero:
         defaultPlugins:
         - openshift
         - aws
       restic:
         enable: false
     snapshotLocations:
       - velero:
           config:
             credentialsFile: /tmp/credentials/openshift-adp/cloud-credentials-credentials
             enableSharedConfig: 'true'
             profile: default
             region: ${REGION}
           provider: aws
    EOF
注記
  • OADP 1.1.x ROSA STS 環境では、コンテナーイメージのバックアップと復元 (spec.backupImages) の値はサポートされていないため、false に設定する必要があります。
  • Restic 機能 (restic.enable=false) は、ROSA STS 環境では無効になっており、サポートされていません。
  • DataMover 機能 (dataMover.enable=false) は、ROSA STS 環境では無効になっており、サポートされていません。

8.3. バックアップの実行

注記

次のサンプル hello-world アプリケーションには、永続ボリュームが接続されていません。どちらの DPA 設定も機能します。

  1. バックアップするワークロードを作成します。

    $ oc create namespace hello-world
    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  2. ルートを公開します。

    $ oc expose service/hello-openshift -n hello-world
  3. アプリケーションが動作していることを確認します。

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`

    出力例

    Hello OpenShift!

  4. ワークロードをバックアップします。

    $ cat << EOF | oc create -f -
    apiVersion: velero.io/v1
    kind: Backup
    metadata:
     name: hello-world
     namespace: openshift-adp
    spec:
     includedNamespaces:
     - hello-world
     storageLocation: ${CLUSTER_NAME}-dpa-1
     ttl: 720h0m0s
    EOF
  5. バックアップが完了するまで待ちます。

    $ watch "oc -n openshift-adp get backup hello-world -o json | jq .status"

    出力例

    {
     "completionTimestamp": "2022-09-07T22:20:44Z",
     "expiration": "2022-10-07T22:20:22Z",
     "formatVersion": "1.1.0",
     "phase": "Completed",
     "progress": {
       "itemsBackedUp": 58,
       "totalItems": 58
     },
     "startTimestamp": "2022-09-07T22:20:22Z",
     "version": 1
    }

  6. デモワークロードを削除します。

    $ oc delete ns hello-world
  7. バックアップから復元します。

    $ cat << EOF | oc create -f -
    apiVersion: velero.io/v1
    kind: Restore
    metadata:
     name: hello-world
     namespace: openshift-adp
    spec:
     backupName: hello-world
    EOF
  8. 復元が完了するまで待ちます。

    $ watch "oc -n openshift-adp get restore hello-world -o json | jq .status"

    出力例

    {
     "completionTimestamp": "2022-09-07T22:25:47Z",
     "phase": "Completed",
     "progress": {
       "itemsRestored": 38,
       "totalItems": 38
     },
     "startTimestamp": "2022-09-07T22:25:28Z",
     "warnings": 9
    }

  9. ワークロードが復元されていることを確認します。

    $ oc -n hello-world get pods

    出力例

    NAME                              READY   STATUS    RESTARTS   AGE
    hello-openshift-9f885f7c6-kdjpj   1/1     Running   0          90s

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`

    出力例

    Hello OpenShift!

  10. トラブルシューティングのヒントについては、OADP チームの トラブルシューティングドキュメント を参照してください。
  11. 追加のサンプルアプリケーションは、OADP チームの サンプルアプリケーションディレクトリー にあります。

8.4. クリーンアップ

  1. ワークロードを削除します。

    $ oc delete ns hello-world
  2. バックアップおよび復元リソースが不要になった場合は、クラスターからリソースを削除します。

    $ oc delete backups.velero.io hello-world
    $ oc delete restores.velero.io hello-world
  3. s3 のバックアップ/復元オブジェクトとリモートオブジェクトを削除するには、以下を実行します。

    $ velero backup delete hello-world
    $ velero restore delete hello-world
  4. Data Protection Application を削除します。

    $ oc -n openshift-adp delete dpa ${CLUSTER_NAME}-dpa
  5. クラウドストレージを削除します。

    $ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp
    警告

    このコマンドがハングした場合は、ファイナライザーの削除が必要になる場合があります。

    $ oc -n openshift-adp patch cloudstorage ${CLUSTER_NAME}-oadp -p '{"metadata":{"finalizers":null}}' --type=merge
  6. Operator が不要になった場合は、Operator を削除します。

    $ oc -n openshift-adp delete subscription oadp-operator
  7. Operator の namespace を削除します。

    $ oc delete ns redhat-openshift-adp
  8. カスタムリソース定義が不要になった場合は、クラスターからカスタムリソース定義を削除します。

    $ for CRD in `oc get crds | grep velero | awk '{print $1}'`; do oc delete crd $CRD; done
    $ for CRD in `oc get crds | grep -i oadp | awk '{print $1}'`; do oc delete crd $CRD; done
  9. AWS S3 バケットを削除します。

    $ aws s3 rm s3://${CLUSTER_NAME}-oadp --recursive
    $ aws s3api delete-bucket --bucket ${CLUSTER_NAME}-oadp
  10. ロールからポリシーの割り当てを解除します。

    $ aws iam detach-role-policy --role-name "${ROLE_NAME}" \
     --policy-arn "${POLICY_ARN}"
  11. ロールを削除します。

    $ aws iam delete-role --role-name "${ROLE_NAME}"

第9章 チュートリアル: ROSA 上の AWS Load Balancer Operator

重要

このコンテンツは Red Hat のエキスパートが作成したものですが、サポート対象のすべての設定でまだテストされていません。

ヒント

AWS Load Balancer Operator によって作成されたロードバランサーは、OpenShift ルート には使用できません。OpenShift ルートのレイヤー 7 機能をすべて必要としない個々のサービスまたは Ingress リソースにのみ使用する必要があります。

AWS Load Balancer Controller は、Red Hat OpenShift Service on AWS (ROSA) クラスターの AWS Elastic Load Balancer を管理します。このコントローラーは、Kubernetes Ingress リソースを作成するときに AWS Application Load Balancer (ALB) をプロビジョニングし、LoadBalancer タイプを使用して Kubernetes Service リソースを実装するときに AWS Network Load Balancer (NLB) をプロビジョニングします。

デフォルトの AWS インツリーロードバランサープロバイダーと比較して、このコントローラーは ALB と NLB 用の詳細なアノテーションを使用して開発されています。高度な使用例としては以下が挙げられます。

  • ネイティブ Kubernetes Ingress オブジェクトと ALB を使用する
  • AWS ウェブアプリケーションファイアウォール (WAF) サービスと ALB を統合する
  • カスタムの NLB ソース IP 範囲を指定する
  • カスタムの NLB 内部 IP アドレスを指定する

AWS Load Balancer Operator は、ROSA クラスター内の aws-load-balancer-controller のインスタンスをインストール、管理、設定するために使用します。

9.1. 前提条件

注記

AWS ALB には、マルチ AZ クラスターと、クラスターと同じ VPC 内の 3 つの AZ に分割された 3 つのパブリックサブネットが必要です。このため、ALB は多くの PrivateLink クラスターには適していません。AWS NLB にはこの制限はありません。

9.1.1. 環境

  • 環境変数を準備します。

    $ export AWS_PAGER=""
    $ export ROSA_CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${ROSA_CLUSTER_NAME}/alb-operator"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: ${ROSA_CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

9.1.2. AWS VPC とサブネット

注記

このセクションは、既存の VPC にデプロイされたクラスターにのみ適用されます。クラスターを既存の VPC にデプロイしなかった場合は、このセクションをスキップして、その後のインストールセクションに進んでください。

  1. 以下の変数を、ROSA デプロイメントに合わせて適切な値に設定します。

    $ export VPC_ID=<vpc-id>
    $ export PUBLIC_SUBNET_IDS=<public-subnets>
    $ export PRIVATE_SUBNET_IDS=<private-subnets>
    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}")
  2. クラスター名を使用してクラスターの VPC にタグを追加します。

    $ aws ec2 create-tags --resources ${VPC_ID} --tags Key=kubernetes.io/cluster/${CLUSTER_NAME},Value=owned --region ${REGION}
  3. パブリックサブネットにタグを追加します。

    $ aws ec2 create-tags \
         --resources ${PUBLIC_SUBNET_IDS} \
         --tags Key=kubernetes.io/role/elb,Value='' \
         --region ${REGION}
  4. プライベートサブネットにタグを追加します。

    $ aws ec2 create-tags \
         --resources "${PRIVATE_SUBNET_IDS}" \
         --tags Key=kubernetes.io/role/internal-elb,Value='' \
         --region ${REGION}

9.2. インストール

  1. AWS Load Balancer Controller の AWS IAM ポリシーを作成します。

    注記

    このポリシーは、アップストリームの AWS Load Balancer Controller ポリシー に加えて、サブネット上にタグを作成する権限から取得されます。これは Operator が機能するために必要です。

    $ oc new-project aws-load-balancer-operator
    $ POLICY_ARN=$(aws iam list-policies --query \
         "Policies[?PolicyName=='aws-load-balancer-operator-policy'].{ARN:Arn}" \
         --output text)
    $ if [[ -z "${POLICY_ARN}" ]]; then
        wget -O "${SCRATCH}/load-balancer-operator-policy.json" \
           https://raw.githubusercontent.com/rh-mobb/documentation/main/content/rosa/aws-load-balancer-operator/load-balancer-operator-policy.json
         POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
         --output text iam create-policy \
         --policy-name aws-load-balancer-operator-policy \
         --policy-document "file://${SCRATCH}/load-balancer-operator-policy.json")
    fi
    $ echo $POLICY_ARN
  2. AWS Load Balancer Operator の AWS IAM 信頼ポリシーを作成します。

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager", "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-cluster"]
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  3. AWS Load Balancer Operator の AWS IAM ロールを作成します。

    $ ROLE_ARN=$(aws iam create-role --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
    $ echo $ROLE_ARN
    
    $ aws iam attach-role-policy --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
         --policy-arn $POLICY_ARN
  4. 新しく作成した AWS IAM ロールを引き受けるための AWS Load Balancer Operator 用のシークレットを作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    stringData:
      credentials: |
        [default]
        role_arn = $ROLE_ARN
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    EOF
  5. AWS Load Balancer Operator をインストールします。

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      upgradeStrategy: Default
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      channel: stable-v1.0
      installPlanApproval: Automatic
      name: aws-load-balancer-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: aws-load-balancer-operator.v1.0.0
    EOF
  6. 次の Operator を使用して、AWS Load Balancer Controller のインスタンスをデプロイします。

    注記

    ここでエラーが発生した場合は、少し待ってから再試行してください。エラーが発生するのは、Operator がまだインストールを完了していないためです。

    $ cat << EOF | oc apply -f -
    apiVersion: networking.olm.openshift.io/v1
    kind: AWSLoadBalancerController
    metadata:
      name: cluster
    spec:
      credentials:
        name: aws-load-balancer-operator
    EOF
  7. Operator Pod とコントローラー Pod の両方が実行されていることを確認します。

    $ oc -n aws-load-balancer-operator get pods

    次のようなメッセージが表示されます。表示されない場合は、少し待ってから再試行してください。

    NAME                                                             READY   STATUS    RESTARTS   AGE
    aws-load-balancer-controller-cluster-6ddf658785-pdp5d            1/1     Running   0          99s
    aws-load-balancer-operator-controller-manager-577d9ffcb9-w6zqn   2/2     Running   0          2m4s

9.3. デプロイメントの検証

  1. 新しいプロジェクトを作成します。

    $ oc new-project hello-world
  2. Hello World アプリケーションをデプロイします。

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  3. AWS ALB が接続する NodePort サービスを設定します。

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-openshift-nodeport
      namespace: hello-world
    spec:
      ports:
        - port: 80
          targetPort: 8080
          protocol: TCP
      type: NodePort
      selector:
        deployment: hello-openshift
    EOF
  4. AWS Load Balancer Operator を使用して AWS ALB をデプロイします。

    $ cat << EOF | oc apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: hello-openshift-alb
      namespace: hello-world
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: hello-openshift-nodeport
                    port:
                      number: 80
    EOF
  5. AWS ALB Ingress エンドポイントを curl して、Hello World アプリケーションにアクセスできることを確認します。

    注記

    AWS ALB のプロビジョニングには数分かかります。curl: (6) Could not resolve host というエラーが表示された場合は、待機してから再試行してください。

    $ INGRESS=$(oc -n hello-world get ingress hello-openshift-alb \
        -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${INGRESS}"

    出力例

    Hello OpenShift!

  6. Hello World アプリケーション用に AWS NLB をデプロイします。

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-openshift-nlb
      namespace: hello-world
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: external
        service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: instance
        service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    spec:
      ports:
        - port: 80
          targetPort: 8080
          protocol: TCP
      type: LoadBalancer
      selector:
        deployment: hello-openshift
    EOF
  7. AWS NLB エンドポイントをテストします。

    注記

    NLB のプロビジョニングには数分かかります。curl: (6) Could not resolve host というエラーが表示された場合は、待機してから再試行してください。

    $ NLB=$(oc -n hello-world get service hello-openshift-nlb \
      -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${NLB}"

    出力例

    Hello OpenShift!

9.4. クリーンアップ

  1. hello world アプリケーションの namespace (および namespace 内のすべてのリソース) を削除します。

    $ oc delete project hello-world
  2. AWS Load Balancer Operator と AWS IAM ロールを削除します。

    $ oc delete subscription aws-load-balancer-operator -n aws-load-balancer-operator
    $ aws iam detach-role-policy \
      --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
      --policy-arn $POLICY_ARN
    $ aws iam delete-role \
      --role-name "${ROSA_CLUSTER_NAME}-alb-operator"
  3. AWS IAM ポリシーを削除します。

    $ aws iam delete-policy --policy-arn $POLICY_ARN

第10章 チュートリアル: Microsoft Entra ID (旧称 Azure Active Directory) をアイデンティティープロバイダーとして設定する

Microsoft Entra ID (旧称 Azure Active Directory) を Red Hat OpenShift Service on AWS (ROSA) のクラスターアイデンティティープロバイダーとして設定できます。

このチュートリアルでは、次のタスクを完了する手順を示します。

  1. 認証のために Entra ID に新しいアプリケーションを登録します。
  2. Entra ID でのアプリケーション登録を設定して、トークンに任意のクレームとグループクレームを含めます。
  3. Entra ID をアイデンティティープロバイダーとして使用するように Red Hat OpenShift Service on AWS クラスターを設定します。
  4. 個々のグループに追加の権限を付与します。

10.1. 前提条件

10.2. 認証のために Entra ID に新規アプリケーションを登録する

Entra ID にアプリケーションを登録するには、まず OAuth コールバック URL を作成し、次にアプリケーションを登録します。

手順

  1. 指定の変数を変更し、次のコマンドを実行して、クラスターの OAuth コールバック URL を作成します。

    注記

    このコールバック URL を忘れずに保存してください。後のプロセスで必要になります。

    $ domain=$(rosa describe cluster -c <cluster_name> | grep "DNS" | grep -oE '\S+.openshiftapps.com')
    $ echo "OAuth callback URL: https://oauth-openshift.apps.$domain/oauth2callback/AAD"

    OAuth コールバック URL の末尾にある "AAD" ディレクトリーは、このプロセスで後で設定する OAuth アイデンティティープロバイダー名と同じである必要があります。

  2. Azure portal にログインして Entra ID アプリケーションを作成し、App registrations ブレード を選択します。次に、New registration を選択して新しいアプリケーションを作成します。

    Azure Portal - App registrations blade

  3. アプリケーションに名前を付けます (例: openshift-auth)。
  4. Redirect URI ドロップダウンから Web を選択し、前のステップで取得した OAuth コールバック URL の値を入力します。
  5. 必要な情報を入力したら、Register をクリックしてアプリケーションを作成します。

    Azure Portal - Register an application page

  6. Certificates & secrets サブブレードを選択し、New client secret を選択します。

    Azure Portal - Certificates and secrets page

  7. 要求された詳細を入力し、生成されたクライアントシークレット値を保存します。このシークレットは、このプロセスで後で必要になります。

    重要

    初期セットアップ後は、クライアントシークレットを確認できません。クライアントシークレットを保存しなかった場合は、新しいクライアントシークレットを生成する必要があります。

    Azure Portal - Add a Client Secret page

  8. Overview サブブレードを選択し、Application (client) IDDirectory (tenant) ID をメモします。これらの値は後のステップで必要になります。

    Azure Portal - Copy Client Secret page

10.3. 任意のクレームとグループクレームを含めるように Entra ID でのアプリケーション登録を設定する

Red Hat OpenShift Service on AWS がユーザーのアカウントを作成するのに十分な情報を取得できるように、Entra ID を設定して 2 つの任意のクレーム (emailpreferred_username) を指定する必要があります。Entra ID の任意のクレームに関する詳細は、Microsoft のドキュメント を参照してください。

個々のユーザー認証に加えて、Red Hat OpenShift Service on AWS はグループクレーム機能を提供します。この機能により、Entra ID などの OpenID Connect (OIDC) アイデンティティープロバイダーが、Red Hat OpenShift Service on AWS 内で使用するユーザーのグループメンバーシップを提供できるようになります。

任意のクレームの設定

Entra ID の任意のクレームを設定できます。

  1. Token configuration サブブレードをクリックし、Add optional claim ボタンを選択します。

    Azure Portal - Add Optional Claims Page

  2. ID ラジオボタンを選択します。

    Azure Portal - Add Optional Claims - Token Type

  3. email クレームのチェックボックスを選択します。

    Azure Portal - Add Optional Claims - email

  4. preferred_username クレームのチェックボックスを選択します。次に、Add をクリックし、Entra ID アプリケーションの email および preferred_username クレームを設定します。

    Azure Portal - Add Optional Claims - preferred_username

  5. ページの上部にダイアログボックスが表示されます。プロンプトに従って、必要な Microsoft Graph 権限を有効にします。

    Azure Portal - Add Optional Claims - Graph Permissions Prompt

グループクレームの設定 (オプション)

グループクレームを提供するように Entra ID を設定します。

手順

  1. Token configuration サブブレードで、Add groups claim をクリックします。

    Azure Portal - Add Groups Claim Page

  2. Entra ID アプリケーションのグループクレームを設定するには、Security groups を選択し、Add をクリックします。

    注記

    この例では、グループクレームに、ユーザーがメンバーとなっているすべてのセキュリティーグループを含めます。実際の実稼働環境では、グループクレームに、Red Hat OpenShift Service on AWS に適用するグループのみを含めてください。

    Azure Portal - Edit Groups Claim Page

10.4. Entra ID をアイデンティティープロバイダーとして使用するように Red Hat OpenShift Service on AWS クラスターを設定する

Entra ID をアイデンティティープロバイダーとして使用するように Red Hat OpenShift Service on AWS を設定する必要があります。

ROSA は OpenShift Cluster Manager を使用してアイデンティティープロバイダーを設定する機能を提供しますが、ここでは ROSA CLI を使用して、Entra ID をアイデンティティープロバイダーとして使用するようにクラスターの OAuth プロバイダーを設定します。アイデンティティープロバイダーを設定する前に、アイデンティティープロバイダー設定に必要な変数を設定します。

手順

  1. 次のコマンドを実行して変数を作成します。

    $ CLUSTER_NAME=example-cluster 1
    $ IDP_NAME=AAD 2
    $ APP_ID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy 3
    $ CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 4
    $ TENANT_ID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz 5
    1
    これは ROSA クラスターの名前に置き換えます。
    2
    この値は、このプロセスで前に生成した OAuth コールバック URL で使用した名前に置き換えます。
    3
    これはアプリケーション (クライアント) ID に置き換えます。
    4
    これはクライアントシークレットに置き換えます。
    5
    これはディレクトリー (テナント) ID に置き換えます。
  2. 次のコマンドを実行して、クラスターの OAuth プロバイダーを設定します。グループクレームを有効にした場合は、必ず --group-claims groups 引数を使用してください。

    • グループクレームを有効にした場合は、次のコマンドを実行します。

      $ rosa create idp \
      --cluster ${CLUSTER_NAME} \
      --type openid \
      --name ${IDP_NAME} \
      --client-id ${APP_ID} \
      --client-secret ${CLIENT_SECRET} \
      --issuer-url https://login.microsoftonline.com/${TENANT_ID}/v2.0 \
      --email-claims email \
      --name-claims name \
      --username-claims preferred_username \
      --extra-scopes email,profile \
      --groups-claims groups
    • グループクレームを有効にしなかった場合は、次のコマンドを実行します。

      $ rosa create idp \
      --cluster ${CLUSTER_NAME} \
      --type openid \
      --name ${IDP_NAME} \
      --client-id ${APP_ID} \
      --client-secret ${CLIENT_SECRET} \
      --issuer-url https://login.microsoftonline.com/${TENANT_ID}/v2.0 \
      --email-claims email \
      --name-claims name \
      --username-claims preferred_username \
      --extra-scopes email,profile

数分後、クラスター認証 Operator が変更を調整します。すると、Entra ID を使用してクラスターにログインできるようになります。

10.5. 個々のユーザーおよびグループへの追加の権限の付与

初めてログインすると、権限が非常に制限されていることがわかります。デフォルトでは、Red Hat OpenShift Service on AWS はクラスター内に新しいプロジェクトまたは namespace を作成する権限のみを付与します。他のプロジェクトの表示は制限されています。

このような追加の権限を個々のユーザーおよびグループに付与する必要があります。

個々のユーザーに追加の権限を付与する

Red Hat OpenShift Service on AWS には、クラスターに対する完全なアクセスと制御を付与する cluster-admin ロールなど、事前設定済みの多数のロールが組み込まれています。

手順

  • 次のコマンドを実行して、ユーザーに cluster-admin ロールへのアクセス権を付与します。

    $ rosa grant user cluster-admin \
        --user=<USERNAME> 1
        --cluster=${CLUSTER_NAME}
    1
    cluster-admin 権限を付与する Entra ID ユーザー名を指定します。
個々のグループに追加の権限を付与する

グループクレームを有効にすることを選択した場合、クラスター OAuth プロバイダーによって、ユーザーのグループメンバーシップがグループ ID を使用して自動的に作成または更新されます。クラスター OAuth プロバイダーは、作成されたグループの RoleBindingClusterRoleBindings を自動的に作成しません。これらのバインディングは、ユーザーが独自のプロセスを使用して作成する必要があります。

自動生成されたグループに cluster-admin ロールへのアクセス権を付与するには、グループ ID への ClusterRoleBinding を作成する必要があります。

手順

  • 次のコマンドを実行して、ClusterRoleBinding を作成します。

    $ oc create clusterrolebinding cluster-admin-group \
    --clusterrole=cluster-admin \
    --group=<GROUP_ID> 1
    1
    cluster-admin 権限を付与する Entra ID グループ ID を指定します。

    これで、指定したグループ内のすべてのユーザーに cluster-admin アクセス権が自動的に付与されます。

10.6. 関連情報

RBAC を使用して Red Hat OpenShift Service on AWS の権限を定義および適用する方法の詳細は、Red Hat OpenShift Service on AWS のドキュメント を参照してください。

第11章 チュートリアル: STS を使用する ROSA での AWS Secrets Manager CSI の使用

AWS Secrets and Configuration Provider (ASCP) は、AWS シークレットを Kubernetes ストレージボリュームとして公開する方法を提供します。ASCP を使用すると、Secrets Manager のシークレットを保存および管理し、Red Hat OpenShift Service on AWS (ROSA) で実行されているワークロードを通じてシークレットを取得できます。

11.1. 前提条件

このプロセスを開始する前に、次のリソースとツールがあることを確認してください。

  • STS とともにデプロイされた ROSA クラスター
  • Helm 3
  • aws CLI
  • oc CLI
  • jq CLI
その他の環境要件
  1. 次のコマンドを実行して、ROSA クラスターにログインします。

    $ oc login --token=<your-token> --server=<your-server-url>

    ログイントークンを見つけるには、Red Hat OpenShift Cluster Manager からプルシークレット でクラスターにアクセスします。

  2. 次のコマンドを実行して、クラスターに STS があることを検証します。

    $ oc get authentication.config.openshift.io cluster -o json \
      | jq .spec.serviceAccountIssuer

    出力例

    "https://xxxxx.cloudfront.net/xxxxx"

    出力が異なる場合は、続行しないでください。このプロセスを続行する前に、STS クラスターの作成に関する Red Hat ドキュメント を参照してください。

  3. 次のコマンドを実行して、CSI ドライバーの実行を許可するように SecurityContextConstraints 権限を設定します。

    $ oc new-project csi-secrets-store
    $ oc adm policy add-scc-to-user privileged \
        system:serviceaccount:csi-secrets-store:secrets-store-csi-driver
    $ oc adm policy add-scc-to-user privileged \
        system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
  4. 次のコマンドを実行して、このプロセスで後で使用する環境変数を作成します。

    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster \
       -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export AWS_PAGER=""

11.2. AWS シークレットと設定プロバイダーのデプロイ

  1. 次のコマンドを実行し、Helm を使用してシークレットストア CSI ドライバーを登録します。

    $ helm repo add secrets-store-csi-driver \
        https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
  2. 次のコマンドを実行して、Helm リポジトリーを更新します。

    $ helm repo update
  3. 次のコマンドを実行して、シークレットストア CSI ドライバーをインストールします。

    $ helm upgrade --install -n csi-secrets-store \
        csi-secrets-store-driver secrets-store-csi-driver/secrets-store-csi-driver
  4. 次のコマンドを実行して、AWS プロバイダーをデプロイします。

    $ oc -n csi-secrets-store apply -f \
        https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
  5. 次のコマンドを実行して、両方の Daemonset が実行されていることを確認します。

    $ oc -n csi-secrets-store get ds \
        csi-secrets-store-provider-aws \
        csi-secrets-store-driver-secrets-store-csi-driver
  6. 次のコマンドを実行して、シークレットストア CSI ドライバーにラベルを付けて、制限付き Pod セキュリティープロファイルとともに使用することを許可します。

    $ oc label csidriver.storage.k8s.io/secrets-store.csi.k8s.io security.openshift.io/csi-ephemeral-volume-profile=restricted

11.3. シークレットと IAM アクセスポリシーの作成

  1. 次のコマンドを実行して、Secrets Manager のシークレットを作成します。

    $ SECRET_ARN=$(aws --region "$REGION" secretsmanager create-secret \
        --name MySecret --secret-string \
        '{"username":"shadowman", "password":"hunter2"}' \
        --query ARN --output text); echo $SECRET_ARN
  2. 次のコマンドを実行して、IAM アクセスポリシードキュメントを作成します。

    $ cat << EOF > policy.json
    {
       "Version": "2012-10-17",
       "Statement": [{
          "Effect": "Allow",
          "Action": [
            "secretsmanager:GetSecretValue",
            "secretsmanager:DescribeSecret"
          ],
          "Resource": ["$SECRET_ARN"]
          }]
    }
    EOF
  3. 次のコマンドを実行して、IAM アクセスポリシーを作成します。

    $ POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
    --output text iam create-policy \
    --policy-name openshift-access-to-mysecret-policy \
    --policy-document file://policy.json); echo $POLICY_ARN
  4. 次のコマンドを実行して、IAM ロール信頼ポリシードキュメントを作成します。

    注記

    信頼ポリシーは、このプロセスで後で作成する namespace のデフォルトのサービスアカウントにロックされます。

    $ cat <<EOF > trust-policy.json
    {
       "Version": "2012-10-17",
       "Statement": [
       {
       "Effect": "Allow",
       "Condition": {
         "StringEquals" : {
           "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:my-application:default"]
          }
        },
        "Principal": {
           "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
        },
        "Action": "sts:AssumeRoleWithWebIdentity"
        }
        ]
    }
    EOF
  5. 次のコマンドを実行して、IAM ロールを作成します。

    $ ROLE_ARN=$(aws iam create-role --role-name openshift-access-to-mysecret \
    --assume-role-policy-document file://trust-policy.json \
    --query Role.Arn --output text); echo $ROLE_ARN
  6. 次のコマンドを実行して、ロールをポリシーに割り当てます。

    $ aws iam attach-role-policy --role-name openshift-access-to-mysecret \
        --policy-arn $POLICY_ARN

11.4. このシークレットを使用するアプリケーションの作成

  1. 次のコマンドを実行して、OpenShift プロジェクトを作成します。

    $ oc new-project my-application
  2. 次のコマンドを実行して、STS ロールを使用するようにデフォルトのサービスアカウントにアノテーションを付けます。

    $ oc annotate -n my-application serviceaccount default \
        eks.amazonaws.com/role-arn=$ROLE_ARN
  3. 次のコマンドを実行して、シークレットにアクセスするためのシークレットプロバイダークラスを作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: my-application-aws-secrets
    spec:
      provider: aws
      parameters:
        objects: |
          - objectName: "MySecret"
            objectType: "secretsmanager"
    EOF
  4. 次のコマンドでシークレットを使用してデプロイメントを作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-application
      labels:
        app: my-application
    spec:
      volumes:
      - name: secrets-store-inline
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "my-application-aws-secrets"
      containers:
      - name: my-application-deployment
        image: k8s.gcr.io/e2e-test-images/busybox:1.29
        command:
          - "/bin/sleep"
          - "10000"
        volumeMounts:
        - name: secrets-store-inline
          mountPath: "/mnt/secrets-store"
          readOnly: true
    EOF
  5. 次のコマンドを実行して、Pod にシークレットがマウントされていることを確認します。

    $ oc exec -it my-application -- cat /mnt/secrets-store/MySecret

11.5. クリーンアップ

  1. 次のコマンドを実行してアプリケーションを削除します。

    $ oc delete project my-application
  2. 次のコマンドを実行して、シークレットストア CSI ドライバーを削除します。

    $ helm delete -n csi-secrets-store csi-secrets-store-driver
  3. 次のコマンドを実行して、Security Context Constraints を削除します。

    $ oc adm policy remove-scc-from-user privileged \
        system:serviceaccount:csi-secrets-store:secrets-store-csi-driver; oc adm policy remove-scc-from-user privileged \
        system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
  4. 次のコマンドを実行して、AWS プロバイダーを削除します。

    $ oc -n csi-secrets-store delete -f \
    https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
  5. 次のコマンドを実行して、AWS のロールとポリシーを削除します。

    $ aws iam detach-role-policy --role-name openshift-access-to-mysecret \
        --policy-arn $POLICY_ARN; aws iam delete-role --role-name openshift-access-to-mysecret; aws iam delete-policy --policy-arn $POLICY_ARN
  6. 次のコマンドを実行して、Secrets Manager のシークレットを削除します。

    $ aws secretsmanager --region $REGION delete-secret --secret-id $SECRET_ARN

第12章 チュートリアル: ROSA での AWS Controllers for Kubernetes の使用

AWS Controllers for Kubernetes (ACK) を使用すると、AWS サービスリソースを Red Hat OpenShift Service on AWS (ROSA) から直接定義して使用できます。ACK を使用すると、クラスター外のリソースを定義したり、クラスター内のデータベースやメッセージキューなどのサポート機能を提供するサービスを実行したりすることなく、アプリケーションで AWS マネージドサービスを利用できます。

OperatorHub からさまざまな ACK Operator を直接インストールできます。これにより、アプリケーションで Operator を簡単に使い始めることができます。このコントローラーは AWS Controller for Kubernetes プロジェクトのコンポーネントであり、現在開発者プレビュー段階にあります。

このチュートリアルを使用して、ACK S3 Operator をデプロイしてください。クラスターの OperatorHub 内の他の ACK Operator に合わせて調整することもできます。

12.1. 前提条件

  • ROSA クラスター
  • cluster-admin 権限を持つユーザーアカウント
  • OpenShift CLI (oc)
  • Amazon Web Services (AWS) CLI (aws)

12.2. 環境の設定

  1. 次の環境変数を設定し、お使いのクラスターに合わせてクラスター名を変更します。

    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(rosa describe cluster -c ${ROSA_CLUSTER_NAME} --output json | jq -r .region.id)
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o json | jq -r .spec.serviceAccountIssuer | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export ACK_SERVICE=s3
    $ export ACK_SERVICE_ACCOUNT=ack-${ACK_SERVICE}-controller
    $ export POLICY_ARN=arn:aws:iam::aws:policy/AmazonS3FullAccess
    $ export AWS_PAGER=""
    $ export SCRATCH="/tmp/${ROSA_CLUSTER_NAME}/ack"
    $ mkdir -p ${SCRATCH}
  2. 次のセクションに進む前に、すべてのフィールドが正しく出力されていることを確認してください。

    $ echo "Cluster: ${ROSA_CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

12.3. AWS アカウントの準備

  1. ACK Operator の AWS Identity Access Management (IAM) 信頼ポリシーを作成します。

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": "system:serviceaccount:ack-system:${ACK_SERVICE_ACCOUNT}"
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  2. AmazonS3FullAccess ポリシーを割り当てた、ACK Operator が引き受ける AWS IAM ロールを作成します。

    注記

    推奨されるポリシーは、各プロジェクトの GitHub リポジトリー (例: https://github.com/aws-controllers-k8s/s3-controller/blob/main/config/iam/recommended-policy-arn) で見つけることができます。

    $ ROLE_ARN=$(aws iam create-role --role-name "ack-${ACK_SERVICE}-controller" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
    $ echo $ROLE_ARN
    
    $ aws iam attach-role-policy --role-name "ack-${ACK_SERVICE}-controller" \
         --policy-arn ${POLICY_ARN}

12.4. ACK S3 コントローラーのインストール

  1. ACK S3 Operator をインストールするプロジェクトを作成します。

    $ oc new-project ack-system
  2. ACK S3 Operator の設定を含むファイルを作成します。

    注記

    ACK_WATCH_NAMESPACE は、コントローラーがクラスター内のすべての namespace を適切に監視できるように、意図的に空白のままにします。

    $ cat <<EOF > "${SCRATCH}/config.txt"
    ACK_ENABLE_DEVELOPMENT_LOGGING=true
    ACK_LOG_LEVEL=debug
    ACK_WATCH_NAMESPACE=
    AWS_REGION=${REGION}
    AWS_ENDPOINT_URL=
    ACK_RESOURCE_TAGS=${CLUSTER_NAME}
    ENABLE_LEADER_ELECTION=true
    LEADER_ELECTION_NAMESPACE=
    EOF
  3. 前のステップのファイルを使用して ConfigMap を作成します。

    $ oc -n ack-system create configmap \
      --from-env-file=${SCRATCH}/config.txt ack-${ACK_SERVICE}-user-config
  4. OperatorHub から ACK S3 Operator をインストールします。

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: ack-${ACK_SERVICE}-controller
      namespace: ack-system
    spec:
      upgradeStrategy: Default
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: ack-${ACK_SERVICE}-controller
      namespace: ack-system
    spec:
      channel: alpha
      installPlanApproval: Automatic
      name: ack-${ACK_SERVICE}-controller
      source: community-operators
      sourceNamespace: openshift-marketplace
    EOF
  5. ACK S3 Operator サービスアカウントに、割り当てる AWS IAM ロールのアノテーションを付けて、デプロイメントを再起動します。

    $ oc -n ack-system annotate serviceaccount ${ACK_SERVICE_ACCOUNT} \
      eks.amazonaws.com/role-arn=${ROLE_ARN} && \
      oc -n ack-system rollout restart deployment ack-${ACK_SERVICE}-controller
  6. ACK S3 Operator が実行されていることを確認します。

    $ oc -n ack-system get pods

    出力例

    NAME                                 READY   STATUS    RESTARTS   AGE
    ack-s3-controller-585f6775db-s4lfz   1/1     Running   0          51s

12.5. デプロイメントの検証

  1. S3 バケットリソースをデプロイします。

    $ cat << EOF | oc apply -f -
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
       name: ${CLUSTER-NAME}-bucket
       namespace: ack-system
    spec:
       name: ${CLUSTER-NAME}-bucket
    EOF
  2. S3 バケットが AWS で作成されたことを確認します。

    $ aws s3 ls | grep ${CLUSTER_NAME}-bucket

    出力例

    2023-10-04 14:51:45 mrmc-test-maz-bucket

12.6. クリーンアップ

  1. S3 バケットリソースを削除します。

    $ oc -n ack-system delete bucket.s3.services.k8s.aws/${CLUSTER-NAME}-bucket
  2. ACK S3 Operator と AWS IAM ロールを削除します。

    $ oc -n ack-system delete subscription ack-${ACK_SERVICE}-controller
    $ aws iam detach-role-policy \
      --role-name "ack-${ACK_SERVICE}-controller" \
      --policy-arn ${POLICY_ARN}
    $ aws iam delete-role \
      --role-name "ack-${ACK_SERVICE}-controller"
  3. ack-system プロジェクトを削除します。

    $ oc delete project ack-system

第13章 チュートリアル: ROSA への External DNS Operator のデプロイ

外部 DNS Operator は、ExternalDNS をデプロイおよび管理して、Amazon Route 53 などの外部 DNS プロバイダーから Red Hat OpenShift Service on AWS (ROSA) クラスターへのサービスとルートの名前解決を提供します。このチュートリアルでは、セカンダリー Ingress Controller を使用して外部 DNS Operator をデプロイして設定し、Amazon Route 53 で DNS レコードを管理します。

重要

External DNS Operator は、IAM Roles for Service Accounts (IRSA) を使用した STS をサポートせず、代わりに有効期間の長い Identity Access Management (IAM) 認証情報を使用します。このチュートリアルは、Operator で STS がサポートされた際に更新される予定です。

13.1. 前提条件

  • ROSA Classic クラスター

    注記

    ROSA with HCP は現在サポートされていません。

  • cluster-admin 権限を持つユーザーアカウント
  • OpenShift CLI (oc)
  • Amazon Web Services (AWS) CLI (aws)
  • 一意のドメイン (例: apps.example.com)
  • 上記ドメイン用の Amazon Route 53 パブリックホストゾーン

13.2. 環境の設定

  1. 次の環境変数を設定します。

    $ export DOMAIN=<apps.example.com> 1
    $ export AWS_PAGER=""
    $ export CLUSTER=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER}/external-dns"
    $ mkdir -p ${SCRATCH}
    1
    IngressController に使用するカスタムドメインに置き換えます。
  2. 次のセクションに進む前に、すべてのフィールドが正しく出力されていることを確認してください。

    $ echo "Cluster: ${CLUSTER}, Region: ${REGION}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    注記

    前のコマンドからの "Cluster" の出力は、クラスターの名前、クラスターの内部 ID、またはクラスターのドメイン接頭辞である可能性があります。別の識別子を使用する場合は、次のコマンドを実行して手動でこの値を設定できます。

    $ export CLUSTER=my-custom-value

13.3. セカンダリー Ingress Controller の設定

カスタムドメインを使用してセカンダリー Ingress Controller をデプロイするには、次の手順を実行します。

前提条件

  • 一意のドメイン (例: apps.example.com)
  • 上記で選択したカスタムドメインで設定されたワイルドカードまたは SAN TLS 証明書 (CN=*.apps.example.com)

手順

  1. 秘密鍵と公開証明書から新しい TLS シークレットを作成します。fullchain.pem は完全なワイルドカード証明書チェーン (中間証明書を含む)、privkey.pem はワイルドカード証明書の秘密鍵です。

    $ oc -n openshift-ingress create secret tls external-dns-tls --cert=fullchain.pem --key=privkey.pem
  2. 新規の IngressController リソースを作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: external-dns-ingress
      namespace: openshift-ingress-operator
    spec:
      domain: ${DOMAIN}
      defaultCertificate:
        name: external-dns-tls
      endpointPublishingStrategy:
        loadBalancer:
          dnsManagementPolicy: Unmanaged
          providerParameters:
            aws:
              type: NLB
            type: AWS
          scope: External
        type: LoadBalancerService
    EOF
    警告

    この IngressController の例では、インターネットにアクセス可能な Network Load Balancer (NLB) を AWS アカウントに作成します。代わりに内部 NLB をプロビジョニングするには、IngressController リソースを作成する前に、.spec.endpointPublishingStrategy.loadBalancer.scope パラメーターを Internal に設定します。

  3. カスタムドメイン IngressController が外部ロードバランサーを正常に作成したことを確認します。

    $ oc -n openshift-ingress get service/router-external-dns-ingress

    出力例

    NAME                          TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     PORT(S)                      AGE
    router-external-dns-ingress   LoadBalancer   172.30.71.250   a4838bb991c6748439134ab89f132a43-aeae124077b50c01.elb.us-east-1.amazonaws.com   80:32227/TCP,443:30310/TCP   43s

13.4. AWS アカウントの準備

  1. Amazon Route 53 のパブリックホストゾーン ID を取得します。

    $ export ZONE_ID=$(aws route53 list-hosted-zones-by-name --output json \
      --dns-name "${DOMAIN}." --query 'HostedZones[0]'.Id --out text | sed 's/\/hostedzone\///')
  2. Ingress Controller の正規ドメインの DNS 解決を有効にするために必要な DNS 変更のあるドキュメントを準備します。

    $ NLB_HOST=$(oc -n openshift-ingress get service/router-external-dns-ingress -ojsonpath="{.status.loadBalancer.ingress[0].hostname}")
    $ cat << EOF > "${SCRATCH}/create-cname.json"
    {
      "Comment":"Add CNAME to ingress controller canonical domain",
      "Changes":[{
          "Action":"CREATE",
          "ResourceRecordSet":{
            "Name": "router-external-dns-ingress.${DOMAIN}",
          "Type":"CNAME",
          "TTL":30,
          "ResourceRecords":[{
            "Value": "${NLB_HOST}"
          }]
        }
      }]
    }
    EOF

    外部 DNS Operator は、この正規ドメインを CNAME レコードのターゲットとして使用します。

  3. 変更を伝播するために Amazon Route 53 に送信します。

    aws route53 change-resource-record-sets \
      --hosted-zone-id ${ZONE_ID} \
      --change-batch file://${SCRATCH}/create-cname.json
  4. External DNS Operator がカスタムドメインのパブリックホストゾーン のみ を更新できるようにする AWS IAM ポリシードキュメントを作成します。

    $ cat << EOF > "${SCRATCH}/external-dns-policy.json"
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "route53:ChangeResourceRecordSets"
          ],
          "Resource": [
            "arn:aws:route53:::hostedzone/${ZONE_ID}"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "route53:ListHostedZones",
            "route53:ListResourceRecordSets"
          ],
          "Resource": [
            "*"
          ]
        }
      ]
    }
    EOF
  5. AWS IAM ユーザーを作成します。

    $ aws iam create-user --user-name "${CLUSTER}-external-dns-operator"
  6. ポリシーを割り当てします。

    $ aws iam attach-user-policy --user-name "${CLUSTER}-external-dns-operator" --policy-arn $POLICY_ARN
    注記

    これは将来的には IRSA を使用した STS に変更される予定です。

  7. IAM ユーザーの AWS キーを作成します。

    $ SECRET_ACCESS_KEY=$(aws iam create-access-key --user-name "${CLUSTER}-external-dns-operator")
  8. 静的認証情報を作成します。

    $ cat << EOF > "${SCRATCH}/credentials"
    [default]
    aws_access_key_id = $(echo $SECRET_ACCESS_KEY | jq -r '.AccessKey.AccessKeyId')
    aws_secret_access_key = $(echo $SECRET_ACCESS_KEY | jq -r '.AccessKey.SecretAccessKey')
    EOF

13.5. External DNS Operator のインストール

  1. 新しいプロジェクトを作成します。

    $ oc new-project external-dns-operator
  2. OperatorHub から External DNS Operator をインストールします。

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: external-dns-group
      namespace: external-dns-operator
    spec:
      targetNamespaces:
      - external-dns-operator
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: external-dns-operator
      namespace: external-dns-operator
    spec:
      channel: stable-v1.1
      installPlanApproval: Automatic
      name: external-dns-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
    EOF
  3. External DNS Operator が実行されるまで待ちます。

    $ oc rollout status deploy external-dns-operator --timeout=300s
  4. AWS IAM ユーザー認証情報からシークレットを作成します。

    $ oc -n external-dns-operator create secret generic external-dns \
      --from-file "${SCRATCH}/credentials"
  5. ExternalDNS コントローラーをデプロイします。

    $ cat << EOF | oc apply -f -
    apiVersion: externaldns.olm.openshift.io/v1beta1
    kind: ExternalDNS
    metadata:
      name: ${DOMAIN}
    spec:
      domains:
        - filterType: Include
          matchType: Exact
          name: ${DOMAIN}
      provider:
        aws:
          credentials:
            name: external-dns
        type: AWS
      source:
        openshiftRouteOptions:
          routerName: external-dns-ingress
        type: OpenShiftRoute
      zones:
        - ${ZONE_ID}
    EOF
  6. コントローラーが実行されるまで待ちます。

    $ oc rollout status deploy external-dns-${DOMAIN} --timeout=300s

13.6. サンプルアプリケーションのデプロイ

ExternalDNS コントローラーが実行されたら、サンプルアプリケーションをデプロイして、新しいルートの公開時にカスタムドメインが設定され、信頼されることを確認します。

  1. サンプルアプリケーション用に新しいプロジェクトを作成します。

    $ oc new-project hello-world
  2. Hello World アプリケーションをデプロイします。

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  3. カスタムドメイン名を指定してアプリケーションのルートを作成します。

    $ oc -n hello-world create route edge --service=hello-openshift hello-openshift-tls \
    --hostname hello-openshift.${DOMAIN}
  4. DNS レコードが ExternalDNS によって自動的に作成されたかどうかを確認します。

    注記

    レコードが Amazon Route 53 に表示されるまでに数分かかる場合があります。

    $ aws route53 list-resource-record-sets --hosted-zone-id ${ZONE_ID} \
       --query "ResourceRecordSets[?Type == 'CNAME']" | grep hello-openshift
  5. オプション: TXT レコードを表示して、レコードが ExternalDNS によって作成されたことを確認することもできます。

    $ aws route53 list-resource-record-sets --hosted-zone-id ${ZONE_ID} \
       --query "ResourceRecordSets[?Type == 'TXT']" | grep ${DOMAIN}
  6. curl を実行して新しく作成した DNS レコードをサンプルアプリケーションを取得し、Hello World アプリケーションにアクセスできることを確認します。

    $ curl https://hello-openshift.${DOMAIN}

    出力例

    Hello OpenShift!

第14章 チュートリアル: ROSA 上の cert-manager Operator を使用した証明書の動的発行

ワイルドカード証明書は、特定のドメインのファーストレベルサブドメインすべてを 1 つの証明書で保護することで簡素化を実現しますが、ユースケースによっては、ドメインごとに個別の証明書を使用する必要がある場合があります。

cert-manager Operator for Red Hat OpenShiftLet's Encrypt を使用して、カスタムドメインを使用して作成したルートの証明書を動的に発行する方法を説明します。

14.1. 前提条件

  • ROSA クラスター (HCP または Classic)
  • cluster-admin 権限を持つユーザーアカウント
  • OpenShift CLI (oc)
  • Amazon Web Services (AWS) CLI (aws)
  • 一意のドメイン (例: *.apps.example.com)
  • 上記ドメイン用の Amazon Route 53 パブリックホストゾーン

14.2. 環境の設定

  1. 次の環境変数を設定します。

    $ export DOMAIN=apps.example.com 1
    $ export EMAIL=email@example.com 2
    $ export AWS_PAGER=""
    $ export CLUSTER=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o json | jq -r .spec.serviceAccountIssuer | sed  's|^https://||')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER}/dynamic-certs"
    $ mkdir -p ${SCRATCH}
    1
    IngressController に使用するカスタムドメインに置き換えます。
    2
    Let's Encrypt が証明書に関する通知を送信するために使用するメールに置き換えます。
  2. 次のセクションに進む前に、すべてのフィールドが正しく出力されていることを確認してください。

    $ echo "Cluster: ${CLUSTER}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    注記

    前のコマンドからの "Cluster" の出力は、クラスターの名前、クラスターの内部 ID、またはクラスターのドメイン接頭辞である可能性があります。別の識別子を使用する場合は、次のコマンドを実行して手動でこの値を設定できます。

    $ export CLUSTER=my-custom-value

14.3. AWS アカウントの準備

cert-manager が Let's Encrypt (または別の ACME 証明書発行者) に証明書を要求すると、Let's Encrypt のサーバーが チャレンジ を使用して、その証明書内のドメイン名がお客様によって制御されていることを検証します。このチュートリアルでは、ドメイン名の TXT レコードに特定の値を入力することで、ドメイン名の DNS を制御していることを証明する DNS-01 チャレンジ を使用します。これはすべて cert-manager によって自動的に行われます。cert-manager 権限によってドメインの Amazon Route 53 パブリックホストゾーンを変更できるように、Pod へのアクセスを許可する信頼関係と特定のポリシー権限を持つ Identity Access Management (IAM) ロールを作成する必要があります。

このチュートリアルで使用するパブリックホストゾーンは、ROSA クラスターと同じ AWS アカウント内にあります。パブリックホストゾーンが別のアカウントにある場合は、クロスアカウントアクセス のためにいくつかの追加手順が必要です。

  1. Amazon Route 53 のパブリックホストゾーン ID を取得します。

    注記

    このコマンドは、DOMAIN 環境変数として以前指定したカスタムドメインに一致するパブリックホストゾーンを検索します。Amazon Route 53 パブリックホストゾーンを手動で指定するには、export ZONE_ID=<zone_ID> を実行し、<zone_ID> を特定の Amazon Route 53 パブリックホストゾーン ID に置き換えます。

    $ export ZONE_ID=$(aws route53 list-hosted-zones-by-name --output json \
      --dns-name "${DOMAIN}." --query 'HostedZones[0]'.Id --out text | sed 's/\/hostedzone\///')
  2. 指定されたパブリックホストゾーン のみ を更新する機能を提供する cert-manager Operator の AWS IAM ポリシードキュメントを作成します。

    $ cat <<EOF > "${SCRATCH}/cert-manager-policy.json"
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "route53:GetChange",
          "Resource": "arn:aws:route53:::change/*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "route53:ChangeResourceRecordSets",
            "route53:ListResourceRecordSets"
          ],
          "Resource": "arn:aws:route53:::hostedzone/${ZONE_ID}"
        },
        {
          "Effect": "Allow",
          "Action": "route53:ListHostedZonesByName",
          "Resource": "*"
        }
      ]
    }
    EOF
  3. 前のステップで作成したファイルを使用して IAM ポリシーを作成します。

    $ POLICY_ARN=$(aws iam create-policy --policy-name "${CLUSTER}-cert-manager-policy" \
      --policy-document file://${SCRATCH}/cert-manager-policy.json \
      --query 'Policy.Arn' --output text)
  4. cert-manager Operator の AWS IAM 信頼ポリシーを作成します。

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": "system:serviceaccount:cert-manager:cert-manager"
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  5. 前のステップで作成した信頼ポリシーを使用して、cert-manager Operator の IAM ロールを作成します。

    $ ROLE_ARN=$(aws iam create-role --role-name "${CLUSTER}-cert-manager-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
  6. 権限ポリシーをロールに割り当てます。

    $ aws iam attach-role-policy --role-name "${CLUSTER}-cert-manager-operator" \
      --policy-arn ${POLICY_ARN}

14.4. cert-manager Operator のインストール

  1. cert-manager Operator をインストールするプロジェクトを作成します。

    $ oc new-project cert-manager-operator
    重要

    クラスター内で複数の cert-manager Operator を使用しないでください。クラスターにコミュニティーの cert-manager Operator がインストールされている場合は、それをアンインストールしてから cert-manager Operator for Red Hat OpenShift をインストールする必要があります。

  2. cert-manager Operator for Red Hat OpenShift をインストールします。

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: openshift-cert-manager-operator-group
      namespace: cert-manager-operator
    spec:
      targetNamespaces:
      - cert-manager-operator
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: openshift-cert-manager-operator
      namespace: cert-manager-operator
    spec:
      channel: stable-v1
      installPlanApproval: Automatic
      name: openshift-cert-manager-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
    EOF
    注記

    この Operator がインストールされ、セットアップが完了するまでに数分かかります。

  3. cert-manager Operator が実行されていることを確認します。

    $ oc -n cert-manager-operator get pods

    出力例

    NAME                                                        READY   STATUS    RESTARTS   AGE
    cert-manager-operator-controller-manager-84b8799db5-gv8mx   2/2     Running   0          12s

  4. cert-manager Pod によって使用されるサービスアカウントに、前に作成した AWS IAM ロールのアノテーションを付けます。

    $ oc -n cert-manager annotate serviceaccount cert-manager eks.amazonaws.com/role-arn=${ROLE_ARN}
  5. 次のコマンドを実行して、既存の cert-manager コントローラー Pod を再起動します。

    $ oc -n cert-manager delete pods -l app.kubernetes.io/name=cert-manager
  6. DNS-01 チャレンジ解決の問題を防ぐために、外部ネームサーバーを使用するように Operator の設定にパッチを適用します。

    $ oc patch certmanager.operator.openshift.io/cluster --type merge \
      -p '{"spec":{"controllerConfig":{"overrideArgs":["--dns01-recursive-nameservers-only","--dns01-recursive-nameservers=1.1.1.1:53"]}}}'
  7. 次のコマンドを実行して、Let's Encrypt を使用する ClusterIssuer リソースを作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-production
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory
        email: ${EMAIL}
        # This key doesn't exist, cert-manager creates it
        privateKeySecretRef:
          name: prod-letsencrypt-issuer-account-key
        solvers:
        - dns01:
            route53:
             hostedZoneID: ${ZONE_ID}
             region: ${REGION}
             secretAccessKeySecretRef:
               name: ''
    EOF
  8. ClusterIssuer リソースの準備ができていることを確認します。

    $ oc get clusterissuer.cert-manager.io/letsencrypt-production

    出力例

    NAME                     READY   AGE
    letsencrypt-production   True    47s

14.5. カスタムドメイン Ingress Controller の作成

  1. 証明書リソースを作成して設定し、カスタムドメイン Ingress Controller の証明書をプロビジョニングします。

    注記

    次の例では、単一のドメイン証明書を使用します。SAN およびワイルドカード証明書もサポートされています。

    $ cat << EOF | oc apply -f -
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: custom-domain-ingress-cert
      namespace: openshift-ingress
    spec:
      secretName: custom-domain-ingress-cert-tls
      issuerRef:
         name: letsencrypt-production
         kind: ClusterIssuer
      commonName: "${DOMAIN}"
      dnsNames:
      - "${DOMAIN}"
    EOF
  2. 証明書が発行されたことを確認します。

    注記

    Let's Encrypt によってこの証明書が発行されるまでに数分かかります。5 分以上かかる場合は、oc -n openshift-Ingress describe certificate.cert-manager.io/custom-domain-Ingress-cert を実行して、cert-manager によって報告された問題を確認します。

    $ oc -n openshift-ingress get certificate.cert-manager.io/custom-domain-ingress-cert

    出力例

    NAME                         READY   SECRET                           AGE
    custom-domain-ingress-cert   True    custom-domain-ingress-cert-tls   9m53s

  3. 新規の IngressController リソースを作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: custom-domain-ingress
      namespace: openshift-ingress-operator
    spec:
      domain: ${DOMAIN}
      defaultCertificate:
        name: custom-domain-ingress-cert-tls
      endpointPublishingStrategy:
        loadBalancer:
          dnsManagementPolicy: Unmanaged
          providerParameters:
            aws:
              type: NLB
            type: AWS
          scope: External
        type: LoadBalancerService
    EOF
    警告

    この IngressController の例では、インターネットにアクセス可能な Network Load Balancer (NLB) を AWS アカウントに作成します。代わりに内部 NLB をプロビジョニングするには、IngressController リソースを作成する前に、.spec.endpointPublishingStrategy.loadBalancer.scope パラメーターを Internal に設定します。

  4. カスタムドメイン IngressController が外部ロードバランサーを正常に作成したことを確認します。

    $ oc -n openshift-ingress get service/router-custom-domain-ingress

    出力例

    NAME                           TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     PORT(S)                      AGE
    router-custom-domain-ingress   LoadBalancer   172.30.174.34   a309962c3bd6e42c08cadb9202eca683-1f5bbb64a1f1ec65.elb.us-east-1.amazonaws.com   80:31342/TCP,443:31821/TCP   7m28s

  5. カスタムドメイン Ingress Controller の DNS 解決を有効にするために必要な DNS 変更を含むドキュメントを準備します。

    $ INGRESS=$(oc -n openshift-ingress get service/router-custom-domain-ingress -ojsonpath="{.status.loadBalancer.ingress[0].hostname}")
    $ cat << EOF > "${SCRATCH}/create-cname.json"
    {
      "Comment":"Add CNAME to custom domain endpoint",
      "Changes":[{
          "Action":"CREATE",
          "ResourceRecordSet":{
            "Name": "*.${DOMAIN}",
          "Type":"CNAME",
          "TTL":30,
          "ResourceRecords":[{
            "Value": "${INGRESS}"
          }]
        }
      }]
    }
    EOF
  6. 変更を伝播するために Amazon Route 53 に送信します。

    $ aws route53 change-resource-record-sets \
      --hosted-zone-id ${ZONE_ID} \
      --change-batch file://${SCRATCH}/create-cname.json
    注記

    ワイルドカード CNAME レコードを使用すると、カスタムドメイン Ingress Controller を使用してデプロイする新しいアプリケーションごとに新しいレコードを作成する必要がなくなりますが、これらの各アプリケーションが使用する証明書は、ワイルドカード証明書 ではありません

14.6. カスタムドメインルートの動的証明書の設定

これで、指定したドメインのファーストレベルサブドメインでクラスターアプリケーションを公開できるようになります。しかし、アプリケーションのドメインと一致する TLS 証明書で接続が保護されません。このクラスターアプリケーションに各ドメイン名の有効な証明書を確実に提供するために、このドメインの配下に作成されたすべての新しいルートに証明書を動的に発行するように cert-manager を設定します。

  1. cert-manager による OpenShift ルートの証明書の管理に必要な OpenShift リソースを作成します。

    このステップでは、クラスター内のアノテーション付きルートを特別に監視する新しいデプロイメント (とその Pod) を作成します。新しいルートで issuer-kind および issuer-name アノテーションが検出された場合、ルートの作成時に指定されたホスト名を受け入れる、このルートに固有の新しい証明書を発行者 (この場合は ClusterIssuer) に要求します。

    注記

    クラスターから GitHub にアクセスできない場合は、raw コンテンツをローカルに保存し、oc apply -f localfilename.yaml -n cert-manager を実行します。

    $ oc -n cert-manager apply -f https://github.com/cert-manager/openshift-routes/releases/latest/download/cert-manager-openshift-routes.yaml

    このステップでは、次の追加の OpenShift リソースも作成されます。

    • ClusterRole - クラスター全体のルートを監視および更新する権限を付与します。
    • ServiceAccount - 新しく作成された Pod を実行する権限を使用します。
    • ClusterRoleBinding - これら 2 つのリソースをバインドします。
  2. 新しい cert-manager-openshift-routes Pod が正常に実行されていることを確認します。

    $ oc -n cert-manager get pods

    結果の例:

    NAME                                             READY   STATUS    RESTARTS   AGE
    cert-manager-866d8f788c-9kspc                    1/1     Running   0          4h21m
    cert-manager-cainjector-6885c585bd-znws8         1/1     Running   0          4h41m
    cert-manager-openshift-routes-75b6bb44cd-f8kd5   1/1     Running   0          6s
    cert-manager-webhook-8498785dd9-bvfdf            1/1     Running   0          4h41m

14.7. サンプルアプリケーションのデプロイ

動的証明書を設定したら、サンプルアプリケーションをデプロイして、新しいルートの公開時に証明書がプロビジョニングされ、信頼されることを確認します。

  1. サンプルアプリケーション用に新しいプロジェクトを作成します。

    $ oc new-project hello-world
  2. Hello World アプリケーションをデプロイします。

    $ oc -n hello-world new-app --image=docker.io/openshift/hello-openshift
  3. クラスターの外部からアプリケーションを公開するためのルートを作成します。

    $ oc -n hello-world create route edge --service=hello-openshift hello-openshift-tls --hostname hello.${DOMAIN}
  4. ルートの証明書が信頼されていないことを確認します。

    $ curl -I https://hello.${DOMAIN}

    出力例

    curl: (60) SSL: no alternative certificate subject name matches target host name 'hello.example.com'
    More details here: https://curl.se/docs/sslcerts.html
    
    curl failed to verify the legitimacy of the server and therefore could not
    establish a secure connection to it. To learn more about this situation and
    how to fix it, please visit the web page mentioned above.

  5. ルートにアノテーションを付けて、cert-manager をトリガーしてカスタムドメインの証明書をプロビジョニングします。

    $ oc -n hello-world annotate route hello-openshift-tls cert-manager.io/issuer-kind=ClusterIssuer cert-manager.io/issuer-name=letsencrypt-production
    注記

    証明書の作成には 2 - 3 分かかります。証明書の更新は、有効期限が近づくと、cert-manager Operator によって自動的に処理されます。

  6. ルートの証明書が信頼されていることを確認します。

    $ curl -I https://hello.${DOMAIN}

    出力例

    HTTP/2 200
    date: Thu, 05 Oct 2023 23:45:33 GMT
    content-length: 17
    content-type: text/plain; charset=utf-8
    set-cookie: 52e4465485b6fb4f8a1b1bed128d0f3b=68676068bb32d24f0f558f094ed8e4d7; path=/; HttpOnly; Secure; SameSite=None
    cache-control: private

14.8. 動的証明書のプロビジョニングのトラブルシューティング

注記

証明書の作成中、検証プロセスが完了するまでに通常 2 - 3 分かかります。

ルートにアノテーションを付けても、証明書作成ステップ中に証明書の作成がトリガーされない場合は、certificatecertificaterequestorder、および challenge リソースのそれぞれに対して oc describe を実行して、問題の原因の特定に役立つイベントや理由を表示します。

$ oc get certificate,certificaterequest,order,challenge

トラブルシューティングについては、証明書のデバッグに役立つこちらのガイド を参照してください。

cmctl CLI ツールを使用して、証明書のステータスの確認や更新のテストなど、さまざまな証明書管理アクティビティーを行うこともできます。

第15章 チュートリアル: 外部トラフィックへの一貫した Egress IP の割り当て

セキュリティー基準を満たすために IP ベースの設定を必要とするセキュリティーグループなど、クラスターから出るトラフィックに一貫した IP アドレスを割り当てることができます。

デフォルトでは、Red Hat OpenShift Service on AWS (ROSA) は、OVN-Kubernetes の Container Network Interface (CNI) を使用して、プールからランダムな IP アドレスを割り当てます。これにより、セキュリティーロックダウンの設定が予測不可能になったり、オープンになったりする可能性があります。

詳細は、Egress IP アドレスの設定 を参照してください。

目的

  • Egress クラスタートラフィック用に予測可能な IP アドレスのセットを設定する方法を学習します。

前提条件

15.1. 環境変数の設定

  • 次のコマンドを実行して、環境変数を設定します。

    注記

    別のマシンプールをターゲットにするには、ROSA_MACHINE_POOL_NAME 変数の値を置き換えます。

    $ export ROSA_CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export ROSA_MACHINE_POOL_NAME=worker

15.2. 容量の確保

各ノードに割り当てられる IP アドレスの数は、パブリッククラウドプロバイダーごとに制限されます。

  • 次のコマンドを実行して、十分な容量を確認します。

    $ oc get node -o json | \
        jq '.items[] |
            {
                "name": .metadata.name,
                "ips": (.status.addresses | map(select(.type == "InternalIP") | .address)),
                "capacity": (.metadata.annotations."cloud.network.openshift.io/egress-ipconfig" | fromjson[] | .capacity.ipv4)
            }'

    出力例

    ---
    {
      "name": "ip-10-10-145-88.ec2.internal",
      "ips": [
        "10.10.145.88"
      ],
      "capacity": 14
    }
    {
      "name": "ip-10-10-154-175.ec2.internal",
      "ips": [
        "10.10.154.175"
      ],
      "capacity": 14
    }
    ---

15.3. Egress IP ルールの作成

  1. Egress IP ルールを作成する前に、使用する Egress IP を特定します。

    注記

    選択する Egress IP は、ワーカーノードがプロビジョニングされているサブネットの一部として存在する必要があります。

  2. オプション: AWS Virtual Private Cloud (VPC) Dynamic Host Configuration Protocol (DHCP) サービスとの競合を回避するために、要求した Egress IP を予約します。

    CIDR 予約ページの AWS ドキュメント で明示的な IP 予約をリクエストします。

15.4. namespace への Egress IP の割り当て

  1. 次のコマンドを実行して新しいプロジェクトを作成します。

    $ oc new-project demo-egress-ns
  2. 次のコマンドを実行して、namespace 内のすべての Pod に Egress ルールを作成します。

    $ cat <<EOF | oc apply -f -
    apiVersion: k8s.ovn.org/v1
    kind: EgressIP
    metadata:
      name: demo-egress-ns
    spec:
      # NOTE: these egress IPs are within the subnet range(s) in which my worker nodes
      #       are deployed.
      egressIPs:
        - 10.10.100.253
        - 10.10.150.253
        - 10.10.200.253
      namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: demo-egress-ns
    EOF

15.5. Pod への Egress IP の割り当て

  1. 次のコマンドを実行して新しいプロジェクトを作成します。

    $ oc new-project demo-egress-pod
  2. 次のコマンドを実行して、Pod の Egress ルールを作成します。

    注記

    spec.namespaceSelector は必須フィールドです。

    $ cat <<EOF | oc apply -f -
    apiVersion: k8s.ovn.org/v1
    kind: EgressIP
    metadata:
      name: demo-egress-pod
    spec:
      # NOTE: these egress IPs are within the subnet range(s) in which my worker nodes
      #       are deployed.
      egressIPs:
        - 10.10.100.254
        - 10.10.150.254
        - 10.10.200.254
      namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: demo-egress-pod
      podSelector:
        matchLabels:
          run: demo-egress-pod
    EOF

15.5.1. ノードのラベル付け

  1. 次のコマンドを実行して、保留中の Egress IP 割り当てを取得します。

    $ oc get egressips

    出力例

    NAME              EGRESSIPS       ASSIGNED NODE   ASSIGNED EGRESSIPS
    demo-egress-ns    10.10.100.253
    demo-egress-pod   10.10.100.254

    作成した Egress IP ルールは、k8s.ovn.org/egress-assignable ラベルを持つノードにのみ適用されます。ラベルが特定のマシンプールにのみ存在することを確認します。

  2. 次のコマンドを使用して、マシンプールにラベルを割り当てます。

    警告

    マシンプールのノードラベルに依存している場合は、このコマンドによってそれらのラベルが置き換えられます。ノードラベルを保持するには、必要なラベルを --labels フィールドに入力してください。

    $ rosa update machinepool ${ROSA_MACHINE_POOL_NAME} \
      --cluster="${ROSA_CLUSTER_NAME}" \
      --labels "k8s.ovn.org/egress-assignable="

15.5.2. Egress IP の確認

  • 次のコマンドを実行して、Egress IP の割り当てを確認します。

    $ oc get egressips

    出力例

    NAME              EGRESSIPS       ASSIGNED NODE                   ASSIGNED EGRESSIPS
    demo-egress-ns    10.10.100.253   ip-10-10-156-122.ec2.internal   10.10.150.253
    demo-egress-pod   10.10.100.254   ip-10-10-156-122.ec2.internal   10.10.150.254

15.6. 検証

15.6.1. サンプルアプリケーションのデプロイ

Egress IP ルールをテストするには、指定した Egress IP アドレスに制限されるサービスを作成します。これは、IP アドレスの小さなサブセットを期待する外部サービスをシミュレートします。

  1. リクエストを複製するには、echoserver コマンドを実行します。

    $ oc -n default run demo-service --image=gcr.io/google_containers/echoserver:1.4
  2. 次のコマンドを実行して、Pod をサービスとして公開し、指定した Egress IP アドレスへの Ingress を制限します。

    $ cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-scheme: "internal"
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    spec:
      selector:
        run: demo-service
      ports:
        - port: 80
          targetPort: 8080
      type: LoadBalancer
      externalTrafficPolicy: Local
      # NOTE: this limits the source IPs that are allowed to connect to our service.  It
      #       is being used as part of this demo, restricting connectivity to our egress
      #       IP addresses only.
      # NOTE: these egress IPs are within the subnet range(s) in which my worker nodes
      #       are deployed.
      loadBalancerSourceRanges:
        - 10.10.100.254/32
        - 10.10.150.254/32
        - 10.10.200.254/32
        - 10.10.100.253/32
        - 10.10.150.253/32
        - 10.10.200.253/32
    EOF
  3. 次のコマンドを実行して、ロードバランサーのホスト名を取得し、環境変数として保存します。

    $ export LOAD_BALANCER_HOSTNAME=$(oc get svc -n default demo-service -o json | jq -r '.status.loadBalancer.ingress[].hostname')

15.6.2. namespace の Egress のテスト

  1. 対話型シェルを起動して、namespace の Egress ルールをテストします。

    $ oc run \
      demo-egress-ns \
      -it \
      --namespace=demo-egress-ns \
      --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \
      --image=registry.access.redhat.com/ubi9/ubi -- \
      bash
  2. ロードバランサーにリクエストを送信し、正常に接続できることを確認します。

    $ curl -s http://$LOAD_BALANCER_HOSTNAME
  3. 接続が成功したかどうかの出力を確認します。

    注記

    client_address は、Egress IP ではなく、ロードバランサーの内部 IP アドレスです。.spec.loadBalancerSourceRanges に制限されたサービスに接続することで、クライアントアドレスが正しく設定されていることを確認できます。

    出力例

    CLIENT VALUES:
    client_address=10.10.207.247
    command=GET
    real path=/
    query=nil
    request_version=1.1
    request_uri=http://internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com:8080/
    
    SERVER VALUES:
    server_version=nginx: 1.10.0 - lua: 10001
    
    HEADERS RECEIVED:
    accept=*/*
    host=internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com
    user-agent=curl/7.76.1
    BODY:
    -no body in request-

  4. 以下のコマンドを実行して Pod を終了します。

    $ exit

15.6.3. Pod の Egress のテスト

  1. 対話型シェルを起動して、Pod の Egress ルールをテストします。

    $ oc run \
      demo-egress-pod \
      -it \
      --namespace=demo-egress-pod \
      --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \
      --image=registry.access.redhat.com/ubi9/ubi -- \
      bash
  2. 次のコマンドを実行して、ロードバランサーにリクエストを送信します。

    $ curl -s http://$LOAD_BALANCER_HOSTNAME
  3. 接続が成功したかどうかの出力を確認します。

    注記

    client_address は、Egress IP ではなく、ロードバランサーの内部 IP アドレスです。.spec.loadBalancerSourceRanges に制限されたサービスに接続することで、クライアントアドレスが正しく設定されていることを確認できます。

    出力例

    CLIENT VALUES:
    client_address=10.10.207.247
    command=GET
    real path=/
    query=nil
    request_version=1.1
    request_uri=http://internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com:8080/
    
    SERVER VALUES:
    server_version=nginx: 1.10.0 - lua: 10001
    
    HEADERS RECEIVED:
    accept=*/*
    host=internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com
    user-agent=curl/7.76.1
    BODY:
    -no body in request-

  4. 以下のコマンドを実行して Pod を終了します。

    $ exit

15.6.4. オプション: ブロックされた Egress のテスト

  1. オプション: 次のコマンドを実行して、Egress ルールが適用されない場合にトラフィックが正常にブロックされることをテストします。

    $ oc run \
      demo-egress-pod-fail \
      -it \
      --namespace=demo-egress-pod \
      --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \
      --image=registry.access.redhat.com/ubi9/ubi -- \
      bash
  2. 次のコマンドを実行して、ロードバランサーにリクエストを送信します。

    $ curl -s http://$LOAD_BALANCER_HOSTNAME
  3. コマンドが失敗すると、Egress が正常にブロックされます。
  4. 以下のコマンドを実行して Pod を終了します。

    $ exit

15.7. クラスターのクリーンアップ

  1. 次のコマンドを実行してクラスターをクリーンアップします。

    $ oc delete svc demo-service -n default; \
    $ oc delete pod demo-service -n default; \
    $ oc delete project demo-egress-ns; \
    $ oc delete project demo-egress-pod; \
    $ oc delete egressip demo-egress-ns; \
    $ oc delete egressip demo-egress-pod
  2. 次のコマンドを実行して、割り当てられたノードラベルをクリーンアップします。

    警告

    マシンプールのノードラベルに依存している場合は、このコマンドによってそれらのラベルが置き換えられます。ノードラベルを保持するには、必要なラベルを --labels フィールドに入力します。

    $ rosa update machinepool ${ROSA_MACHINE_POOL_NAME} \
      --cluster="${ROSA_CLUSTER_NAME}" \
      --labels ""

第16章 チュートリアル: カスタムドメインと TLS 証明書を使用してコンポーネントルートを更新する

このガイドでは、Red Hat OpenShift Service on AWS (ROSA) バージョン 4.14 以降で、Web コンソール、OAuth サーバー、およびダウンロードコンポーネントルートのホスト名と TLS 証明書を変更する方法を説明します。[1]

コンポーネントルートに加える変更[2] このガイドで説明されている内容は 内部 OAuth サーバー URLコンソールルートダウンロードルート のカスタマイズに関する OpenShift Container Platform ドキュメントで詳しく説明されています。

16.1. 前提条件

  • ROSA CLI (rosa) バージョン 1.2.37 以降
  • AWS CLI (aws)
  • ROSA Classic クラスターバージョン 4.14 以降

    注記

    ROSA with HCP は現在サポートされていません。

  • OpenShift CLI (oc)
  • jq CLI
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • OpenSSL (デモ用の SSL/TLS 証明書を生成するため)

16.2. 環境の設定

  1. cluster-admin 権限を持つアカウントを使用してクラスターにログインします。
  2. クラスター名の環境変数を設定します。

    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
  3. 次のセクションに進む前に、すべてのフィールドが正しく出力されていることを確認してください。

    $ echo "Cluster: ${CLUSTER_NAME}"

    出力例

    Cluster: my-rosa-cluster

16.3. 現在のルートを確認する

  1. デフォルトのホスト名でコンポーネントルートに到達できることを確認します。

    openshift-console および openshift-authentication プロジェクトでルートのリストをクエリーすることで、ホスト名を確認できます。

    $ oc get routes -n openshift-console
    $ oc get routes -n openshift-authentication

    出力例

    NAME        HOST/PORT                                                                          PATH       SERVICES    PORT    TERMINATION          WILDCARD
    console     console-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com    ... 1 more  console    https   reencrypt/Redirect   None
    downloads   downloads-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com  ... 1 more  downloads  http    edge/Redirect        None
    NAME              HOST/PORT                                                             PATH        SERVICES          PORT   TERMINATION            WILDCARD
    oauth-openshift   oauth-openshift.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com ... 1 more  oauth-openshift   6443   passthrough/Redirect   None

    この出力から、ベースホスト名が z9a9.p1.openshiftapps.com であることを確認できます。

  2. 次のコマンドを実行して、デフォルト Ingress の ID を取得します。

    $ export INGRESS_ID=$(rosa list ingress -c ${CLUSTER_NAME} -o json | jq -r '.[] | select(.default == true) | .id')
  3. 次のセクションに進む前に、すべてのフィールドが正しく出力されていることを確認してください。

    $ echo "Ingress ID: ${INGRESS_ID}"

    出力例

    Ingress ID: r3l6

    これらのコマンドを実行すると、クラスターのデフォルトのコンポーネントルートが次のとおりであることがわかります。

    • console-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com (Console の場合)
    • downloads-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com (Downloads の場合)
    • oauth-openshift.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com (OAuth の場合)

rosa edit Ingress コマンドを使用して、各サービスのホスト名を変更し、すべてのコンポーネントルートに TLS 証明書を追加できます。関連するパラメーターは、以下に示す rosa edit ingress コマンドのコマンドラインヘルプの抜粋で確認できます。

$ rosa edit ingress -h
Edit a cluster ingress for a cluster. Usage:
  rosa edit ingress ID [flags]
  [...]
  --component-routes string                Component routes settings. Available keys [oauth, console, downloads]. For each key a pair of hostname and tlsSecretRef is expected to be supplied. Format should be a comma separate list 'oauth: hostname=example-hostname;tlsSecretRef=example-secret-ref,downloads:...'

この例では、次のカスタムコンポーネントルートを使用します。

  • Console の場合: console.my-new-domain.dev
  • Downloads の場合: downloads.my-new-domain.dev
  • OAuth の場合: oauth.my-new-domain.dev

16.4. 各コンポーネントルートに対して有効な TLS 証明書を作成する

このセクションでは、3 つの個別の自己署名証明書キーペアを作成し、それらを信頼して、実際の Web ブラウザーを使用して新しいコンポーネントルートにアクセスできることを確認します。

警告

これはデモンストレーションのみを目的としており、実稼働環境のワークロードのソリューションとしては推奨されません。実稼働環境のワークロード用に同様の属性を持つ証明書を作成する方法については、認証局に問い合わせてください。

重要

HTTP/2 接続の結合に関する問題を防ぐには、エンドポイントごとに個別の証明書を使用する必要があります。ワイルドカードまたは SAN 証明書の使用はサポートされません。

  1. 各コンポーネントルートの証明書を生成し、使用するコンポーネントルートのカスタムドメインに、証明書のサブジェクト (-subj) を設定するように注意してください。

    $ openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout key-console.pem -out cert-console.pem -subj "/CN=console.my-new-domain.dev"
    $ openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout key-downloads.pem -out cert-downloads.pem -subj "/CN=downloads.my-new-domain.dev"
    $ openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout key-oauth.pem -out cert-oauth.pem -subj "/CN=oauth.my-new-domain.dev"

    これにより、.pem ファイル、key-<component>.pemcert-<component>.pem ペアが 3 つ生成されます。

16.5. シークレットとして証明書をクラスターに追加する

  1. openshift-config namespace に 3 つの TLS シークレットを作成します。

    これは、このガイドで後にコンポーネントルートを更新するときのシークレット参照になります。

    $ oc create secret tls console-tls --cert=cert-console.pem --key=key-console.pem -n openshift-config
    $ oc create secret tls downloads-tls --cert=cert-downloads.pem --key=key-downloads.pem -n openshift-config
    $ oc create secret tls oauth-tls --cert=cert-oauth.pem --key=key-oauth.pem -n openshift-config

16.6. クラスター内のロードバランサーのホスト名を確認する

クラスターを作成すると、サービスによってロードバランサーが作成され、そのロードバランサーのホスト名が生成されます。クラスターの DNS レコードを作成するために、ロードバランサーのホスト名を確認する必要があります。

ホスト名を確認するには、openshift-ingress namespace に対して oc get svc コマンドを実行します。ロードバランサーのホスト名は、openshift-ingress namespace の router-default サービスに関連付けられた EXTERNAL-IP です。

$ oc get svc -n openshift-ingress
NAME            TYPE          CLUSTER-IP     EXTERNAL-IP                                             PORT(S)                     AGE
router-default  LoadBalancer  172.30.237.88  a234gsr3242rsfsfs-1342r624.us-east-1.elb.amazonaws.com  80:31175/TCP,443:31554/TCP  76d

この場合、ホスト名は a234gsr3242rsfsfs-1342r624.us-east-1.elb.amazonaws.com です。

この値を後の手順のために保存します。新しいコンポーネントルートのホスト名に DNS レコードを設定する際に必要になります。

16.7. コンポーネントルートの DNS レコードをホスティングプロバイダーに追加する

ホスティングプロバイダーで、新しいコンポーネントルートのホスト名の CNAME を、前のステップで確認したロードバランサーのホスト名にマップする DNS レコードを追加します。

16.8. ROSA CLI を使用してコンポーネントのルートと TLS シークレットを更新する

DNS レコードを更新したら、ROSA CLI を使用してコンポーネントルートを変更できます。

  1. rosa edit Ingress コマンドを使用して、デフォルトの Ingress ルートを新しいベースドメインとそれに関連付けられたシークレット参照で更新します。その際、各コンポーネントルートのホスト名を更新するように注意してください。

    $ rosa edit ingress -c ${CLUSTER_NAME} ${INGRESS_ID} --component-routes 'console: hostname=console.my-new-domain.dev;tlsSecretRef=console-tls,downloads: hostname=downloads.my-new-domain.dev;tlsSecretRef=downloads-tls,oauth: hostname=oauth.my-new-domain.dev;tlsSecretRef=oauth-tls'
    注記

    変更しないコンポーネントルートを空の文字列に設定したままにして、コンポーネントルートのサブセットのみを編集することもできます。たとえば、コンソールおよび OAuth サーバーのホスト名および TLS 証明書のみを変更する場合は、以下のコマンドを実行します。

    $ rosa edit ingress -c ${CLUSTER_NAME} ${INGRESS_ID} --component-routes 'console: hostname=console.my-new-domain.dev;tlsSecretRef=console-tls,downloads: hostname="";tlsSecretRef="", oauth: hostname=oauth.my-new-domain.dev;tlsSecretRef=oauth-tls'
  2. rosa list ingress コマンドを実行して、変更が正常に行われたことを確認します。

    $ rosa list ingress -c ${CLUSTER_NAME} -ojson | jq ".[] | select(.id == \"${INGRESS_ID}\") | .component_routes"

    出力例

    {
      "console": {
        "kind": "ComponentRoute",
        "hostname": "console.my-new-domain.dev",
        "tls_secret_ref": "console-tls"
      },
      "downloads": {
        "kind": "ComponentRoute",
        "hostname": "downloads.my-new-domain.dev",
        "tls_secret_ref": "downloads-tls"
      },
      "oauth": {
        "kind": "ComponentRoute",
        "hostname": "oauth.my-new-domain.dev",
        "tls_secret_ref": "oauth-tls"
      }
    }

  3. ローカルシステムのトラストストアに証明書を追加し、ローカル Web ブラウザーを使用して新しいルートでコンポーネントにアクセスできることを確認します。

16.9. ROSA CLI を使用してコンポーネントルートをデフォルトにリセットする

コンポーネントルートをデフォルト設定にリセットする場合は、次の rosa edit Ingress コマンドを実行します。

$ rosa edit ingress -c ${CLUSTER_NAME} ${INGRESS_ID} --component-routes 'console: hostname="";tlsSecretRef="",downloads: hostname="";tlsSecretRef="", oauth: hostname="";tlsSecretRef=""'


[1] 4.14 より前のバージョンの Red Hat OpenShift Service on AWS ROSA でこれらのルートを変更することは、通常サポートされていません。ただし、バージョン 4.13 を使用しているクラスターがある場合は、サポートケースを作成 して、バージョン 4.13 クラスターでこの機能のサポートを有効にするように Red Hat サポートにリクエストできます。
[2] ROSA が最初にインストールされたときに提供される OAuth、コンソール、およびダウンロードルートを指すために、「コンポーネントルート」という用語を使用します。

第17章 ROSA のスタートガイド

17.1. チュートリアル: ROSA とは

Red Hat OpenShift Service on AWS (ROSA) は、フルマネージドのターンキーアプリケーションプラットフォームです。ROSA を利用すると、アプリケーションを構築およびデプロイして顧客に価値を提供するという、最も重要なことに集中できます。Red Hat と AWS の SRE エキスパートが基盤となるプラットフォームを管理するため、お客様がインフラストラクチャーの管理について心配する必要はありません。ROSA は、幅広い AWS コンピュート、データベース、分析、機械学習、ネットワーク、モバイル、およびその他のサービスとのシームレスな統合を提供し、差別化されたエクスペリエンスの構築とお客様への提供をさらに加速します。

ROSA は、AWS Security Token Service (STS) を利用して、AWS アカウントのインフラストラクチャーを管理するための認証情報を取得します。AWS STS は、IAM ユーザーまたはフェデレーションユーザーの一時的な認証情報を作成するグローバル Web サービスです。ROSA はこれを使用して、権限が限られた短期間のセキュリティー認証情報を割り当てます。これらの認証情報は、AWS API 呼び出しを行う各コンポーネントに固有の IAM ロールに関連付けられます。この方法は、クラウドサービスのリソース管理における最小権限と安全なプラクティスの原則に沿ったものです。ROSA コマンドラインインターフェイス (CLI) ツールは、固有のタスクに割り当てられた STS 認証情報を管理し、OpenShift 機能の一部として AWS リソースに対してアクションを実行します。

17.1.1. ROSA の主な特徴

  • ネイティブ AWS サービス: AWS マネジメントコンソールから、セルフサービスのオンボーディングにより、オンデマンドで Red Hat OpenShift にアクセスし、使用できます。
  • 柔軟な従量制の価格設定: ビジネスニーズに合わせたスケールアップが可能で、柔軟な価格設定と時間単位または年単位のオンデマンド請求モデルに基づく従量課金制が導入されています。
  • Red Hat OpenShift と AWS の使用に対する一括請求書: お客様は、Red Hat OpenShift と AWS の両方の使用に対して、AWS から単一の請求書を受け取ります。
  • 完全に統合されたサポートエクスペリエンス: インストール、管理、メンテナンス、アップグレードは、Red Hat と Amazon の共同サポートと 99.95 % のサービスレベルアグリーメント (SLA) に基づき、Red Hat site reliability engineer (SRE) が行います。
  • AWS サービスインテグレーション: AWS には、コンピューティング、ストレージ、ネットワーキング、データベース、分析、機械学習など、堅牢なクラウドサービスポートフォリオがあります。これらのサービスはすべて、ROSA を通じて直接アクセスできます。これにより、使い慣れた管理インターフェイスを通じて、グローバルかつオンデマンドでの構築、運用、拡張が容易になります。
  • 可用性の最大化: サポート対象リージョン内の複数のアベイラビリティーゾーンにクラスターをデプロイして可用性を最大化し、最も要求の厳しいミッションクリティカルなアプリケーションとデータの高可用性を維持します。
  • クラスターノードのスケーリング: リソースのニーズに合わせてコンピューティングノードを簡単に追加または削除できます。
  • 最適化されたクラスター: ニーズを満たすサイズのクラスターを備えた EC2 インスタンスタイプ (メモリー最適化型、コンピュート最適型、汎用型) を選択できます。
  • グローバルな可用性: ROSA が使用できる世界の地域を確認するには、製品の地域別可用性ページ を参照してください。

17.1.2. ROSA と Kubernetes

ROSA には、コンテナー管理、Operator、ネットワーキング、負荷分散、サービスメッシュ、CI/CD、ファイアウォール、モニタリング、レジストリー、認証、および認可機能など、コンテナーのデプロイと管理に必要なすべての機能がバンドルされています。これらのコンポーネントは、完全なプラットフォームとして統合された操作を行うために一緒にテストされます。無線によるプラットフォームアップグレードを含む自動化されたクラスター操作により、Kubernetes エクスペリエンスがさらに強化されています。

17.1.3. 基本的な責任

一般的に、クラスターのデプロイメントと維持は Red Hat または AWS がその責任を果たし、アプリケーション、ユーザー、データについてはお客様が責任を果たします。責任の詳細な内訳については、責任マトリクス を参照してください。

17.1.4. ロードマップと機能リクエスト

現在開発中の機能の最新ステータスは、ROSA ロードマップ で確認してください。製品チームに提案がある場合は、新規 Issue を作成してください。

17.1.5. リージョン別の AWS 可用性

最新の ROSA 可用性については、リージョン別の製品可用性 ページを参照してください。

17.1.6. コンプライアンス認証

ROSA は現在、SOC-2 タイプ 2、SOC 3、ISO-27001、ISO 27017、ISO 27018、HIPAA、GDPR、および PCI-DSS に準拠しています。現在、FedRAMP High に向けて取り組んでいます。

17.1.7. ノード

17.1.7.1. 複数の AWS リージョンにまたがるワーカーノード

ROSA クラスター内のすべてのノードは、同じ AWS リージョンに配置する必要があります。複数のアベイラビリティーゾーン用に設定されたクラスターの場合、コントロールプレーンノードとワーカーノードはアベイラビリティーゾーンをまたいで分散的に配置されます。

17.1.7.2. ワーカーノードの最小数

ROSA クラスターにおけるワーカーノードの最小数は、アベイラビリティーゾーンが 1 つの場合は 2 台、アベイラビリティーゾーンが複数の場合は 3 台です。

17.1.7.3. 基盤となるノードのオペレーティングシステム

すべての OpenShift v4.x 製品と同様に、コントロールプレーン、インフラおよびワーカーノードは Red Hat Enterprise Linux CoreOS (RHCOS) を実行します。

17.1.7.4. ノードのハイバネートまたはシャットダウン

現時点では、ROSA にノードのハイバネート機能またはシャットダウン機能はありません。シャットダウンおよびハイバネート機能は OpenShift プラットフォームの機能ですが、広範なクラウドサービスで使用できるほど十分には成熟していません。

17.1.7.5. ワーカーノードでサポートされるインスタンス

ワーカーノードでサポートされるインスタンスの完全なリストは、AWS インスタンスタイプ を参照してください。スポットインスタンスもサポートされています。

17.1.7.6. ノードの自動スケーリング

自動スケーリングを使用すると、現在のワークロードに基づいてクラスターのサイズを自動的に調整できます。詳細は、クラスター上のノードの自動スケーリング を参照してください。

17.1.7.7. ワーカーノードの最大数

ROSA クラスターバージョン 4.14.14 以降のワーカーノードの最大数は 249 です。以前のバージョンでは、制限が 180 ノードです。ノード数の詳細は、制限とスケーラビリティー を参照してください。

アカウント全体およびクラスターごとのロールのリストは、ROSA のドキュメント に記載されています。

17.1.8. 管理者

お客様側の ROSA 管理者は、ユーザーが作成したすべてのプロジェクトにアクセスできる他に、ユーザーとクォータを管理できます。

17.1.9. OpenShift のバージョンとアップグレード

ROSA は、OpenShift Container Platform をベースとするマネージドサービスです。現行バージョンとライフサイクルの日付は、ROSA のドキュメント で確認できます。

お客様は、OpenShift の最新バージョンにアップグレードして、そのバージョンの OpenShift 機能を使用できます。詳細は、ライフサイクルの日付 を参照してください。ROSA では、一部の OpenShift 機能を使用できません。詳細は、サービス定義 を参照してください。

17.1.10. サポート

OpenShift Cluster Manager から直接チケットを作成できます。サポートを受ける方法の詳細は、ROSA サポートドキュメント を参照してください。

Red Hat カスタマーポータル にアクセスして、Red Hat ナレッジベースで Red Hat 製品に関連する記事やソリューションを検索または参照したり、Red Hat サポートに対してサポートケースを作成したりすることもできます。

17.1.10.1. Limited support

ROSA クラスターが "サポート終了日" までにアップグレードされなかった場合、クラスターは限定サポートステータスで引き続き動作します。そのクラスターの SLA は適用されなくなりますが、そのクラスターのサポートはその後も受けることができます。詳細は、限定サポートステータス のドキュメントを参照してください。

その他のサポートリソース

17.1.11. Service Level Agreement (SLA)

詳細は、ROSA SLA のページを参照してください。

17.1.12. 通知と連絡

Red Hat は、Red Hat および AWS の新機能、更新、定期メンテナンスに関する通知を、メールおよび Hybrid Cloud Console サービスログを通じて提供します。

17.1.13. Open Service Broker for AWS (OBSA)

ROSA では OSBA を使用できます。ただし、より新しい AWS Controller for Kubernetes の使用が推奨されます。OSBA の詳細は、Open Service Broker for AWS を参照してください。

17.1.14. オフボーディング

お客様はいつでも ROSA の使用を停止し、アプリケーションをオンプレミス、プライベートクラウド、または他のクラウドプロバイダーに移行できます。標準予約インスタンス (RI) ポリシーは、未使用の RI に適用されます。

17.1.15. 認証

ROSA がサポートする認証メカニズムは、OpenID Connect (OAuth2 のプロファイル)、Google OAuth、GitHub OAuth、GitLab、および LDAP です。

17.1.16. SRE クラスターアクセス

すべての SRE クラスターへのアクセスは、MFA で保護されます。詳細は、SRE アクセス を参照してください。

17.1.17. 暗号化

17.1.17.1. 暗号鍵

ROSA は、KMS に保存されている鍵を使用して EBS ボリュームを暗号化します。オプションとして、お客様はクラスター作成時に独自の KMS キーを指定することもできます。

17.1.17.2. KMS キー

KMS キーを指定すると、コントロールプレーン、インフラストラクチャーおよびワーカーノードのルートボリュームと永続ボリュームがそのキーで暗号化されます。

17.1.17.3. データの暗号化

デフォルトでは、保存時に暗号化されます。AWS Storage プラットフォームは、データを永続化する前に自動的に暗号化し、取得する前にデータを復号化します。詳細は、AWS EBS Encryption を参照してください。

AWS ストレージ暗号化と組み合わせて、クラスター内の etcd を暗号化することもできます。その結果、暗号化が 2 倍になり、パフォーマンスが最大 20% 低下します。詳細は、etcd 暗号化 のドキュメントを参照してください。

17.1.17.4. etcd 暗号化

etcd 暗号化は、クラスター作成時にのみ有効にできます。

注記

etcd 暗号化では追加のオーバーヘッドが発生しますが、セキュリティーリスクはほとんど軽減されません。

17.1.17.5. etcd 暗号化の設定

etcd 暗号化は、OpenShift Container Platform と同じように設定されます。aescbc 暗号が使用され、設定はクラスターのデプロイメント中にパッチが適用されます。詳細は、Kubernetes のドキュメント を参照してください。

17.1.17.6. EBS 暗号化用のマルチリージョン KMS キー

現在、ROSA CLI は EBS 暗号化用のマルチリージョン KMS キーを許可しません。この機能は、製品更新のバックログに入っています。クラスター作成時に定義されている場合、ROSA CLI は EBS 暗号化用のシングルリージョン KMS キーを許可します。

17.1.18. Infrastructure

ROSA は、仮想マシン、ストレージ、ロードバランサーなど、複数のクラウドサービスを使用します。定義済みのリストは、AWS の前提条件 で確認できます。

17.1.19. 認証情報メソッド

AWS アカウントで必要な操作を行うために必要な権限を付与する認証情報メソッドには、AWS with STS を使用する方法と、管理者権限を持つ IAM ユーザーを使用する方法の 2 つがあります。推奨されるのは AWS with STS で、IAM ユーザーを使用する方法はいずれ非推奨になる予定です。AWS with STS は、クラウドサービスのリソース管理における最小権限と安全なプラクティスの原則に沿うものです。

17.1.20. 前提条件となる権限または失敗エラー

ROSA CLI の新しいバージョンを確認してください。ROSA CLI の各リリースは、GithubRed Hat 署名付きバイナリーリリース の 2 カ所にあります。

17.1.21. ストレージ

サービス定義の ストレージ セクションを参照してください。

OpenShift には、AWS EFS 用の CSI ドライバーが含まれています。詳細は、Red Hat OpenShift Service on AWS 用の AWS EFS のセットアップ を参照してください。

17.1.22. VPC の使用

インストール時に、既存の VPC にデプロイするか、独自の VPC を使用するかを選択できます。次に、必要なサブネットを選択し、それらのサブネットを使用する際にインストールプログラムのサブネットを含む有効な CIDR 範囲を指定できます。

ROSA を使用すると、複数のクラスターが同じ VPC を共有できます。1 つの VPC 上のクラスター数は、残りの AWS リソースクォータと重複不可の CIDR 範囲で制限されます。詳細は、CIDR 範囲の定義 を参照してください。

17.1.23. ネットワークプラグイン

ROSA は、OpenShift OVN-Kubernetes のデフォルトの CNI ネットワークプロバイダーを使用します。

17.1.24. cross-namespace ネットワーキング

クラスター管理者は、NetworkPolicy オブジェクトを使用して、プロジェクトごとに cross-namespace をカスタマイズまたは拒否できます。詳細は ネットワークポリシーを使用してマルチテナント分離を設定する を参照してください。

17.1.25. Prometheus と Grafana の使用

Prometheus と Grafana を使用してコンテナーを監視し、OpenShift User Workload Monitoring を使用してキャパシティを管理できます。これは、OpenShift Cluster Manager のチェックボックスオプションです。

17.1.26. クラスターコントロールプレーンから出力される監査ログ

Cluster Logging Operator アドオンがクラスターに追加されている場合は、CloudWatch を通じて監査ログを利用できます。そうでない場合は、サポートリクエストで監査ログをリクエストできます。対象を絞り、タイムボックス化された小規模なログのエクスポートをリクエストして、お客様に送信できます。利用可能な監査ログは、プラットフォームのセキュリティーとコンプライアンスのカテゴリーにおける SRE の裁量によって選ばれます。クラスターのログ全体のエクスポートリクエストは拒否されます。

17.1.27. AWS アクセス許可の境界

クラスターのポリシーの周囲に AWS アクセス許可の境界を使用できます。

17.1.28. AMI

ROSA ワーカーノードは、OSD や OpenShift Container Platform とは異なる AMI を使用します。コントロールプレーンとインフラノード AMI は、同じバージョンの製品間で共通しています。

17.1.29. クラスターのバックアップ

ROSA STS クラスターにはバックアップがありません。ユーザーは、アプリケーションとデータに対する独自のバックアップポリシーを持つ必要があります。詳細は、バックアップポリシー を参照してください。

17.1.30. カスタムドメイン

アプリケーションのカスタムドメインを定義できます。詳細は、アプリケーションのカスタムドメインの設定 を参照してください。

17.1.31. ROSA ドメイン証明書

Red Hat インフラストラクチャー (Hive) は、デフォルトのアプリケーション ingress に使用する証明書ローテーションを管理します。

17.1.32. 非接続環境

ROSA は、エアギャップのある非接続環境をサポートしません。ROSA クラスターには、レジストリー、S3 にアクセスしてメトリクスを送信するために、インターネットへの egress が必要です。サービスには多数の egress エンドポイントが必要です。Ingress は、Red Hat SRE 用の PrivateLink とお客様のアクセス用の VPN に制限できます。

17.2. チュートリアル: AWS STS を使用する ROSA の説明

このチュートリアルでは、Red Hat OpenShift Service on AWS (ROSA) がユーザーの Amazon Web Services (AWS) アカウント内のリソースと対話できるようにする方法を 2 つ紹介します。ここでは、Security Token Service (STS) を使用する ROSA が必要な認証情報の取得に使用するコンポーネントとプロセスについて詳しく説明します。また、STS を使用する ROSA がよりセキュアで推奨される方法である理由も説明します。

注記

このコンテンツは現在、AWS STS を使用した ROSA Classic を扱っています。AWS STS を使用した ROSA with Hosted Control Plane (HCP) については、AWS STS と ROSA with HCP の説明 を参照してください。

このチュートリアルでは次のことを行います。

  • 2 つのデプロイ方法を示します。

    • IAM ユーザーを使用する ROSA
    • STS を使用する ROSA
  • 2 つの方法の違いを説明します。
  • STS を使用する ROSA がよりセキュアで推奨される方法である理由を説明します。
  • STS を使用する ROSA がどのように機能するかを説明します。

17.2.1. ROSA をデプロイするための各種認証方法

Red Hat は、ROSA の一部として、お客様の AWS アカウント内のインフラストラクチャーリソースを管理します。そのため、Red Hat に必要な権限を付与する必要があります。必要な権限を付与する方法は、現在、次の 2 つのものがサポートされています。

  • AdministratorAccess ポリシーで静的 IAM ユーザー認証情報を使用する

    このチュートリアルでは、この方法を "IAM ユーザーを使用する ROSA" と呼びます。これは推奨される認証方法ではありません。

  • AWS STS と有効期間の短い動的トークンを使用する

    このチュートリアルでは、この方法を "STS を使用する ROSA" と呼びます。これは推奨される認証方法です。

17.2.1.1. IAM ユーザーを使用する ROSA

ROSA のリリース当初、認証方法は IAM ユーザーを使用する ROSA だけでした。この方法では、AdministratorAccess ポリシーを持つ IAM ユーザーに対して、ROSA を使用する AWS アカウントに必要なリソースを作成するためのフルアクセスを付与します。その後、必要に応じてクラスターで認証情報を作成および拡張できます。

17.2.1.2. STS を使用する ROSA

STS を使用する ROSA では、AWS アカウント内のリソースへの限定的かつ短期間のアクセスをユーザーに付与します。STS による方法では、事前定義されたロールとポリシーを使用して、IAM ユーザーまたは認証されたフェデレーションユーザーに一時的な最小限の権限を付与します。通常、認証情報は要求されてから 1 時間後に期限切れになります。有効期限が切れると、認証情報は AWS によって認識されなくなり、その認証情報を使用して実行される API 要求からアカウントにアクセスできなくなります。詳細は、AWS のドキュメント を参照してください。現在、IAM ユーザーを使用する ROSA と STS を使用する ROSA の両方が有効ですが、STS を使用する ROSA が優先および推奨される方法です。

17.2.2. STS を使用する ROSA のセキュリティー

STS を使用する ROSA は、以下に示すいくつかの重要な要素により、IAM ユーザーを使用する ROSA よりもセキュリティーが向上します。

  • ユーザーが事前に作成する明示的かつ限定的なロールとポリシーのセット。要求されたすべての権限と使用されるすべてのロールをユーザーが把握することになります。
  • サービスは、これらの権限以外の操作を一切行うことができません。
  • サービスは、操作を実行する必要が生じるたびに、1 時間以内に期限切れになる認証情報を取得します。そのため、認証情報のローテーションや取り消しが不要になります。さらに、認証情報の有効期限により、認証情報の漏洩や再利用のリスクが軽減されます。

17.2.3. AWS STS の説明

ROSA は、AWS STS を使用して、短期間のセキュリティー認証情報を持つ最小限の権限を、分離された特定の IAM ロールに付与します。認証情報は、AWS の API 呼び出しを実行する各コンポーネントおよびクラスターに固有の IAM ロールに関連付けられます。この方法は、クラウドサービスのリソース管理における最小権限と安全なプラクティスの原則に沿ったものです。ROSA コマンドラインインターフェイス (CLI) ツールは、固有のタスクに割り当てられた STS のロールとポリシーを管理し、OpenShift 機能の一部として AWS リソースに対してアクションを実行します。

STS のロールとポリシーは、ROSA クラスターごとに作成する必要があります。これを容易にするために、インストールツールには、ロールをポリシーとして作成するために必要なすべてのコマンドおよびファイルと、CLI でロールとポリシーを自動的に作成できるようにするオプションが用意されています。さまざまな --mode オプションの詳細は、カスタマイズを使用した STS を使用する ROSA クラスターの作成 を参照してください。

17.2.4. STS を使用する ROSA に固有のコンポーネント

  • AWS インフラストラクチャー - クラスターに必要なインフラストラクチャーを提供します。これには、実際の EC2 インスタンス、ストレージ、ネットワークコンポーネントが含まれます。コンピュートノードでサポートされているインスタンスタイプと、コントロールプレーンとインフラストラクチャーノードの設定用に プロビジョニングされる AWS インフラストラクチャー を確認するには、AWS コンピュートタイプ を参照してください。
  • AWS STS - 上記の認証方法のセクションを参照してください。
  • OpenID Connect (OIDC) - クラスター Operator が AWS で認証し、信頼ポリシーを通じてクラスターのロールを引き受け、必要な API 呼び出しを実行するために STS から一時的な認証情報を取得するためのメカニズムを提供します。
  • ロールとポリシー - ロールとポリシーは、STS を使用する ROSA と IAM ユーザーを使用する ROSA の主な違いの 1 つです。STS を使用する ROSA の場合、ROSA で使用されるロールとポリシーは、アカウント全体のロールとポリシーと Operator のロールとポリシーに分類されます。

    ポリシーは、各ロールに対して許可されるアクションを決定します。個々のロールとポリシーの詳細は、STS を使用する ROSA クラスターの IAM リソースについて を参照してください。

    • アカウント全体のロールは次のとおりです。

      • ManagedOpenShift-Installer-Role
      • ManagedOpenShift-ControlPlane-Role
      • ManagedOpenShift-Worker-Role
      • ManagedOpenShift-Support-Role
    • アカウント全体のポリシーは次のとおりです。

      • ManagedOpenShift-Installer-Role-Policy
      • ManagedOpenShift-ControlPlane-Role-Policy
      • ManagedOpenShift-Worker-Role-Policy
      • ManagedOpenShift-Support-Role-Policy
      • ManagedOpenShift-openshift-ingress-operator-cloud-credentials [1]
      • ManagedOpenShift-openshift-cluster-csi-drivers-ebs-cloud-credent [1]
      • ManagedOpenShift-openshift-cloud-network-config-controller-cloud [1]
      • ManagedOpenShift-openshift-machine-api-aws-cloud-credentials [1]
      • ManagedOpenShift-openshift-cloud-credential-operator-cloud-crede [1]
      • ManagedOpenShift-openshift-image-registry-installer-cloud-creden [1]

        1. このポリシーは、下記のクラスター Operator ロールによって使用されます。Operator ロールは既存のクラスター名に依存しており、アカウント全体のロールと同時に作成できないため、2 番目のステップで作成されます。
    • Operator のロールは次のとおりです。

      • <cluster-name\>-xxxx-openshift-cluster-csi-drivers-ebs-cloud-credent
      • <cluster-name\>-xxxx-openshift-cloud-network-config-controller-cloud
      • <cluster-name\>-xxxx-openshift-machine-api-aws-cloud-credentials
      • <cluster-name\>-xxxx-openshift-cloud-credential-operator-cloud-crede
      • <cluster-name\>-xxxx-openshift-image-registry-installer-cloud-creden
      • <cluster-name\>-xxxx-openshift-ingress-operator-cloud-credentials
    • 信頼ポリシーは、アカウント全体および Operator のロールごとに作成されます。

17.2.5. ROSA STS クラスターのデプロイ

以下の手順にリストされているリソースを最初から作成する必要はありません。ROSA CLI が必要な JSON ファイルを作成し、必要なコマンドを出力します。さらに、必要に応じて ROSA CLI にコマンドを実行させることもできます。

STS を使用する ROSA クラスターをデプロイする手順

  1. アカウント全体のロールとポリシーを作成します。
  2. 権限ポリシーを、対応するアカウント全体のロールに割り当てます。
  3. クラスターを作成します。
  4. Operator のロールとポリシーを作成します。
  5. 権限ポリシーを、対応する Operator のロールに割り当てます。
  6. OIDC プロバイダーを作成します。

ロールとポリシーは、ROSA CLI によって自動的に作成することも、ROSA CLI で --mode manual フラグまたは --mode auto フラグを利用して手動で作成することもできます。デプロイの詳細は、カスタマイズしたクラスターを作成する または クラスターのデプロイのチュートリアル を参照してください。

17.2.6. STS を使用する ROSA のワークフロー

ユーザーは、必要なアカウント全体のロールとアカウント全体のポリシーを作成します。詳細は、このチュートリアルのコンポーネントのセクションを参照してください。ロールの作成時に、クロスアカウント信頼ポリシーという信頼ポリシーが作成されます。このポリシーは、Red Hat 所有のロールがこのロールを引き受けることを許可するものです。また、EC2 サービス用の信頼ポリシーも作成されます。このポリシーは、EC2 インスタンス上のワークロードがロールを引き受けて認証情報を取得することを許可するものです。ユーザーは、対応する権限ポリシーを各ロールに割り当てることができます。

アカウント全体のロールとポリシーを作成した後、ユーザーはクラスターを作成できます。クラスターの作成を開始すると、クラスター Operator が AWS API 呼び出しを実行できるように、複数の Operator ロールが作成されます。これらのロールを、以前に作成された対応する権限ポリシーと、OIDC プロバイダーの信頼ポリシーに割り当てます。Operator ロールは、AWS リソースへのアクセスが必要な Pod を最終的に表すという点で、アカウント全体のロールとは異なります。ユーザーは IAM ロールを Pod に割り当てることができないため、Operator (ひいては Pod) が必要なロールにアクセスできるように、OIDC プロバイダーを使用して信頼ポリシーを作成する必要があります。

対応する権限ポリシーにロールを割り当てたら、最後のステップとして OIDC プロバイダーを作成します。

cloud experts sts explained creation flow

新しいロールが必要な場合、現在 Red Hat のロールを使用しているワークロードが AWS アカウントのロールを引き受け、AWS STS から一時的な認証情報を取得し、引き受けたロールの権限ポリシーに従ってお客様の AWS アカウント内の API 呼び出しを使用してアクションの実行を開始します。認証情報は一時的なもので、有効期間は最大 1 時間です。

クラウドエキスパート STS の説明の概要

ワークフロー全体を次の図に示します。

cloud experts sts explained entire flow

Operator は、次のプロセスを使用して、タスクを実行するために必要な認証情報を取得します。各 Operator には、Operator のロール、権限ポリシー、および OIDC プロバイダーの信頼ポリシーが割り当てられます。Operator は、ロールとトークンファイル (web_identity_token_file) を含む JSON Web トークンを OIDC プロバイダーに渡してロールを引き受けます。OIDC プロバイダーは署名された鍵を公開鍵で認証します。公開鍵はクラスターの作成時に作成され、S3 バケットに保存されます。次に、Operator は、署名されたトークンファイル内のサブジェクトがロール信頼ポリシー内のロールと一致することを確認します。このロールは、OIDC プロバイダーが許可されたロールのみを取得できるようにするためのものです。その後、OIDC プロバイダーが一時的な認証情報を Operator に返し、Operator が AWS API 呼び出しを実行できるようにします。視覚的に表した図を以下に示します。

cloud experts sts explained oidc op roles

17.2.7. STS を使用する ROSA のユースケース

クラスターのインストール時にノードを作成する

Red Hat のインストールプログラムは、RH-Managed-OpenShift-Installer ロールと信頼ポリシーを使用して、お客様のアカウントの Managed-OpenShift-Installer-Role ロールを引き受けます。このプロセスにより、AWS STS から一時的な認証情報が返されます。インストールプログラムは、STS から受け取った一時的な認証情報を使用して、必要な API 呼び出しの実行を開始します。インストールプログラムは必要なインフラストラクチャーを AWS に作成します。この認証情報は 1 時間以内に期限切れになり、インストールプログラムはお客様のアカウントにアクセスできなくなります。

このプロセスはサポートケースにも適用されます。サポートケースでは、インストールプログラムの代わりに Red Hat Site Reliability Engineer (SRE) がプロセスを実行します。

クラスターのスケーリング

machine-api-operator は、AssumeRoleWithWebIdentity を使用して machine-api-aws-cloud-credentials ロールを引き受けます。これにより、クラスター Operator が認証情報を受け取るシーケンスが開始します。その後、machine-api-operator ロールが関連する API 呼び出しを実行して、クラスターに EC2 インスタンスをさらに追加できるようになります。

17.3. チュートリアル: OpenShift の概念

17.3.1. Source-to-Image (S2I)

Source-to-Image (S2I) は、ソースコードから再現可能なコンテナーイメージをビルドするためのツールキットとワークフローです。S2I は、コンテナーイメージにソースコードを挿入し、コンテナーにソースコードを準備させることで、すぐに実行できるイメージを生成します。自己アセンブルするビルダーイメージを作成することにより、コンテナーイメージを使用してランタイム環境のバージョン管理を行うのとまったく同じように、ビルド環境のバージョン管理と制御を行うことができます。

17.3.1.1. 仕組み

Ruby などの動的言語の場合、ビルド時環境とランタイム環境は通常同じです。Ruby、Bundler、Rake、Apache、GCC、および Ruby アプリケーションのセットアップと実行に必要なその他すべてのパッケージがすでにインストールされていると仮定した場合、ビルダーイメージは次の手順を実行します。

  1. ビルダーイメージが、既知のディレクトリーにアプリケーションソースが注入されたコンテナーを起動します。
  2. コンテナープロセスが、そのソースコードを適切な実行可能なセットアップに変換します。たとえば、Bundler を使用して依存関係をインストールし、Apache による Ruby 設定ファイルの検索先として事前設定されているディレクトリーにソースコードを移動します。
  3. 次に、新しいコンテナーをコミットし、イメージのエントリーポイントを、Apache を起動して Ruby アプリケーションをホストするスクリプトとして設定します。

C、C++、Go、Java などのコンパイル言語の場合、コンパイルに必要な依存関係がランタイムアーティファクトのサイズを上回る可能性があります。ランタイムイメージのサイズを抑えるために、S2I は複数ステップのビルドプロセスを可能にします。このプロセスでは、実行可能ファイルなどのバイナリーアーティファクトが 1 つ目のビルダーイメージに作成および抽出されて、実行可能プログラムを正しい場所に配置する 2 つ目のランタイムイメージに挿入されます。

たとえば、Tomcat と Maven の再現可能なビルドパイプラインを作成するには、次の手順を実行します。

  1. WAR ファイルを注入する予定の、OpenJDK と Tomcat を含むビルダーイメージを作成します。
  2. 1 つ目の Maven イメージとその他の標準依存関係の上にレイヤーとして追加し、Maven プロジェクトを注入する予定の 2 つ目のイメージを作成します。
  3. Java アプリケーションソースと Maven イメージを使用して S2I を起動し、目的のアプリケーション WAR を作成します。
  4. 前のステップの WAR ファイルと初期 Tomcat イメージを使用して S2I をもう一度起動し、ランタイムイメージを作成します。

ビルドロジックをイメージ内に配置し、イメージを複数のステップに統合することで、ビルドツールを実稼働環境にデプロイする必要なく、ランタイム環境をビルド環境に近づけることができます。

17.3.1.2. S2I の利点
再現性
ビルド環境をコンテナーイメージ内にカプセル化し、注入されたソースコードのシンプルなインターフェイスを呼び出し元に対して定義することで、ビルド環境を厳密にバージョン管理できます。ビルドの再現性は、コンテナー化されたインフラストラクチャーでセキュリティー更新と継続的インテグレーションを実現するうえで重要な要件です。ビルダーイメージは、再現性と実行時のスワップ機能を確保するのに役立ちます。
柔軟性
Linux 上で実行できる既存のビルドシステムは、すべてコンテナー内で実行できます。個々のビルダーは、より大きなパイプラインの一部とすることもできます。アプリケーションのソースコードを処理するスクリプトをビルダーイメージに注入できるため、作成者は既存のイメージを調整してソース処理を可能にすることができます。
速度
S2I では、単一の Dockerfile に複数のレイヤーを構築するのではなく、アプリケーションを単一のイメージレイヤーで表現することを作成者に推奨しています。これにより、作成とデプロイの時間が削減され、最終的なイメージの出力をより適切に制御できるようになります。
セキュリティー
Dockerfile は、コンテナーの多くの一般的な動作制御機能を使用せずに実行されます。通常、Dockerfile は root として実行され、コンテナーネットワークにアクセスできます。S2I では、ビルドが単一のコンテナーで起動されるため、ビルダーイメージに与える権限と特権を制御できます。管理者は、S2I を使用すると、OpenShift などのプラットフォームと連携させて、ビルド時に開発者に付与する特権を制御できます。

17.3.2. ルート

OpenShift のルートは、外部クライアントが名前でサービスにアクセスできるように、ホスト名でサービスを公開します。OpenShift 上に Route オブジェクトを作成すると、そのオブジェクトが組み込みの HAProxy ロードバランサーによって取得され、要求されたサービスが特定の設定を使用して公開され、外部から利用できるようになります。

Kubernetes の Ingress オブジェクトと同様に、Red Hat はニーズを満たすためにルートの概念を開発し、その背後にある設計原則をコミュニティーに提供することで、Ingress の設計に大きな影響を与えました。ルートには、次の表に示すように、いくつかの追加機能があります。

機能OpenShift 上の IngressOpenShift 上のルート

標準 Kubernetes オブジェクト

X

 

サービスへの外部アクセス

X

X

永続的な (スティッキー) セッション

X

X

負荷分散ストラテジー (例: ラウンドロビン)

X

X

レート制限とスロットリング

X

X

IP のホワイトリスト登録

X

X

セキュリティー強化のための TLS エッジ終端

X

X

セキュリティー強化のための TLS 再暗号化

 

X

セキュリティー強化のための TLS パススルー

 

X

重み付けされた複数のバックエンド (トラフィックの分割)

 

X

生成されたパターンベースのホスト名

 

X

ワイルドカードドメイン

 

X

注記

ホスト名の DNS 解決は、ルーティングとは別に処理されます。管理者は、常に正しくルーターに解決されるクラウドドメインを設定することも、無関係なホスト名の DNS レコードを個別に変更してルーターに解決することもあります。

個々のルートは、アノテーションで特定の設定を指定することにより、一部のデフォルトをオーバーライドできます。

17.3.3. イメージストリーム

イメージストリームには、タグとイメージのマッピング、ストリーム内でイメージがタグ付けされたときに適用されるメタデータのオーバーライド、およびレジストリー上の Docker イメージリポジトリーへの参照 (オプション) が格納されます。

17.3.3.1. イメージストリームの利点

イメージストリームを使用すると、コンテナーイメージのタグの変更が容易になります。使用しない場合、タグを手動で変更するには、イメージをダウンロードし、ローカルで変更してから、すべてをプッシュして戻す必要があります。タグを手動で変更してから、デプロイメントオブジェクトを更新してアプリケーションをプロモートするには、多くの手順が必要です。

イメージストリームを使用すると、コンテナーイメージを 1 回アップロードし、その仮想タグを OpenShift 内で内部的に管理できます。あるプロジェクトでは開発者用のタグを使用し、そのタグへの参照を内部だけで変更する一方で、実稼働環境では実稼働用のタグを使用し、そのタグを同様に内部で管理できます。レジストリーを扱う必要はありません。

また、イメージストリームをデプロイメント設定と組み合わせて使用して、新しいイメージの発生時やタグの参照の変更時にすぐにデプロイを開始するトリガーを設定することもできます。

17.3.4. ビルド

ビルドとは、入力パラメーターを結果として作成されるオブジェクトに変換するプロセスです。ほとんどの場合、このプロセスは入力パラメーターまたはソースコードを実行可能なイメージに変換するために使用されます。BuildConfig オブジェクトはビルドプロセス全体の定義です。

OpenShift Container Platform は、Docker 形式のコンテナーをビルドイメージから作成し、それらをコンテナーイメージレジストリーにプッシュして Kubernetes を利用します。

ビルドオブジェクトには共通の特性があります。

  • ビルドの入力
  • ビルドプロセスを完了するための要件
  • ビルドプロセスのロギング
  • 成功したビルドからのリソースの公開
  • ビルドの最終ステータスの公開

ビルドはリソースの制限を利用し、CPU 使用、メモリー使用およびビルドまたは Pod の実行時間などのリソースの制限を指定します。

17.4. クラスターのデプロイ

17.4.1. チュートリアル: デプロイ方法の選択

このチュートリアルでは、クラスターをデプロイするさまざまな方法を説明します。設定や要件に最適なデプロイメント方法を選択してください。

17.4.1.1. デプロイ方法

任意の条件に合わせてデプロイメントをしてください。

上記のデプロイ方法はすべて、このチュートリアルで問題なく使用できます。このチュートリアルを初めて行う場合は、CLI 簡易ガイド が最も簡単で推奨される方法です。

17.4.2. チュートリアル: CLI 簡易ガイド

このページでは、コマンドラインインターフェイス (CLI) を使用して Red Hat OpenShift Service on AWS (ROSA) クラスターをデプロイするための最小限のコマンドを説明します。

注記

この単純なデプロイメントはチュートリアル環境では問題なく機能しますが、実稼働環境で使用するクラスターはより詳細な方法でデプロイする必要があります。

17.4.2.1. 前提条件
  • セットアップのチュートリアルの前提条件を完了している。
17.4.2.2. アカウントロールの作成

AWS アカウントおよび OpenShift の y-stream バージョンごとに次のコマンドを 1 回 実行します。

rosa create account-roles --mode auto --yes
17.4.2.3. クラスターのデプロイ
  1. 次のコマンドを実行して、デフォルト設定でクラスターを作成します。クラスター名は独自のものに置き換えてください。

    rosa create cluster --cluster-name <cluster-name> --sts --mode auto --yes
  2. 次のコマンドを実行して、クラスターのステータスを確認します。

    rosa list clusters

17.4.3. チュートリアル: CLI 詳細ガイド

このチュートリアルでは、ROSA CLI を使用して ROSA クラスターをデプロイする詳細な手順を説明します。

17.4.3.1. CLI のデプロイメントモード

ROSA クラスターのデプロイには 2 つのモードがあります。1 つは自動モードです。より迅速であり、作業が自動的に実行されます。もう 1 つは手動モードです。追加のコマンドを実行する必要があり、作成中のロールとポリシーを確認できます。このチュートリアルでは、両方のオプションを説明します。

クラスターを迅速に作成する場合は、自動オプションを使用します。作成中のロールとポリシーを確認する場合は、手動オプションを使用します。

デプロイメントモードを選択するには、関連するコマンドで --mode フラグを使用します。

--mode の有効なオプションは次のとおりです。

  • manual: ロールとポリシーが作成され、現在のディレクトリーに保存されます。その後、指定のコマンドを手動で実行する必要があります。このオプションを使用すると、ポリシーとロールを作成する前に確認できます。
  • auto: ロールとポリシーが現在の AWS アカウントを使用して自動的に作成され、適用されます。
ヒント

このチュートリアルではどちらのデプロイ方法も使用できます。auto モードはより高速で、ステップ数が少なくなります。

17.4.3.2. デプロイメントワークフロー

全体的なデプロイメントワークフローは、次のステップに基づいています。

  1. rosa create account-roles - これはアカウントごとに 1 回 だけ実行します。アカウントロールを一度作成したら、同じ y-stream バージョンの他のクラスターに対して再度作成する必要は ありません
  2. rosa create cluster
  3. rosa create operator-roles - 手動モードのみ。
  4. rosa create oidc-provider - 手動モードのみ。

自動モードの場合、同じ y-stream バージョンの同じアカウント内のクラスターごとに、ステップ 2 のみを実行する必要があります。手動モードの場合、ステップ 2 - 4 を実行する必要があります。

17.4.3.3. 自動モード

ROSA CLI でロールとポリシーの作成を自動化し、クラスターを迅速に作成する場合は、この方法を使用します。

17.4.3.3.1. アカウントロールの作成

このアカウントに ROSA を 初めて デプロイし、アカウントロールをまだ 作成していない 場合は、Operator ポリシーを含むアカウント全体のロールとポリシーを作成します。

次のコマンドを実行して、アカウント全体のロールを作成します。

rosa create account-roles --mode auto --yes

出力例

I: Creating roles using 'arn:aws:iam::000000000000:user/rosa-user'
I: Created role 'ManagedOpenShift-ControlPlane-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role'
I: Created role 'ManagedOpenShift-Worker-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role'
I: Created role 'ManagedOpenShift-Support-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role'
I: Created role 'ManagedOpenShift-Installer-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-machine-api-aws-cloud-credentials'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cloud-credential-operator-cloud-crede'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-image-registry-installer-cloud-creden'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-ingress-operator-cloud-credentials'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cluster-csi-drivers-ebs-cloud-credent'
I: To create a cluster with these roles, run the following command:
    rosa create cluster --sts

17.4.3.3.2. クラスターの作成

次のコマンドを実行して、すべてのデフォルトオプションを使用してクラスターを作成します。

rosa create cluster --cluster-name <cluster-name> --sts --mode auto --yes
注記

これにより、必要な Operator ロールと OIDC プロバイダーも作成されます。クラスターで使用可能なすべてのオプションを確認する場合は、--help フラグを使用するか、対話モードの場合は --interactive を使用してください。

入力の例

$ rosa create cluster --cluster-name my-rosa-cluster --sts --mode auto --yes

出力例

I: Creating cluster 'my-rosa-cluster'
I: To view a list of clusters and their status, run 'rosa list clusters'
I: Cluster 'my-rosa-cluster' has been created.
I: Once the cluster is installed you will need to add an Identity Provider before you can login into the cluster. See 'rosa create idp --help' for more information.
I: To determine when your cluster is Ready, run 'rosa describe cluster -c my-rosa-cluster'.
I: To watch your cluster installation logs, run 'rosa logs install -c my-rosa-cluster --watch'.
Name:                       my-rosa-cluster
ID:                         1mlhulb3bo0l54ojd0ji000000000000
External ID:
OpenShift Version:
Channel Group:              stable
DNS:                        my-rosa-cluster.ibhp.p1.openshiftapps.com
AWS Account:                000000000000
API URL:
Console URL:
Region:                     us-west-2
Multi-AZ:                   false
Nodes:
- Master:                  3
- Infra:                   2
- Compute:                 2
Network:
- Service CIDR:            172.30.0.0/16
- Machine CIDR:            10.0.0.0/16
- Pod CIDR:                10.128.0.0/14
- Host Prefix:             /23
STS Role ARN:               arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role
Support Role ARN:           arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role
Instance IAM Roles:
- Master:                  arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role
- Worker:                  arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role
Operator IAM Roles:
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-image-registry-installer-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-ingress-operator-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-cluster-csi-drivers-ebs-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-machine-api-aws-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-cloud-credential-operator-cloud-credential-oper
State:                      waiting (Waiting for OIDC configuration)
Private:                    No
Created:                    Oct 28 2021 20:28:09 UTC
Details Page:               https://console.redhat.com/openshift/details/s/1wupmiQy45xr1nN000000000000
OIDC Endpoint URL:          https://rh-oidc.s3.us-east-1.amazonaws.com/1mlhulb3bo0l54ojd0ji000000000000

17.4.3.3.2.1. デフォルト設定

デフォルトの設定は次のとおりです。

  • ノード:

    • 3 つのコントロールプレーンノード
    • 2 つのインフラストラクチャーノード
    • 2 つのワーカーノード
    • 自動スケーリングなし
    • 詳細は、ec2 インスタンス のドキュメントを参照してください。
  • リージョン: aws CLI の設定どおり
  • ネットワーク IP 範囲:

    • Machine CIDR: 10.0.0.0/16
    • Service CIDR: 172.30.0.0/16
    • Pod CIDR: 10.128.0.0/14
  • 新しい VPC
  • 暗号化用のデフォルトの AWS KMS キー
  • rosa で利用可能な OpenShift の最新バージョン
  • 単一のアベイラビリティーゾーン
  • パブリッククラスター
17.4.3.3.3. インストールステータスの確認
  1. 次のコマンドのいずれかを実行して、クラスターのステータスを確認します。

    • ステータスの詳細を表示するには、次を実行します。

      rosa describe cluster --cluster <cluster-name>
    • ステータスの要約を表示するには、次を実行します。

      rosa list clusters
  2. クラスターの状態が、“waiting”、“installing”、"ready" の順に変わります。これには約 40 分かかります。
  3. 状態が “ready” に変われば、クラスターのインストールは完了です。
17.4.3.4. 手動モード

ロールとポリシーをクラスターに適用する前に確認する場合は、手動の方法を使用します。この方法では、ロールとポリシーを作成するためにいくつかの追加コマンドを実行する必要があります。

このセクションでは --interactive モードを使用します。このセクションのフィールドの説明については、対話モード に関するドキュメントを参照してください。

17.4.3.4.1. アカウントロールの作成
  1. このアカウントに ROSA を 初めて デプロイし、アカウントロールをまだ 作成していない 場合は、Operator ポリシーを含むアカウント全体のロールとポリシーを作成します。このコマンドは、アカウントに必要なロールとポリシーに必要な JSON ファイルを現在のディレクトリーに作成します。また、これらのオブジェクトを作成するために実行する必要がある aws CLI コマンドも出力されます。

    次のコマンドを実行して必要なファイルを作成し、追加のコマンドを出力します。

    rosa create account-roles --mode manual

    出力例

    I: All policy files saved to the current directory
    I: Run the following commands to create the account roles and policies:
    aws iam create-role \
    --role-name ManagedOpenShift-Worker-Role \
    --assume-role-policy-document file://sts_instance_worker_trust_policy.json \
    --tags Key=rosa_openshift_version,Value=4.8 Key=rosa_role_prefix,Value=ManagedOpenShift Key=rosa_role_type,Value=instance_worker
    aws iam put-role-policy \
    --role-name ManagedOpenShift-Worker-Role \
    --policy-name ManagedOpenShift-Worker-Role-Policy \
    --policy-document file://sts_instance_worker_permission_policy.json

  2. 現在のディレクトリーの内容をチェックして、新しいファイルを確認します。これらの各オブジェクトを作成するには、aws CLI を使用します。

    出力例

    $ ls
    openshift_cloud_credential_operator_cloud_credential_operator_iam_ro_creds_policy.json
    sts_instance_controlplane_permission_policy.json
    openshift_cluster_csi_drivers_ebs_cloud_credentials_policy.json        sts_instance_controlplane_trust_policy.json
    openshift_image_registry_installer_cloud_credentials_policy.json          sts_instance_worker_permission_policy.json
    openshift_ingress_operator_cloud_credentials_policy.json                 sts_instance_worker_trust_policy.json
    openshift_machine_api_aws_cloud_credentials_policy.json                   sts_support_permission_policy.json
    sts_installer_permission_policy.json                                      sts_support_trust_policy.json
    sts_installer_trust_policy.json

  3. オプション: ファイルを開いて、作成する内容を確認します。たとえば、sts_installer_permission_policy.json を開くと、次のように表示されます。

    出力例

    $ cat sts_installer_permission_policy.json
            {
            "Version": "2012-10-17",
            "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "autoscaling:DescribeAutoScalingGroups",
                    "ec2:AllocateAddress",
                    "ec2:AssociateAddress",
                    "ec2:AssociateDhcpOptions",
                    "ec2:AssociateRouteTable",
                    "ec2:AttachInternetGateway",
                    "ec2:AttachNetworkInterface",
                    "ec2:AuthorizeSecurityGroupEgress",
                    "ec2:AuthorizeSecurityGroupIngress",
                    [...]

    ROSA クラスターの IAM リソースについて のドキュメントの内容も参照してください。

  4. ステップ 1 でリストされた aws コマンドを実行します。作成した JSON ファイルと同じディレクトリーにいる場合は、コピーして貼り付けることができます。
17.4.3.4.2. クラスターの作成
  1. aws コマンドが正常に実行されたら、次のコマンドを実行して対話モードで ROSA クラスターの作成を開始します。

    rosa create cluster --interactive --sts

    フィールドの説明については、ROSA のドキュメント を参照してください。

  2. このチュートリアルでは、次の値をコピーして入力します。

    Cluster name: my-rosa-cluster
    OpenShift version: <choose version>
    External ID (optional): <leave blank>
    Operator roles prefix: <accept default>
    Multiple availability zones: No
    AWS region: <choose region>
    PrivateLink cluster: No
    Install into an existing VPC: No
    Enable Customer Managed key: No
    Compute nodes instance type: m5.xlarge
    Enable autoscaling: No
    Compute nodes: 2
    Machine CIDR: <accept default>
    Service CIDR: <accept default>
    Pod CIDR: <accept default>
    Host prefix: <accept default>
    Encrypt etcd data (optional): No
    Disable Workload monitoring: No

    出力例

    I: Creating cluster 'my-rosa-cluster'
    I: To create this cluster again in the future, you can run:
    rosa create cluster --cluster-name my-rosa-cluster --role-arn arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role --support-role-arn arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role --master-iam-role arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role --worker-iam-role arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role --operator-roles-prefix my-rosa-cluster --region us-west-2 --version 4.8.13 --compute-nodes 2 --machine-cidr 10.0.0.0/16 --service-cidr 172.30.0.0/16 --pod-cidr 10.128.0.0/14 --host-prefix 23
    I: To view a list of clusters and their status, run 'rosa list clusters'
    I: Cluster 'my-rosa-cluster' has been created.
    I: Once the cluster is installed you will need to add an Identity Provider before you can login into the cluster. See 'rosa create idp --help' for more information.
    Name:                       my-rosa-cluster
    ID:                         1t6i760dbum4mqltqh6o000000000000
    External ID:
    OpenShift Version:
    Channel Group:              stable
    DNS:                        my-rosa-cluster.abcd.p1.openshiftapps.com
    AWS Account:                000000000000
    API URL:
    Console URL:
    Region:                     us-west-2
    Multi-AZ:                   false
    Nodes:
    - Control plane:           3
    - Infra:                   2
    - Compute:                 2
    Network:
    - Service CIDR:            172.30.0.0/16
    - Machine CIDR:            10.0.0.0/16
    - Pod CIDR:                10.128.0.0/14
    - Host Prefix:             /23
    STS Role ARN:               arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role
    Support Role ARN:           arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role
    Instance IAM Roles:
    - Control plane:           arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role
    - Worker:                  arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role
    Operator IAM Roles:
    - arn:aws:iam::000000000000:role/my-rosa-cluster-w7i6-openshift-ingress-operator-cloud-credentials
    - arn:aws:iam::000000000000:role/my-rosa-cluster-w7i6-openshift-cluster-csi-drivers-ebs-cloud-credentials
    - arn:aws:iam::000000000000:role/my-rosa-cluster-w7i6-openshift-cloud-network-config-controller-cloud-cre
    - arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-machine-api-aws-cloud-credentials
    - arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-cloud-credential-operator-cloud-credentia
    - arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-image-registry-installer-cloud-credential
    State:                      waiting (Waiting for OIDC configuration)
    Private:                    No
    Created:                    Jul  1 2022 22:13:50 UTC
    Details Page:               https://console.redhat.com/openshift/details/s/2BMQm8xz8Hq5yEN000000000000
    OIDC Endpoint URL:          https://rh-oidc.s3.us-east-1.amazonaws.com/1t6i760dbum4mqltqh6o000000000000
    I: Run the following commands to continue the cluster creation:
    rosa create operator-roles --cluster my-rosa-cluster
    rosa create oidc-provider --cluster my-rosa-cluster
    I: To determine when your cluster is Ready, run 'rosa describe cluster -c my-rosa-cluster'.
    I: To watch your cluster installation logs, run 'rosa logs install -c my-rosa-cluster --watch'.

    注記

    次の 2 つのステップが完了するまで、クラスターの状態は “waiting” のままです。

17.4.3.4.3. Operator ロールの作成
  1. 上記のステップで、次に実行すべきコマンドが出力されます。これらのロールは、クラスター ごと1 回 作成する必要があります。ロールを作成するには、次のコマンドを実行します。

    rosa create operator-roles --mode manual --cluster <cluster-name>

    出力例

    I: Run the following commands to create the operator roles:
        aws iam create-role \
            --role-name my-rosa-cluster-openshift-image-registry-installer-cloud-credentials \
            --assume-role-policy-document file://operator_image_registry_installer_cloud_credentials_policy.json \
            --tags Key=rosa_cluster_id,Value=1mkesci269png3tck000000000000000 Key=rosa_openshift_version,Value=4.8 Key=rosa_role_prefix,Value= Key=operator_namespace,Value=openshift-image-registry Key=operator_name,Value=installer-cloud-credentials
    
        aws iam attach-role-policy \
            --role-name my-rosa-cluster-openshift-image-registry-installer-cloud-credentials \
            --policy-arn arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-image-registry-installer-cloud-creden
        [...]

  2. aws コマンドを実行します。
17.4.3.4.4. OIDC プロバイダーの作成
  1. 次のコマンドを実行して、OIDC プロバイダーを作成します。

    rosa create oidc-provider --mode manual --cluster <cluster-name>
  2. これにより、実行する必要がある aws コマンドが表示されます。

    出力例

    I: Run the following commands to create the OIDC provider:
    $ aws iam create-open-id-connect-provider \
    --url https://rh-oidc.s3.us-east-1.amazonaws.com/1mkesci269png3tckknhh0rfs2da5fj9 \
    --client-id-list openshift sts.amazonaws.com \
    --thumbprint-list a9d53002e97e00e043244f3d170d000000000000
    
    $ aws iam create-open-id-connect-provider \
    --url https://rh-oidc.s3.us-east-1.amazonaws.com/1mkesci269png3tckknhh0rfs2da5fj9 \
    --client-id-list openshift sts.amazonaws.com \
    --thumbprint-list a9d53002e97e00e043244f3d170d000000000000

  3. クラスターがインストールプロセスを続行します。
17.4.3.4.5. インストールステータスの確認
  1. 次のコマンドのいずれかを実行して、クラスターのステータスを確認します。

    • ステータスの詳細を表示するには、次を実行します。

      rosa describe cluster --cluster <cluster-name>
    • ステータスの要約を表示するには、次を実行します。

      rosa list clusters
  2. クラスターの状態が、“waiting”、“installing”、"ready" の順に変わります。これには約 40 分かかります。
  3. 状態が “ready” に変われば、クラスターのインストールは完了です。
17.4.3.5. Red Hat Hybrid Cloud Console URL の取得
  • Hybrid Cloud Console URL を取得するには、次のコマンドを実行します。

    rosa describe cluster -c <cluster-name> | grep Console

これで、クラスターが正常にデプロイされました。次のチュートリアルでは、クラスターをすぐに使用できるように、管理ユーザーを作成する方法を示します。

17.4.4. チュートリアル: UI 簡易ガイド

このページでは、ユーザーインターフェイス (UI) を使用して ROSA クラスターをデプロイするための最小限のコマンドを説明します。

注記

この単純なデプロイメントはチュートリアル環境では問題なく機能しますが、実稼働環境で使用するクラスターはより詳細な方法でデプロイする必要があります。

17.4.4.1. 前提条件
  • セットアップのチュートリアルの前提条件を完了している。
17.4.4.2. アカウントロールの作成

AWS アカウントおよび OpenShift の y-stream バージョンごとに次のコマンドを 1 回 実行します。

rosa create account-roles --mode auto --yes
17.4.4.3. Red Hat OpenShift Cluster Manager ロールの作成
  1. 次のコマンドを実行して、AWS アカウントごとに 1 つの OpenShift Cluster Manager ロールを作成します。

    rosa create ocm-role --mode auto --admin --yes
  2. 次のコマンドを実行して、AWS アカウントごとに 1 つの OpenShift Cluster Manager ユーザーロールを作成します。

    rosa create user-role --mode auto --yes
  3. OpenShift Cluster Manager を使用して AWS アカウント、クラスターオプションを選択し、デプロイメントを開始します。
  4. OpenShift Cluster Manager UI にクラスターのステータスが表示されます。

    cloud experts getting started deployment ui cluster create

17.4.5. チュートリアル: UI 詳細ガイド

このチュートリアルでは、Red Hat OpenShift Cluster Manager ユーザーインターフェイス (UI) を使用して Red Hat OpenShift Service on AWS (ROSA) クラスターをデプロイする詳細な手順を説明します。

17.4.5.1. デプロイメントワークフロー

全体的なデプロイメントワークフローは、次のステップに基づいています。

  1. アカウント全体のロールとポリシーを作成します。
  2. AWS アカウントを Red Hat アカウントに関連付けます。

    1. Red Hat OpenShift Cluster Manager ロールを作成してリンクします。
    2. ユーザーロールを作成してリンクします。
  3. クラスターを作成します。

ステップ 1 は、初めて AWS アカウントにデプロイする場合にのみ実行する必要があります。ステップ 2 は、UI を 初めて 使用する場合にのみ実行する必要があります。同じ y-stream バージョンのクラスターを連続して作成する場合は、クラスターを作成するだけで済みます。

17.4.5.2. アカウント全体のロールの作成
注記

以前のデプロイメントのアカウントロールをすでに持っている場合は、この手順をスキップしてください。関連付けられた AWS アカウントを選択すると、UI で既存のロールが検出されます。

このアカウントに ROSA を 初めて デプロイし、アカウントロールをまだ 作成していない 場合は、Operator ポリシーを含むアカウント全体のロールとポリシーを作成します。

  • ターミナルで次のコマンドを実行して、アカウント全体のロールを作成します。

    $ rosa create account-roles --mode auto --yes

    出力例

    I: Creating roles using 'arn:aws:iam::000000000000:user/rosa-user'
    I: Created role 'ManagedOpenShift-ControlPlane-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role'
    I: Created role 'ManagedOpenShift-Worker-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role'
    I: Created role 'ManagedOpenShift-Support-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role'
    I: Created role 'ManagedOpenShift-Installer-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-machine-api-aws-cloud-credentials'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cloud-credential-operator-cloud-crede'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-image-registry-installer-cloud-creden'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-ingress-operator-cloud-credentials'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cluster-csi-drivers-ebs-cloud-credent'
    I: To create a cluster with these roles, run the following command:
    rosa create cluster --sts

17.4.5.3. AWS アカウントと Red Hat アカウントの関連付け

このステップでは、ROSA をデプロイするときに使用する AWS アカウントを OpenShift Cluster Manager に伝えます。

注記

すでに AWS アカウントを関連付けている場合は、この手順をスキップしてください。

  1. OpenShift Cluster Manager にアクセスし、Red Hat アカウントにログインして、Red Hat Hybrid Cloud Console を開きます。
  2. Create Cluster をクリックします。
  3. Red Hat OpenShift Service on AWS (ROSA) 行まで下にスクロールし、Create Cluster をクリックします。

    cloud experts getting started rosa deployment detailed ui create
  4. ドロップダウンメニューが表示されます。With web interface をクリックします。

    cloud experts getting started rosa deployment detailed ui web interface
  5. "Select an AWS control plane type" の選択で、Classic を選択します。Next をクリックします。

    cloud experts getting started rosa deployment detailed ui classic
  6. Associated AWS infrastructure account の下にあるドロップボックスをクリックします。AWS アカウントをまだ関連付けていない場合、ドロップボックスは空の可能性があります。
  7. How to associate a new AWS account をクリックします。

    cloud experts getting started rosa deployment detailed ui associate
  8. 新しい AWS アカウントを関連付ける手順を示すサイドバーが表示されます。

    cloud experts getting started rosa deployment detailed ui associate2
17.4.5.4. OpenShift Cluster Manager ロールの作成と関連付け
  1. 次のコマンドを実行して、OpenShift Cluster Manager ロールが存在するかどうかを確認します。

    $ rosa list ocm-role
  2. UI に、権限のレベルが異なる 2 種類の OpenShift Cluster Manager ロールを作成するコマンドが表示されます。

    • Basic OpenShift Cluster Manager role: OpenShift Cluster Manager にアカウントへの読み取り専用アクセス権を付与し、クラスターを作成する前に ROSA に必要なロールとポリシーが存在するかどうかを確認できるようにします。CLI を使用して、必要なロール、ポリシー、および OIDC プロバイダーを手動で作成する必要があります。
    • Admin OpenShift Cluster Manager role: ROSA に必要なロール、ポリシー、および OIDC プロバイダーを作成する追加の権限を OpenShift Cluster Manager に付与します。これを使用すると、OpenShift Cluster Manager が必要なリソースを作成できるため、ROSA クラスターのデプロイがより迅速になります。

      これらのロールの詳細は、ドキュメントの OpenShift Cluster Manager のロールおよび権限 セクションを参照してください。

      このチュートリアルでは、最も簡単かつ迅速なアプローチである Admin OpenShift Cluster Manager role を使用します。

  3. サイドバーからコマンドをコピーして Admin OpenShift Cluster Manager role を作成するか、ターミナルに切り替えて次のコマンドを入力します。

    $ rosa create ocm-role --mode auto --admin --yes

    このコマンドは、OpenShift Cluster Manager ロールを作成し、それを Red Hat アカウントに関連付けます。

    出力例

    I: Creating ocm role
    I: Creating role using 'arn:aws:iam::000000000000:user/rosa-user'
    I: Created role 'ManagedOpenShift-OCM-Role-12561000' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-OCM-Role-12561000'
    I: Linking OCM role
    I: Successfully linked role-arn 'arn:aws:iam::000000000000:role/ManagedOpenShift-OCM-Role-12561000' with organization account '1MpZfntsZeUdjWHg7XRgP000000'

  4. Step 2: User role をクリックします。
17.4.5.4.1. その他の OpenShift Cluster Manager ロール作成オプション
  • 手動モード: AWS CLI コマンドを自分で実行する場合は、モードを auto ではなく manual と定義します。CLI に AWS コマンドが出力され、関連する JSON ファイルが現在のディレクトリーに作成されます。

    次のコマンドを使用して、手動モードで OpenShift Cluster Manager ロールを作成します。

    $ rosa create ocm-role --mode manual --admin --yes
  • Basic OpenShift Cluster Manager role: OpenShift Cluster Manager にアカウントへの読み取り専用アクセス権を付与する場合は、Basic OpenShift Cluster Manager role を作成します。この場合、CLI を使用して必要なロール、ポリシー、OIDC プロバイダーを手動で作成する必要があります。

    次のコマンドを使用して、Basic OpenShift Cluster Manager role を作成します。

    $ rosa create ocm-role --mode auto --yes
17.4.5.5. OpenShift Cluster Manager ユーザーロールの作成

ユーザーロールのドキュメント で定義されているように、ROSA が AWS ID を検証できるようにユーザーロールを作成する必要があります。このロールには権限を付与せず、インストールプログラムアカウントと OpenShift Cluster Manager ロールリソースの間に信頼関係を構築するためにのみ使用します。

  1. 次のコマンドを実行して、ユーザーロールがすでに存在するかどうかを確認します。

    $ rosa list user-role
  2. 次のコマンドを実行してユーザーロールを作成し、それを Red Hat アカウントにリンクします。

    $ rosa create user-role --mode auto --yes

    出力例

    I: Creating User role
    I: Creating ocm user role using 'arn:aws:iam::000000000000:user/rosa-user'
    I: Created role 'ManagedOpenShift-User-rosa-user-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-User-rosa-user-Role'
    I: Linking User role
    I: Successfully linked role ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-User-rosa-user-Role' with account '1rbOQez0z5j1YolInhcXY000000'

    注記

    前述のように、AWS CLI コマンドを自分で実行する場合は、--mode manual を定義します。CLI に AWS コマンドが出力され、関連する JSON ファイルが現在のディレクトリーに作成されます。必ずロールをリンクしてください。

  3. Step 3: Account roles をクリックします。
17.4.5.6. アカウントロールの作成
  1. 次のコマンドを実行して、アカウントのロールを作成します。

    $ rosa create account-roles --mode auto
  2. OK をクリックしてサイドバーを閉じます。
17.4.5.7. アカウントの関連付けが成功したことの確認
  1. Associated AWS infrastructure account ドロップダウンメニューに AWS アカウントが表示されるはずです。自分のアカウントが表示されれば、アカウントの関連付けは成功しています。
  2. アカウントを選択します。
  3. アカウントのロール ARN が下に入力されて表示されます。

    cloud experts getting started rosa deployment detailed ui account roles
  4. Next をクリックします。
17.4.5.8. クラスターの作成
  1. このチュートリアルでは、以下を選択してください。

    クラスター設定

    • Cluster name: <名前を選択\>
    • Version: <最新バージョンを選択\>
    • Region: <リージョンを選択\>
    • Availability: Single zone
    • Enable user workload monitoring: オンのまま
    • Enable additional etcd encryption: オフのまま
    • Encrypt persistent volumes with customer keys: オフのまま
  2. Next をクリックします。
  3. マシンプールのデフォルト設定はオンのままにします。

    デフォルトのマシンプール設定

    • Compute node instance type: m5.xlarge - 4 vCPU 16 GiB RAM
    • Enable autoscaling: オフ
    • Compute node count: 2
    • ノードラベルは空白のままにする
  4. Next をクリックします。
17.4.5.8.1. ネットワーク
  1. 設定はすべてデフォルト値のままにします。
  2. Next をクリックします。
  3. CIDR 範囲のデフォルト値はすべてそのままにしておきます。
  4. Next をクリックします。
17.4.5.8.2. クラスターのロールおよびポリシー

このチュートリアルでは、Auto を選択したままにしておきます。これにより、クラスターのデプロイメントプロセスが容易かつ迅速になります。

注記

前に Basic OpenShift Cluster Manager role を選択した場合は、手動モードのみを使用できます。Operator ロールと OIDC プロバイダーを手動で作成する必要があります。「クラスターの更新」セクションを完了してクラスターの作成を開始したら、後述の「Basic OpenShift Cluster Manager role」セクションを参照してください。

17.4.5.8.3. クラスターの更新
  • このセクションでは、すべてのオプションをデフォルトのままにしておきます。
17.4.5.8.4. クラスターの確認と作成
  1. クラスター設定の内容を確認します。
  2. Create cluster をクリックします。
17.4.5.8.5. インストールの進行状況の監視
  • 現在のページに留まり、インストールの進行状況を監視します。所要時間は約 40 分です。

    cloud experts getting started rosa deployment detailed ui cluster create
17.4.5.9. Basic OpenShift Cluster Manager Role
注記

前述の手順に従って Admin OpenShift Cluster Manager role を作成した場合は、このセクション全体を 無視してください。OpenShift Cluster Manager によってリソースが作成されます。

前に Basic OpenShift Cluster Manager role を作成した場合は、クラスターのインストールを続行する前に、さらに 2 つの要素を手動で作成する必要があります。

  • Operator ロール
  • OIDC プロバイダー
17.4.5.9.1. Operator ロールの作成
  1. ポップアップウィンドウに、実行するコマンドが表示されます。

    cloud experts getting started rosa deployment detailed ui create cmds
  2. ターミナルのウィンドウからコマンドを実行して、対話モードを起動します。または、簡素化のために、次のコマンドを実行して Operator ロールを作成します。

    $ rosa create operator-roles --mode auto --cluster <cluster-name> --yes

    出力例

    I: Creating roles using 'arn:aws:iam::000000000000:user/rosauser'
    I: Created role 'rosacluster-b736-openshift-ingress-operator-cloud-credentials' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-ingress-operator-cloud-credentials'
    I: Created role 'rosacluster-b736-openshift-cluster-csi-drivers-ebs-cloud-credent' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-cluster-csi-drivers-ebs-cloud-credent'
    I: Created role 'rosacluster-b736-openshift-cloud-network-config-controller-cloud' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-cloud-network-config-controller-cloud'
    I: Created role 'rosacluster-b736-openshift-machine-api-aws-cloud-credentials' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-machine-api-aws-cloud-credentials'
    I: Created role 'rosacluster-b736-openshift-cloud-credential-operator-cloud-crede' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-cloud-credential-operator-cloud-crede'
    I: Created role 'rosacluster-b736-openshift-image-registry-installer-cloud-creden' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-image-registry-installer-cloud-creden'

17.4.5.9.2. OIDC プロバイダーの作成
  • ターミナルで次のコマンドを実行して OIDC プロバイダーを作成します。

    $ rosa create oidc-provider --mode auto --cluster <cluster-name> --yes

    出力例

    I: Creating OIDC provider using 'arn:aws:iam::000000000000:user/rosauser'
    I: Created OIDC provider with ARN 'arn:aws:iam::000000000000:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/1tt4kvrr2kha2rgs8gjfvf0000000000'

17.4.6. チュートリアル: Hosted Control Plane (HCP) ガイド

このワークショップでは、Hosted Control Plane (HCP) クラスターを使用するサンプル Red Hat OpenShift Service on AWS (ROSA) をデプロイします。その後、次のチュートリアルでクラスターを使用できます。

チュートリアルの目的

  • クラスター作成の前提条件を学習します。

    • サンプル Virtual Private Cloud (VPC) の作成
    • サンプル OpenID Connect (OIDC) リソースの作成
  • サンプル環境変数を作成します。
  • サンプル ROSA クラスターをデプロイします。

前提条件

  • ROSA バージョン 1.2.31 以降
  • Amazon Web Services (AWS) コマンドラインインターフェイス (CLI)
  • ROSA CLI (rosa)
17.4.6.1. クラスター作成の前提条件

ROSA with HCP クラスターをデプロイするには、VPC リソースと OIDC リソースの両方が必要です。そのため、最初にこれらのリソースを作成します。ROSA は、独自の VPC (BYO-VPC) モデルを使用します。

17.4.6.1.1. VPC の作成
  1. AWS CLI (aws) が、ROSA が利用可能なリージョンを使用するように設定されていることを確認します。次のコマンドを実行して、AWS CLI でサポートされているリージョンを確認します。

    $ rosa list regions --hosted-cp
  2. VPC を作成します。このチュートリアルでは、次の スクリプト で VPC とその必須コンポーネントを作成します。aws CLI で設定されたリージョンを使用します。

    #!/bin/bash
    
    set -e
    ##########
    # This script will create the network requirements for a ROSA cluster. This will be
    # a public cluster. This creates:
    # - VPC
    # - Public and private subnets
    # - Internet Gateway
    # - Relevant route tables
    # - NAT Gateway
    #
    # This will automatically use the region configured for the aws cli
    #
    ##########
    
    VPC_CIDR=10.0.0.0/16
    PUBLIC_CIDR_SUBNET=10.0.1.0/24
    PRIVATE_CIDR_SUBNET=10.0.0.0/24
    
    # Create VPC
    echo -n "Creating VPC..."
    VPC_ID=$(aws ec2 create-vpc --cidr-block $VPC_CIDR --query Vpc.VpcId --output text)
    
    # Create tag name
    aws ec2 create-tags --resources $VPC_ID --tags Key=Name,Value=$CLUSTER_NAME
    
    # Enable dns hostname
    aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-hostnames
    echo "done."
    
    # Create Public Subnet
    echo -n "Creating public subnet..."
    PUBLIC_SUBNET_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block $PUBLIC_CIDR_SUBNET --query Subnet.SubnetId --output text)
    
    aws ec2 create-tags --resources $PUBLIC_SUBNET_ID --tags Key=Name,Value=$CLUSTER_NAME-public
    echo "done."
    
    # Create private subnet
    echo -n "Creating private subnet..."
    PRIVATE_SUBNET_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block $PRIVATE_CIDR_SUBNET --query Subnet.SubnetId --output text)
    
    aws ec2 create-tags --resources $PRIVATE_SUBNET_ID --tags Key=Name,Value=$CLUSTER_NAME-private
    echo "done."
    
    # Create an internet gateway for outbound traffic and attach it to the VPC.
    echo -n "Creating internet gateway..."
    IGW_ID=$(aws ec2 create-internet-gateway --query InternetGateway.InternetGatewayId --output text)
    echo "done."
    
    aws ec2 create-tags --resources $IGW_ID --tags Key=Name,Value=$CLUSTER_NAME
    
    aws ec2 attach-internet-gateway --vpc-id $VPC_ID --internet-gateway-id $IGW_ID > /dev/null 2>&1
    echo "Attached IGW to VPC."
    
    # Create a route table for outbound traffic and associate it to the public subnet.
    echo -n "Creating route table for public subnet..."
    PUBLIC_ROUTE_TABLE_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID --query RouteTable.RouteTableId --output text)
    
    aws ec2 create-tags --resources $PUBLIC_ROUTE_TABLE_ID --tags Key=Name,Value=$CLUSTER_NAME
    echo "done."
    
    aws ec2 create-route --route-table-id $PUBLIC_ROUTE_TABLE_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $IGW_ID > /dev/null 2>&1
    echo "Created default public route."
    
    aws ec2 associate-route-table --subnet-id $PUBLIC_SUBNET_ID --route-table-id $PUBLIC_ROUTE_TABLE_ID > /dev/null 2>&1
    echo "Public route table associated"
    
    # Create a NAT gateway in the public subnet for outgoing traffic from the private network.
    echo -n "Creating NAT Gateway..."
    NAT_IP_ADDRESS=$(aws ec2 allocate-address --domain vpc --query AllocationId --output text)
    
    NAT_GATEWAY_ID=$(aws ec2 create-nat-gateway --subnet-id $PUBLIC_SUBNET_ID --allocation-id $NAT_IP_ADDRESS --query NatGateway.NatGatewayId --output text)
    
    aws ec2 create-tags --resources $NAT_IP_ADDRESS --resources $NAT_GATEWAY_ID --tags Key=Name,Value=$CLUSTER_NAME
    sleep 10
    echo "done."
    
    # Create a route table for the private subnet to the NAT gateway.
    echo -n "Creating a route table for the private subnet to the NAT gateway..."
    PRIVATE_ROUTE_TABLE_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID --query RouteTable.RouteTableId --output text)
    
    aws ec2 create-tags --resources $PRIVATE_ROUTE_TABLE_ID $NAT_IP_ADDRESS --tags Key=Name,Value=$CLUSTER_NAME-private
    
    aws ec2 create-route --route-table-id $PRIVATE_ROUTE_TABLE_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $NAT_GATEWAY_ID > /dev/null 2>&1
    
    aws ec2 associate-route-table --subnet-id $PRIVATE_SUBNET_ID --route-table-id $PRIVATE_ROUTE_TABLE_ID > /dev/null 2>&1
    
    echo "done."
    
    # echo "***********VARIABLE VALUES*********"
    # echo "VPC_ID="$VPC_ID
    # echo "PUBLIC_SUBNET_ID="$PUBLIC_SUBNET_ID
    # echo "PRIVATE_SUBNET_ID="$PRIVATE_SUBNET_ID
    # echo "PUBLIC_ROUTE_TABLE_ID="$PUBLIC_ROUTE_TABLE_ID
    # echo "PRIVATE_ROUTE_TABLE_ID="$PRIVATE_ROUTE_TABLE_ID
    # echo "NAT_GATEWAY_ID="$NAT_GATEWAY_ID
    # echo "IGW_ID="$IGW_ID
    # echo "NAT_IP_ADDRESS="$NAT_IP_ADDRESS
    
    echo "Setup complete."
    echo ""
    echo "To make the cluster create commands easier, please run the following commands to set the environment variables:"
    echo "export PUBLIC_SUBNET_ID=$PUBLIC_SUBNET_ID"
    echo "export PRIVATE_SUBNET_ID=$PRIVATE_SUBNET_ID"

    関連情報

  3. スクリプトはコマンドを出力します。後で使用するためにサブネット ID を保存するには、コマンドを環境変数として設定します。以下のコマンドをコピーして実行します。

    $ export PUBLIC_SUBNET_ID=$PUBLIC_SUBNET_ID
    $ export PRIVATE_SUBNET_ID=$PRIVATE_SUBNET_ID
  4. 次のコマンドを実行して、環境変数を確認します。

    $ echo "Public Subnet: $PUBLIC_SUBNET_ID"; echo "Private Subnet: $PRIVATE_SUBNET_ID"

    出力例

    Public Subnet: subnet-0faeeeb0000000000
    Private Subnet: subnet-011fe340000000000

17.4.6.1.2. OIDC 設定の作成

このチュートリアルでは、OIDC 設定を作成するときに自動モードを使用します。また、後で使用できるように、OIDC ID を環境変数として保存します。このコマンドは、ROSA CLI を使用して、クラスターの一意の OIDC 設定を作成します。

  • 次のコマンドを実行して、OIDC 設定を作成します。

    $ export OIDC_ID=$(rosa create oidc-config --mode auto --managed --yes -o json | jq -r '.id')
17.4.6.2. 追加の環境変数の作成
  • 環境変数を設定するには、次のコマンドを実行します。これらの変数を使用すると、ROSA クラスターを作成するコマンドの実行が容易になります。

    $ export CLUSTER_NAME=<cluster_name>
    $ export REGION=<VPC_region>
    ヒント

    VPC リージョンを確認するには、rosa whoami を実行します。

17.4.6.3. クラスターの作成
  1. オプション: Operator ポリシーや AWS IAM ロールとポリシーを含め、アカウント全体のロールとポリシーを作成するには次のコマンドを実行します。

    重要

    このアカウントで ROSA を 初めて デプロイし、アカウントのロールとポリシーをまだ 作成していない 場合にのみ、この手順を完了してください。

    $ rosa create account-roles --mode auto --yes
  2. 次のコマンドを実行してクラスターを作成します。

    $ rosa create cluster --cluster-name $CLUSTER_NAME \
    --subnet-ids ${PUBLIC_SUBNET_ID},${PRIVATE_SUBNET_ID} \
    --hosted-cp \
    --region $REGION \
    --oidc-config-id $OIDC_ID \
    --sts --mode auto --yes

約 10 分後にクラスターの準備が完了します。選択したリージョン内の 3 つの AWS アベイラビリティーゾーンにまたがるコントロールプレーンがクラスターに作成され、AWS アカウントに 2 つのワーカーノードが作成されます。

17.4.6.4. インストールステータスの確認
  1. 次のコマンドのいずれかを実行して、クラスターのステータスを確認します。

    • クラスターのステータスの詳細を表示するには、次のコマンドを実行します。

      $ rosa describe cluster --cluster $CLUSTER_NAME
    • クラスターのステータスの概要を表示するには、次のコマンドを実行します。

      $ rosa list clusters
    • ログの進行状況を監視するには、次を実行します。

      $ rosa logs install --cluster $CLUSTER_NAME --watch
  2. 状態が “ready” に変われば、クラスターのインストールは完了です。ワーカーノードがオンラインになるまでにさらに数分かかる場合があります。

17.5. チュートリアル: 管理ユーザーの作成

管理 (admin) ユーザーを作成すると、クラスターにすばやくアクセスできるようになります。管理ユーザーを作成するには、次の手順に従います。

注記

管理ユーザーは、このチュートリアル設定では問題なく機能します。実際のデプロイメントでは、正式なアイデンティティープロバイダー を使用してクラスターにアクセスし、ユーザーに管理権限を付与してください。

  1. 次のコマンドを実行して管理ユーザーを作成します。

    rosa create admin --cluster=<cluster-name>

    出力例

    W: It is recommended to add an identity provider to login to this cluster. See 'rosa create idp --help' for more information.
    I: Admin account has been added to cluster 'my-rosa-cluster'. It may take up to a minute for the account to become active.
    I: To login, run the following command:
    oc login https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443 \
    --username cluster-admin \
    --password FWGYL-2mkJI-00000-00000

  2. 前のステップで返されたログインコマンドをコピーし、ターミナルに貼り付けます。これにより、CLI を使用してクラスターにログインし、クラスターの使用を開始できるようになります。

    $ oc login https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443 \
    >    --username cluster-admin \
    >    --password FWGYL-2mkJI-00000-00000

    出力例

    Login successful.
    
    You have access to 79 projects, the list has been suppressed. You can list all projects with ' projects'
    
    Using project "default".

  3. 管理ユーザーとしてログインしていることを確認するには、次のコマンドのいずれかを実行します。

    • オプション 1:

      $ oc whoami

      出力例

      cluster-admin

    • オプション 2:

      oc get all -n openshift-apiserver

      このコマンドをエラーなしで実行できるのは管理ユーザーのみです。

  4. これでクラスターを管理ユーザーとして使用できるようになりました。このチュートリアルではこれで十分です。実際のデプロイメントでは、アイデンティティープロバイダーをセットアップすることを強く推奨します。これについては、次のチュートリアル で説明します。

17.6. チュートリアル: アイデンティティープロバイダーのセットアップ

クラスターにログインするには、アイデンティティープロバイダー (IDP) をセットアップします。このチュートリアルでは、IDP の例として GitHub を使用します。ROSA でサポートされる IDP の完全なリストを参照してください。

  • すべての IDP オプションを表示するには、次のコマンドを実行します。

    rosa create idp --help

17.6.1. GitHub を使用した IDP のセットアップ

  1. GitHub アカウントにログインします。
  2. 自分が管理者となる新しい GitHub 組織を作成します。

    ヒント

    すでに既存の組織の管理者であり、その組織を使用する場合は、ステップ 9 に進みます。

    + アイコンをクリックし、New Organization をクリックします。

    cloud experts getting started idp new org
  3. 状況に最も適したプランを選択するか、Join for free をクリックします。
  4. 組織のアカウント名、メールアドレス、および個人アカウントかビジネスアカウントかを入力します。Next をクリックします。

    cloud experts getting started idp team
  5. オプション: 他のユーザーの GitHub ID を追加して、ROSA クラスターへの追加のアクセス権を付与します。後で追加することもできます。
  6. Complete Setup をクリックします。
  7. オプション: 次のページで、要求される情報を入力します。
  8. Submit をクリックします。
  9. ターミナルに戻り、次のコマンドを入力して GitHub IDP を設定します。

    rosa create idp --cluster=<cluster name> --interactive
  10. 以下の値を設定します。

    Type of identity provider: github
    Identity Provider Name: <IDP-name>
    Restrict to members of: organizations
    GitHub organizations: <organization-account-name>
  11. CLI にリンクが表示されます。リンクをコピーしてブラウザーに貼り付け、Enter を押します。これにより、このアプリケーションを OAuth に登録するために必要な情報が入力されます。情報を変更する必要はありません。

    cloud experts getting started idp link
  12. Register application をクリックします。

    cloud experts getting started idp register
  13. 次のページに Client ID が表示されます。ID をコピーし、Client ID を要求するターミナルに ID を貼り付けます。

    注記

    タブは閉じないでください。

  14. CLI で Client Secret を求められます。ブラウザーに戻り、Generate a new client secret をクリックします。

    cloud experts getting started idp secret
  15. シークレットが生成されます。シークレットは二度と表示されないため、コピーしてください。
  16. シークレットをターミナルに貼り付けて Enter を押します。
  17. GitHub Enterprise Hostname は空白のままにします。
  18. claim を選択します。
  19. IDP が作成され、設定がクラスターに反映されるまで、約 1 分間待ちます。

    cloud experts getting started idp inputs
  20. 返されたリンクをコピーし、ブラウザーに貼り付けます。新しい IDP を、選択した名前で利用できるはずです。IDP をクリックし、GitHub 認証情報を使用してクラスターにアクセスします。

    cloud experts getting started idp login

17.6.2. 他のユーザーにクラスターへのアクセス権を付与する

他のクラスターユーザーにアクセス権を付与するには、その GitHub ユーザー ID を、このクラスターに使用する GitHub 組織に追加する必要があります。

  1. GitHub で、Your organizations ページに移動します。
  2. profile icon をクリックし、Your organizations をクリックします。次に、<自分の組織名> をクリックします。この例では、my-rosa-cluster です。

    cloud experts getting started idp org
  3. Invite someone をクリックします。

    cloud experts getting started idp invite
  4. 新しいユーザーの GitHub ID を入力し、正しいユーザーを選択して、Invite をクリックします。
  5. 新しいユーザーが招待を承諾すると、Hybrid Cloud Console リンクと GitHub 認証情報を使用して ROSA クラスターにログインできるようになります。

17.7. チュートリアル: 管理権限の付与

管理 (admin) 権限は、クラスターに追加したユーザーに自動的には付与されません。特定のユーザーに管理レベルの権限を付与する場合は、各ユーザーに手動で権限を付与する必要があります。ROSA コマンドラインインターフェイス (CLI) または Red Hat OpenShift Cluster Manager Web ユーザーインターフェイス (UI) のいずれかから管理権限を付与できます。

Red Hat は 2 種類の管理権限を提供します。

  • cluster-admin: cluster-admin 権限は、管理ユーザーにクラスター内のすべての権限を付与します。
  • dedicated-admin: dedicated-admin 権限を持つ管理ユーザーは、ほとんどの管理タスクを完了できますが、クラスターの破損を防ぐために一定の制限があります。権限の昇格が必要な場合は、dedicated-admin を使用することを推奨します。

管理権限の詳細は、クラスターの管理 に関するドキュメントを参照してください。

17.7.1. ROSA CLI の使用

  1. クラスターを作成したユーザーが、次のコマンドのいずれかを実行して管理権限を付与します。

    • cluster-admin の場合:

      $ rosa grant user cluster-admin --user <idp_user_name> --cluster=<cluster-name>
    • dedicated-admin の場合:

      $ rosa grant user dedicated-admin --user <idp_user_name> --cluster=<cluster-name>
  2. 次のコマンドを実行して、管理権限が追加されたことを確認します。

    $ rosa list users --cluster=<cluster-name>

    出力例

    $ rosa list users --cluster=my-rosa-cluster
    ID                 GROUPS
    <idp_user_name>    cluster-admins

  3. 現在 Red Hat Hybrid Cloud Console にログインしている場合は、コンソールからログアウトし、クラスターに再度ログインして、"Administrator パネル" がある新しいパースペクティブを表示します。シークレットウィンドウまたはプライベートウィンドウが必要になる場合があります。

    cloud experts getting started admin rights admin panel

  4. 次のコマンドを実行して、アカウントに管理権限が追加されたことをテストすることもできます。このコマンドをエラーなしで実行できるのは、cluster-admin ユーザーのみです。

    $ oc get all -n openshift-apiserver

17.7.2. Red Hat OpenShift Cluster Manager UI の使用

  1. OpenShift Cluster Manager にログインします。
  2. クラスターを選択します。
  3. Access Control タブをクリックします。
  4. サイドバーの Cluster roles and Access タブをクリックします。
  5. Add user をクリックします。

    cloud experts getting started admin rights access control
  6. ポップアップ画面でユーザー ID を入力します。
  7. ユーザーに cluster-admin 権限を付与するか、dedicated-admin 権限を付与するかを選択します。

    cloud experts getting started admin rights add user2

17.8. チュートリアル: クラスターへのアクセス

コマンドラインインターフェイス (CLI) または Red Hat Hybrid Cloud Console ユーザーインターフェイス (UI) を使用してクラスターに接続できます。

17.8.1. CLI を使用したクラスターへのアクセス

CLI を使用してクラスターにアクセスするには、oc CLI がインストールされている必要があります。チュートリアルの手順を実行してきた場合は、oc CLI がすでにインストールされています。

  1. OpenShift Cluster Manager にログインします。
  2. 右上隅にあるユーザー名をクリックします。
  3. Copy Login Command をクリックします。

    cloud experts getting started accessing copy login
  4. アイデンティティープロバイダー (IDP) を選択できる新しいタブが開きます。使用する IDP をクリックします。たとえば、"rosa-github" です。

    cloud experts getting started accessing copy token
  5. 新しいタブが開きます。Display token をクリックします。
  6. ターミナルで次のコマンドを実行します。

    $ oc login --token=sha256~GBAfS4JQ0t1UTKYHbWAK6OUWGUkdMGz000000000000 --server=https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443

    出力例

    Logged into "https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443" as "rosa-user" using the token provided.
    
    You have access to 79 projects, the list has been suppressed. You can list all projects with ' projects'
    
    Using project "default".

  7. 次のコマンドを実行して、ログインしていることを確認します。

    $ oc whoami

    出力例

    rosa-user

  8. これで、クラスターにアクセスできます。

17.8.2. Hybrid Cloud Console を使用したクラスターへのアクセス

  1. OpenShift Cluster Manager にログインします。

    1. Hybrid Cloud Console URL を取得するには、次のコマンドを実行します。

      rosa describe cluster -c <cluster-name> | grep Console
  2. IDP をクリックします。たとえば、"rosa-github" です。

    cloud experts getting started accessing copy token
  3. ユーザー認証情報を入力します。
  4. ログインが完了します。チュートリアルの手順を実行してきた場合は、cluster-admin となり、Administrator パネルがある Hybrid Cloud Console の Web ページが表示されるはずです。

    cloud experts getting started accessing logged

17.9. チュートリアル: ワーカーノードの管理

Red Hat OpenShift Service on AWS (ROSA) では、ワーカーノードの変更はマシンプールを使用して実行します。マシンプールを使用すると、ユーザーは多数のマシンを 1 つのエンティティーとして管理できます。すべての ROSA クラスターに、クラスターの作成時に作成されるデフォルトのマシンプールがあります。詳細は、マシンプール のドキュメントを参照してください。

17.9.1. マシンセットの作成

マシンプールは、コマンドラインインターフェイス (CLI) またはユーザーインターフェイス (UI) のいずれかを使用して作成できます。

17.9.1.1. CLI を使用したマシンプールの作成
  1. 以下のコマンドを実行します。

    rosa create machinepool --cluster=<cluster-name> --name=<machinepool-name> --replicas=<number-nodes>

    入力の例

     $ rosa create machinepool --cluster=my-rosa-cluster --name=new-mp
     --replicas=2

    出力例

    I: Machine pool 'new-mp' created successfully on cluster 'my-rosa-cluster'
    I: To view all machine pools, run 'rosa list machinepools -c my-rosa-cluster'

  2. オプション: 次のコマンドを実行して、新しいマシンプール内の特定のノードにノードラベルまたはテイントを追加します。

    rosa create machinepool --cluster=<cluster-name> --name=<machinepool-name> --replicas=<number-nodes> --labels=`<key=pair>`

    入力の例

    $ rosa create machinepool --cluster=my-rosa-cluster --name=db-nodes-mp --replicas=2 --labels='app=db','tier=backend'

    出力例

    I: Machine pool 'db-nodes-mp' created successfully on cluster 'my-rosa-cluster'

    これにより、1 つのユニットとして管理できる追加の 2 つのノードが作成されます。また、表示されるラベルがこのノードに割り当てられます。

  3. 次のコマンドを実行して、マシンプールの作成と割り当てられたラベルを確認します。

    rosa list machinepools --cluster=<cluster-name>

    出力例

    ID          AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS            TAINTS    AVAILABILITY ZONES
    Default     No           2         m5.xlarge                                  us-east-1a

17.9.1.2. UI を使用したマシンプールの作成
  1. OpenShift Cluster Manager にログインし、クラスターをクリックします。

    cloud experts getting started managing ocm cluster
  2. Machine pools をクリックします。

    cloud experts getting started managing mp ocm

  3. Add machine pool をクリックします。
  4. 必要な設定を入力します。

    ヒント

    また、Edit node labels and taints セクションを展開して、ノードラベルとテイントをマシンプール内のノードに追加することもできます。

    cloud experts getting started managing mp nlt
  5. 作成した新しいマシンプールが表示されます。

    cloud experts getting started managing mp fromui

17.9.2. ワーカーノードのスケーリング

マシンプールを編集して、その特定のマシンプール内のワーカーノードの数をスケーリングします。CLI または UI を使用してワーカーノードをスケーリングできます。

17.9.2.1. CLI を使用したワーカーノードのスケーリング
  1. 次のコマンドを実行して、各クラスターで作成されたデフォルトのマシンプールを確認します。

    rosa list machinepools --cluster=<cluster-name>

    出力例

    ID          AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS            TAINTS    AVAILABILITY ZONES
    Default     No           2         m5.xlarge                                  us-east-1a

  2. デフォルトのマシンプールを異なるノード数にスケールアウトするには、次のコマンドを実行します。

    rosa edit machinepool --cluster=<cluster-name> --replicas=<number-nodes> <machinepool-name>

    入力の例

    rosa edit machinepool --cluster=my-rosa-cluster --replicas 3 Default

  3. 次のコマンドを実行して、マシンプールがスケーリングされたことを確認します。

    rosa describe cluster --cluster=<cluster-name> | grep Compute

    入力の例

    $ rosa describe cluster --cluster=my-rosa-cluster | grep Compute

    出力例

    - Compute:                 3 (m5.xlarge)

17.9.2.2. UI を使用したワーカーノードのスケーリング
  1. 編集するマシンプールの右側にある 3 つの点をクリックします。
  2. Edit をクリックします。
  3. 必要なノード数を入力し、Save をクリックします。
  4. クラスターを選択し、Overview タブをクリックします。Compute listing までスクロールして、クラスターがスケーリングされたことを確認します。Compute listing はスケーリングされたノードと同じであるはずです。たとえば、3/3 のようになります。

    cloud experts getting started managing ocm nodes
17.9.2.3. ノードラベルの追加
  1. 次のコマンドを使用してノードラベルを追加します。

    rosa edit machinepool --cluster=<cluster-name> --replicas=<number-nodes> --labels='key=value' <machinepool-name>

    入力の例

    rosa edit machinepool --cluster=my-rosa-cluster --replicas=2 --labels 'foo=bar','baz=one' new-mp

    これにより、新しいマシンプールに 2 つのラベルが追加されます。

重要

このコマンドは、すべてのマシンプール設定を新しく定義した設定に置き換えます。別のラベルを追加し、かつ 古いラベルを保持する場合は、新しいラベルと既存のラベルの両方を指定する必要があります。指定しないと、既存のすべてのラベルが追加するラベルに置き換えられます。同様に、ラベルを削除する場合は、削除するラベルを除いて必要なラベルを指定し、コマンドを実行します。

17.9.3. ノードタイプの混在

新しいマシンプールを使用して、同じクラスター内で異なるワーカーノードマシンタイプを混在させることもできます。マシンプールの作成後にマシンプールのノードタイプを変更することはできません。しかし、--instance-type フラグを追加することで、異なるノードを持つ新しいマシンプールを作成できます。

  1. たとえば、データベースノードを別のノードタイプに変更するには、次のコマンドを実行します。

    rosa create machinepool --cluster=<cluster-name> --name=<mp-name> --replicas=<number-nodes> --labels='<key=pair>' --instance-type=<type>

    入力の例

    rosa create machinepool --cluster=my-rosa-cluster --name=db-nodes-large-mp --replicas=2 --labels='app=db','tier=backend' --instance-type=m5.2xlarge

  2. 利用可能なすべてのインスタンスタイプ を表示するには、次のコマンドを実行します。

    rosa list instance-types
  3. ステップバイステップで変更するには、--interactive フラグを使用します。

    rosa create machinepool -c <cluster-name> --interactive
    cloud experts getting started managing mp interactive
  4. 次のコマンドを実行してマシンプールをリストし、より大きな新しいインスタンスタイプを確認します。

    rosa list machinepools -c <cluster-name>
    cloud experts getting started managing large mp

17.10. チュートリアル: 自動スケーリング

クラスターオートスケーラー は、Pod リソースに基づいてクラスターにワーカーノードを追加または削除します。

クラスターオートスケーラーは、次の場合にクラスターのサイズを増やします。

  • リソースが不足しているため、Pod を現在のノードでスケジュールできない場合。
  • デプロイメントのニーズを満たすために、別のノードが必要な場合。

クラスターオートスケーラーは、指定の制限を超えてクラスターリソースを拡大することはありません。

クラスターオートスケーラーは、次の場合にクラスターのサイズを減らします。

  • 一部のノードが長期間続けて必要とされない場合。たとえば、ノードのリソース使用量が低く、そのノードの重要な Pod がすべて他のノードに収まる場合です。

17.10.1. CLI を使用した既存マシンプールの自動スケーリングの有効化

注記

クラスターの自動スケーリングは、クラスターの作成時、および新しいマシンプールを作成するときに、--enable-autoscaling オプションを使用して有効にできます。

  1. 自動スケーリングは、マシンプールの可用性に基づいて設定されます。どのマシンプールが自動スケーリングに使用できるかを確認するには、次のコマンドを実行します。

    $ rosa list machinepools -c <cluster-name>

    出力例

    ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS     TAINTS    AVAILABILITY ZONES
    Default    No           2         m5.xlarge                           us-east-1a

  2. 次のコマンドを実行して、利用可能なマシンプールに自動スケーリングを追加します。

    $ rosa edit machinepool -c <cluster-name> --enable-autoscaling <machinepool-name> --min-replicas=<num> --max-replicas=<num>

    入力の例

    $ rosa edit machinepool -c my-rosa-cluster --enable-autoscaling Default --min-replicas=2 --max-replicas=4

    上記のコマンドは、リソースに応じて 2 - 4 ノードの間でスケーリングするワーカーノードのオートスケーラーを作成します。

17.10.2. UI を使用した既存マシンプールの自動スケーリングの有効化

注記

マシンプールの作成時に Enable autoscaling チェックボックスをオンにすることで、クラスターの作成時にクラスターの自動スケーリングを有効にできます。

  1. Machine pools タブに移動し、右側の 3 つの点をクリックします。
  2. Scale をクリックし、Enable autoscaling をクリックします。
  3. 次のコマンドを実行して、自動スケーリングが追加されたことを確認します。

    $ rosa list machinepools -c <cluster-name>

    出力例

    ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS     TAINTS    AVAILABILITY ZONES
    Default    Yes          2-4       m5.xlarge                           us-east-1a

17.11. チュートリアル: クラスターのアップグレード

Red Hat OpenShift Service on AWS (ROSA) では、クラスターのアップグレードはすべてマネージドサービスの一環として実行されます。ユーザーがコマンドを実行したり、クラスターに変更を加えたりする必要はありません。アップグレードは都合の良い時刻にスケジュールできます。

クラスターのアップグレードをスケジュールする方法には、次のものがあります。

  • コマンドラインインターフェイス (CLI) を使用した手動アップグレード: 1 回限りの即時アップグレードを開始するか、将来の日時に 1 回限りのアップグレードをスケジュールします。
  • Red Hat OpenShift Cluster Manager ユーザーインターフェイス (UI) を使用した手動アップグレード: 1 回限りの即時アップグレードを開始するか、将来の日時に 1 回限りのアップグレードをスケジュールします。
  • 自動アップグレード: 手動でスケジュールを設定することなく、新しいバージョンが利用可能になるたびに、定期的な y-stream アップグレードのアップグレード時間を設定します。マイナーバージョンは手動でスケジュールする必要があります。

クラスターのアップグレードの詳細は、次のコマンドを実行してください。

$ rosa upgrade cluster --help

17.11.1. CLI を使用したクラスターの手動アップグレード

  1. 次のコマンドを実行して、利用可能なアップグレードがあるかどうかを確認します。

    $ rosa list upgrade -c <cluster-name>

    出力例

    $ rosa list upgrade -c <cluster-name>
    VERSION  NOTES
    4.14.7   recommended
    4.14.6
    ...

    上の例では、バージョン 4.14.7 と 4.14.6 の両方が利用可能です。

  2. 次のコマンドを実行して、1 時間以内にクラスターをアップグレードするようにスケジュールします。

    $ rosa upgrade cluster -c <cluster-name> --version <desired-version>
  3. オプション: 次のコマンドを実行して、将来の日時にクラスターをアップグレードするようにスケジュールします。

    $ rosa upgrade cluster -c <cluster-name> --version <desired-version> --schedule-date <future-date-for-update> --schedule-time <future-time-for-update>

17.11.2. UI を使用したクラスターの手動アップグレード

  1. OpenShift Cluster Manager にログインし、アップグレードするクラスターを選択します。
  2. Settings をクリックします。
  3. アップグレードが利用可能な場合は、Update をクリックします。

    cloud experts getting started cluster upgrade
  4. 新しいウィンドウでアップグレードするバージョンを選択します。
  5. アップグレードの時間をスケジュールするか、すぐに開始します。

17.11.3. 自動定期アップグレードの設定

  1. OpenShift Cluster Manager にログインし、アップグレードするクラスターを選択します。
  2. Settings をクリックします。

    1. Update Strategy で、Recurring updates をクリックします。
  3. アップグレードを実行する日時を設定します。
  4. Node draining で、Pod のエビクション前にノードをドレインできるようにする猶予期間を選択します。
  5. Save をクリックします。

17.12. チュートリアル: クラスターの削除

コマンドラインインターフェイス (CLI) またはユーザーインターフェイス (UI) を使用して、Red Hat OpenShift Service on AWS (ROSA) クラスターを削除できます。

17.12.1. CLI を使用した ROSA クラスターの削除

  1. オプション: 次のコマンドを実行して、クラスターをリストし、削除する正しいクラスターを確認します。

    $ rosa list clusters
  2. 次のコマンドを実行してクラスターを削除します。

    $ rosa delete cluster --cluster <cluster-name>
    警告

    このコマンドは元に戻せません。

  3. CLI に、クラスターを削除するかどうかを確認するプロンプトが表示されます。y を押してから Enter を押します。クラスターとそれに関連するすべてのインフラストラクチャーが削除されます。

    注記

    AWS STS および IAM のロールとポリシーはすべての残るため、クラスターの削除が完了したら、以下の手順に従って手動で削除する必要があります。

  4. CLI に、作成した OpenID Connect (OIDC) プロバイダーおよび Operator IAM ロールのリソースを削除するコマンドが出力します。クラスターの削除が完了するまで待ってから、これらのリソースを削除します。次のコマンドを実行して、簡単なステータスチェックを実行します。

    $ rosa list clusters
  5. クラスターが削除されたら、次のコマンドを実行して OIDC プロバイダーを削除します。

    $ rosa delete oidc-provider -c <clusterID> --mode auto --yes
  6. 次のコマンドを実行して、Operator IAM ロールを削除します。

    $ rosa delete operator-roles -c <clusterID> --mode auto --yes
    注記

    このコマンドには、クラスター名ではなくクラスター ID が必要です。

  7. 残りのアカウントロールは、同じアカウント内の他のクラスターで必要なくなった場合にのみ削除してください。このアカウントで他の ROSA クラスターを作成する場合は、この手順を実行しないでください。

    アカウントロールを削除するには、アカウントロールの作成時に使用した接頭辞を確認する必要があります。特に指定しなかった場合、デフォルトは "ManagedOpenShift" です。

    次のコマンドを実行して、アカウントのロールを削除します。

    $ rosa delete account-roles --prefix <prefix> --mode auto --yes

17.12.2. UI を使用した ROSA クラスターの削除

  1. OpenShift Cluster Manager にログインし、削除するクラスターを見つけます。
  2. クラスターの右側にある 3 つの点をクリックします。

    cloud experts getting started deleting1
  3. ドロップダウンメニューで、Delete cluster をクリックします。

    cloud experts getting started deleting2
  4. 削除を確認するクラスターの名前を入力し、Delete をクリックします。

17.13. チュートリアル: サポートの利用

必要なときに適切なサポートを受けることが重要です。ここでは、サポートが必要な場合に利用できるリソースをいくつか紹介します。

17.13.1. サポート連絡先の追加

クラスターに関する連絡用のメールアドレスを追加できます。

  1. Red Hat OpenShift Cluster Manager ユーザーインターフェイス (UI) で、select cluster をクリックします。
  2. Support タブをクリックします。
  3. Add notification contact をクリックし、追加のメールアドレスを入力します。

17.13.2. UI を使用して Red Hat にサポートについて問い合わせる

  1. OpenShift Cluster Manager UI で、Support タブをクリックします。
  2. Open support case をクリックします。

17.13.3. サポートページを使用して Red Hat にサポートについて問い合わせる

  1. Red Hat サポートページ に移動します。
  2. Open a new Case をクリックします。

    obtain support case
  3. Red Hat アカウントにログインします。
  4. サポートに問い合わせる理由を選択します。

    obtain support reason
  5. Red Hat OpenShift Service on AWS を選択します。
obtain support select rosa
  1. continue をクリックします。
  2. 問題の概要とリクエストの詳細を入力します。ファイル、ログ、スクリーンショットをアップロードします。ご提供いただく情報が多いほど、Red Hat サポートが適切な解決方法を見つけやすくなります。

    注記

    このページの下部に、問題の解決に役立つ関連性の高い提案が表示されます。

    obtain support summary
  3. Continue をクリックします。
  4. 新しいフィールドの質問に回答します。
  5. Continue をクリックします。
  6. ケースに関する次の情報を入力します。

    1. Support level: Premium
    2. Severity: Red Hat サポートの重大度レベルの定義を確認して、正しいものを選択します。
    3. Group: このケースが他のいくつかのケースに関連する場合は、対応するグループを選択できます。
    4. Language
    5. Send notifications: アクティビティーの通知を受け取るためのメールアドレスを追加します。
    6. Red Hat associates: Red Hat の従業員とやり取りをしていて、その従業員と情報を共有する場合は、ここに従業員のメールアドレスを入力できます。
    7. Alternate Case ID: お客様独自の ID を割り当てる場合は、ここに入力できます。
  7. Continue をクリックします。
  8. 確認画面で、問い合わせに関連する正しいクラスター ID を選択していることを確認します。

    obtain support cluster id
  9. Submit をクリックします。
  10. 指定した重大度レベル の約束された応答時間に応じて連絡が届きます。

第18章 アプリケーションのデプロイ

18.1. チュートリアル: アプリケーションのデプロイ

18.1.1. はじめに

クラスターのプロビジョニングが正常に完了したら、そのクラスターにアプリケーションをデプロイできます。このアプリケーションを使用すると、Red Hat OpenShift Service on AWS (ROSA) と Kubernetes の機能の一部をさらに詳しく知ることができます。

18.1.1.1. ラボの概要

このラボでは、コンテナーベースのアプリケーションのデプロイと操作の概念を理解するのに役立つ次の一連のタスクを完了します。

  • S2I および Kubernetes Deployment オブジェクトを使用して、Node.js ベースのアプリをデプロイします。
  • 継続的デリバリー (CD) パイプラインをセットアップして、ソースコードの変更を自動的にプッシュします。
  • ロギングを調べます。
  • アプリケーションの自己修復を試します。
  • configmap、シークレット、環境変数を通じて設定の管理を確認します。
  • 永続ストレージを使用して、Pod の再起動後もデータを保持します。
  • Kubernetes とアプリケーション内のネットワークを確認します。
  • ROSA と Kubernetes の機能の理解を深めます。
  • Horizontal Pod Autoscaler からの負荷に基づいて Pod を自動的にスケーリングします。
  • AWS Controllers for Kubernetes (ACK) を使用して、S3 バケットをデプロイして使用します。

このラボでは、ROSA CLI または ROSA Web ユーザーインターフェイス (UI) を使用します。

18.2. チュートリアル: アプリケーションのデプロイ

18.2.1. 前提条件

  1. プロビジョニングされた ROSA クラスター

    このラボは、正常にプロビジョニングされた ROSA クラスターにアクセスできることを前提としています。ROSA クラスターをまだ作成していない場合は、ROSA クイックスタートガイド で詳細を参照してください。

  2. OpenShift コマンドラインインターフェイス (CLI)

    詳細は、OpenShift CLI の使用を開始する を参照してください。

  3. GitHub アカウント

    既存の GitHub アカウントを使用するか、https://github.com/signup で登録します。

18.2.1.1. AWS アカウントの関連付けについて

Red Hat Hybrid Cloud Console で Red Hat OpenShift Cluster Manager を使用して、AWS Security Token Service (STS) を使用する Red Hat OpenShift Service on AWS (ROSA) クラスターを作成する前に、AWS アカウントを Red Hat 組織に関連付ける必要があります。。次の IAM ロールを作成してリンクすることで、アカウントを関連付けることができます。

OpenShift Cluster Manager ロール

OpenShift Cluster Manager IAM ロールを作成し、Red Hat 組織にリンクします。

基本権限または管理権限を OpenShift Cluster Manager ロールに適用できます。基本パーミッションにより、OpenShift Cluster Manager を使用したクラスターのメンテナンスが可能になります。管理パーミッションにより、OpenShift Cluster Manager を使用して、クラスター固有の Operator ロールおよび OpenID Connect (OIDC) プロバイダーの自動デプロイが可能になります。

User role

ユーザー IAM ロールを作成し、Red Hat ユーザーアカウントにリンクします。Red Hat ユーザーアカウントは、OpenShift Cluster Manager ロールにリンクされている Red Hat 組織に存在する必要があります。

ユーザーロールは、OpenShift Cluster Manager Hybrid Cloud Console を使用してクラスターと必要な STS リソースをインストールするときに、AWS Identity を確認するために Red Hat によって使用されます。

AWS アカウントを Red Hat 組織に関連付ける

Red Hat Hybrid Cloud Console で Red Hat OpenShift Cluster Manager を使用して、AWS Security Token Service (STS) を使用する Red Hat OpenShift Service on AWS (ROSA) クラスターを作成する前に、OpenShift Cluster Manager IAM ロールを作成し、そのロールを Red Hat 組織に関連付ける必要があります。次に、ユーザー IAM ロールを作成し、同じ Red Hat 組織内の Red Hat ユーザーアカウントにリンクします。

手順

  1. OpenShift Cluster Manager ロールを作成し、Red Hat 組織にリンクします。

    注記

    OpenShift Cluster Manager Hybrid Cloud Console を使用してクラスター固有の Operator ロールと OpenID Connect (OIDC) プロバイダーの自動デプロイを有効にするには、ROSA クラスターの作成の アカウントとロール の手順で、Admin OCM role コマンドを選択して、ロールに管理権限を適用する必要があります。OpenShift Cluster Manager ロールの基本権限および管理権限の詳細は、AWS アカウントの関連付けについて を参照してください。

    注記

    OpenShift Cluster Manager Hybrid Cloud Console で ROSA クラスターを作成する アカウントとロール の手順で Basic OCM role コマンドを選択した場合は、手動モードを使用して ROSA クラスターをデプロイする必要があります。後のステップで、クラスター固有の Operator ロールと OpenID Connect (OIDC) プロバイダーを設定するように求められます。

    $ rosa create ocm-role

    ロールをすばやく作成してリンクするには、プロンプトでデフォルト値を選択します。

  2. ユーザーロールを作成し、Red Hat ユーザーアカウントにリンクします。

    $ rosa create user-role

    ロールをすばやく作成してリンクするには、プロンプトでデフォルト値を選択します。

    注記

    Red Hat ユーザーアカウントは、OpenShift Cluster Manager ロールにリンクされている Red Hat 組織に存在する必要があります。

18.3. チュートリアル: アプリケーションのデプロイ

18.3.1. ラボの概要

18.3.1.1. ラボのリソース
  • OSToy アプリケーションのソースコード
  • OSToy フロントエンドコンテナーイメージ
  • OSToy マイクロサービスコンテナーイメージ
  • デプロイメント定義 YAML ファイル:

    ostoy-frontend-deployment.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ostoy-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ostoy-frontend
      labels:
        app: ostoy
    spec:
      selector:
        matchLabels:
          app: ostoy-frontend
      strategy:
        type: Recreate
      replicas: 1
      template:
        metadata:
          labels:
            app: ostoy-frontend
        spec:
          # Uncomment to use with ACK portion of the workshop
          # If you chose a different service account name please replace it.
          # serviceAccount: ostoy-sa
          containers:
          - name: ostoy-frontend
            securityContext:
              allowPrivilegeEscalation: false
              runAsNonRoot: true
              seccompProfile:
                type: RuntimeDefault
              capabilities:
                drop:
                - ALL
            image: quay.io/ostoylab/ostoy-frontend:1.6.0
            imagePullPolicy: IfNotPresent
            ports:
            - name: ostoy-port
              containerPort: 8080
            resources:
              requests:
                memory: "256Mi"
                cpu: "100m"
              limits:
                memory: "512Mi"
                cpu: "200m"
            volumeMounts:
            - name: configvol
              mountPath: /var/config
            - name: secretvol
              mountPath: /var/secret
            - name: datavol
              mountPath: /var/demo_files
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
              initialDelaySeconds: 10
              periodSeconds: 5
            env:
            - name: ENV_TOY_SECRET
              valueFrom:
                secretKeyRef:
                  name: ostoy-secret-env
                  key: ENV_TOY_SECRET
            - name: MICROSERVICE_NAME
              value: OSTOY_MICROSERVICE_SVC
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          volumes:
            - name: configvol
              configMap:
                name: ostoy-configmap-files
            - name: secretvol
              secret:
                defaultMode: 420
                secretName: ostoy-secret
            - name: datavol
              persistentVolumeClaim:
                claimName: ostoy-pvc
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ostoy-frontend-svc
      labels:
        app: ostoy-frontend
    spec:
      type: ClusterIP
      ports:
        - port: 8080
          targetPort: ostoy-port
          protocol: TCP
          name: ostoy
      selector:
        app: ostoy-frontend
    ---
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: ostoy-route
    spec:
      to:
        kind: Service
        name: ostoy-frontend-svc
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: ostoy-secret-env
    type: Opaque
    data:
      ENV_TOY_SECRET: VGhpcyBpcyBhIHRlc3Q=
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: ostoy-configmap-files
    data:
      config.json:  '{ "default": "123" }'
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: ostoy-secret
    data:
      secret.txt: VVNFUk5BTUU9bXlfdXNlcgpQQVNTV09SRD1AT3RCbCVYQXAhIzYzMlk1RndDQE1UUWsKU01UUD1sb2NhbGhvc3QKU01UUF9QT1JUPTI1
    type: Opaque

    ostoy-microservice-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ostoy-microservice
      labels:
        app: ostoy
    spec:
      selector:
        matchLabels:
          app: ostoy-microservice
      replicas: 1
      template:
        metadata:
          labels:
            app: ostoy-microservice
        spec:
          containers:
          - name: ostoy-microservice
            securityContext:
              allowPrivilegeEscalation: false
              runAsNonRoot: true
              seccompProfile:
                type: RuntimeDefault
              capabilities:
                drop:
                - ALL
            image: quay.io/ostoylab/ostoy-microservice:1.5.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: "128Mi"
                cpu: "50m"
              limits:
                memory: "256Mi"
                cpu: "100m"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ostoy-microservice-svc
      labels:
        app: ostoy-microservice
    spec:
      type: ClusterIP
      ports:
        - port: 8080
          targetPort: 8080
          protocol: TCP
      selector:
        app: ostoy-microservice

  • ACK S3 の S3 バケットマニフェスト

    s3-bucket.yaml

    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
      name: ostoy-bucket
      namespace: ostoy
    spec:
      name: ostoy-bucket

注記

OSToy アプリケーションのデプロイを簡略化するために、上記のデプロイメントマニフェストで必要なすべてのオブジェクトはグループ化されています。一般的なエンタープライズデプロイメントでは、Kubernetes オブジェクトごとに個別のマニフェストファイルを使用することを推奨します。

18.3.1.2. OSToy アプリケーションについて

OSToy は、Kubernetes の機能を確認するのに役立つシンプルな Node.js アプリケーションです。このアプリケーションを ROSA クラスターにデプロイします。このアプリケーションのユーザーインターフェイスから、以下を実行できます。

  • メッセージをログ (stdout/stderr) に書き込む。
  • アプリケーションを意図的にクラッシュして自己修復を確認する。
  • liveness プローブを切り替えて、OpenShift の動作を監視する。
  • config map、シークレット、および環境変数を読み取る。
  • 共有ストレージに接続されている場合にファイルの読み取りと書き込みを行う。
  • ネットワーク接続、クラスター内 DNS、および含まれるマイクロサービスとの内部通信を確認する。
  • 負荷を増やし、Horizontal Pod Autoscaler を使用して負荷を処理する Pod の自動スケーリングを確認する。
  • オプション: AWS S3 バケットに接続して、オブジェクトの読み取りと書き込みを行う。
18.3.1.3. OSToy アプリケーションの図
OSToy architecture diagram
18.3.1.4. OSToy の UI について
Preview of the OSToy homepage
  1. ブラウザーにページを提供した Pod 名が表示されます。
  2. Home: アプリケーションのメインページです。このラボで確認する機能の一部を実行できます。
  3. Persistent Storage: このアプリケーションにバインドされた永続ボリュームにデータを書き込むことができます。
  4. Config Maps: アプリケーションで使用可能な設定マップの内容とキーと値のペアが表示されます。
  5. Secrets: アプリケーションで使用可能なシークレットの内容とキーと値のペアが表示されます。
  6. ENV Variables: アプリケーションで使用可能な環境変数が表示されます。
  7. Networking: アプリケーション内のネットワークを説明するツール。
  8. Pod Auto Scaling: Pod の負荷を増やし、HPA をテストするツール。
  9. ACK S3: (オプション) AWS S3 と統合して、バケットへのオブジェクトの読み取りおよび書き込みを行います。

    注記

    OSToy の "ACK S3" セクションを表示するには、このワークショップの ACK セクションを完了する必要があります。このセクションを完了しなくても、OSToy アプリケーションは機能します。

  10. About: アプリケーションに関する詳細情報が表示されます。

18.4. チュートリアル: アプリケーションのデプロイ

18.4.1. Kubernetes を使用した OSToy アプリケーションのデプロイ

フロントエンドおよびバックエンドのマイクロサービスコンテナーのイメージを作成してイメージリポジトリーに保存することで、OSToy アプリケーションをデプロイできます。その後、Kubernetes デプロイメントを作成してアプリケーションをデプロイできます。

18.4.1.1. ログインコマンドの取得
  1. CLI にログインしていない場合は、Web コンソールを使用してクラスターにアクセスします。
  2. 右上のログイン名の横にあるドロップダウン矢印をクリックし、Copy Login Command を選択します。

    CLI login screen

    新しいタブが開きます。

  3. 認証方法を選択します。
  4. Display Token をクリックします。
  5. Log in with this token の下のコマンドをコピーします。
  6. ターミナルから、コピーしたコマンドを貼り付けて実行します。ログインに成功すると、次の確認メッセージが表示されます。

    $ oc login --token=<your_token> --server=https://api.osd4-demo.abc1.p1.openshiftapps.com:6443
    Logged into "https://api.myrosacluster.abcd.p1.openshiftapps.com:6443" as "rosa-user" using the token provided.
    
    You don't have any projects. You can try to create a new project, by running
    
    oc new-project <project name>
18.4.1.2. 新規プロジェクトの作成
18.4.1.2.1. CLI の使用
  1. 以下のコマンドを実行して、クラスターに ostoy という名前の新規プロジェクトを作成します。

    $ oc new-project ostoy

    出力例

    Now using project "ostoy" on server "https://api.myrosacluster.abcd.p1.openshiftapps.com:6443".

  2. オプション: または、次のコマンドを実行して一意のプロジェクト名でプロジェクトを作成します。

    $ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
18.4.1.2.2. Web コンソールの使用
  1. Web コンソールから、Home → Projects をクリックします。
  2. Projects ページで Create Project をクリックします。

    The project creation screen
18.4.1.3. バックエンドマイクロサービスのデプロイ

マイクロサービスは内部 Web リクエストを処理し、現在のホスト名とランダムに生成された色の文字列を含む JSON オブジェクトを返します。

  • ターミナルから以下のコマンドを実行してマイクロサービスをデプロイします。

    $ oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml

    出力例

    $ oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
    deployment.apps/ostoy-microservice created
    service/ostoy-microservice-svc created

18.4.1.4. フロントエンドサービスのデプロイ

フロントエンドデプロイメントでは、アプリケーションと追加の Kubernetes オブジェクトに Node.js フロントエンドを使用します。

ostoy-frontend-deployment.yaml ファイルは、フロントエンドデプロイメントで次の機能が定義されていることを示しています。

  • 永続ボリューム要求
  • Deployment オブジェクト
  • サービス
  • Route
  • Configmaps
  • シークレット

    • 次のコマンドを入力して、アプリケーションのフロントエンドをデプロイし、すべてのオブジェクトを作成します。

      $ oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml

      出力例

      persistentvolumeclaim/ostoy-pvc created
      deployment.apps/ostoy-frontend created
      service/ostoy-frontend-svc created
      route.route.openshift.io/ostoy-route created
      configmap/ostoy-configmap-env created
      secret/ostoy-secret-env created
      configmap/ostoy-configmap-files created
      secret/ostoy-secret created

      すべてのオブジェクトが正常に作成されたことが表示されます。

18.4.1.5. ルートの取得

アプリケーションにアクセスするためのルートを取得する必要があります。

  • 次のコマンドを実行して、アプリケーションへのルートを取得します。

    $ oc get route

    出力例

    NAME          HOST/PORT                                                 PATH   SERVICES             PORT    TERMINATION   WILDCARD
    ostoy-route   ostoy-route-ostoy.apps.<your-rosa-cluster>.abcd.p1.openshiftapps.com          ostoy-frontend-svc   <all>                 None

18.4.1.6. アプリケーションの表示
  1. 前の手順で出力された ostoy-route-ostoy.apps.<your-rosa-cluster>.abcd.p1.openshiftapps.com URL をコピーします。
  2. コピーした URL を Web ブラウザーに貼り付けて Enter キーを押します。アプリケーションのホームページが表示されます。ページが読み込まれない場合は、https ではなく http を使用していることを確認してください。

    OStoy application homepage

18.5. チュートリアル: ヘルスチェック

意図的に Pod をクラッシュさせ、Kubernetes liveness プローブに応答しないようにすることで、Kubernetes が Pod の障害にどのように対応するかを確認できます。

18.5.1. デスクトップの準備

  1. デスクトップ画面を OpenShift Web コンソールと OSToy アプリケーションの Web コンソールに分割して、アクションの結果をすぐに確認できるようにします。

    Splitscreen desktop with the OSToy application and the web console

    画面を分割できない場合は、別のタブで OSToy アプリケーションの Web コンソールを開き、アプリケーションの機能を有効にした後で OpenShift Web コンソールにすばやく切り替えられるようにします。

  2. OpenShift Web コンソールから、Workloads > Deployments > ostoy-frontend を選択して、OSToy デプロイメントを表示します。

    The web console deployments page

18.5.2. Pod のクラッシュ

  1. OSToy アプリケーションの Web コンソールから、左側のメニューの Home をクリックし、Crash Pod ボックスに This is goodbye! などのメッセージを入力します。
  2. Crash Pod をクリックします。

    OSToy crash pod selection

    Pod がクラッシュし、Kubernetes が Pod を再起動するはずです。

    OSToy pod crash message

18.5.3. 復活した Pod の確認

  1. OpenShift Web コンソールから、Deployments 画面にすばやく切り替えます。Pod が黄色に変わり、ダウンしていることがわかります。すぐに復活して青色に変わるはずです。復活プロセスはすぐに行われるため、見逃さないよう注意してください。

    Deployment details page

検証

  1. Web コンソールから、Pods > ostoy-frontend-xxxxxxx-xxxx をクリックして、Pod 画面に切り替えます。

    Pod overview page
  2. Events サブタブをクリックし、コンテナーがクラッシュして再起動したことを確認します。

    Pod events list

18.5.4. アプリケーションを誤動作させる

前の手順の Pod イベントページを開いたままにしておきます。

  • OSToy アプリケーションから、Toggle Health Status タイルの Toggle Health をクリックします。Current Health 状態が I’m not feeling all that well に切り替わるのを確認します。

    OSToy toggle health tile

検証

前のステップを実行すると、アプリケーションが 200 HTTP code で応答を停止します。3 回連続して失敗すると、Kubernetes が Pod を停止して再起動します。Web コンソールから Pod イベントページに戻ると、liveness プローブが失敗し、Pod が再起動されたことがわかります。

次の画像は、Pod イベントページに表示される内容の例を示しています。

Pod events list

A. Pod で失敗が 3 回連続で発生しました。

B. Kubernetes が Pod を停止します。

C. Kubernetes が Pod を再起動します。

18.6. チュートリアル: クラスターストレージの永続ボリューム

Red Hat OpenShift Service on AWS (ROSA) (Classic アーキテクチャー) および Red Hat OpenShift Service on AWS (ROSA) は、Amazon Web Services (AWS) Elastic Block Store (EBS) または AWS Elastic File System (EFS) のいずれかを使用した永続ボリュームの保存をサポートしています。

18.6.1. 永続ボリュームの使用

以下の手順に従ってファイルを作成し、クラスター内の永続ボリュームに保存し、Pod の障害と再作成後もファイルが存在することを確認します。

18.6.1.1. 永続ボリューム要求の表示
  1. クラスターの OpenShift Web コンソールに移動します。
  2. 左側のメニューで Storage をクリックし、PersistentVolumeClaims をクリックして、すべての永続ボリューム要求のリストを表示します。
  3. 永続ボリューム要求をクリックすると、サイズ、アクセスモード、ストレージクラス、その他の要求の詳細が表示されます。

    注記

    アクセスモードは ReadWriteOnce (RWO) です。つまり、ボリュームは 1 つのノードにのみマウントでき、Pod または複数の Pod がボリュームの読み取りと書き込みを行うことができます。

18.6.1.2. ファイルの保存
  1. OSToy アプリケーションコンソールで、左側のメニューで Persistent Storage をクリックします。
  2. Filename ボックスに、.txt 拡張子が付いたファイル名 ( test-pv.txt など) を入力します。
  3. File contents ボックスに、テキストの文を入力します (例: OpenShift is the greatest thing since sliced bread!)。
  4. Create file をクリックします。

    cloud experts storage ostoy createfile
  5. OSToy アプリケーションコンソールで 既存のファイル までスクロールします。
  6. 作成したファイルをクリックすると、ファイル名と内容が表示されます。

    cloud experts storage ostoy viewfile
18.6.1.3. Pod のクラッシュ
  1. OSToy アプリケーションコンソールで、左側のメニューの Home をクリックします。
  2. Crash Pod をクリックします。
18.6.1.4. 永続ストレージの確認
  1. Pod が再作成されるまで待機します。
  2. OSToy アプリケーションコンソールで、左側のメニューで Persistent Storage をクリックします。
  3. 作成したファイルを見つけて開き、内容を表示して確認します。

    cloud experts storage ostoy existingfile

検証

デプロイメント YAML ファイルには /var/demo_files ディレクトリー が永続ボリューム要求にマウントされたことが示されています。

  1. 次のコマンドを実行して、フロントエンド Pod の名前を取得します。

    $ oc get pods
  2. 次のコマンドを実行して、コンテナー内でセキュアシェル (SSH) セッションを開始します。

    $ oc rsh <pod_name>
  3. 次のコマンドを実行してディレクトリーに移動します。

    $ cd /var/demo_files
  4. オプション: 次のコマンドを実行して、作成したすべてのファイルを表示します。

    $ ls
  5. 次のコマンドを実行して、ファイルを開いてコンテンツを表示します。

    $ cat test-pv.txt
  6. 出力が OSToy アプリケーションコンソールに入力したテキストであることを確認します。

    端末の例

    $ oc get pods
    NAME                                  READY     STATUS    RESTARTS   AGE
    ostoy-frontend-5fc8d486dc-wsw24       1/1       Running   0          18m
    ostoy-microservice-6cf764974f-hx4qm   1/1       Running   0          18m
    
    $ oc rsh ostoy-frontend-5fc8d486dc-wsw24
    
    $ cd /var/demo_files/
    
    $ ls
    lost+found   test-pv.txt
    
    $ cat test-pv.txt
    OpenShift is the greatest thing since sliced bread!

18.6.1.5. セッションの終了
  • ターミナルで exit と入力してセッションを終了し、CLI に戻ります。

18.6.2. 関連情報

18.7. チュートリアル: ConfigMap、シークレット、環境変数

このチュートリアルでは、config mapシークレット環境変数 を使用して OSToy アプリケーションを設定する方法を示します。詳細は、各トピックのリンク先を参照してください。

18.7.1. ConfigMap を使用した設定

config map を使用すると、コンテナーイメージのコンテンツから設定アーティファクトを分離して、コンテナー化されたアプリケーションの移植性を維持できます。

手順

  • OSToy アプリの左側のメニューで、Config Maps をクリックすると、OSToy アプリケーションで使用できる config map の内容が表示されます。このコードスニペットは、config map の設定の例を示しています。

    出力例

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: ostoy-configmap-files
    data:
      config.json:  '{ "default": "123" }'

18.7.2. シークレットを使用した設定

Kubernetes の Secret オブジェクトを使用すると、パスワード、OAuth トークン、SSH 鍵などの機密情報を保存および管理できます。機密情報をシークレットに格納すると、Pod 定義やコンテナーイメージにプレーンテキストで格納するよりも安全性と柔軟性が高まります。

手順

  • OSToy アプリの左側のメニューで、Secrets をクリックすると、OSToy アプリケーションで使用できるシークレットの内容が表示されます。このコードスニペットは、シークレットの設定の例を示しています。

    出力例

    USERNAME=my_user
    PASSWORD=VVNFUk5BTUU9bXlfdXNlcgpQQVNTV09SRD1AT3RCbCVYQXAhIzYzMlk1RndDQE1UUWsKU01UUD1sb2NhbGhvc3QKU01UUF9QT1JUPTI1
    SMTP=localhost
    SMTP_PORT=25

18.7.3. 環境変数を使用した設定

環境変数を使用すると、コードを変更することなくアプリケーションの動作を簡単に変更できます。同じアプリケーションの別々のデプロイメントで、環境変数によって動作を変えることができます。Red Hat OpenShift Service on AWS では、Pod またはデプロイメントの環境変数の設定、表示、更新を簡単に行うことができます。

手順

  • OSToy アプリの左側のメニューで、ENV Variables をクリックすると、OSToy アプリケーションで使用できる環境変数が表示されます。このコードスニペットは、環境変数の設定の例を示しています。

    出力例

    {
      "npm_config_local_prefix": "/opt/app-root/src",
      "STI_SCRIPTS_PATH": "/usr/libexec/s2i",
      "npm_package_version": "1.7.0",
      "APP_ROOT": "/opt/app-root",
      "NPM_CONFIG_PREFIX": "/opt/app-root/src/.npm-global",
      "OSTOY_MICROSERVICE_PORT_8080_TCP_PORT": "8080",
      "NODE": "/usr/bin/node",
      "LD_PRELOAD": "libnss_wrapper.so",
      "KUBERNETES_SERVICE_HOST": "172.30.0.1",
      "OSTOY_MICROSERVICE_PORT": "tcp://172.30.60.255:8080",
      "OSTOY_PORT": "tcp://172.30.152.25:8080",
      "npm_package_name": "ostoy",
      "OSTOY_SERVICE_PORT_8080_TCP": "8080",
      "_": "/usr/bin/node"
      "ENV_TOY_CONFIGMAP": "ostoy-configmap -env"
    }

18.8. チュートリアル: ネットワーク

このチュートリアルでは、OSToy アプリケーションがクラスター内ネットワークを使用してマイクロサービスによって機能を分離し、Pod のスケーリングを視覚化する方法を説明します。

OSToy Diagram

この図は、それぞれ独自のサービスを持つ少なくとも 2 つの個別の Pod があることを示しています。

1 つの Pod は、サービスとパブリックにアクセス可能なルートを備えたフロントエンド Web アプリケーションとして機能します。もう一方の Pod は、フロントエンド Pod がマイクロサービスと通信できるように、サービスオブジェクトを備えたバックエンドマイクロサービスとして機能します。この通信は、Pod が複数ある場合に、Pod 間で行われます。これらの通信制限のため、このマイクロサービスは、このクラスターの外部から、または他の namespace やプロジェクト (設定されている場合) からはアクセスできません。このマイクロサービスの唯一の目的は、内部 Web リクエストを処理し、現在のホスト名 (Pod の名前) とランダムに生成された色の文字列を含む JSON オブジェクトを返すことです。この色文字列は、"Intra-cluster Communication" というタイトルのタイルにその色のボックスを表示するために使用されます。

ネットワークの制限の詳細は、ネットワークポリシーについて を参照してください。

18.8.1. クラスター内ネットワーク

OSToy アプリケーションでネットワーク設定を表示できます。

手順

  1. OSToy アプリケーションで、左側のメニューの Networking をクリックします。
  2. ネットワーク設定を確認します。"Hostname Lookup" というタイトルの右側のタイルは、Pod 用に作成されたサービス名を使用して内部 ClusterIP アドレスに変換する方法を示しています。

    OSToy Networking page
  3. 右側のタイルに ("Hostname Lookup") に <service_name>.<namespace>.svc.cluster.local の形式で作成したマイクロサービスの名前を入力します。次のコマンドを実行すると、ostoy-microservice.yaml のサービス定義でこのサービス名を見つけることができます。

    $ oc get service <name_of_service> -o yaml

    出力例

    apiVersion: v1
    kind: Service
    metadata:
      name: ostoy-microservice-svc
      labels:
        app: ostoy-microservice
    spec:
      type: ClusterIP
      ports:
        - port: 8080
          targetPort: 8080
          protocol: TCP
      selector:
        app: ostoy-microservice

    この例では、完全なホスト名は、ostoy-microservice-svc.ostoy.svc.cluster.local です。

  4. 返された IP アドレスが表示されます。上記の例では、172.30.165.246 になります。これはクラスター内 IP アドレスであり、クラスター内からのみアクセスできます。

    OSToy DNS

18.9. チュートリアル: アプリケーションのスケーリング

18.9.1. スケーリング

Horizontal Pod Autoscaler (HPA) を使用すると、Pod を手動または自動でスケーリングできます。クラスターノードをスケーリングすることもできます。

18.9.1.1. Pod の手動スケーリング

次のいずれかの方法を使用して、アプリケーションの Pod を手動でスケーリングできます。

  • ReplicaSet またはデプロイメント定義の変更
  • コマンドラインの使用
  • Web コンソールの使用

このワークショップでは、まず 1 つの Pod だけをマイクロサービスに使用します。デプロイメント定義でレプリカを 1 に定義すると、Kubernetes レプリケーションコントローラーが 1 つの Pod を維持しようとします。次に、Horizontal Pod Autoscaler (HPA) を使用して Pod の自動スケーリングを定義する方法を説明します。HPA は、高負荷が発生した場合に、負荷に応じて、最初の定義を超えて Pod をスケールアウトします。

前提条件

  • アクティブな ROSA クラスター
  • デプロイ済みの OSToy アプリケーション

手順

  1. OSToy アプリケーションで、ナビゲーションメニューの Networking タブをクリックします。
  2. "Intra-cluster Communication" セクションで、"Remote Pods" の下にある、色がランダムに変化するボックスを見つけます。ボックス内に、マイクロサービスの Pod 名が表示されます。この例では、マイクロサービスの Pod が 1 つしかないため、ボックスは 1 つしかありません。

    HPA Menu
  3. 次のコマンドを実行して、マイクロサービスに対して実行されている Pod が 1 つだけであることを確認します。

    $ oc get pods

    出力例

    NAME                                  READY     STATUS    RESTARTS   AGE
    ostoy-frontend-679cb85695-5cn7x       1/1       Running   0          1h
    ostoy-microservice-86b4c6f559-p594d   1/1       Running   0          1h

  4. ostoy-microservice-deployment.yaml をダウンロードし、ローカルマシンに保存します。
  5. 次の例を使用して、デプロイメント定義を 1 Pod から 3 Pod に変更します。

    spec:
        selector:
          matchLabels:
            app: ostoy-microservice
        replicas: 3
  6. 次のコマンドを実行してレプリカの変更を適用します。

    $ oc apply -f ostoy-microservice-deployment.yaml
    注記

    OpenShift Web コンソールで Workloads > Deployments > ostoy-microservice > YAML タブに移動して、ostoy-microservice-deployment.yaml ファイルを編集することもできます。

  7. 次のコマンドを実行して、Pod が 3 つあることを確認します。

    $ oc get pods

    出力から、マイクロサービスの Pod が 1 つではなく 3 つあることがわかります。

    出力例

    NAME                                  READY   STATUS    RESTARTS   AGE
    ostoy-frontend-5fbcc7d9-rzlgz         1/1     Running   0          26m
    ostoy-microservice-6666dcf455-2lcv4   1/1     Running   0          81s
    ostoy-microservice-6666dcf455-5z56w   1/1     Running   0          81s
    ostoy-microservice-6666dcf455-tqzmn   1/1     Running   0          26m

  8. CLI または Web UI を使用してアプリケーションをスケーリングします。

    • CLI で次のコマンドを実行して、Pod の数を 3 から 2 に減らします。

      $ oc scale deployment ostoy-microservice --replicas=2
    • OpenShift Web コンソール UI のナビゲーションメニューから、Workloads > Deployments > ostoy-microservice をクリックします。
    • ページの左側で、中心に "3 Pod" というラベルがある青い円を見つけます。
    • 円の横にある矢印を選択すると、Pod の数が増加します。下矢印を選択して 2 にします。

      UI Scale

検証

CLI、Web UI、または OSToy アプリケーションを使用して Pod の数を確認します。

  • CLI から次のコマンドを実行して、マイクロサービスに 2 つの Pod が使用されていることを確認します。

    $ oc get pods

    出力例

    NAME                                  READY   STATUS    RESTARTS   AGE
    ostoy-frontend-5fbcc7d9-rzlgz         1/1     Running   0          75m
    ostoy-microservice-6666dcf455-2lcv4   1/1     Running   0          50m
    ostoy-microservice-6666dcf455-tqzmn   1/1     Running   0          75m

  • Web UI で、Workloads > Deployments > ostoy-microservice を選択します。

    Verify the workload pods
  • OSToy アプリケーションのナビゲーションメニューで Networking を選択して、2 つの Pod が使用されていることを確認することもできます。2 つの Pod の色付きボックスが 2 つがあるはずです。

    UI Scale
18.9.1.2. Pod の自動スケーリング

Red Hat OpenShift Service on AWS は、Horizontal Pod Autoscaler (HPA) を備えています。HPA はメトリクスを使用して、必要に応じて Pod の数を増減します。

手順

  1. Web UI のナビゲーションメニューから、Pod Auto Scaling を選択します。

    HPA Menu
  2. 次のコマンドを実行して HPA を作成します。

    $ oc autoscale deployment/ostoy-microservice --cpu-percent=80 --min=1 --max=10

    このコマンドは、ostoy-microservice デプロイメントによって制御される Pod のレプリカを 1 - 10 個の間で維持する HPA を作成するものです。HPA は、デプロイメント全体のレプリカの数を増減して、すべての Pod の平均 CPU 使用率を 80% および 40 ミリコアに保ちます。

  3. Pod Auto Scaling > Horizontal Pod Autoscaling ページで、Increase the load を選択します。

    重要

    負荷が増加すると、が発生するため、ページが応答しなくなる可能性があります。これは予想どおりの反応です。Increase the Load は 1 回だけクリックしてください。プロセスの詳細は、このマイクロサービスの GitHub リポジトリー を参照してください。

    数分後、ページに新しい Pod が色付きのボックスで表示されます。

    注記

    ページに遅延が発生する可能性があります。

検証

次のいずれかの方法で Pod 数を確認します。

  • OSToy アプリケーションの Web UI で、Remote Pods ボックスを確認します。

    HPA Main

    Pod は 1 つしかないため、ワークロードを増やすと Pod も増加するはずです。

  • CLI で、次のコマンドを実行します。

    oc get pods --field-selector=status.phase=Running | grep microservice

    出力例

    ostoy-microservice-79894f6945-cdmbd   1/1     Running   0          3m14s
    ostoy-microservice-79894f6945-mgwk7   1/1     Running   0          4h24m
    ostoy-microservice-79894f6945-q925d   1/1     Running   0          3m14s

  • OpenShift Cluster Manager から自動スケーリングを確認することもできます。

    1. OpenShift Web コンソールのナビゲーションメニューで、Observe > Dashboards をクリックします。
    2. ダッシュボードで、Kubernetes / Compute Resources / Namespace (Pods) と namespace ostoy を選択します。

      Select metrics
    3. CPU とメモリーのリソース使用状況を示すグラフが表示されます。上のグラフは Pod ごとの最近の CPU 消費量を示し、下のグラフはメモリー使用量を示しています。グラフ内の記号の意味は次のとおりです。

      1. 負荷が増加しました (A)。
      2. 2 つの新しい Pod が作成されました (B および C)。
      3. 各グラフの幅は CPU 消費量を表し、どの Pod がより多くの負荷を処理したかを示しています。
      4. 負荷が減少し (D)、Pod が削除されました。

        Select metrics
18.9.1.3. ノードの自動スケーリング

Red Hat OpenShift Service on AWS では、ノードの自動スケーリング を使用できます。ここでは、クラスターが処理できない大きなワークロードを持つジョブを含む新しいプロジェクトを作成します。自動スケーリングが有効な場合、負荷が現在の容量を超えたときに、クラスターが負荷を処理するために新しいノードを自動的に作成します。

前提条件

  • マシンプールで自動スケーリングが有効になっている。

手順

  1. 次のコマンドを実行して、autoscale-ex という新しいプロジェクトを作成します。

    $ oc new-project autoscale-ex
  2. 次のコマンドを実行してジョブを作成します。

    $ oc create -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/job-work-queue.yaml
  3. 数分後、次のコマンドを実行して Pod を確認します。

    $ oc get pods

    出力例

    NAME                     READY   STATUS    RESTARTS   AGE
    work-queue-5x2nq-24xxn   0/1     Pending   0          10s
    work-queue-5x2nq-57zpt   0/1     Pending   0          10s
    work-queue-5x2nq-58bvs   0/1     Pending   0          10s
    work-queue-5x2nq-6c5tl   1/1     Running   0          10s
    work-queue-5x2nq-7b84p   0/1     Pending   0          10s
    work-queue-5x2nq-7hktm   0/1     Pending   0          10s
    work-queue-5x2nq-7md52   0/1     Pending   0          10s
    work-queue-5x2nq-7qgmp   0/1     Pending   0          10s
    work-queue-5x2nq-8279r   0/1     Pending   0          10s
    work-queue-5x2nq-8rkj2   0/1     Pending   0          10s
    work-queue-5x2nq-96cdl   0/1     Pending   0          10s
    work-queue-5x2nq-96tfr   0/1     Pending   0          10s

  4. Pending 状態の Pod が多数あるため、このステータスによってオートスケーラーがトリガーされ、マシンプールにさらにノードが作成されます。これらのワーカーノードが作成されるまで待ちます。
  5. 数分後、次のコマンドを使用して、現在のワーカーノードの数を確認します。

    $ oc get nodes

    出力例

    NAME                                         STATUS   ROLES          AGE     VERSION
    ip-10-0-138-106.us-west-2.compute.internal   Ready    infra,worker   22h     v1.23.5+3afdacb
    ip-10-0-153-68.us-west-2.compute.internal    Ready    worker         2m12s   v1.23.5+3afdacb
    ip-10-0-165-183.us-west-2.compute.internal   Ready    worker         2m8s    v1.23.5+3afdacb
    ip-10-0-176-123.us-west-2.compute.internal   Ready    infra,worker   22h     v1.23.5+3afdacb
    ip-10-0-195-210.us-west-2.compute.internal   Ready    master         23h     v1.23.5+3afdacb
    ip-10-0-196-84.us-west-2.compute.internal    Ready    master         23h     v1.23.5+3afdacb
    ip-10-0-203-104.us-west-2.compute.internal   Ready    worker         2m6s    v1.23.5+3afdacb
    ip-10-0-217-202.us-west-2.compute.internal   Ready    master         23h     v1.23.5+3afdacb
    ip-10-0-225-141.us-west-2.compute.internal   Ready    worker         23h     v1.23.5+3afdacb
    ip-10-0-231-245.us-west-2.compute.internal   Ready    worker         2m11s   v1.23.5+3afdacb
    ip-10-0-245-27.us-west-2.compute.internal    Ready    worker         2m8s    v1.23.5+3afdacb
    ip-10-0-245-7.us-west-2.compute.internal     Ready    worker         23h     v1.23.5+3afdacb

    ワークロードを処理するためにワーカーノードが自動的に作成されたことがわかります。

  6. 次のコマンドを入力して、OSToy アプリケーションに戻ります。

    $ oc project ostoy

18.10. チュートリアル: ロギング

Red Hat OpenShift Service on AWS (ROSA) では、さまざまな方法でログを表示できます。以下の手順では、ログを AWS CloudWatch に転送し、oc logs を使用して Pod から直接ログを表示します。

注記

ROSA にはロギングソリューションが事前設定されていません。

18.10.1. CloudWatch へのログの転送

ログを AWS CloudWatch に転送するには、ロギングアドオンサービスをインストールします。

  1. 次のスクリプトを実行して、ROSA クラスターからログを CloudWatch に転送するように設定します。

    $ curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/configure-cloudwatch.sh | bash
    注記

    ROSA からログを CloudWatch に送信するように設定する方法は、このチュートリアルの範囲を超えています。AWS との統合と CloudWatch ロギングの有効化は、ROSA の重要な側面です。そのため、設定プロセスを簡素化するために、スクリプトが同梱されています。このスクリプトにより、AWS CloudWatch が自動的に設定されます。スクリプトを調べると、必要な手順を理解することができます。

    出力例

    Varaibles are set...ok.
    Policy already exists...ok.
    Created RosaCloudWatch-mycluster role.
    Attached role policy.
    Deploying the Red Hat OpenShift Logging Operator
    namespace/openshift-logging configured
    operatorgroup.operators.coreos.com/cluster-logging created
    subscription.operators.coreos.com/cluster-logging created
    Waiting for Red Hat OpenShift Logging Operator deployment to complete...
    Red Hat OpenShift Logging Operator deployed.
    secret/cloudwatch-credentials created
    clusterlogforwarder.logging.openshift.io/instance created
    clusterlogging.logging.openshift.io/instance created
    Complete.

  2. 数分後、AWS CloudWatch 内にロググループが表示され始めます。次のコマンドを実行してロググループを表示します。

    $ aws logs describe-log-groups --log-group-name-prefix rosa-mycluster

    出力例

    {
        "logGroups": [
            {
                "logGroupName": "rosa-mycluster.application",
                "creationTime": 1724104537717,
                "metricFilterCount": 0,
                "arn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.application:*",
                "storedBytes": 0,
                "logGroupClass": "STANDARD",
                "logGroupArn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.application"
            },
            {
                "logGroupName": "rosa-mycluster.audit",
                "creationTime": 1724104152968,
                "metricFilterCount": 0,
                "arn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.audit:*",
                "storedBytes": 0,
                "logGroupClass": "STANDARD",
                "logGroupArn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.audit"
            },

18.10.2. ストリームとログへのデータの出力

  1. メッセージを stdout に出力します。

    1. OSToy アプリケーションで、Home をクリックし、Log Message (stdout) のメッセージボックスをクリックします。
    2. stdout ストリームに出力するメッセージ ("All is well!" など) を書き込みます。
    3. Send Message をクリックします。

      cloud experts deploying application logging ostoy stdout

  2. メッセージを stderr に出力します。

    1. Log Message (stderr) のメッセージボックスをクリックします。
    2. stderr ストリームに出力するメッセージ ("Oh no! Error!" など) を書き込みます。
    3. Send Message をクリックします。

      cloud experts deploying application logging ostoy stderr

18.10.3. oc コマンドを使用したアプリケーションログの表示

  1. コマンドラインインターフェイス (CLI) で次のコマンドを入力して、フロントエンド Pod の名前を取得します。

    $ oc get pods -o name

    出力例

    pod/ostoy-frontend-679cb85695-5cn7x 1
    pod/ostoy-microservice-86b4c6f559-p594d

    1
    Pod 名は ostoy-frontend-679cb85695-5cn7x です。
  2. 次のコマンドを実行して、stdoutstderr 両方のメッセージを表示します。

    $ oc logs <pod-name>

    出力例

    $ oc logs ostoy-frontend-679cb85695-5cn7x
    [...]
    ostoy-frontend-679cb85695-5cn7x: server starting on port 8080
    Redirecting to /home
    stdout: All is well!
    stderr: Oh no! Error!

18.10.4. CloudWatch でのログの表示

  1. AWS Web コンソールCloudWatch に移動します。
  2. 左側のメニューで、Logs をクリックし、Log groups をクリックして、さまざまなロググループを表示します。次の 3 つのグループがあるはずです。

    • rosa-<cluster-name>.application
    • rosa-<cluster-name>.audit
    • rosa-<cluster-name>.infrastructure

      cloud experts deploying application logging cw

  3. rosa-<cluster-name>.application をクリックします。
  4. フロントエンド Pod のログストリームをクリックします。

    cloud experts deploying application logging logstream2

  5. stdoutstderr のフィルター。
  6. 行を展開すると、以前に入力したメッセージやその他の関連情報が表示されます。

    cloud experts deploying application logging stderr

  7. ログストリームに戻り、マイクロサービスを選択します。
  8. 検索バーに "microservice" と入力して、ログ内の他のメッセージを確認します。
  9. エントリーの 1 つを展開すると、フロントエンド Pod がマイクロサービスから受信した色と、その色をフロントエンド Pod に送信した Pod が表示されます。

    cloud experts deploying application logging messages

18.11. チュートリアル: S2I デプロイメント

OpenShift でアプリケーションをデプロイする方法はいくつかあります。このチュートリアルでは、統合された Source-to-Image (S2I) ビルダーの使用について説明します。OpenShift の概念 セクションで述べたように、S2I は再現可能な Docker 形式のコンテナーイメージをビルドするためのツールです。

18.11.1. 前提条件

このチュートリアルを使用する前に、次の要件を満たしている必要があります。

  1. ROSA クラスターの作成を完了します。
  2. ログインコマンドを取得します。

    1. CLI 経由でログインしていない場合は、OpenShift Cluster Manager で、右上の名前の横にあるドロップダウン矢印をクリックし、Copy Login Command を選択します。

      CLI Login
    2. 新しいタブが開きます。ユーザー名とパスワードを入力し、認証方法を選択します。
    3. Display Token をクリックします。
    4. "Log in with this token" の下のコマンドをコピーします。
    5. コピーしたコマンドをターミナルで実行して、コマンドラインインターフェイス (CLI) にログインします。次のような出力が表示されるはずです。

      $ oc login --token=RYhFlXXXXXXXXXXXX --server=https://api.osd4-demo.abc1.p1.openshiftapps.com:6443

      出力例

      Logged into "https://api.myrosacluster.abcd.p1.openshiftapps.com:6443" as "rosa-user" using the token provided.
      
      You don't have any projects. You can try to create a new project, by running
      
      oc new-project <project name>

  3. 次のコマンドを実行して、CLI から新しいプロジェクトを作成します。

    $ oc new-project ostoy-s2i

18.11.2. OSToy リポジトリーのフォーク

次のセクションでは、ソースコードの変更に基づいて自動ビルドをトリガーする方法を主に取り上げます。GitHub リポジトリーにコードをプッシュしたときに S2I ビルドをトリガーするには、GitHub Webhook を設定する必要があります。Webhook を設定するには、まずリポジトリーをフォークする 必要があります。

注記

このガイドで以下に示す URL の <UserName> は、自分の GitHub ユーザー名に置き換えてください。

18.11.3. S2i を使用してクラスターに OSToy をデプロイする

  1. OpenShift にシークレットを追加する

    この例では、.env ファイルをエミュレートし、これを OpenShift 環境に直接移動する簡単な方法を示します。Secret 内でファイルの名前を変更することもできます。CLI で次のコマンドを入力します。<UserName> は、GitHub ユーザー名に置き換えてください。

    $ oc create -f https://raw.githubusercontent.com/<UserName>/ostoy/master/deployment/yaml/secret.yaml
  2. OpenShift に ConfigMap を追加する

    この例では、HAProxy 設定ファイルをエミュレートします。これは、通常 OpenShift アプリケーションのデフォルト設定をオーバーライドするために使用されます。ConfigMap でファイルの名前を変更することもできます。

    CLI で次のコマンドを入力します。<UserName> は、GitHub ユーザー名に置き換えてください。

    $ oc create -f https://raw.githubusercontent.com/<UserName>/ostoy/master/deployment/yaml/configmap.yaml
  3. マイクロサービスをデプロイする

    UI アプリケーションから SERVICE 環境変数を使用できるように、まずマイクロサービスをデプロイする必要があります。--context-dir は、ここでは git リポジトリー内の microservice ディレクトリーで定義されたアプリケーションのみをビルドするために使用します。app ラベルを使用すると、UI アプリケーションとマイクロサービスの両方が OpenShift UI で確実にグループ化されます。CLI で次のコマンドを実行してマイクロサービスを作成します。<UserName> は、GitHub ユーザー名に置き換えてください。

    $ oc new-app https://github.com/<UserName>/ostoy \
        --context-dir=microservice \
        --name=ostoy-microservice \
        --labels=app=ostoy

    出力例

    --> Creating resources with label app=ostoy ...
        imagestream.image.openshift.io "ostoy-microservice" created
        buildconfig.build.openshift.io "ostoy-microservice" created
        deployment.apps "ostoy-microservice" created
        service "ostoy-microservice" created
    --> Success
        Build scheduled, use 'oc logs -f buildconfig/ostoy-microservice' to track its progress.
        Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
         'oc expose service/ostoy-microservice'
        Run 'oc status' to view your app.

  4. マイクロサービスのステータスを確認する

    次のステップに進む前に、次のコマンドを実行して、マイクロサービスが作成され、正しく実行されていることを確認する必要があります。

    $ oc status

    出力例

    In project ostoy-s2i on server https://api.myrosacluster.g14t.p1.openshiftapps.com:6443
    
    svc/ostoy-microservice - 172.30.47.74:8080
      dc/ostoy-microservice deploys istag/ostoy-microservice:latest <-
        bc/ostoy-microservice source builds https://github.com/UserName/ostoy on openshift/nodejs:14-ubi8
        deployment #1 deployed 34 seconds ago - 1 pod

    正常にデプロイされたことが表示されるまで待ちます。Web UI からこれを確認することもできます。

  5. フロントエンド UI をデプロイする

    このアプリケーションは、いくつかの環境変数に依存して外部設定を定義するように設計されています。後で、以前に作成した Secret と ConfigMap をアタッチし、PersistentVolume を作成します。CLI に次のように入力します。

    $ oc new-app https://github.com/<UserName>/ostoy \
        --env=MICROSERVICE_NAME=OSTOY_MICROSERVICE

    出力例

    --> Creating resources ...
        imagestream.image.openshift.io "ostoy" created
        buildconfig.build.openshift.io "ostoy" created
        deployment.apps "ostoy" created
        service "ostoy" created
    --> Success
        Build scheduled, use 'oc logs -f buildconfig/ostoy' to track its progress.
        Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
         'oc expose service/ostoy'
        Run 'oc status' to view your app.

  6. デプロイメントを更新する

    永続ボリュームを使用した一貫性のあるデプロイメントを実現するために、(デフォルトの RollingUpdate ではなく) "Recreate" デプロイメントストラテジーを使用するようにデプロイメントを更新します。これが必要な理由は、PV が EBS を基盤としており、RWO 方式のみをサポートしているためです。既存の Pod をすべて強制終了せずにデプロイメントを更新すると、PV が既存の Pod にバインドされたままであるため、新しい Pod をスケジュールして PV の PVC を作成できない可能性があります。EFS を使用する場合は、これを変更する必要はありません。

    $ oc patch deployment ostoy --type=json -p \
        '[{"op": "replace", "path": "/spec/strategy/type", "value": "Recreate"}, {"op": "remove", "path": "/spec/strategy/rollingUpdate"}]'
  7. liveness プローブを設定する

    アプリケーション内に異常が発生した場合に Pod が確実に再起動するように、デプロイメントに Liveness Probe を作成します。CLI に次のように入力します。

    $ oc set probe deployment ostoy --liveness --get-url=http://:8080/health
  8. Secret、ConfigMap、PersistentVolume をデプロイメントにアタッチする

    次のコマンドを実行して、Secret、ConfigMap、および PersistentVolume をアタッチします。

    1. Secret のアタッチ

      $ oc set volume deployment ostoy --add \
          --secret-name=ostoy-secret \
          --mount-path=/var/secret
    2. ConfigMap のアタッチ

      $ oc set volume deployment ostoy --add \
          --configmap-name=ostoy-config \
          -m /var/config
    3. PersistentVolume の作成およびアタッチ

      $ oc set volume deployment ostoy --add \
          --type=pvc \
          --claim-size=1G \
          -m /var/demo_files
  9. UI アプリケーションを OpenShift ルートとして公開する

    次のコマンドを実行して、同梱の TLS ワイルドカード証明書を使用する HTTPS アプリケーションとしてこれをデプロイします。

    $ oc create route edge --service=ostoy --insecure-policy=Redirect
  10. 次の方法でアプリケーションを参照する

    • 次のコマンドを実行すると、OSToy アプリケーションが Web ブラウザーで開きます。

      $ python -m webbrowser "$(oc get route ostoy -o template --template='https://{{.spec.host}}')"
    • 次のコマンドを実行すると、アプリケーションのルートを取得し、そのルートをコピーしてブラウザーに貼り付けることができます。

      $ oc get route

18.12. チュートリアル: Source-to-Image (S2I) Webhook を使用した自動デプロイ

Webhook を使用して、ソースコードを変更するたびに、ビルドとデプロイを自動的にトリガーします。このプロセスの詳細は、Triggering Builds を参照してください。

手順

  1. GitHub Webhook トリガーのシークレットを取得するために、ターミナルで次のコマンドを実行します。

    $ oc get bc/ostoy-microservice -o=jsonpath='{.spec.triggers..github.secret}'

    出力例

    `o_3x9M1qoI2Wj_cz1WiK`

    重要

    このプロセスの後のステップでこのシークレットを使用する必要があります。

  2. OSToy の buildconfig から GitHub Webhook トリガーの URL を取得するために、次のコマンドを実行します。

    $ oc describe bc/ostoy-microservice

    出力例

    [...]
    Webhook GitHub:
    	URL:	https://api.demo1234.openshift.com:443/apis/build.openshift.io/v1/namespaces/ostoy-s2i/buildconfigs/ostoy/webhooks/<secret>/github
    [...]

  3. GitHub Webhook URL の <secret> テキストを、取得したシークレットに置き換えます。実際の URL は、次の出力例のようになります。

    出力例

    https://api.demo1234.openshift.com:443/apis/build.openshift.io/v1/namespaces/ostoy-s2i/buildconfigs/ostoy-microservice/webhooks/o_3x9M1qoI2Wj_czR1WiK/github

  4. GitHub リポジトリーで Webhook URL を設定します。

    1. リポジトリーで、Settings > Webhooks > Add webhook をクリックします。

      Webhook の追加
    2. "Payload URL" フィールドに、Secret を含む GitHub Webhook URL を貼り付けます。
    3. "Content type" を application/json に変更します。
    4. Add webhook ボタンをクリックします。

      Finish Add Webhook

      Webhook が正常に設定されたことを示す GitHub のメッセージが表示されます。これで、GitHub リポジトリーに変更をプッシュするたびに、新しいビルドが自動的に開始し、ビルドが成功すると新しいデプロイが開始します。

  5. ソースコードを変更します。変更すると、ビルドとデプロイが自動的にトリガーされます。この例では、OSToy アプリケーションのステータスを示す色がランダムに選択されます。設定をテストするために、グレースケールのみを表示するようにボックスを変更します。

    1. リポジトリー内のソースコード https://github.com/<username>/ostoy/blob/master/microservice/app.js に移動します。
    2. ファイルを編集します。
    3. 8 行目 (let randomColor = getRandomColor(); を含む行) をコメントアウトします。
    4. 9 行目 (let randomColor = getRandomGrayScaleColor(); を含む行) のコメントを解除します。

      7   app.get('/', function(request, response) {
      8   //let randomColor = getRandomColor(); // <-- comment this
      9   let randomColor = getRandomGrayScaleColor(); // <-- uncomment this
      10
      11  response.writeHead(200, {'Content-Type': 'application/json'});
    5. "changed box to grayscale colors" など、更新を示すメッセージを入力します。
    6. 下部の Commit クリックして、変更をメインブランチにコミットします。
  6. クラスターの Web UI で、Builds > Builds をクリックして、ビルドのステータスを確認します。このビルドが完了すると、デプロイが開始します。ターミナルで oc status を実行してステータスを確認することもできます。

    Build Run
  7. デプロイが完了したら、ブラウザーで OSToy アプリケーションに戻ります。左側の Networking メニュー項目にアクセスします。ボックスの色がグレースケールの色だけに制限されるようになります。

    灰色

18.13. チュートリアル: AWS サービスとの統合

OSToy アプリケーションは独立して機能しますが、実際のアプリケーションの多くは、データベース、オブジェクトストア、メッセージングサービスなどの外部サービスを必要とします。

目的

  • OSToy アプリケーションを、他の Amazon Web Services (AWS) サービス、具体的には AWS S3 Storage と統合する方法を説明します。このセクションを完了すると、アプリケーションが AWS S3 Storage からオブジェクトをセキュアに作成して読み取るようになります。
  • Amazon Controller for Kubernetes (ACK) を使用して、Kubernetes からアプリケーションに必要なサービスを直接作成します。
  • アクセスと認証の管理のために、サービスアカウントの Identity and Access Management (IAM) ロールを使用します。
  • OSToy を使用して基本的なテキストファイルを作成し、S3 バケットに保存します。
  • ファイルが正常に追加されたこと、およびバケットからファイルを読み取れることを確認します。

18.13.1. Amazon Controller for Kubernetes (ACK)

ACK を使用して、Kubernetes から直接 AWS サービスを作成して使用します。よく知られた構造を使用して S3 バケットや Relational Database Service (RDS) データベースなどの AWS サービスを宣言的に定義および作成することで、Kubernetes フレームワークにアプリケーションを直接デプロイできます。

ACK を使用すると、S3 バケットを作成し、それを OSToy アプリケーションと統合し、そのバケットにファイルをアップロードして、アプリケーションでファイルを表示できます。

18.13.2. サービスアカウントの IAM ロール

サービスアカウントの IAM ロールを使用すると、Kubernetes サービスアカウントに IAM ロールを直接割り当てることができます。これを使用して、ACK コントローラーの認証情報を付与し、AWS アカウントにサービスをデプロイできます。サービスアカウントの IAM ロール は、一時的な認証情報の管理とローテーションの自動化に使用します。

Pod は、有効な OpenID Connect (OIDC) JSON Web トークン (JWT) を受け取り、それを AWS STS AssumeRoleWithWebIdentity API の操作に渡して、IAM の一時的なロール認証情報を受け取ります。このプロセスは、AWS IAM アクセスを必要とする Pod を変更する EKS Pod アイデンティティー変更 Webhook に依存しています。

サービスアカウントの IAM ロールは、次のベストプラクティスに準拠しています。

  • 最小権限の原則: 制限付きのアクセスだけを許可する AWS ロールの IAM 権限を作成できます。この権限は、ロールに関連付けられたサービスアカウントに制限されており、そのサービスアカウントを使用する Pod からのみアクセスできます。
  • 認証情報の分離: Pod が取得できるのは、Pod が使用しているサービスアカウントに関連付けられた IAM ロールの認証情報だけです。
  • 監査: すべての AWS リソースアクセスを CloudTrail で確認できます。

18.13.3. ACK コントローラーのインストール

バケットの Kubernetes カスタムリソースを使用して S3 サービスでバケットを作成および削除するために、ACK コントローラーをインストールします。コントローラーをインストールすると、必要な namespace とサービスアカウントが作成されます。

簡素化のために、Operator を使用します。Operator をインストールすると、ack-system namespace とサービスアカウント ack-s3-controller が作成されます。

  1. クラスターコンソールにログインします。
  2. 左側のメニューで、Operator をクリックし、OperatorHub をクリックします。
  3. フィルターボックスに "S3" と入力し、AWS Controller for Kubernetes - Amazon S3 を選択します。

    cloud experts deploying integrating ack operator

  4. コミュニティー Operator に関するポップアップが表示された場合は、Continue をクリックします。
  5. Install をクリックします。
  6. "Installation mode" で All namespaces on the cluster を選択します。
  7. "Installed Namespace" で ack-system を選択します。
  8. "Update approval" で Manual を選択します。

    重要

    サービスアカウントへの変更が Operator 自動更新によって上書きされないように、必ず Manual Mode を選択してください。

  9. Install をクリックします。

    設定は以下の画像のようになるはずです。

    cloud experts deployment integrating ack install

  10. Approve をクリックします。
  11. インストールが開始しますが、ACK コントローラー用の IAM ロールとポリシーを作成するまで完了しません。

18.13.4. ACK コントローラー用の IAM ロールとポリシーの作成

  1. 次のいずれかのスクリプトを実行して、ACK コントローラー用の AWS IAM ロールを作成し、S3 ポリシーを割り当てます。

    • setup-s3-ack-controller.sh スクリプトを自動的にダウンロードします。このスクリプトはプロセスを自動化するものです。
    • コマンドラインインターフェイス (CLI) で次のスクリプトを実行します。

      $ curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/setup-s3-ack-controller.sh | bash
  2. スクリプトが完了すると、デプロイメントが再起動し、サービスアカウント環境変数の IAM ロールを使用してサービスコントローラー Pod が更新されます。
  3. 次のコマンドを実行して、環境変数が設定されていることを確認します。

    $ oc describe pod ack-s3-controller -n ack-system | grep "^\s*AWS_"

    出力例

    AWS_ROLE_ARN:                 arn:aws:iam::000000000000:role/ack-s3-controller
    AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token

  4. Web コンソールで OperatorInstalled Operators の順にクリックして、ACK コントローラーが正常にセットアップされたことを確認します。

    cloud experts deployment installing ack oper installed

  5. Operator のインストールと環境変数が正常に表示されない場合は、次のコマンドを実行して手動でデプロイメントを再起動します。

    $ oc rollout restart deployment ack-s3-controller -n ack-system

18.13.5. アプリケーションへのアクセスの設定

OSToy が S3 バケットのオブジェクトを読み書きできるように、AWS IAM ロールとサービスアカウントを作成できます。

  1. 次のコマンドを実行して、OSToy 用の新しい一意のプロジェクトを作成します。

    $ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
  2. 次のコマンドを実行して、namespace とプロジェクトの名前を環境変数に保存します。

    $ export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')

18.13.6. AWS IAM ロールの作成

  1. 次のコマンドを実行して AWS アカウント ID を取得します。

    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
  2. 次のコマンドを実行して OIDC プロバイダーを取得します (<cluster-name> はクラスターの名前に置き換えます)。

    $ export OIDC_PROVIDER=$(rosa describe cluster -c <cluster-name> -o yaml | awk '/oidc_endpoint_url/ {print $2}' | cut -d '/' -f 3,4)
  3. 次のコマンドを実行して、信頼ポリシーファイルを作成します。

    $ cat <<EOF > ./ostoy-sa-trust.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "${OIDC_PROVIDER}:sub": "system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa"
            }
          }
        }
      ]
    }
    EOF
  4. 次のコマンドを実行して、サービスアカウントで使用する AWS IAM ロールを作成します。

    $ aws iam create-role --role-name "ostoy-sa-role" --assume-role-policy-document file://ostoy-sa-trust.json

18.13.7. IAM ロールへの S3 ポリシーの割り当て

  1. 次のコマンドを実行して、S3 フルアクセスポリシー ARN を取得します。

    $ export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)
  2. 次のコマンドを実行して、ポリシーを AWS IAM ロールに割り当てます。

    $ aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"

18.13.8. Pod 用のサービスアカウントの作成

  1. 次のコマンドを実行して、作成した AWS IAM ロールの ARN を取得し、サービスアカウントを作成するときにアノテーションとして追加されるようにします。

    $ export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)
  2. 次のコマンドを実行してサービスアカウントを作成します。

    $ cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ostoy-sa
      namespace: ${OSTOY_NAMESPACE}
      annotations:
        eks.amazonaws.com/role-arn: "$APP_IAM_ROLE_ARN"
    EOF
    重要

    サービスアカウントの名前を "ostoy-sa" から変更しないでください。変更すると、AWS IAM ロールの信頼関係を変更する必要があります。

  3. 次のコマンドを実行して、サービスアカウントに restricted ロールを付与します。

    $ oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa
  4. 次のコマンドを実行して、アノテーションが正常に追加されていることを確認します。

    $ oc describe serviceaccount ostoy-sa -n ${OSTOY_NAMESPACE}

    出力例

    Name:                ostoy-sa
    Namespace:           ostoy
    Labels:              <none>
    Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::000000000000:role/ostoy-sa-role
    Image pull secrets:  ostoy-sa-dockercfg-b2l94
    Mountable secrets:   ostoy-sa-dockercfg-b2l94
    Tokens:              ostoy-sa-token-jlc6d
    Events:              <none>

18.13.9. S3 バケットの作成

  1. 次のコマンドを実行して、マニフェストファイルを使用して S3 バケットを作成します。

    $ cat <<EOF | oc apply -f -
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
      name: ${OSTOY_NAMESPACE}-bucket
      namespace: ${OSTOY_NAMESPACE}
    spec:
      name: ${OSTOY_NAMESPACE}-bucket
    EOF
    重要

    OSToy アプリケーションは、<namespace>-bucket という名前のバケットが検出されることを想定しています。OSToy プロジェクトの namespace 以外を使用すると、この機能が動作しません。たとえば、プロジェクトが "ostoy" の場合、name の値を ostoy-bucket にする必要があります。

  2. 次のコマンドを実行して、バケットが作成されたことを確認します。

    $ aws s3 ls | grep ${OSTOY_NAMESPACE}-bucket

18.13.10. 新しいサービスアカウントを使用した OSToy アプリケーションの再デプロイ

  1. 作成したサービスアカウントを使用して Pod を実行します。
  2. 次のコマンドを実行してマイクロサービスをデプロイします。

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
  3. 次のコマンドを実行して ostoy-frontend をデプロイします。

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
  4. 次のコマンドを実行して、ostoy-frontend デプロイメントにパッチを適用します。

    $ oc patch deploy ostoy-frontend -n ${OSTOY_NAMESPACE} --type=merge --patch '{"spec": {"template": {"spec":{"serviceAccount":"ostoy-sa"}}}}'

    出力例

    spec:
      # Uncomment to use with ACK portion of the workshop
      # If you chose a different service account name please replace it.
      serviceAccount: ostoy-sa
      containers:
      - name: ostoy-frontend
        image: quay.io/ostoylab/ostoy-frontend:1.6.0
        imagePullPolicy: IfNotPresent
    [...]

  5. Pod が更新されるまで待ちます。

18.13.11. 環境変数の確認

  • 次のコマンドを使用して Pod を describe し、アプリケーションに AWS_WEB_IDENTITY_TOKEN_FILE および AWS_ROLE_ARN 環境変数が存在することを確認します。

    $ oc describe pod ostoy-frontend -n ${OSTOY_NAMESPACE} | grep "^\s*AWS_"

    出力例

    AWS_ROLE_ARN:                 arn:aws:iam::000000000000:role/ostoy-sa
    AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token

18.13.12. OSToy を使用したバケットの内容の表示

アプリケーションを使用して S3 バケットの内容を表示します。

  1. 次のコマンドを実行して、新しくデプロイされたアプリケーションのルートを取得します。

    $ oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'
  2. 新しいブラウザータブを開き、前のステップで取得したルートを入力します。

    重要

    https:// ではなく http:// を必ず使用してください。

  3. OSToy の左側のメニューで ACK S3 をクリックします。
  4. 新しいバケットであるため、バケットは空であるはずです。

    cloud expert deploying integrating ack views3contents

18.13.13. S3 バケットへのファイル作成

OStoy を使用してファイルを作成し、S3 バケットにアップロードします。S3 はあらゆる種類のファイルを受け入れることができますが、このチュートリアルでは、コンテンツをブラウザーで簡単にレンダリングできるようにテキストファイルを使用します。

  1. OSToy の左側のメニューで ACK S3 をクリックします。
  2. 下にスクロールして、Upload a text file to S3 に移動します。
  3. ファイルのファイル名を入力します。
  4. ファイルの内容を入力します。
  5. Create file をクリックします。

    cloud expert deploying integrating ack creates3obj

  6. 上部にある既存ファイルのセクションまでスクロールし、作成したファイルがそこにあることを確認します。
  7. ファイル名をクリックしてファイルを表示します。

    cloud experts deploying integrating ack viewobj

  8. AWS CLI で次のコマンドを実行して、バケットの内容をリスト表示して確認します。

    $ aws s3 ls s3://${OSTOY_NAMESPACE}-bucket

    出力例

    $ aws s3 ls s3://ostoy-bucket
    2023-05-04 22:20:51         51 OSToy.txt

Legal Notice

Copyright © 2024 Red Hat, Inc.

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.