ユーザーガイド


OpenShift sandboxed containers 1.9

OpenShift Container Platform での Sandboxed Container のデプロイ

Red Hat Customer Content Services

概要

ベアメタル、パブリッククラウド、および IBM プラットフォームの OpenShift Container Platform への OpenShift sandboxed containers のデプロイ

はじめに

Red Hat ドキュメントへのフィードバック (英語のみ)

Jira で Create Issue フォームを送信することで、フィードバックを提供したり、エラーを報告したりできます。Jira の課題は、Red Hat Hybrid Cloud Infrastructure Jira プロジェクトに作成されるため、フィードバックの進行状況を追跡できます。

  1. Jira にログインしていることを確認してください。Jira アカウントをお持ちでない場合は、Red Hat Jira アカウント を作成する必要があります。
  2. Create Issue フォーム を起動します。
  3. Summary フィールド、Description フィールド、および Reporter フィールドに入力します。

    Description フィールドに、ドキュメントの URL、章またはセクション番号、および問題の詳しい説明を入力します。

  4. Create をクリックします。

第1章 OpenShift Sandboxed Containers について

OpenShift Container Platform の OpenShift sandboxed container は、Kata Containers をオプションのランタイムとして統合し、軽量の仮想マシンでコンテナー化されたアプリケーションを実行することで、セキュリティーおよび分離を強化します。このインテグレーションにより、既存の OpenShift ワークフローに大きな変更を加えることなく、機密性の高いワークロードに対してより安全なランタイム環境が提供されます。このランタイムは、専用の仮想マシン (VM) でコンテナーをサポートし、ワークロードの分離を改善します。

1.1. 機能

OpenShift Sandboxed Containers は、次の機能を提供します。

特権または信頼できないワークロードを実行する

特権コンテナーを実行することでクラスターノードが危険にさらされることなく、特定の特権を必要とするワークロードを安全に実行できます。特別な権限を必要とするワークロードには、次のものがあります。

  • たとえば、低レベルのネットワーク機能にアクセスするために、CRI-O などの標準コンテナーランタイムによって付与されるデフォルトの機能を超えて、カーネルからの特別な機能を必要とするワークロード。
  • 特定の物理デバイスにアクセスする場合など、ルート権限の昇格が必要なワークロード。OpenShift Sandboxed Containers を使用すると、特定のデバイスのみを仮想マシン (VM) に渡すことができるため、ワークロードがシステムの残りの部分にアクセスしたり、設定を誤ったりすることはありません。
  • set-uid ルートバイナリーをインストールまたは使用するためのワークロード。これらのバイナリーは特別な権限を付与するため、セキュリティーリスクが生じる可能性があります。OpenShift Sandboxed Containers を使用すると、追加の権限は仮想マシンに制限され、クラスターノードへの特別なアクセスは許可されません。

    一部のワークロードでは、特にクラスターノードを設定するための特権が必要です。このようなワークロードは、仮想マシンで実行すると機能しなくなるため、引き続き特権コンテナーを使用する必要があります。

機密性の高いワークロードを分離する
OpenShift Container Platform の Red Hat OpenShift sandboxed container は、Kata Containers をオプションのランタイムとして統合し、軽量の仮想マシンでコンテナー化されたアプリケーションを実行することで、セキュリティーおよび分離を強化します。このインテグレーションにより、既存の OpenShift ワークフローに大きな変更を加えることなく、機密性の高いワークロードに対してより安全なランタイム環境が提供されます。このランタイムは、専用の仮想マシン (VM) でコンテナーをサポートし、ワークロードの分離を改善します。
各ワークロードのカーネルを確実に分離する
カスタムカーネルチューニング (sysctl、スケジューラーの変更、キャッシュチューニングなど) とカスタムカーネルモジュール (ツリー外 または特別な引数など) の作成を必要とするワークロードを実行できます。
テナント全体で同じワークロードを共有する
同じ OpenShift Container Platform クラスターを共有するさまざまな組織のユーザー (テナント) を多数サポートするワークロードを実行できます。このシステムは、コンテナーネットワーク機能 (CNF) やエンタープライズアプリケーションなど、複数のベンダーからのサードパーティーワークロードの実行もサポートします。たとえば、サードパーティーの CNF は、カスタム設定がパケットチューニングや他のアプリケーションによって設定された sysctl 変数に干渉することを望まない場合があります。完全に分離されたカーネル内で実行すると、"ノイジーネイバー" 設定の問題を防ぐのに役立ちます。
ソフトウェアのテストに適した分離とサンドボックスがあることを確認する
既知の脆弱性がある、コンテナー化されたワークロードを実行したり、レガシーアプリケーションの問題を処理したりできます。この分離により、管理者は Pod に対する管理制御を開発者に付与することができます。これは、開発者が、管理者が通常許可する設定を超えて設定をテストまたは検証したい場合に役立ちます。たとえば、管理者はカーネルパケットフィルタリング (eBPF) を安全かつ確実に開発者に委譲できます。eBPF には CAP_ADMIN または CAP_BPF 権限が必要となるため、標準の CRI-O 設定では許可されません。Container Host ワーカーノード上のすべてのプロセスへのアクセスを許可することになるためです。同様に、管理者は SystemTap などの侵入型ツールへのアクセスを許可したり、開発中にカスタムカーネルモジュールの読み込みをサポートしたりできます。
仮想マシン境界を使用して、デフォルトのリソースに含まれるようにする
デフォルトでは、OpenShift sandboxed containers は、CPU、メモリー、ストレージ、ネットワークなどのリソースを堅牢かつ安全な方法で管理します。OpenShift Sandboxed Containers は仮想マシンにデプロイされるため、分離とセキュリティーのレイヤーを追加することで、リソースへのアクセスをよりきめ細かく制御できます。たとえば、コンテナーが誤っている場合は、仮想マシンで使用できる以上のメモリーを割り当てることができません。逆に、ネットワークカードまたはディスクへの専用アクセスが必要なコンテナーは、他のデバイスにアクセスすることなく、そのデバイスを完全に制御できます。

1.2. OpenShift Container Platform との互換性

OpenShift Container Platform プラットフォームに必要な機能は、次の 2 つの主要コンポーネントによってサポートされています。

  • Kata ランタイム: これには、Red Hat Enterprise Linux CoreOS (RHCOS) と、OpenShift Container Platform リリースごとの 更新 が含まれます。
  • OpenShift sandboxed containers Operator: Web コンソールまたは OpenShift CLI (oc) を使用して Operator をインストールします。

OpenShift sandboxed containers Operator は Rolling Stream Operator です。つまり、サポートされているバージョンは最新バージョンのみです。現在サポートされているすべてのバージョンの OpenShift Container Platform で動作します。詳細は、OpenShift Container Platform ライフサイクルポリシー を参照してください。

Operator は、RHCOS ホストに含まれる機能とホストが実行される環境に依存します。

注記

Red Hat Enterprise Linux CoreOS (RHCOS) をワーカーノードにインストールする必要があります。RHEL ノードはサポートされていません。

OpenShift sandboxed containers と OpenShift Container Platform リリースの次の互換性に関する表は、互換性のある機能と環境を示しています。

表1.1 サポートされているアーキテクチャー
アーキテクチャーOpenShift Container Platform バージョン

x86_64

4.8 以降

s390x

4.14 以降

Kata コンテナーランタイムをデプロイする方法は 2 つあります。

  • ベアメタル
  • ピア Pod

パブリッククラウドでの OpenShift sandboxed containers のデプロイメント用のピア Pod テクノロジーは、OpenShift sandboxed containers 1.5 および OpenShift Container Platform 4.14 で開発者プレビューとして利用可能でした。

OpenShift sandboxed containers 1.7 のリリースにより、Operator には OpenShift Container Platform バージョン 4.15 以降が必要です。

表1.2 OpenShift バージョン別で利用可能な機能
機能デプロイメント方法OpenShift Container Platform 4.15OpenShift Container Platform 4.16

Confidential Containers

ベアメタル

  

ピア Pod

テクノロジープレビュー

テクノロジープレビュー [1]

GPU サポート [2]

ベアメタル

  

ピア Pod

開発者プレビュー

開発者プレビュー

  1. Confidential Containers のテクノロジープレビューは、OpenShift sandboxed containers 1.7.0 以降で利用できます。
  2. GPU 機能は、IBM Z では利用できません。
表1.3 OpenShift Sandboxed Containers でサポートされているクラウドプラットフォーム
PlatformGPUConfidential Containers

AWS Cloud Computing Services

開発者プレビュー

 

Microsoft Azure Cloud Computing Services

開発者プレビュー

テクノロジープレビュー [1]

  1. Confidential Containers のテクノロジープレビューは、OpenShift sandboxed containers 1.7.0 以降で利用できます。

1.3. ノードの適格性チェック

ノードの適格性チェックを実行して、ベアメタルクラスターノードが OpenShift Sandboxed Containers をサポートすることを確認できます。ノードが不適格となる最も一般的な理由は、仮想化サポートの欠如です。不適格なノードでサンドボックス化されたワークロードを実行すると、エラーが発生します。

ワークフローの概要

  1. Node Feature Discovery Operator をインストールします。
  2. NodeFeatureDiscovery カスタムリソース (CR) を作成します。
  3. Kataconfig CR を作成するときにノード適格性チェックを有効にします。すべてのワーカーノードまたは一部のノードでノード適格性チェックを実行できます。

1.4. 一般的な用語

以下の用語は、このドキュメント全体で使用されています。

サンドボックス

サンドボックスとは、プログラムが実行可能な分離された環境のことです。サンドボックスでは、ホストマシンやオペレーティングシステムに悪影響を及ぼすことなく、テストされていないプログラムまたは信頼できないプログラムを実行できます。

OpenShift Sandboxed Containers のコンテキストでは、仮想化を使用して異なるカーネルでワークロードを実行し、同じホストで実行される複数のワークロードとの間の対話を強化することでサンドボックス化を図ります。

Pod

Pod は Kubernetes および OpenShift Container Platform から継承されるコンストラクトです。Pod とは、コンテナーのデプロイが可能なリソースを表します。コンテナーは Pod 内で実行され、Pod を使用して複数のコンテナー間で共有できるリソースを指定します。

OpenShift Sandboxed Containers のコンテキストでは、Pod が仮想マシンとして実装されます。同じ仮想マシンにある同じ Pod でコンテナーを複数実行できます。

OpenShift Sandboxed Containers Operator
OpenShift sandboxed containers Operator は、クラスター上の sandboxed containers のライフサイクルを管理します。OpenShift Sandboxed Containers Operator を使用して、Sandboxed Containers のインストールと削除、ソフトウェア更新、ステータス監視などのタスクを実行できます。
Kata Container
Kata Container は OpenShift sandboxed containers の構築に使用されるコアアップストリームプロジェクトです。OpenShift sandboxed containers は Kata Container と OpenShift Container Platform を統合します。
KataConfig
KataConfig オブジェクトは Sandboxed Containers の設定を表します。ソフトウェアのデプロイ先のノードなど、クラスターの状態に関する情報を保存します。
ランタイムクラス
RuntimeClass オブジェクトは、指定のワークロード実行に使用可能なランタイムを記述します。kata という名前のランタイムクラスは、OpenShift の Sandboxed Containers Operator によってインストールされ、デプロイされます。ランタイムクラスには、ランタイムが Pod オーバーヘッド など、動作に必要なリソースを記述するランタイムに関する情報が含まれます。
ピア Pod

OpenShift Sandboxed Containers のピア Pod は、標準 Pod の概念を拡張します。ピア Pod 内のワーカーノード自体に仮想マシンが作成される標準の Sandboxed Containers とは異なり、サポートされているハイパーバイザーまたはクラウドプロバイダー API を使用して、リモートハイパーバイザー経由で仮想マシンが作成されます。

ピア Pod はワーカーノード上で通常の Pod として機能し、対応する VM が別の場所で実行されます。VM のリモートの場所はユーザーに対して透過的であり、Pod 仕様のランタイムクラスによって指定されます。ピア Pod 設計により、ネストされた仮想化の必要性が回避されます。

IBM Secure Execution
Linux の IBM Secure Execution は、IBM z15® および LinuxONE III で導入された高度なセキュリティー機能です。この機能は、広範囲な暗号化によって提供される保護を拡張します。IBM Secure Execution は、保存中、転送中、使用中のデータを保護します。ワークロードを安全にデプロイでき、ライフサイクル全体にわたってデータを保護できます。詳細は、Introducing IBM Secure Execution for Linux を参照してください。
Confidential Containers

Confidential Containers は、ワークロードがトラステッド実行環境 (TEE) で実行されていることを確認し、コンテナーとデータを保護します。この機能をデプロイして、ビッグデータ分析および機械学習推論のプライバシーを保護することができます。

Trustee は Confidential Containers のコンポーネントです。Trustee は、今後ワークロードを実行する場所や機密情報を送信する場所の信頼性を検証するアテステーションサービスです。Trustee には、信頼できる側にデプロイされ、リモートワークロードが Trusted Execution Environment (TEE) で実行されているかどうかを確認するために使用されるコンポーネントが含まれます。Trustee は柔軟性が高く、さまざまなアプリケーションやハードウェアプラットフォームをサポートするために、さまざまな設定でデプロイできます。

Confidential compute attestation Operator
Confidential compute attestation Operator は、Confidential Containers のインストール、ライフサイクル、設定を管理します。

1.5. OpenShift Sandboxed Containers Operator

OpenShift Sandboxed Containers Operator は、Kata Containers からのコンポーネントをすべてカプセル化します。インストール、ライフサイクル、設定タスクを管理します。

OpenShift Sandboxed Containers Operator は、2 つのコンテナーイメージとして Operator バンドル形式 でパッケージ化されています。

  • バンドルイメージにはメタデータが含まれ、Operator で OLM が利用できるようにする必要があります。
  • 2 つ目のコンテナーイメージには、KataConfig リソースを監視および管理するための実際のコントローラーが含まれています。

OpenShift Sandboxed Containers Operator は Red Hat Enterprise Linux CoreOS (RHCOS) 拡張機能の概念に基づいています。RHCOS 拡張機能は、オプションの OpenShift Container Platform ソフトウェアをインストールするためのメカニズムです。OpenShift Sandboxed Containers Operator はこのメカニズムを使用して、Sandboxed Containers をクラスターにデプロイします。

Sandboxed Containers の RHCOS 拡張には、Kata、QEMU、およびその依存関係の RPM が含まれます。これらは、Machine Config Operator が提供する MachineConfig リソースを使用して有効にできます。

1.6. Confidential Containers について

Confidential Containers は、Trusted Execution Environments を利用してコンテナーおよびデータを保護するための機密コンピューティング環境を提供します。

重要

Microsoft Azure Cloud Computing Services、IBM Z®、および IBM® LinuxONE 上の Confidential Containers はテクノロジープレビュー機能のみです。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

Red Hat Trusted Artifact Signer などのツールを使用して、コンテナーイメージに署名できます。次に、コンテナーイメージ署名検証ポリシーを作成します。

Trustee Operator は署名を検証し、信頼され、認証されたコンテナーイメージのみが環境にデプロイされるようにします。

詳細は、Exploring the OpenShift confidential containers solution を参照してください。

1.7. OpenShift Virtualization

OpenShift Virtualization を使用してクラスターで OpenShift Sandboxed Containers をデプロイできます。

OpenShift Virtualization と OpenShift Sandboxed Containers を同時に実行するには、ノードの再起動がブロックされないように、仮想マシンのライブマイグレーションが可能です。詳細は、OpenShift Virtualization ドキュメントの ライブマイグレーションについて を参照してください。

1.8. ブロックボリュームのサポート

OpenShift Container Platform は、raw ブロックボリュームを静的にプロビジョニングできます。これらのボリュームにはファイルシステムがなく、ディスクに直接書き込むアプリケーションや、独自のストレージサービスを実装するアプリケーションにはパフォーマンス上の利点があります。

OpenShift サンドボックスコンテナーでは、ローカルブロックデバイスを永続ボリューム (PV) ストレージとして使用できます。このブロックデバイスは、Local Storage Operator (LSO) を使用してプロビジョニングできます。

ローカルストレージ Operator はデフォルトで OpenShift Container Platform にインストールされません。インストール手順は、Local Storage Operator のインストール を参照してください。

OpenShift サンドボックスコンテナーの Raw ブロックボリュームは、PV 仕様で volumeMode: Block を指定してプロビジョニングされます。

ブロックボリュームの例

apiVersion: "local.storage.openshift.io/v1"
kind: "LocalVolume"
metadata:
  name: "local-disks"
  namespace: "openshift-local-storage"
spec:
  nodeSelector:
    nodeSelectorTerms:
    - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker-0
  storageClassDevices:
    - storageClassName: "local-sc"
      forceWipeDevicesAndDestroyAllData: false
      volumeMode: Block 1
      devicePaths:
        - /path/to/device 2

1
この PV が生のブロックボリュームであることを示すには、volumeModeBlock に設定します。
2
この値を、LocalVolume リソース by-id へのファイルパスに置き換えます。プロビジョナーが正常にデプロイされると、これらのローカルディスク用に PV が作成されます。OpenShift sandboxed containers をデプロイするときに、ブロックデバイスを使用するノードにラベルを付ける場合にも、このパスを使用する必要があります。

1.9. FIPS コンプライアンス

OpenShift Container Platform は、Federal Information Processing Standards (FIPS) 140-2 および 140-3 向けに設計されています。FIPS モードでブートされた Red Hat Enterprise Linux (RHEL) または Red Hat Enterprise Linux CoreOS (RHCOS) を実行する場合、OpenShift Container Platform コアコンポーネントは、x86_64ppc64le、および s390x アーキテクチャーのみで、FIPS 140-2/140-3 検証のために NIST に提出された RHEL 暗号化ライブラリーを使用します。

NIST の検証プログラムの詳細は、Cryptographic Module Validation Program を参照してください。検証のために提出された RHEL 暗号化ライブラリーの個別バージョンの最新の NIST ステータスは、政府の標準規格 を参照してください。

OpenShift Sandboxed Containers は、FIPS 対応クラスターで使用できます。

FIPS モードで実行している場合、OpenShift Sandboxed Containers コンポーネント、仮想マシン、および VM イメージは、FIPS に準拠するように調整されます。

注記

OpenShift Sandboxed Containers の FIPS コンプライアンスは、kata ランタイムクラスにのみ適用されます。ピア Pod ランタイムクラス kata-remote はまだ完全にはサポートされておらず、FIPS 準拠のテストも行われていません。

FIPS コンプライアンスは、安全な環境で必要とされる最も重要なコンポーネントの 1 つであり、サポートされている暗号化技術のみがノード上で許可されるようにします。

重要

FIPS 検証済み/進行中のモジュール (Modules in Process) 暗号ライブラリーの使用は、x86_64 アーキテクチャーの OpenShift Container Platform デプロイメントでのみサポートされています。

OpenShift Container Platform コンプライアンスフレームワークに関する Red Hat のアプローチは、OpenShift セキュリティーガイド のリスク管理および規制対応の章を参照してください。

第2章 OpenShift sandboxed containers のベアメタルへのデプロイ

ワーカーノードに Red Hat Enterprise Linux CoreOS (RHCOS) がインストールされたオンプレミスのベアメタルクラスターに OpenShift sandboxed containers をデプロイできます。

注記
  • RHEL ノードはサポートされていません。
  • ネストされた仮想化はサポートされていません。

ユーザーによってプロビジョニングされるインストーラーでプロビジョニングされる、または Assisted Installer によるインストールなどのインストール方法を使用してクラスターをデプロイできます。

Amazon Web Services (AWS) ベアメタルインスタンスに OpenShift Sandboxed Containers のインストールもできます。他のクラウドプロバイダーが提供するベアメタルインスタンスはサポートされません。

クラスターの要件

  • OpenShift sandboxed containers Operator をインストールするクラスターに Red Hat OpenShift Container Platform 4.14 以降をインストールしている。
  • クラスターには少なくとも 1 つのワーカーノードがある。

OpenShift Container Platform をベアメタルにインストールする方法の詳細は ベアメタルへのインストール を参照してください。

2.1. OpenShift Sandboxed Containers のリソース要件

クラスターに十分なリソースがあることを確認する。

OpenShift sandboxed containers を使用すると、ユーザーはサンドボックスランタイム (Kata) 内の OpenShift Container Platform クラスターでワークロードを実行できます。各 Pod は仮想マシン (VM) で表されます。各仮想マシンは QEMU プロセスで実行され、コンテナーワークロードおよびこれらのコンテナーで実行されているプロセスを管理するためのスーパーバイザーとして機能する kata-agent プロセスをホストします。2 つのプロセスを追加すると、オーバーヘッドがさらに増加します。

  • containerd-shim-kata-v2。これは Pod との通信に使用されます。
  • virtiofsd。これはゲストの代わりにホストファイルシステムのアクセスを処理します。

各仮想マシンには、デフォルトのメモリー容量が設定されます。コンテナーでメモリーが明示的に要求された場合に、メモリーが追加で仮想マシンにホットプラグされます。

メモリーリソースなしで実行されているコンテナーは、仮想マシンによって使用される合計メモリーがデフォルトの割り当てに達するまで、空きメモリーを消費します。ゲストやその I/O バッファーもメモリーを消費します。

コンテナーに特定のメモリー量が指定されている場合には、コンテナーが起動する前に、メモリーが仮想マシンにホットプラグされます。

メモリー制限が指定されている場合には、上限より多くメモリーが消費された場合に、ワークロードが終了します。メモリー制限が指定されていない場合、仮想マシンで実行されているカーネルがメモリー不足になる可能性があります。カーネルがメモリー不足になると、仮想マシン上の他のプロセスが終了する可能性があります。

デフォルトのメモリーサイズ

以下の表は、リソース割り当てのデフォルト値を示しています。

リソース

デフォルトで仮想マシンに割り当てられるメモリー

2Gi

起動時のゲスト Linux カーネルのメモリー使用量

~110Mi

QEMU プロセスで使用されるメモリー (仮想マシンメモリーを除く)

~30Mi

virtiofsd プロセスで使用されるメモリー (VM I/O バッファーを除く)

~10Mi

containerd-shim-kata-v2 プロセスで使用されるメモリー

~20Mi

Fedora で dnf install を実行した後のファイルバッファーのキャッシュデータ

~300Mi* [1]

ファイルバッファーが表示され、このバッファーは以下の複数の場所に考慮されます。

  • ファイルバッファーキャッシュとして表示されるゲスト。
  • 許可されたユーザー空間ファイルの I/O 操作をマッピングする virtiofsd デーモン。
  • ゲストメモリーとして使用される QEMU プロセス。
注記

メモリー使用量の合計は、メモリー使用率メトリックによって適切に考慮され、そのメモリーを 1 回だけカウントします。

Pod のオーバーヘッド では、ノード上の Pod が使用するシステムリソースの量を記述します。以下のように、oc describe runtimeclass kata を使用して、Kata ランタイムクラスの現在の Pod オーバーヘッドを取得できます。

$ oc describe runtimeclass kata

出力例

kind: RuntimeClass
apiVersion: node.k8s.io/v1
metadata:
  name: kata
overhead:
  podFixed:
    memory: "500Mi"
    cpu: "500m"

RuntimeClassspec.overhead フィールドを変更して、Pod のオーバーヘッドを変更できます。たとえば、コンテナーに対する設定が QEMU プロセスおよびゲストカーネルデータでメモリー 350Mi 以上を消費する場合に、RuntimeClass のオーバーヘッドをニーズに合わせて変更できます。

注記

Red Hat では、指定のデフォルトオーバーヘッド値がサポートされます。デフォルトのオーバーヘッド値の変更はサポートされておらず、値を変更すると技術的な問題が発生する可能性があります。

ゲストで種類にかかわらず、ファイルシステム I/O を実行すると、ファイルバッファーがゲストカーネルに割り当てられます。ファイルバッファーは、virtiofsd プロセスだけでなく、ホスト上の QEMU プロセスでもマッピングされます。

たとえば、ゲストでファイルバッファーキャッシュ 300Mi を使用すると、QEMU と virtiofsd の両方が、追加で 300Mi を使用するように見えます。ただし、3 つのケースすべてで同じメモリーが使用されます。したがって、合計メモリー使用量は 3 つの異なる場所にマップされた 300Mi のみです。これは、メモリー使用量メトリックの報告時に適切に考慮されます。

2.2. Web コンソールを使用した OpenShift Sandboxed Containers のデプロイ

OpenShift Container Platform Web コンソールを使用して次のタスクを実行することで、ベアメタルに OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: ノード適格性チェックを設定するには、Node Feature Discovery (NFD) Operator をインストールします。詳細は、ノードの適格性チェック および NFD Operator ドキュメント を参照してください。
  3. オプション: Kata エージェントポリシーをカスタマイズします。
  4. KataConfig カスタムリソースを作成します。
  5. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

2.2.1. OpenShift Sandboxed Containers Operator のインストール

OpenShift Container Platform Web コンソールを使用して、OpenShift sandboxed containers Operator をインストールできます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. Web コンソールで、OperatorsOperatorHub に移動します。
  2. Filter by keyword フィールドに OpenShift sandboxed containers と入力します。
  3. OpenShift sandboxed containers Operator タイルを選択し、Install をクリックします。
  4. Install Operator ページで、利用可能な Update Channel オプションの一覧から stable を選択します。
  5. Installed NamespaceOperator recommended Namespace が選択されていることを確認します。これにより、Operator が必須の openshift-sandboxed-containers-operator namespace にインストールされます。この namespace がまだ存在しない場合は、自動的に作成されます。

    注記

    OpenShift Sandboxed Containers Operator を openshift-sandboxed-containers-operator 以外の namespace にインストールしようとすると、インストールに失敗します。

  6. Approval StrategyAutomatic が選択されていることを確認します。Automatic がデフォルト値であり、新しい z-stream リリースが利用可能になると、OpenShift Sandboxed Containers への自動更新が有効になります。
  7. Install をクリックします。
  8. OperatorInstalled Operator に移動して、Operator がインストールされていることを確認します。

2.2.2. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

2.2.3. KataConfig カスタムリソースの作成

ワーカーノードに kataRuntimeClass としてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

kata ランタイムクラスは、デフォルトですべてのワーカーノードにインストールされます。特定のノードにのみ kata をインストールする場合は、それらのノードにラベルを追加し、KataConfig CR でラベルを定義できます。

OpenShift sandboxed containers は、プライマリーランタイムとしてではなく クラスター上のセカンダリーのオプション ランタイムとして kata をインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。次の要因により再起動時間が長くなる可能性があります。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • オプション: ノードの適格性チェックを有効にする場合は、Node Feature Discovery Operator をインストールしておきます。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. OpenShift sandboxed containers Operator を選択します。
  3. KataConfig タブで、Create KataConfig をクリックします。
  4. 以下の詳細を入力します。

    • Name: オプション: デフォルト名は example-kataconfig です。
    • Labels: オプション: 関連する識別属性を KataConfig リソースに入力します。各ラベルはキーと値のペアを表します。
    • checkNodeEligibility : オプション: Node Feature Discovery Operator (NFD) を使用してノードの適格性を検出する場合に選択します。
    • kataConfigPoolSelector。オプション: 選択したノードに kata をインストールするには、選択したノードのラベルに一致する式を追加します。

      1. kataConfigPoolSelector エリアを展開します。
      2. kataConfigPoolSelector エリアで、matchExpressions を展開します。これは、ラベルセレクターの要件のリストです。
      3. Add matchExpressions をクリックします。
      4. Key フィールドに、セレクターの適用先のラベルキーを入力します。
      5. Operator フィールドに、キーとラベル値の関係を入力します。有効な演算子は、InNotInExistsDoesNotExist です。
      6. Values エリアを展開し、Add value をクリックします。
      7. Value フィールドで、true または falsekey ラベル値として入力します。
    • logLevel: ランタイムクラスが kata のノードに対して取得されるログデータのレベルを定義します。
  5. Create をクリックします。KataConfig CR が作成され、ワーカーノードに kata ランタイムクラスをインストールします。

    kata のインストールが完了し、ワーカーノードが再起動するのを待ってから、インストールを検証します。

検証

  1. KataConfig タブで、KataConfig CR をクリックして詳細を表示します。
  2. YAML タブをクリックして status スタンザを表示します。

    status スタンザには、conditions および kataNodes キーが含まれています。status.kataNodes の値はノード配列であり、各ノードには kata インストールの特定の状態にあるノードがリストされます。更新があるたびにメッセージが表示されます。

  3. Reload をクリックして、YAML を更新します。

    status.kataNodes 配列内のすべてのワーカーに、installed の値と、理由が指定されていない conditions.InProgress: False が表示される場合、kata がクラスターにインストールされています。

関連情報

2.2.4. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. OpenShift Container Platform Web コンソールで、Workloads → workload type (例: Pods) に移動します。
  2. ワークロードタイプページで、オブジェクトをクリックして詳細を表示します。
  3. YAML タブをクリックします。
  4. 次の例のように、spec.runtimeClassName: kata を各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata
    # ...

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata の場合、ワークロードはピア Pod を使用して OpenShift sandboxed containers 上で実行されています。

2.3. コマンドラインを使用した OpenShift Sandboxed Containers のデプロイ

コマンドラインインターフェイス (CLI) を使用して次のタスクを実行することにより、ベアメタル上に OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. Operator のインストール後に、以下のオプションを設定できます。

    • ブロックストレージデバイスを設定します。
    • ノード適格性チェックを設定するには、Node Feature Discovery (NFD) Operator をインストールします。詳細は、ノードの適格性チェック および NFD Operator ドキュメント を参照してください。

      • NodeFeatureDiscovery カスタムリソースを作成します。
  3. オプション: Kata エージェントポリシーをカスタマイズします。
  4. KataConfig カスタムリソースを作成します。
  5. オプション: Pod のオーバーヘッドを変更します。
  6. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

2.3.1. OpenShift Sandboxed Containers Operator のインストール

CLI を使用して、OpenShift Sandboxed Containers Operator をインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. osc-namespace.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
  2. 以下のコマンドを実行して namespace を作成します。

    $ oc apply -f osc-namespace.yaml
  3. osc-operatorgroup.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
  4. 以下のコマンドを実行して Operator グループを作成します。

    $ oc apply -f osc-operatorgroup.yaml
  5. osc-subscription.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.9.0
  6. 次のコマンドを実行して、サブスクリプションを作成します。

    $ oc apply -f osc-subscription.yaml
  7. 次のコマンドを実行して、Operator が正常にインストールされていることを確認します。

    $ oc get csv -n openshift-sandboxed-containers-operator

    このコマンドが完了するまでに数分かかる場合があります。

  8. 次のコマンドを実行してプロセスを監視します。

    $ watch oc get csv -n openshift-sandboxed-containers-operator

    出力例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.9.0    1.8.1        Succeeded

2.3.2. 任意の設定

OpenShift Sandboxed Containers Operator をインストールした後に、次のオプションを設定できます。

2.3.2.1. ローカルブロックボリュームのプロビジョニング

OpenShift Sandboxed Containers でローカルブロックボリュームを使用できます。まず、Local Storage Operator (LSO) を使用してローカルブロックボリュームをプロビジョニングする必要があります。次に、ローカルブロックボリュームを持つノードを有効にして、OpenShift sandboxed containers ワークロードを実行する必要があります。

Local Storage Operator (LSO) を使用して、OpenShift sandboxed containers のローカルブロックボリュームをプロビジョニングできます。ローカルボリュームプロビジョナーは、定義されたリソースで指定されたパスにあるブロックボリュームデバイスを検索します。

前提条件

  • Local Storage Operator がインストールされている。
  • 以下の条件を満たすローカルディスクがある。

    • ノードに接続されている。
    • マウントされていない。
    • パーティションが含まれていない。

手順

  1. ローカルボリュームリソースを作成します。このリソースは、ノードおよびローカルボリュームへのパスを定義する必要があります。

    注記

    同じデバイスに別のストレージクラス名を使用しないでください。こうすることで、複数の永続ボリューム (PV) が作成されます。

    例: ブロック

    apiVersion: "local.storage.openshift.io/v1"
    kind: "LocalVolume"
    metadata:
      name: "local-disks"
      namespace: "openshift-local-storage" 1
    spec:
      nodeSelector: 2
        nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-136-143
              - ip-10-0-140-255
              - ip-10-0-144-180
      storageClassDevices:
        - storageClassName: "local-sc" 3
          forceWipeDevicesAndDestroyAllData: false 4
          volumeMode: Block
          devicePaths: 5
            - /path/to/device 6

    1
    ローカルストレージ Operator がインストールされている namespace。
    2
    オプション: ローカルストレージボリュームが割り当てられているノードの一覧が含まれるノードセレクター。以下の例では、oc get node から取得したノードホスト名を使用します。値が定義されない場合、ローカルストレージ Operator は利用可能なすべてのノードで一致するディスクの検索を試行します。
    3
    永続ボリュームオブジェクトの作成時に使用するストレージクラスの名前。
    4
    この設定は、パーティションテーブルの署名 (マジックストリング) を削除してディスクを Local Storage Operator プロビジョニングに使用できるようにする winefs を呼び出すかどうかを定義します。署名以外のデータは消去されません。デフォルトは "false" です (wipefs は呼び出されません)。再利用する必要がある以前のデータをディスク上に残す場合、forceWipeDevicesAndDestroyAllData を "true" に設定すると便利です。このようなシナリオでは、このフィールドを true に設定すると、管理者はディスクを手動で消去する必要がありません。
    5
    選択するローカルストレージデバイスの一覧を含むパスです。ローカルブロックデバイスを持つノードを有効にして OpenShift sandboxed containers ワークロードを実行する場合は、このパスを使用する必要があります。
    6
    この値を、LocalVolume リソース by-id へのファイルパス (/dev/disk/by-id/wwn など) に置き換えます。プロビジョナーが正常にデプロイされると、これらのローカルディスク用に PV が作成されます。
  2. OpenShift Container Platform クラスターにローカルボリュームリソースを作成します。作成したばかりのファイルを指定します。

    $ oc apply -f <local-volume>.yaml
  3. プロビジョナーが作成され、対応するデーモンセットが作成されていることを確認します。

    $ oc get all -n openshift-local-storage

    出力例

    NAME                                          READY   STATUS    RESTARTS   AGE
    pod/diskmaker-manager-9wzms                   1/1     Running   0          5m43s
    pod/diskmaker-manager-jgvjp                   1/1     Running   0          5m43s
    pod/diskmaker-manager-tbdsj                   1/1     Running   0          5m43s
    pod/local-storage-operator-7db4bd9f79-t6k87   1/1     Running   0          14m
    
    NAME                                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
    service/local-storage-operator-metrics   ClusterIP   172.30.135.36   <none>        8383/TCP,8686/TCP   14m
    
    NAME                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/diskmaker-manager   3         3         3       3            3           <none>          5m43s
    
    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/local-storage-operator   1/1     1            1           14m
    
    NAME                                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/local-storage-operator-7db4bd9f79   1         1         1       14m

    デーモンセットプロセスの desired 数と current 数をメモします。desired 数が 0 の場合、これはラベルセレクターが無効であることを示します。

  4. 永続ボリュームが作成されていることを確認します。

    $ oc get pv

    出力例

    NAME                CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    local-pv-1cec77cf   100Gi      RWO            Delete           Available           local-sc                88m
    local-pv-2ef7cd2a   100Gi      RWO            Delete           Available           local-sc                82m
    local-pv-3fa1c73    100Gi      RWO            Delete           Available           local-sc                48m

重要

LocalVolume オブジェクトを編集しても、破壊的な操作になる可能性があるため、既存の永続ボリュームは変更されません。

2.3.2.2. ノードがローカルブロックデバイスを使用できるようにする

定義されたボリュームリソースで指定されたパスで OpenShift sandboxed containers ワークロードを実行するように、ローカルブロックデバイスを持つノードを設定できます。

前提条件

  • Local Storage Operator (LSO) を使用してブロックデバイスをプロビジョニングしている

手順

  • 次のコマンドを実行して、ローカルブロックデバイスを持つ各ノードが OpenShift sandboxed containers ワークロードを実行できるようにします。

    $ oc debug node/worker-0 -- chcon -vt container_file_t /host/path/to/device

    /path/to/device は、ローカルストレージリソースを作成するときに定義したパスと同じである必要があります。

    出力例

    system_u:object_r:container_file_t:s0 /host/path/to/device

2.3.2.3. NodeFeatureDiscovery カスタムリソースの作成

NodeFeatureDiscovery カスタムリソース (CR) を作成して、Node Feature Discovery (NFD) Operator がチェックする設定パラメーターを定義して、ワーカーノードが OpenShift Sandboxed Containers をサポートできるかどうかを判断します。

注記

適格であることがわかっている一部のワーカーノードにのみ kata ランタイムをインストールするには、一部のノードに feature.node.kubernetes.io/runtime.kata=true ラベルを適用し、KataConfig CR で checkNodeEligibility: true を設定します。

すべてのワーカーノードに kata ランタイムをインストールするには、KataConfig CR で checkNodeEligibility: false を設定します。

どちらのシナリオでも、NodeFeatureDiscovery CR を作成する必要はありません。ノードが OpenShift sandboxed containers を実行する資格があることが確実な場合にのみ、feature.node.kubernetes.io/runtime.kata=true ラベルを手動で適用する必要があります。

次の手順では、feature.node.kubernetes.io/runtime.kata=true ラベルをすべての適格なノードに適用し、ノードの適格性を確認するように KataConfig リソースを設定します。

前提条件

  • NFD Operator がインストールされている。

手順

  1. 以下の例に従って、nfd.yaml マニフェストファイルを作成します。

    apiVersion: nfd.openshift.io/v1
    kind: NodeFeatureDiscovery
    metadata:
      name: nfd-kata
      namespace: openshift-nfd
    spec:
      workerConfig:
        configData: |
          sources:
            custom:
              - name: "feature.node.kubernetes.io/runtime.kata"
                matchOn:
                  - cpuId: ["SSE4", "VMX"]
                    loadedKMod: ["kvm", "kvm_intel"]
                  - cpuId: ["SSE4", "SVM"]
                    loadedKMod: ["kvm", "kvm_amd"]
    # ...
  2. NodeFeatureDiscovery CR を作成します。

    $ oc create -f nfd.yaml

    NodeFeatureDiscovery CR は、feature.node.kubernetes.io/runtime.kata=true ラベルをすべての認定ワーカーノードに適用します。

  1. 次の例に従って、kata-config.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      checkNodeEligibility: true
  2. KataConfig CR を作成します。

    $ oc create -f kata-config.yaml

検証

  • クラスター内の適格なノードに正しいラベルが適用されていることを確認します。

    $ oc get nodes --selector='feature.node.kubernetes.io/runtime.kata=true'

    出力例

    NAME                           STATUS                     ROLES    AGE     VERSION
    compute-3.example.com          Ready                      worker   4h38m   v1.25.0
    compute-2.example.com          Ready                      worker   4h35m   v1.25.0

2.3.3. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

2.3.4. KataConfig カスタムリソースの作成

ワーカーノードに kata をランタイムクラスとしてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

KataConfig CR を作成すると、OpenShift Sandboxed Containers Operator がトリガーされ、以下が実行されます。

  • QEMU および kata-containers など、必要な RHCOS 拡張を RHCOS ノードにインストールします。
  • CRI-O ランタイムが正しいランタイムハンドラーで設定されていることを確認してください。
  • デフォルト設定で kata という名前の RuntimeClass CR を作成します。これにより、ユーザーは、RuntimeClassName フィールドで CR を参照することにより、kata をランタイムとして使用するようにワークロードを設定できます。この CR は、ランタイムのリソースオーバーヘッドも指定します。

OpenShift sandboxed containers は、プライマリーランタイムとしてではなく クラスター上のセカンダリーのオプション ランタイムとして kata をインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • オプション: ノードの適格性チェックを有効にする場合は、Node Feature Discovery Operator をインストールしておきます。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      checkNodeEligibility: false 1
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 2
    1
    オプション: ノード適格性チェックを実行するには、`checkNodeEligibility` を true に設定します。
    2
    オプション: 特定のノードに OpenShift sandboxed containers をインストールするためにノードラベルを適用した場合は、キーと値を指定します。
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードにランタイムクラスとして kata がインストールされます。

    kata のインストールが完了し、ワーカーノードが再起動するのを待ってから、インストールを検証します。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata はクラスターにインストールされます。

2.3.5. Pod オーバーヘッドの変更

Pod のオーバーヘッド では、ノード上の Pod が使用するシステムリソースの量を記述します。RuntimeClass カスタムリソースの spec.overhead フィールドを変更して、Pod のオーバーヘッドを変更できます。たとえば、コンテナーに対する設定が QEMU プロセスおよびゲストカーネルデータでメモリー 350Mi 以上を消費する場合に、RuntimeClass のオーバーヘッドをニーズに合わせて変更できます。

ゲストで種類にかかわらず、ファイルシステム I/O を実行すると、ファイルバッファーがゲストカーネルに割り当てられます。ファイルバッファーは、virtiofsd プロセスだけでなく、ホスト上の QEMU プロセスでもマッピングされます。

たとえば、ゲストでファイルバッファーキャッシュ 300Mi を使用すると、QEMU と virtiofsd の両方が、追加で 300Mi を使用するように見えます。ただし、3 つのケースすべてで同じメモリーが使用されています。したがって、合計メモリー使用量は 3 つの異なる場所にマップされた 300Mi のみです。これは、メモリー使用量メトリックの報告時に適切に考慮されます。

注記

Red Hat はデフォルト値をサポートします。デフォルトのオーバーヘッド値の変更はサポートされておらず、値を変更すると技術的な問題が発生する可能性があります。

手順

  1. 次のコマンドを実行して、RuntimeClass オブジェクトを取得します。

    $ oc describe runtimeclass kata
  2. overhead.podFixed.memory および cpu の値を更新し、ファイルを runtimeclass.yaml として保存します。

    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
      name: kata
    overhead:
      podFixed:
        memory: "500Mi"
        cpu: "500m"
  3. 次のコマンドを実行して変更を適用します。

    $ oc apply -f runtimeclass.yaml

2.3.6. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. 次の例のように、spec.runtimeClassName: kata を各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata
    # ...

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata の場合、ワークロードはピア Pod を使用して OpenShift sandboxed containers 上で実行されています。

第3章 OpenShift sandboxed containers の AWS へのデプロイ

OpenShift Container Platform Web コンソールまたはコマンドラインインターフェイス (CLI) を使用して、OpenShift sandboxed containers を AWS クラウドコンピューティングサービスにデプロイできます。

OpenShift sandboxed containers はピア Pod をデプロイします。ピア Pod 設計により、ネストされた仮想化の必要性が回避されます。詳細は、ピア Pod および Peer pods technical dive を参照してください。

クラスターの要件

  • OpenShift sandboxed containers Operator をインストールするクラスターに Red Hat OpenShift Container Platform 4.14 以降をインストールしている。
  • クラスターには少なくとも 1 つのワーカーノードがある。

OpenShift Container Platform を AWS クラウドコンピューティングサービスにインストールする方法の詳細は AWS へのインストール を参照してください。

3.1. ピア Pod のリソース要件

クラスターに十分なリソースがあることを確認する。

ピア Pod 仮想マシン (VM) には、次の 2 つの場所にリソースが必要です。

  • ワーカーノード。ワーカーノードは、メタデータ、Kata shim リソース (containerd-shim-kata-v2)、リモートハイパーバイザーリソース (cloud-api-adaptor)、およびワーカーノードとピア Pod VM 間のトンネル設定を保存します。
  • クラウドインスタンス。これは、クラウド内で実行されている実際のピア Pod VM です。

Kubernetes ワーカーノードで使用される CPU およびメモリーリソースは、ピア Pod の作成に使用される RuntimeClass (kata-remote) 定義に含まれる Pod オーバーヘッド によって処理されます。

クラウド内で実行されているピア Pod VM の合計数は、Kubernetes ノード拡張リソースとして定義されます。この制限はノードごとに設定され、peer-pods-cm config map の PEERPODS_LIMIT_PER_NODE 属性によって設定されます。

拡張リソースの名前は kata.peerpods.io/vm で、Kubernetes スケジューラーが容量の追跡とアカウンティングを処理できるようにします。

OpenShift Sandboxed Containers Operator のインストール後に、環境の要件に基づいてノードごとの制限を編集できます。

mutating Webhook により、拡張リソース kata.peerpods.io/vm が Pod 仕様に追加されます。また、リソース固有のエントリーが存在する場合は、Pod 仕様から削除されます。こうすることで、Kubernetes スケジューラーがこれらの拡張リソースを考慮できるようになり、リソースが利用可能な場合にのみピア Pod がスケジュールされるようになります。

mutating Webhook は、次のように Kubernetes Pod を変更します。

  • mutating Webhook は、TARGET_RUNTIME_CLASS 環境変数で指定された RuntimeClassName の想定値であるか、Pod をチェックします。Pod 仕様の値が TARGET_RUNTIME_CLASS の値と一致しない場合、Webhook は Pod を変更せずに終了します。
  • RuntimeClassName の値が一致する場合、Webhook は Pod 仕様に次の変更を加えます。

    1. この Webhook は、Pod 内のすべてのコンテナーおよび初期化コンテナーの resources フィールドからすべてのリソース仕様を削除します。
    2. Webhook は、Pod 内の最初のコンテナーのリソースフィールドを変更して、拡張リソース (kata.peerpods.io/vm) を仕様に追加します。拡張リソース kata.peerpods.io/vm は Kubernetes スケジューラーによってアカウンティング目的で使用されます。
注記

mutating Webhook は、OpenShift Container Platform の特定のシステム namespace が変更されないように除外します。これらのシステム namespace でピア Pod が作成された場合、Pod の仕様に拡張リソースが含まれていない限り、Kubernetes 拡張リソースを使用したリソースアカウンティングは機能しません。

ベストプラクティスとして、特定の namespace でのみピア Pod の作成を許可するクラスター全体のポリシーを定義します。

3.2. Web コンソールを使用した OpenShift Sandboxed Containers のデプロイ

OpenShift Container Platform Web コンソールを使用して次のタスクを実行することで、AWS に OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: ピア Pod との内部通信を許可するには、ポート 15150 と 9000 を有効にします。
  3. オプション: OpenShift sandboxed containers Operator とともにインストールされる Cloud Credential Operator をアンインストールした場合は、ピア Pod シークレットを作成します。
  4. オプション: カスタム Pod 仮想マシンイメージを選択します。
  5. オプション: Kata エージェントポリシーをカスタマイズします。
  6. ピア Pod の config map を作成します。
  7. KataConfig カスタムリソースを作成します。
  8. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

3.2.1. OpenShift Sandboxed Containers Operator のインストール

OpenShift Container Platform Web コンソールを使用して、OpenShift sandboxed containers Operator をインストールできます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. Web コンソールで、OperatorsOperatorHub に移動します。
  2. Filter by keyword フィールドに OpenShift sandboxed containers と入力します。
  3. OpenShift sandboxed containers Operator タイルを選択し、Install をクリックします。
  4. Install Operator ページで、利用可能な Update Channel オプションの一覧から stable を選択します。
  5. Installed NamespaceOperator recommended Namespace が選択されていることを確認します。これにより、Operator が必須の openshift-sandboxed-containers-operator namespace にインストールされます。この namespace がまだ存在しない場合は、自動的に作成されます。

    注記

    OpenShift Sandboxed Containers Operator を openshift-sandboxed-containers-operator 以外の namespace にインストールしようとすると、インストールに失敗します。

  6. Approval StrategyAutomatic が選択されていることを確認します。Automatic がデフォルト値であり、新しい z-stream リリースが利用可能になると、OpenShift Sandboxed Containers への自動更新が有効になります。
  7. Install をクリックします。
  8. OperatorInstalled Operator に移動して、Operator がインストールされていることを確認します。

3.2.2. AWS のポートの有効化

AWS で実行されるピア Pod との内部通信を許可するには、ポート 15150 および 9000 を有効にする必要があります。

前提条件

  • OpenShift Sandboxed Containers Operator をインストールしている。
  • AWS コマンドラインツールがインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. OpenShift Container Platform クラスターにログインし、インスタンス ID を取得します。

    $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' \
      -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')
  2. AWS リージョンを取得します。

    $ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}')
  3. セキュリティーグループ ID を取得し、配列に保存します。

    $ AWS_SG_IDS=($(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \
      --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' \
      --output text --region $AWS_REGION))
  4. 各セキュリティーグループ ID について、ピア Pod シムが kata-agent 通信にアクセスできるように承認し、ピア Pod トンネルを設定します。

    $ for AWS_SG_ID in "${AWS_SG_IDS[@]}"; do \
      aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 15150 --source-group $AWS_SG_ID --region $AWS_REGION \
      aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 9000 --source-group $AWS_SG_ID --region $AWS_REGION \
    done

これでポートが有効になりました。

3.2.3. ピア Pod シークレットの作成

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、OpenShift sandboxed containers のピア Pod シークレットを手動で作成する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • AWS コンソールを使用して以下の値が生成されます。

    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. OpenShift sandboxed containers Operator タイルをクリックします。
  3. 右上隅のインポートアイコン (+) をクリックします。
  4. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      AWS_ACCESS_KEY_ID: "<aws_access_key>" 1
      AWS_SECRET_ACCESS_KEY: "<aws_secret_access_key>" 2
    1
    AWS_ACCESS_KEY_ID 値を指定します。
    2
    AWS_SECRET_ACCESS_KEY 値を指定します。
  5. Save をクリックして変更を適用します。
  6. WorkloadsSecrets に移動して、ピア Pod シークレットを確認します。

3.2.4. ピア Pod config map の作成

OpenShift sandboxed containers のピア Pod config map を作成する必要があります。

前提条件

  • クラスター認証情報に基づくデフォルトの AMI ID を使用していない場合は、Amazon Machine Image (AMI) ID がある。

手順

  1. AWS インスタンスから以下の値を取得します。

    1. インスタンス ID を取得して記録します。

      $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')

      これは、シークレットオブジェクトの他の値を取得するために使用されます。

    2. AWS リージョンを取得して記録します。

      $ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}') && echo "AWS_REGION: \"$AWS_REGION\""
    3. AWS サブネット ID を取得して記録します。

      $ AWS_SUBNET_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SubnetId' --region ${AWS_REGION} --output text) && echo "AWS_SUBNET_ID: \"$AWS_SUBNET_ID\""
    4. AWS VPC ID を取得して記録します。

      $ AWS_VPC_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].VpcId' --region ${AWS_REGION} --output text) && echo "AWS_VPC_ID: \"$AWS_VPC_ID\""
    5. AWS セキュリティーグループ ID を取得して記録します。

      $ AWS_SG_IDS=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --region  $AWS_REGION --output json | jq -r '.[][][]' | paste -sd ",") && echo "AWS_SG_IDS: \"$AWS_SG_IDS\""
  2. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  3. Operator のリストから OpenShift Sandboxed Containers Operator を選択します。
  4. 右上隅にあるインポートアイコン (+) をクリックします。
  5. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "aws"
      VXLAN_PORT: "9000"
      PODVM_INSTANCE_TYPE: "t3.medium" 1
      PODVM_INSTANCE_TYPES: "t2.small,t2.medium,t3.large" 2
      PROXY_TIMEOUT: "5m"
      PODVM_AMI_ID: "<podvm_ami_id>" 3
      AWS_REGION: "<aws_region>" 4
      AWS_SUBNET_ID: "<aws_subnet_id>" 5
      AWS_VPC_ID: "<aws_vpc_id>" 6
      AWS_SG_IDS: "<aws_sg_ids>" 7
      PEERPODS_LIMIT_PER_NODE: "10" 8
      TAGS: "key1=value1,key2=value2" 9
      DISABLECVM: "true"
    1
    ワークロードでタイプが定義されていない場合に使用されるデフォルトのインスタンスタイプを定義します。
    2
    Pod の作成時に指定できるすべてのインスタンスタイプを一覧表示します。これにより、メモリーと CPU をあまり必要としないワークロードには小さいインスタンスタイプを定義したり、ワークロードが大きい場合は大きいインスタンスタイプを定義したりすることができます。
    3
    オプション: デフォルトでは、この値は、クラスターの認証情報に基づく AMI ID を使用して KataConfig CR を実行するときに入力されます。独自の AMI を作成する場合は、正しい AMI ID を指定します。
    4
    取得した AWS_REGION 値を指定します。
    5
    取得した AWS_SUBNET_ID 値を指定します。
    6
    取得した AWS_VPC_ID 値を指定します。
    7
    取得した AWS_SG_IDS 値を指定します。
    8
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    9
    Pod 仮想マシンインスタンスの key:value ペアとしてカスタムタグを設定して、ピア Pod のコストを追跡したり、異なるクラスター内のピア Pod を識別したりできます。
  6. Save をクリックして変更を適用します。
  7. 新しい config map を表示するには、WorkloadsConfigMaps に移動します。

3.2.5. カスタムピア Pod 仮想マシンイメージの選択

Pod マニフェストにアノテーションを追加することで、ワークロード要件に合わせてカスタマイズされたカスタムピア Pod 仮想マシン (VM) イメージを選択できます。カスタムイメージは、ピア Podconfig map で指定されたデフォルトイメージをオーバーライドします。

前提条件

  • 使用予定のカスタム Pod 仮想マシンイメージの ID が利用でき、クラウドプロバイダーまたはハイパーバイザーと互換性がある。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. Operator のリストから OpenShift Sandboxed Containers Operator を選択します。
  3. 右上隅にあるインポートアイコン (+) をクリックします。
  4. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<custom_image_id>" 1
    spec:
      runtimeClassName: kata-remote 2
      containers:
      - name: <example_container> 3
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
  5. Save をクリックして変更を適用します。

3.2.6. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

3.2.7. KataConfig カスタムリソースの作成

ワーカーノードに kata-remoteRuntimeClass としてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

kata-remote ランタイムクラスは、デフォルトですべてのワーカーノードにインストールされます。kata-remote を特定のノードにのみインストールする場合は、それらのノードにラベルを追加し、KataConfig CR でラベルを定義できます。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。次の要因により再起動時間が長くなる可能性があります。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • オプション: ノードの適格性チェックを有効にする場合は、Node Feature Discovery Operator をインストールしておきます。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. OpenShift sandboxed containers Operator を選択します。
  3. KataConfig タブで、Create KataConfig をクリックします。
  4. 以下の詳細を入力します。

    • Name: オプション: デフォルト名は example-kataconfig です。
    • Labels: オプション: 関連する識別属性を KataConfig リソースに入力します。各ラベルはキーと値のペアを表します。
    • enablePeerPods: パブリッククラウド、IBM Z®、および IBM® LinuxONE デプロイメントの場合に選択します。
    • kataConfigPoolSelector。オプション: 選択したノードに kata-remote をインストールするには、選択したノードのラベルに一致する式を追加します。

      1. kataConfigPoolSelector エリアを展開します。
      2. kataConfigPoolSelector エリアで、matchExpressions を展開します。これは、ラベルセレクターの要件のリストです。
      3. Add matchExpressions をクリックします。
      4. Key フィールドに、セレクターの適用先のラベルキーを入力します。
      5. Operator フィールドに、キーとラベル値の関係を入力します。有効な演算子は、InNotInExistsDoesNotExist です。
      6. Values エリアを展開し、Add value をクリックします。
      7. Value フィールドで、true または falsekey ラベル値として入力します。
    • logLevel: ランタイムクラスが kata-remote のノードに対して取得されるログデータのレベルを定義します。
  5. Create をクリックします。KataConfig CR が作成され、ワーカーノードに kata-remote ランタイムクラスをインストールします。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

検証

  1. KataConfig タブで、KataConfig CR をクリックして詳細を表示します。
  2. YAML タブをクリックして status スタンザを表示します。

    status スタンザには、conditions および kataNodes キーが含まれています。status.kataNodes の値はノード配列であり、各ノードには kata-remote インストールの特定の状態にあるノードがリストされます。更新があるたびにメッセージが表示されます。

  3. Reload をクリックして、YAML を更新します。

    status.kataNodes 配列内のすべてのワーカーに、値 installed と、理由が指定されていない conditions.InProgress: False が表示される場合、kata-remote はクラスターにインストールされています。

関連情報
Pod VM イメージの確認

kata-remote がクラスターにインストールされると、OpenShift sandboxed containers Operator は、ピア Pod の作成に使用される Pod 仮想マシンイメージを作成します。イメージがクラウドインスタンス上に作成されるため、このプロセスには時間がかかる場合があります。クラウドプロバイダー用に作成した config map を確認し、Pod 仮想マシンイメージが正常に作成されたことを確認できます。

手順

  1. WorkloadsConfigMaps に移動します。
  2. プロバイダー config map をクリックすると、詳細が表示されます。
  3. YAML タブをクリックします。
  4. YAML ファイルの status スタンザを確認します。

    PODVM_AMI_ID パラメーターが入力されている場合は、Pod 仮想マシンイメージが正常に作成されています。

トラブルシューティング

  1. 次のコマンドを実行してイベントログを取得します。

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
  2. 次のコマンドを実行して、ジョブログを取得します。

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation

問題を解決できない場合は、Red Hat サポートケースを送信し、両方のログの出力を添付してください。

3.2.8. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata-remote を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

YAML ファイルにアノテーションを追加することで、config map で定義したデフォルトのインスタンスタイプを使用してワークロードをデプロイするかどうかを定義できます。

インスタンスタイプを手動で定義しない場合は、使用可能なメモリーに基づいて自動インスタンスタイプを使用するようにアノテーションを追加できます。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. OpenShift Container Platform Web コンソールで、Workloads → workload type (例: Pods) に移動します。
  2. ワークロードタイプページで、オブジェクトをクリックして詳細を表示します。
  3. YAML タブをクリックします。
  4. 次の例のように、各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに spec.runtimeClassName: kata-remote を追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
  5. 手動で定義されたインスタンスタイプまたは自動インスタンスタイプを使用するには、Pod テンプレートオブジェクトにアノテーションを追加します。

    • 手動で定義されたインスタンスタイプを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <object>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.machine_type: "t3.medium" 1
      # ...
      1 1
      config map で定義したインスタンスタイプを指定します。
    • 自動インスタンスタイプを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <Pod>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.default_vcpus: <vcpus>
          io.katacontainers.config.hypervisor.default_memory: <memory>
      # ...

      ワークロードが使用できるメモリーの量を定義します。ワークロードは、使用可能なメモリーの量に基づいて自動インスタンスタイプで実行されます。

  6. Save をクリックして変更を適用します。

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata-remote の場合、ワークロードはピア Pod を使用して OpenShift Sandboxed Containers で実行されています。

3.3. コマンドラインを使用した OpenShift Sandboxed Containers のデプロイ

コマンドラインインターフェイス (CLI) を使用して次のタスクを実行することにより、AWS に OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: 各ワーカーノードで実行されている仮想マシンの数を変更します。
  3. オプション: ピア Pod との内部通信を許可するには、ポート 15150 と 9000 を有効にします。
  4. オプション: OpenShift sandboxed containers Operator とともにインストールされる Cloud Credential Operator をアンインストールした場合は、ピア Pod シークレットを作成します。
  5. オプション: カスタム Pod 仮想マシンイメージを選択します。
  6. ピア Pod の config map を作成します。
  7. オプション: Kata エージェントポリシーをカスタマイズします。
  8. KataConfig カスタムリソースを作成します。
  9. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

3.3.1. OpenShift Sandboxed Containers Operator のインストール

CLI を使用して、OpenShift Sandboxed Containers Operator をインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. osc-namespace.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
  2. 以下のコマンドを実行して namespace を作成します。

    $ oc apply -f osc-namespace.yaml
  3. osc-operatorgroup.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
  4. 以下のコマンドを実行して Operator グループを作成します。

    $ oc apply -f osc-operatorgroup.yaml
  5. osc-subscription.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.9.0
  6. 次のコマンドを実行して、サブスクリプションを作成します。

    $ oc apply -f osc-subscription.yaml
  7. 次のコマンドを実行して、Operator が正常にインストールされていることを確認します。

    $ oc get csv -n openshift-sandboxed-containers-operator

    このコマンドが完了するまでに数分かかる場合があります。

  8. 次のコマンドを実行してプロセスを監視します。

    $ watch oc get csv -n openshift-sandboxed-containers-operator

    出力例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.9.0    1.8.1        Succeeded

3.3.2. AWS のポートの有効化

AWS で実行されるピア Pod との内部通信を許可するには、ポート 15150 および 9000 を有効にする必要があります。

前提条件

  • OpenShift Sandboxed Containers Operator をインストールしている。
  • AWS コマンドラインツールがインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. OpenShift Container Platform クラスターにログインし、インスタンス ID を取得します。

    $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' \
      -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')
  2. AWS リージョンを取得します。

    $ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}')
  3. セキュリティーグループ ID を取得し、配列に保存します。

    $ AWS_SG_IDS=($(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \
      --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' \
      --output text --region $AWS_REGION))
  4. 各セキュリティーグループ ID について、ピア Pod シムが kata-agent 通信にアクセスできるように承認し、ピア Pod トンネルを設定します。

    $ for AWS_SG_ID in "${AWS_SG_IDS[@]}"; do \
      aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 15150 --source-group $AWS_SG_ID --region $AWS_REGION \
      aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 9000 --source-group $AWS_SG_ID --region $AWS_REGION \
    done

これでポートが有効になりました。

3.3.3. ピア Pod シークレットの作成

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、OpenShift sandboxed containers のピア Pod シークレットを手動で作成する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • AWS コンソールを使用して以下の値が生成されます。

    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY

手順

  1. 次の例に従って peer-pods-secret.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      AWS_ACCESS_KEY_ID: "<aws_access_key>" 1
      AWS_SECRET_ACCESS_KEY: "<aws_secret_access_key>" 2
    1
    AWS_ACCESS_KEY_ID 値を指定します。
    2
    AWS_SECRET_ACCESS_KEY 値を指定します。
  2. 以下のコマンドを実行してシークレットを作成します。

    $ oc apply -f peer-pods-secret.yaml

3.3.4. ピア Pod config map の作成

OpenShift sandboxed containers のピア Pod config map を作成する必要があります。

前提条件

  • クラスター認証情報に基づくデフォルトの AMI ID を使用していない場合は、Amazon Machine Image (AMI) ID がある。

手順

  1. AWS インスタンスから以下の値を取得します。

    1. インスタンス ID を取得して記録します。

      $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')

      これは、シークレットオブジェクトの他の値を取得するために使用されます。

    2. AWS リージョンを取得して記録します。

      $ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}') && echo "AWS_REGION: \"$AWS_REGION\""
    3. AWS サブネット ID を取得して記録します。

      $ AWS_SUBNET_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SubnetId' --region ${AWS_REGION} --output text) && echo "AWS_SUBNET_ID: \"$AWS_SUBNET_ID\""
    4. AWS VPC ID を取得して記録します。

      $ AWS_VPC_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].VpcId' --region ${AWS_REGION} --output text) && echo "AWS_VPC_ID: \"$AWS_VPC_ID\""
    5. AWS セキュリティーグループ ID を取得して記録します。

      $ AWS_SG_IDS=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --region  $AWS_REGION --output json | jq -r '.[][][]' | paste -sd ",") && echo "AWS_SG_IDS: \"$AWS_SG_IDS\""
  2. 以下の例に従って peer-pods-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "aws"
      VXLAN_PORT: "9000"
      PODVM_INSTANCE_TYPE: "t3.medium" 1
      PODVM_INSTANCE_TYPES: "t2.small,t2.medium,t3.large" 2
      PROXY_TIMEOUT: "5m"
      PODVM_AMI_ID: "<podvm_ami_id>" 3
      AWS_REGION: "<aws_region>" 4
      AWS_SUBNET_ID: "<aws_subnet_id>" 5
      AWS_VPC_ID: "<aws_vpc_id>" 6
      AWS_SG_IDS: "<aws_sg_ids>" 7
      PEERPODS_LIMIT_PER_NODE: "10" 8
      TAGS: "key1=value1,key2=value2" 9
      DISABLECVM: "true"
    1
    ワークロードでタイプが定義されていない場合に使用されるデフォルトのインスタンスタイプを定義します。
    2
    Pod の作成時に指定できるすべてのインスタンスタイプを一覧表示します。これにより、メモリーと CPU をあまり必要としないワークロードには小さいインスタンスタイプを定義したり、ワークロードが大きい場合は大きいインスタンスタイプを定義したりすることができます。
    3
    オプション: デフォルトでは、この値は、クラスターの認証情報に基づく AMI ID を使用して KataConfig CR を実行するときに入力されます。独自の AMI を作成する場合は、正しい AMI ID を指定します。
    4
    取得した AWS_REGION 値を指定します。
    5
    取得した AWS_SUBNET_ID 値を指定します。
    6
    取得した AWS_VPC_ID 値を指定します。
    7
    取得した AWS_SG_IDS 値を指定します。
    8
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    9
    Pod 仮想マシンインスタンスの key:value ペアとしてカスタムタグを設定して、ピア Pod のコストを追跡したり、異なるクラスター内のピア Pod を識別したりできます。
  3. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f peer-pods-cm.yaml

3.3.5. カスタムピア Pod 仮想マシンイメージの選択

Pod マニフェストにアノテーションを追加することで、ワークロード要件に合わせてカスタマイズされたカスタムピア Pod 仮想マシン (VM) イメージを選択できます。カスタムイメージは、ピア Podconfig map で指定されたデフォルトイメージをオーバーライドします。

前提条件

  • 使用予定のカスタム Pod 仮想マシンイメージの ID が利用でき、クラウドプロバイダーまたはハイパーバイザーと互換性がある。

手順

  1. io.katacontainers.config.hypervisor.image アノテーションを追加して Pod マニフェストを編集し、pod-manifest.yaml ファイルに保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<custom_image_id>" 1
    spec:
      runtimeClassName: kata-remote 2
      containers:
      - name: <example_container> 3
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    1
    カスタムピア Pod イメージ ID を指定します。
    2
    ピア Pod を作成するには、runtimeClassName フィールドが kata-remote に設定されていることを確認します。
    3
    コンテナー名を指定します。
  2. 以下のコマンドを実行して Pod を作成します。

    $ oc apply -f pod-manifest.yaml

3.3.6. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

3.3.7. KataConfig カスタムリソースの作成

ワーカーノードに kata-remote をランタイムクラスとしてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

KataConfig CR を作成すると、OpenShift Sandboxed Containers Operator がトリガーされ、以下が実行されます。

  • デフォルト設定で kata-remote という名前の RuntimeClass CR を作成します。これにより、RuntimeClassName フィールドの CR を参照して、kata-remote をランタイムとして使用するようにワークロードを設定できるようになります。この CR は、ランタイムのリソースオーバーヘッドも指定します。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
    1
    オプション: 特定のノードに kata-remote をインストールするためにノードラベルを適用した場合は、キーと値を指定します (例: osc: 'true')
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードに kata-remote がランタイムクラスとしてインストールされます。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata-remote はクラスターにインストールされます。

  4. 次のコマンドを実行してデーモンセットを確認します。

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
  5. 次のコマンドを実行してランタイムクラスを確認します。

    $ oc get runtimeclass

    出力例

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

Pod VM イメージの確認

kata-remote がクラスターにインストールされると、OpenShift sandboxed containers Operator は、ピア Pod の作成に使用される Pod 仮想マシンイメージを作成します。イメージがクラウドインスタンス上に作成されるため、このプロセスには時間がかかる場合があります。クラウドプロバイダー用に作成した config map を確認し、Pod 仮想マシンイメージが正常に作成されたことを確認できます。

手順

  1. ピア Pod 用に作成した config map を取得します。

    $ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml
  2. YAML ファイルの status スタンザを確認します。

    PODVM_AMI_ID パラメーターが入力されている場合は、Pod 仮想マシンイメージが正常に作成されています。

トラブルシューティング

  1. 次のコマンドを実行してイベントログを取得します。

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
  2. 次のコマンドを実行して、ジョブログを取得します。

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation

問題を解決できない場合は、Red Hat サポートケースを送信し、両方のログの出力を添付してください。

3.3.8. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata-remote を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

YAML ファイルにアノテーションを追加することで、config map で定義したデフォルトのインスタンスタイプを使用してワークロードをデプロイするかどうかを定義できます。

インスタンスタイプを手動で定義しない場合は、使用可能なメモリーに基づいて自動インスタンスタイプを使用するようにアノテーションを追加できます。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. 次の例のように、各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに spec.runtimeClassName: kata-remote を追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
  2. 手動で定義されたインスタンスタイプまたは自動インスタンスタイプを使用するには、Pod テンプレートオブジェクトにアノテーションを追加します。

    • 手動で定義されたインスタンスタイプを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <object>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.machine_type: "t3.medium" 1
      # ...
      1
      config map で定義したインスタンスタイプを指定します。
    • 自動インスタンスタイプを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <Pod>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.default_vcpus: <vcpus>
          io.katacontainers.config.hypervisor.default_memory: <memory>
      # ...

      ワークロードが使用できるメモリーの量を定義します。ワークロードは、使用可能なメモリーの量に基づいて自動インスタンスタイプで実行されます。

  3. 次のコマンドを実行して、変更をワークロードオブジェクトに適用します。

    $ oc apply -f <object.yaml>

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata-remote の場合、ワークロードはピア Pod を使用して OpenShift Sandboxed Containers で実行されています。

第4章 OpenShift sandboxed containers の Azure へのデプロイ

OpenShift sandboxed containers を Microsoft Azure クラウドコンピューティングサービスにデプロイできます。

OpenShift sandboxed containers はピア Pod をデプロイします。ピア Pod 設計により、ネストされた仮想化の必要性が回避されます。詳細は、ピア Pod および Peer pods technical dive を参照してください。

クラスターの要件

  • OpenShift sandboxed containers Operator をインストールするクラスターに Red Hat OpenShift Container Platform 4.14 以降をインストールしている。
  • クラスターには少なくとも 1 つのワーカーノードがある。

OpenShift Container Platform を Microsoft Azure Cloud Computing Services にインストールする方法の詳細は Azure へのインストール を参照してください。

4.1. ピア Pod のリソース要件

クラスターに十分なリソースがあることを確認する。

ピア Pod 仮想マシン (VM) には、次の 2 つの場所にリソースが必要です。

  • ワーカーノード。ワーカーノードは、メタデータ、Kata shim リソース (containerd-shim-kata-v2)、リモートハイパーバイザーリソース (cloud-api-adaptor)、およびワーカーノードとピア Pod VM 間のトンネル設定を保存します。
  • クラウドインスタンス。これは、クラウド内で実行されている実際のピア Pod VM です。

Kubernetes ワーカーノードで使用される CPU およびメモリーリソースは、ピア Pod の作成に使用される RuntimeClass (kata-remote) 定義に含まれる Pod オーバーヘッド によって処理されます。

クラウド内で実行されているピア Pod VM の合計数は、Kubernetes ノード拡張リソースとして定義されます。この制限はノードごとに設定され、peer-pods-cm config map の PEERPODS_LIMIT_PER_NODE 属性によって設定されます。

拡張リソースの名前は kata.peerpods.io/vm で、Kubernetes スケジューラーが容量の追跡とアカウンティングを処理できるようにします。

OpenShift Sandboxed Containers Operator のインストール後に、環境の要件に基づいてノードごとの制限を編集できます。

mutating Webhook により、拡張リソース kata.peerpods.io/vm が Pod 仕様に追加されます。また、リソース固有のエントリーが存在する場合は、Pod 仕様から削除されます。こうすることで、Kubernetes スケジューラーがこれらの拡張リソースを考慮できるようになり、リソースが利用可能な場合にのみピア Pod がスケジュールされるようになります。

mutating Webhook は、次のように Kubernetes Pod を変更します。

  • mutating Webhook は、TARGET_RUNTIME_CLASS 環境変数で指定された RuntimeClassName の想定値であるか、Pod をチェックします。Pod 仕様の値が TARGET_RUNTIME_CLASS の値と一致しない場合、Webhook は Pod を変更せずに終了します。
  • RuntimeClassName の値が一致する場合、Webhook は Pod 仕様に次の変更を加えます。

    1. この Webhook は、Pod 内のすべてのコンテナーおよび初期化コンテナーの resources フィールドからすべてのリソース仕様を削除します。
    2. Webhook は、Pod 内の最初のコンテナーのリソースフィールドを変更して、拡張リソース (kata.peerpods.io/vm) を仕様に追加します。拡張リソース kata.peerpods.io/vm は Kubernetes スケジューラーによってアカウンティング目的で使用されます。
注記

mutating Webhook は、OpenShift Container Platform の特定のシステム namespace が変更されないように除外します。これらのシステム namespace でピア Pod が作成された場合、Pod の仕様に拡張リソースが含まれていない限り、Kubernetes 拡張リソースを使用したリソースアカウンティングは機能しません。

ベストプラクティスとして、特定の namespace でのみピア Pod の作成を許可するクラスター全体のポリシーを定義します。

4.2. 送信接続の設定

ピア Pod がパブリックインターネットなどの外部ネットワークと通信できるようにするには、Pod 仮想マシン (VM) サブネットの送信接続を設定する必要があります。これには、NAT ゲートウェイの設定と、オプションでサブネットを Azure のクラスターの仮想ネットワーク (VNet) と統合する方法の定義が含まれます。

ピア Pod とサブネット
ピア Pod は、送信アクセス用に明示的な設定を必要とする専用の Azure サブネットで動作します。このサブネットは、OpenShift Container Platform ノードによって使用されるデフォルトのワーカーサブネット、またはピア Pod 専用に作成された別のカスタムサブネットのいずれかになります。
VNet ピアリング
別のサブネットを使用する場合、VNet ピアリングはピア Pod VNet をクラスターの VNet に接続し、分離を維持しながら内部通信を確保します。これには、CIDR 範囲が VNet 間で重複しないようにする必要があります。

送信接続は次の 2 つの方法で設定できます。

  • デフォルトのワーカーサブネット: 既存のワーカーサブネットを変更して、NAT ゲートウェイを含めます。これはより単純で、クラスターリソースを再利用しますが、分離性は低くなります。
  • ピア Pod VNet: ピア Pod 専用の VNet とサブネットを設定し、NAT ゲートウェイを接続して、クラスター VNet とピアリングします。これにより、複雑さは増しますが、分離性と柔軟性が向上します。

4.2.1. 送信接続用のデフォルトのワーカーサブネットの設定

デフォルトのワーカーサブネットを NAT ゲートウェイで設定できます。

前提条件

  • Azure CLI (az) がインストールされ、認証されている。
  • Azure リソースグループと VNet への管理者アクセス権がある。

手順

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

    $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster \
        -o jsonpath='{.status.platformStatus.azure.resourceGroupName}')
  2. 次のコマンドを実行して、AZURE_REGION 環境変数を設定します。

    $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP}\
        --query "{Location:location}" --output tsv) && \
        echo "AZURE_REGION: \"$AZURE_REGION\""
  3. 次のコマンドを実行して、AZURE_VNET_NAME 環境変数を設定します。

    $ AZURE_VNET_NAME=$(az network vnet list \
        -g "${AZURE_RESOURCE_GROUP}" --query '[].name' -o tsv)
  4. 次のコマンドを実行して、AZURE_SUBNET_ID 環境変数を設定します。

    $ AZURE_SUBNET_ID=$(az network vnet subnet list \
        --resource-group "${AZURE_RESOURCE_GROUP}" \
        --vnet-name "${AZURE_VNET_NAME}" --query "[].{Id:id} \
        | [? contains(Id, 'worker')]" --output tsv)
  5. 次のコマンドを実行して、ピア Pod サブネットの NAT ゲートウェイ環境変数を設定します。

    $ export PEERPOD_NAT_GW=peerpod-nat-gw
    $ export PEERPOD_NAT_GW_IP=peerpod-nat-gw-ip
  6. 次のコマンドを実行して、NAT ゲートウェイのパブリック IP アドレスを作成します。

    $ az network public-ip create -g "${AZURE_RESOURCE_GROUP}" \
        -n "${PEERPOD_NAT_GW_IP}" -l "${AZURE_REGION}" --sku Standard
  7. 次のコマンドを実行して、NAT ゲートウェイを作成し、パブリック IP アドレスに関連付けます。

    $ az network nat gateway create -g "${AZURE_RESOURCE_GROUP}" \
        -l "${AZURE_REGION}" --public-ip-addresses "${PEERPOD_NAT_GW_IP}" \
        -n "${PEERPOD_NAT_GW}"
  8. 以下のコマンドを実行して、NAT ゲートウェイを使用するように VNet サブネットを更新します。

    $ az network vnet subnet update --nat-gateway "${PEERPOD_NAT_GW}" \
        --ids "${AZURE_SUBNET_ID}"

検証

  • 以下のコマンドを実行して、NAT ゲートウェイが VNet サブネットに割り当てられていることを確認します。

    $ az network vnet subnet show --ids "${AZURE_SUBNET_ID}" \
        --query "natGateway.id" -o tsv

    出力には NAT ゲートウェイリソース ID が含まれます。NAT ゲートウェイが接続されていない場合、出力は空になります。

    出力例

    /subscriptions/12345678-1234-1234-1234-1234567890ab/resourceGroups/myResourceGroup/providers/Microsoft.Network/natGateways/myNatGateway

関連情報

4.2.2. 送信接続用のピア Pod VNet の作成

パブリックインターネットアクセスを有効にするには、ピア Pod 専用の仮想ネットワーク (VNet) を作成して、ネットワークアドレス変換 (NAT) ゲートウェイの接続およびサブネットの作成を行い、重複しないアドレス空間で VNet ピアリングを有効にします。

前提条件

  • Azure CLI (az) がインストールされている、
  • Azure にサインインしている。Azure CLI を使用した Azure の認証 を参照してください。
  • クラスターをホストする Azure リソースグループおよび VNet への管理者アクセスがある。
  • クラスターの VNet classless inter-domain routing (CIDR) アドレスを検証した。デフォルト値は 10.0.0.0/14 です。デフォルト値を上書きした場合は、CIDR アドレスがピア Pod VNet と重複していないことを確認します。たとえば、192.168.0.0/16 です。

手順

  1. ピア Pod ネットワークの環境変数を設定します。

    1. 次のコマンドを実行して、ピア Pod VNet 環境変数を設定します。

      $ export PEERPOD_VNET_NAME="${PEERPOD_VNET_NAME:-peerpod-vnet}"
      $ export PEERPOD_VNET_CIDR="${PEERPOD_VNET_CIDR:-192.168.0.0/16}"
    2. 次のコマンドを実行して、ピア Pod サブネット環境変数を設定します。

      $ export PEERPOD_SUBNET_NAME="${PEERPOD_SUBNET_NAME:-peerpod-subnet}"
      $ export PEERPOD_SUBNET_CIDR="${PEERPOD_SUBNET_CIDR:-192.168.0.0/16}"
  2. Azure の環境変数を設定します。

    $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster \
        -o jsonpath='{.status.platformStatus.azure.resourceGroupName}')
    $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP}\
        --query "{Location:location}" --output tsv) && \
        echo "AZURE_REGION: \"$AZURE_REGION\""
    $ AZURE_VNET_NAME=$(az network vnet list \
        -g "${AZURE_RESOURCE_GROUP}" --query '[].name' -o tsv)
  3. 次のコマンドを実行して、ピア Pod の NAT ゲートウェイ環境変数を設定します。

    $ export PEERPOD_NAT_GW="${PEERPOD_NAT_GW:-peerpod-nat-gw}"
    $ export PEERPOD_NAT_GW_IP="${PEERPOD_NAT_PUBLIC_IP:-peerpod-nat-gw-ip}"
  4. VNET を設定します。

    1. 次のコマンドを実行して、ピア Pod VNet を作成します。

      $ az network vnet create --resource-group "${AZURE_RESOURCE_GROUP}" \
          --name "${PEERPOD_VNET_NAME}" \
          --address-prefixes "${PEERPOD_VNET_CIDR}"
    2. 次のコマンドを実行して、ピア Pod VNet のパブリック IP アドレスを作成します。

      $ az network public-ip create -g "${AZURE_RESOURCE_GROUP}" \
          -n "${PEERPOD_NAT_GW_IP}" -l "${AZURE_REGION}"
    3. 次のコマンドを実行して、ピア Pod VNet の NAT ゲートウェイを作成します。

      $ az network nat gateway create -g "${AZURE_RESOURCE_GROUP}" \
          -l "${AZURE_REGION}" \
          --public-ip-addresses "${PEERPOD_NAT_GW_IP}" \
          -n "${PEERPOD_NAT_GW}"
    4. 次のコマンドを実行して、ピア Pod VNet にサブネットを作成し、NAT ゲートウェイを接続します。

      $ az network vnet subnet create \
          --resource-group "${AZURE_RESOURCE_GROUP}" \
          --vnet-name "${PEERPOD_VNET_NAME}" \
          --name "${PEERPOD_SUBNET_NAME}" \
          --address-prefixes "${PEERPOD_SUBNET_CIDR}" \
          --nat-gateway "${PEERPOD_NAT_GW}"
  5. 仮想ネットワークピアリング接続を設定します。

    1. 次のコマンドを実行してピアリング接続を作成します。

      $ az network vnet peering create -g "${AZURE_RESOURCE_GROUP}" \
          -n peerpod-azure-vnet-to-peerpod-vnet \
          --vnet-name "${AZURE_VNET_NAME}" \
          --remote-vnet "${PEERPOD_VNET_NAME}" --allow-vnet-access \
          --allow-forwarded-traffic
    2. 次のコマンドを実行してピアリング接続を同期します。

      $ az network vnet peering sync -g "${AZURE_RESOURCE_GROUP}" \
          -n peerpod-azure-vnet-to-peerpod-vnet \
          --vnet-name "${AZURE_VNET_NAME}"
    3. 次のコマンドを実行してピアリング接続を完了します。

      $ az network vnet peering create -g "${AZURE_RESOURCE_GROUP}" \
          -n peerpod-peerpod-vnet-to-azure-vnet \
          --vnet-name "${PEERPOD_VNET_NAME}" \
          --remote-vnet "${AZURE_VNET_NAME}" --allow-vnet-access \
          --allow-forwarded-traffic

検証

  1. 次のコマンドを実行して、クラスター VNet からのピアリング接続ステータスを確認します。

    $ az network vnet peering show -g "${AZURE_RESOURCE_GROUP}" \
        -n peerpod-azure-vnet-to-peerpod-vnet \
        --vnet-name "${AZURE_VNET_NAME}" \
        --query "peeringState" -o tsv

    これにより、Connected が返されるはずです。

  2. 次のコマンドを実行して、NAT ゲートウェイがピア Pod サブネットに接続されていることを確認します。

    $ az network vnet subnet show --resource-group "${AZURE_RESOURCE_GROUP}" \
        --vnet-name "${PEERPOD_VNET_NAME}" --name "${PEERPOD_SUBNET_NAME}" \
        --query "natGateway.id" -o tsv

関連情報

4.3. Web コンソールを使用した OpenShift Sandboxed Containers のデプロイ

OpenShift Container Platform Web コンソールを使用して次のタスクを実行することで、Azure に OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: OpenShift sandboxed containers Operator とともにインストールされる Cloud Credential Operator をアンインストールした場合は、ピア Pod シークレットを作成します。
  3. オプション: カスタム Pod 仮想マシンイメージを選択します。
  4. オプション: Azure シークレットを作成します。
  5. オプション: Kata エージェントポリシーをカスタマイズします。
  6. ピア Pod の config map を作成します。
  7. KataConfig カスタムリソースを作成します。
  8. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

4.3.1. OpenShift Sandboxed Containers Operator のインストール

OpenShift Container Platform Web コンソールを使用して、OpenShift sandboxed containers Operator をインストールできます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. Web コンソールで、OperatorsOperatorHub に移動します。
  2. Filter by keyword フィールドに OpenShift sandboxed containers と入力します。
  3. OpenShift sandboxed containers Operator タイルを選択し、Install をクリックします。
  4. Install Operator ページで、利用可能な Update Channel オプションの一覧から stable を選択します。
  5. Installed NamespaceOperator recommended Namespace が選択されていることを確認します。これにより、Operator が必須の openshift-sandboxed-containers-operator namespace にインストールされます。この namespace がまだ存在しない場合は、自動的に作成されます。

    注記

    OpenShift Sandboxed Containers Operator を openshift-sandboxed-containers-operator 以外の namespace にインストールしようとすると、インストールに失敗します。

  6. Approval StrategyAutomatic が選択されていることを確認します。Automatic がデフォルト値であり、新しい z-stream リリースが利用可能になると、OpenShift Sandboxed Containers への自動更新が有効になります。
  7. Install をクリックします。
  8. OperatorInstalled Operator に移動して、Operator がインストールされていることを確認します。

4.3.2. ピア Pod シークレットの作成

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、OpenShift sandboxed containers のピア Pod シークレットを手動で作成する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • Azure CLI ツールをインストールして設定している。

手順

  1. 次のコマンドを実行して、Azure サブスクリプション ID を取得します。

    $ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \
      -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""
  2. 次のコマンドを実行して RBAC コンテンツを生成します。

    $ az ad sp create-for-rbac --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \
      --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"

    出力例

    {
      "client_id": `AZURE_CLIENT_ID`,
      "client_secret": `AZURE_CLIENT_SECRET`,
      "tenant_id": `AZURE_TENANT_ID`
    }

  3. secret オブジェクトで使用する RBAC 出力を記録します。
  4. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  5. OpenShift sandboxed containers Operator タイルをクリックします。
  6. 右上隅のインポートアイコン (+) をクリックします。
  7. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      AZURE_CLIENT_ID: "<azure_client_id>" 1
      AZURE_CLIENT_SECRET: "<azure_client_secret>" 2
      AZURE_TENANT_ID: "<azure_tenant_id>" 3
      AZURE_SUBSCRIPTION_ID: "<azure_subscription_id>" 4
    1
    AZURE_CLIENT_ID 値を指定します。
    2
    AZURE_CLIENT_SECRET 値を指定します。
    3
    AZURE_TENANT_ID 値を指定します。
    4
    AZURE_SUBSCRIPTION_ID 値を指定します。
  8. Save をクリックして変更を適用します。
  9. WorkloadsSecrets に移動して、ピア Pod シークレットを確認します。

4.3.3. ピア Pod config map の作成

OpenShift sandboxed containers のピア Pod config map を作成する必要があります。

手順

  1. Azure インスタンスから以下の値を取得します。

    1. Azure リソースグループを取得して記録します。

      $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
    2. Azure VNet 名を取得し、記録します。

      $ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)

      この値は、Azure サブネット ID を取得するために使用されます。

    3. Azure サブネット ID を取得して記録します。

      $ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""
    4. Azure ネットワークセキュリティーグループ (NSG) ID を取得して記録します。

      $ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""
    5. Azure リージョンを取得して記録します。

      $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
  2. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  3. Operator のリストから OpenShift Sandboxed Containers Operator を選択します。
  4. 右上隅にあるインポートアイコン (+) をクリックします。
  5. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "azure"
      VXLAN_PORT: "9000"
      AZURE_INSTANCE_SIZE: "Standard_B2als_v2" 1
      AZURE_INSTANCE_SIZES: "Standard_B2als_v2,Standard_D2as_v5,Standard_D4as_v5,Standard_D2ads_v5" 2
      AZURE_SUBNET_ID: "<azure_subnet_id>" 3
      AZURE_NSG_ID: "<azure_nsg_id>" 4
      PROXY_TIMEOUT: "5m"
      AZURE_IMAGE_ID: "<azure_image_id>" 5
      AZURE_REGION: "<azure_region>" 6
      AZURE_RESOURCE_GROUP: "<azure_resource_group>" 7
      PEERPODS_LIMIT_PER_NODE: "10" 8
      TAGS: "key1=value1,key2=value2" 9
      DISABLECVM: "true"
    1
    インスタンスサイズがワークロードで定義されていない場合、"Standard_B2als_v2" インスタンスサイズがデフォルト値になります。
    2
    Pod の作成時に指定できるすべてのインスタンスサイズを一覧表示します。これにより、メモリーと CPU をあまり必要としないワークロードには小さいインスタンスサイズを定義したり、ワークロードが大きい場合は大きいインスタンスサイズを定義したりすることができます。
    3
    取得した AZURE_SUBNET_ID 値を指定します。
    4
    取得した AZURE_NSG_ID 値を指定します。
    5
    オプション: デフォルトでは、この値は、クラスターの認証情報に基づく Azure イメージ ID を使用して KataConfig CR を実行するときに入力されます。独自の Azure イメージを作成する場合は、正しいイメージ ID を指定します。
    6
    取得した AZURE_REGION 値を指定します。
    7
    取得した AZURE_RESOURCE_GROUP 値を指定します。
    8
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    9
    Pod 仮想マシンインスタンスの key:value ペアとしてカスタムタグを設定して、ピア Pod のコストを追跡したり、異なるクラスター内のピア Pod を識別したりできます。
  6. Save をクリックして変更を適用します。
  7. 新しい config map を表示するには、WorkloadsConfigMaps に移動します。

4.3.4. カスタムピア Pod 仮想マシンイメージの選択

Pod マニフェストにアノテーションを追加することで、ワークロード要件に合わせてカスタマイズされたカスタムピア Pod 仮想マシン (VM) イメージを選択できます。カスタムイメージは、ピア Podconfig map で指定されたデフォルトイメージをオーバーライドします。

前提条件

  • 使用予定のカスタム Pod 仮想マシンイメージの ID が利用でき、クラウドプロバイダーまたはハイパーバイザーと互換性がある。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. Operator のリストから OpenShift Sandboxed Containers Operator を選択します。
  3. 右上隅にあるインポートアイコン (+) をクリックします。
  4. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<custom_image_id>" 1
    spec:
      runtimeClassName: kata-remote 2
      containers:
      - name: <example_container> 3
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    1
    カスタムピア Pod イメージ ID を指定します。
    2
    ピア Pod を作成するには、runtimeClassName フィールドが kata-remote に設定されていることを確認します。
    3
    コンテナー名を指定します。
  5. Save をクリックして変更を適用します。

4.3.5. Azure シークレットの作成

Azure 仮想マシン (VM) 作成 API に必要な SSH 鍵シークレットを作成する必要があります。Azure では SSH 公開鍵のみが必要です。Confidential Containers は仮想マシン内の SSH を無効にするため、鍵は仮想マシン内で効果がありません。

手順

  1. 次のコマンドを実行して、SSH キーペアを生成します。

    $ ssh-keygen -f ./id_rsa -N ""
  2. OpenShift Container Platform Web コンソールで、WorkloadsSecrets に移動します。
  3. Secrets ページで、openshift-sandboxed-containers-operator プロジェクトにいることを確認します。
  4. Create をクリックし、Key/value secret を選択します。
  5. Secret name フィールドに ssh-key-secret と入力します。
  6. Key フィールドに id_rsa.pub と入力します。
  7. Value フィールドに、公開 SSH 鍵を貼り付けます。
  8. Create をクリックします。
  9. 作成した SSH 鍵を削除します。

    $ shred --remove id_rsa.pub id_rsa

4.3.6. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

4.3.7. KataConfig カスタムリソースの作成

ワーカーノードに kata-remoteRuntimeClass としてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

kata-remote ランタイムクラスは、デフォルトですべてのワーカーノードにインストールされます。kata-remote を特定のノードにのみインストールする場合は、それらのノードにラベルを追加し、KataConfig CR でラベルを定義できます。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。次の要因により再起動時間が長くなる可能性があります。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • オプション: ノードの適格性チェックを有効にする場合は、Node Feature Discovery Operator をインストールしておきます。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. OpenShift sandboxed containers Operator を選択します。
  3. KataConfig タブで、Create KataConfig をクリックします。
  4. 以下の詳細を入力します。

    • Name: オプション: デフォルト名は example-kataconfig です。
    • Labels: オプション: 関連する識別属性を KataConfig リソースに入力します。各ラベルはキーと値のペアを表します。
    • enablePeerPods: パブリッククラウド、IBM Z®、および IBM® LinuxONE デプロイメントの場合に選択します。
    • kataConfigPoolSelector。オプション: 選択したノードに kata-remote をインストールするには、選択したノードのラベルに一致する式を追加します。

      1. kataConfigPoolSelector エリアを展開します。
      2. kataConfigPoolSelector エリアで、matchExpressions を展開します。これは、ラベルセレクターの要件のリストです。
      3. Add matchExpressions をクリックします。
      4. Key フィールドに、セレクターの適用先のラベルキーを入力します。
      5. Operator フィールドに、キーとラベル値の関係を入力します。有効な演算子は、InNotInExistsDoesNotExist です。
      6. Values エリアを展開し、Add value をクリックします。
      7. Value フィールドで、true または falsekey ラベル値として入力します。
    • logLevel: ランタイムクラスが kata-remote のノードに対して取得されるログデータのレベルを定義します。
  5. Create をクリックします。KataConfig CR が作成され、ワーカーノードに kata-remote ランタイムクラスをインストールします。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

検証

  1. KataConfig タブで、KataConfig CR をクリックして詳細を表示します。
  2. YAML タブをクリックして status スタンザを表示します。

    status スタンザには、conditions および kataNodes キーが含まれています。status.kataNodes の値はノード配列であり、各ノードには kata-remote インストールの特定の状態にあるノードがリストされます。更新があるたびにメッセージが表示されます。

  3. Reload をクリックして、YAML を更新します。

    status.kataNodes 配列内のすべてのワーカーに、値 installed と、理由が指定されていない conditions.InProgress: False が表示される場合、kata-remote はクラスターにインストールされています。

関連情報
Pod VM イメージの確認

kata-remote がクラスターにインストールされると、OpenShift sandboxed containers Operator は、ピア Pod の作成に使用される Pod 仮想マシンイメージを作成します。イメージがクラウドインスタンス上に作成されるため、このプロセスには時間がかかる場合があります。クラウドプロバイダー用に作成した config map を確認し、Pod 仮想マシンイメージが正常に作成されたことを確認できます。

手順

  1. WorkloadsConfigMaps に移動します。
  2. プロバイダー config map をクリックすると、詳細が表示されます。
  3. YAML タブをクリックします。
  4. YAML ファイルの status スタンザを確認します。

    AZURE_IMAGE_ID パラメーターが入力されている場合は、Pod 仮想マシンイメージが正常に作成されています。

トラブルシューティング

  1. 次のコマンドを実行してイベントログを取得します。

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
  2. 次のコマンドを実行して、ジョブログを取得します。

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation

問題を解決できない場合は、Red Hat サポートケースを送信し、両方のログの出力を添付してください。

4.3.8. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata-remote を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

YAML ファイルにアノテーションを追加することで、config map で定義したデフォルトのインスタンスサイズを使用してワークロードをデプロイするかどうかを定義できます。

インスタンスサイズを手動で定義しない場合は、使用可能なメモリーに基づいて自動インスタンスサイズを使用するようにアノテーションを追加できます。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. OpenShift Container Platform Web コンソールで、Workloads → workload type (例: Pods) に移動します。
  2. ワークロードタイプページで、オブジェクトをクリックして詳細を表示します。
  3. YAML タブをクリックします。
  4. 次の例のように、各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに spec.runtimeClassName: kata-remote を追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
  5. 手動で定義されたインスタンスサイズまたは自動インスタンスサイズを使用するには、Pod テンプレートオブジェクトにアノテーションを追加します。

    • 手動で定義されたインスタンスサイズを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <object>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.machine_type: "Standard_B2als_v2" 1
      # ...
      1
      config map で定義したインスタンスサイズを指定します。
    • 自動インスタンスサイズを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <Pod>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.default_vcpus: <vcpus>
          io.katacontainers.config.hypervisor.default_memory: <memory>
      # ...

      ワークロードが使用できるメモリーの量を定義します。ワークロードは、使用可能なメモリーの量に基づいて自動インスタンスサイズで実行されます。

  6. Save をクリックして変更を適用します。

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata-remote の場合、ワークロードはピア Pod を使用して OpenShift Sandboxed Containers で実行されています。

4.4. コマンドラインを使用した OpenShift Sandboxed Containers のデプロイ

コマンドラインインターフェイス (CLI) を使用して次のタスクを実行することにより、Azure に OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: 各ワーカーノードで実行されている仮想マシンの数を変更します。
  3. オプション: OpenShift sandboxed containers Operator とともにインストールされる Cloud Credential Operator をアンインストールした場合は、ピア Pod シークレットを作成します。
  4. オプション: カスタム Pod 仮想マシンイメージを選択します。
  5. ピア Pod の config map を作成します。
  6. オプション: Azure シークレットを作成します。
  7. オプション: Kata エージェントポリシーをカスタマイズします。
  8. KataConfig カスタムリソースを作成します。
  9. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

4.4.1. OpenShift Sandboxed Containers Operator のインストール

CLI を使用して、OpenShift Sandboxed Containers Operator をインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. osc-namespace.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
  2. 以下のコマンドを実行して namespace を作成します。

    $ oc apply -f osc-namespace.yaml
  3. osc-operatorgroup.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
  4. 以下のコマンドを実行して Operator グループを作成します。

    $ oc apply -f osc-operatorgroup.yaml
  5. osc-subscription.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.9.0
  6. 次のコマンドを実行して、サブスクリプションを作成します。

    $ oc apply -f osc-subscription.yaml
  7. 次のコマンドを実行して、Operator が正常にインストールされていることを確認します。

    $ oc get csv -n openshift-sandboxed-containers-operator

    このコマンドが完了するまでに数分かかる場合があります。

  8. 次のコマンドを実行してプロセスを監視します。

    $ watch oc get csv -n openshift-sandboxed-containers-operator

    出力例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.9.0    1.8.1        Succeeded

4.4.2. ピア Pod シークレットの作成

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、OpenShift sandboxed containers のピア Pod シークレットを手動で作成する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • Azure CLI ツールをインストールして設定している。

手順

  1. 次のコマンドを実行して、Azure サブスクリプション ID を取得します。

    $ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \
      -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""
  2. 次のコマンドを実行して RBAC コンテンツを生成します。

    $ az ad sp create-for-rbac --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \
      --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"

    出力例

    {
      "client_id": `AZURE_CLIENT_ID`,
      "client_secret": `AZURE_CLIENT_SECRET`,
      "tenant_id": `AZURE_TENANT_ID`
    }

  3. secret オブジェクトで使用する RBAC 出力を記録します。
  4. 次の例に従って peer-pods-secret.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      AZURE_CLIENT_ID: "<azure_client_id>" 1
      AZURE_CLIENT_SECRET: "<azure_client_secret>" 2
      AZURE_TENANT_ID: "<azure_tenant_id>" 3
      AZURE_SUBSCRIPTION_ID: "<azure_subscription_id>" 4
    1
    AZURE_CLIENT_ID 値を指定します。
    2
    AZURE_CLIENT_SECRET 値を指定します。
    3
    AZURE_TENANT_ID 値を指定します。
    4
    AZURE_SUBSCRIPTION_ID 値を指定します。
  5. 以下のコマンドを実行してシークレットを作成します。

    $ oc apply -f peer-pods-secret.yaml

4.4.3. ピア Pod config map の作成

OpenShift sandboxed containers のピア Pod config map を作成する必要があります。

手順

  1. Azure インスタンスから以下の値を取得します。

    1. Azure リソースグループを取得して記録します。

      $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
    2. Azure VNet 名を取得し、記録します。

      $ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)

      この値は、Azure サブネット ID を取得するために使用されます。

    3. Azure サブネット ID を取得して記録します。

      $ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""
    4. Azure ネットワークセキュリティーグループ (NSG) ID を取得して記録します。

      $ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""
    5. Azure リージョンを取得して記録します。

      $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
  2. 以下の例に従って peer-pods-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "azure"
      VXLAN_PORT: "9000"
      AZURE_INSTANCE_SIZE: "Standard_B2als_v2" 1
      AZURE_INSTANCE_SIZES: "Standard_B2als_v2,Standard_D2as_v5,Standard_D4as_v5,Standard_D2ads_v5" 2
      AZURE_SUBNET_ID: "<azure_subnet_id>" 3
      AZURE_NSG_ID: "<azure_nsg_id>" 4
      PROXY_TIMEOUT: "5m"
      AZURE_IMAGE_ID: "<azure_image_id>" 5
      AZURE_REGION: "<azure_region>" 6
      AZURE_RESOURCE_GROUP: "<azure_resource_group>" 7
      PEERPODS_LIMIT_PER_NODE: "10" 8
      TAGS: "key1=value1,key2=value2" 9
      DISABLECVM: "true"
    1
    インスタンスサイズがワークロードで定義されていない場合、"Standard_B2als_v2" インスタンスサイズがデフォルト値になります。
    2
    Pod の作成時に指定できるすべてのインスタンスサイズを一覧表示します。これにより、メモリーと CPU をあまり必要としないワークロードには小さいインスタンスサイズを定義したり、ワークロードが大きい場合は大きいインスタンスサイズを定義したりすることができます。
    3
    取得した AZURE_SUBNET_ID 値を指定します。
    4
    取得した AZURE_NSG_ID 値を指定します。
    5
    オプション: デフォルトでは、この値は、クラスターの認証情報に基づく Azure イメージ ID を使用して KataConfig CR を実行するときに入力されます。独自の Azure イメージを作成する場合は、正しいイメージ ID を指定します。
    6
    取得した AZURE_REGION 値を指定します。
    7
    取得した AZURE_RESOURCE_GROUP 値を指定します。
    8
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    9
    Pod 仮想マシンインスタンスの key:value ペアとしてカスタムタグを設定して、ピア Pod のコストを追跡したり、異なるクラスター内のピア Pod を識別したりできます。
  3. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f peer-pods-cm.yaml

4.4.4. カスタムピア Pod 仮想マシンイメージの選択

Pod マニフェストにアノテーションを追加することで、ワークロード要件に合わせてカスタマイズされたカスタムピア Pod 仮想マシン (VM) イメージを選択できます。カスタムイメージは、ピア Podconfig map で指定されたデフォルトイメージをオーバーライドします。

前提条件

  • 使用予定のカスタム Pod 仮想マシンイメージの ID が利用でき、クラウドプロバイダーまたはハイパーバイザーと互換性がある。

手順

  1. io.katacontainers.config.hypervisor.image アノテーションを追加して Pod マニフェストを編集し、pod-manifest.yaml ファイルに保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<custom_image_id>" 1
    spec:
      runtimeClassName: kata-remote 2
      containers:
      - name: <example_container> 3
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    1
    カスタムピア Pod イメージ ID を指定します。
    2
    ピア Pod を作成するには、runtimeClassName フィールドが kata-remote に設定されていることを確認します。
    3
    コンテナー名を指定します。
  2. 以下のコマンドを実行して Pod を作成します。

    $ oc apply -f pod-manifest.yaml

4.4.5. Azure シークレットの作成

Azure 仮想マシン (VM) 作成 API に必要な SSH 鍵シークレットを作成する必要があります。Azure では SSH 公開鍵のみが必要です。Confidential Containers は仮想マシン内の SSH を無効にするため、鍵は仮想マシン内で効果がありません。

手順

  1. 次のコマンドを実行して、SSH キーペアを生成します。

    $ ssh-keygen -f ./id_rsa -N ""
  2. 以下のコマンドを実行して Secret オブジェクトを作成します。

    $ oc create secret generic ssh-key-secret \
      -n openshift-sandboxed-containers-operator \
      --from-file=id_rsa.pub=./id_rsa.pub \
      --from-file=id_rsa=./id_rsa
  3. 作成した SSH 鍵を削除します。

    $ shred --remove id_rsa.pub id_rsa

4.4.6. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

4.4.7. KataConfig カスタムリソースの作成

ワーカーノードに kata-remote をランタイムクラスとしてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

KataConfig CR を作成すると、OpenShift Sandboxed Containers Operator がトリガーされ、以下が実行されます。

  • デフォルト設定で kata-remote という名前の RuntimeClass CR を作成します。これにより、RuntimeClassName フィールドの CR を参照して、kata-remote をランタイムとして使用するようにワークロードを設定できるようになります。この CR は、ランタイムのリソースオーバーヘッドも指定します。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
    1
    オプション: 特定のノードに kata-remote をインストールするためにノードラベルを適用した場合は、キーと値を指定します (例: osc: 'true')
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードに kata-remote がランタイムクラスとしてインストールされます。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata-remote はクラスターにインストールされます。

  4. 次のコマンドを実行してデーモンセットを確認します。

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
  5. 次のコマンドを実行してランタイムクラスを確認します。

    $ oc get runtimeclass

    出力例

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

Pod VM イメージの確認

kata-remote がクラスターにインストールされると、OpenShift sandboxed containers Operator は、ピア Pod の作成に使用される Pod 仮想マシンイメージを作成します。イメージがクラウドインスタンス上に作成されるため、このプロセスには時間がかかる場合があります。クラウドプロバイダー用に作成した config map を確認し、Pod 仮想マシンイメージが正常に作成されたことを確認できます。

手順

  1. ピア Pod 用に作成した config map を取得します。

    $ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml
  2. YAML ファイルの status スタンザを確認します。

    AZURE_IMAGE_ID パラメーターが入力されている場合は、Pod 仮想マシンイメージが正常に作成されています。

トラブルシューティング

  1. 次のコマンドを実行してイベントログを取得します。

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
  2. 次のコマンドを実行して、ジョブログを取得します。

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation

問題を解決できない場合は、Red Hat サポートケースを送信し、両方のログの出力を添付してください。

4.4.8. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata-remote を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

YAML ファイルにアノテーションを追加することで、config map で定義したデフォルトのインスタンスサイズを使用してワークロードをデプロイするかどうかを定義できます。

インスタンスサイズを手動で定義しない場合は、使用可能なメモリーに基づいて自動インスタンスサイズを使用するようにアノテーションを追加できます。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. 次の例のように、各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに spec.runtimeClassName: kata-remote を追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...
  2. 手動で定義されたインスタンスサイズまたは自動インスタンスサイズを使用するには、Pod テンプレートオブジェクトにアノテーションを追加します。

    • 手動で定義されたインスタンスサイズを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <object>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.machine_type: "Standard_B2als_v2" 1
      # ...
      1
      config map で定義したインスタンスサイズを指定します。
    • 自動インスタンスサイズを使用するには、次のアノテーションを追加します。

      apiVersion: v1
      kind: <Pod>
      metadata:
        annotations:
          io.katacontainers.config.hypervisor.default_vcpus: <vcpus>
          io.katacontainers.config.hypervisor.default_memory: <memory>
      # ...

      ワークロードが使用できるメモリーの量を定義します。ワークロードは、使用可能なメモリーの量に基づいて自動インスタンスサイズで実行されます。

  3. 次のコマンドを実行して、変更をワークロードオブジェクトに適用します。

    $ oc apply -f <object.yaml>

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata-remote の場合、ワークロードはピア Pod を使用して OpenShift Sandboxed Containers で実行されています。

第5章 Google Cloud への OpenShift Sandboxed Containers のデプロイ

Google Cloud に OpenShift Sandboxed Containers をデプロイできます。

OpenShift sandboxed containers はピア Pod をデプロイします。ピア Pod 設計により、ネストされた仮想化の必要性が回避されます。詳細は、ピア Pod および Peer pods technical dive を参照してください。

クラスターの要件

  • Google Cloud 用の OpenShift sandboxed containers Operator をインストールするクラスターに OpenShift Container Platform 4.17 以降がインストールされている。
  • クラスターには少なくとも 1 つのワーカーノードがある。

詳細は、OpenShift Container Platform ドキュメント Google Cloud へのインストール を参照してください。

5.1. ピア Pod のリソース要件

クラスターに十分なリソースがあることを確認する。

ピア Pod 仮想マシン (VM) には、次の 2 つの場所にリソースが必要です。

  • ワーカーノード。ワーカーノードは、メタデータ、Kata shim リソース (containerd-shim-kata-v2)、リモートハイパーバイザーリソース (cloud-api-adaptor)、およびワーカーノードとピア Pod VM 間のトンネル設定を保存します。
  • クラウドインスタンス。これは、クラウド内で実行されている実際のピア Pod VM です。

Kubernetes ワーカーノードで使用される CPU およびメモリーリソースは、ピア Pod の作成に使用される RuntimeClass (kata-remote) 定義に含まれる Pod オーバーヘッド によって処理されます。

クラウド内で実行されているピア Pod VM の合計数は、Kubernetes ノード拡張リソースとして定義されます。この制限はノードごとに設定され、peer-pods-cm config map の PEERPODS_LIMIT_PER_NODE 属性によって設定されます。

拡張リソースの名前は kata.peerpods.io/vm で、Kubernetes スケジューラーが容量の追跡とアカウンティングを処理できるようにします。

OpenShift Sandboxed Containers Operator のインストール後に、環境の要件に基づいてノードごとの制限を編集できます。

mutating Webhook により、拡張リソース kata.peerpods.io/vm が Pod 仕様に追加されます。また、リソース固有のエントリーが存在する場合は、Pod 仕様から削除されます。こうすることで、Kubernetes スケジューラーがこれらの拡張リソースを考慮できるようになり、リソースが利用可能な場合にのみピア Pod がスケジュールされるようになります。

mutating Webhook は、次のように Kubernetes Pod を変更します。

  • mutating Webhook は、TARGET_RUNTIME_CLASS 環境変数で指定された RuntimeClassName の想定値であるか、Pod をチェックします。Pod 仕様の値が TARGET_RUNTIME_CLASS の値と一致しない場合、Webhook は Pod を変更せずに終了します。
  • RuntimeClassName の値が一致する場合、Webhook は Pod 仕様に次の変更を加えます。

    1. この Webhook は、Pod 内のすべてのコンテナーおよび初期化コンテナーの resources フィールドからすべてのリソース仕様を削除します。
    2. Webhook は、Pod 内の最初のコンテナーのリソースフィールドを変更して、拡張リソース (kata.peerpods.io/vm) を仕様に追加します。拡張リソース kata.peerpods.io/vm は Kubernetes スケジューラーによってアカウンティング目的で使用されます。
注記

mutating Webhook は、OpenShift Container Platform の特定のシステム namespace が変更されないように除外します。これらのシステム namespace でピア Pod が作成された場合、Pod の仕様に拡張リソースが含まれていない限り、Kubernetes 拡張リソースを使用したリソースアカウンティングは機能しません。

ベストプラクティスとして、特定の namespace でのみピア Pod の作成を許可するクラスター全体のポリシーを定義します。

5.2. Web コンソールを使用した OpenShift Sandboxed Containers のデプロイ

OpenShift Container Platform Web コンソールを使用して次のタスクを実行することで、Google Cloud に OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: ピア Pod との内部通信を許可するには、ポート 15150 を有効にします。
  3. オプション: OpenShift sandboxed containers Operator とともにインストールされる Cloud Credential Operator をアンインストールした場合は、ピア Pod シークレットを作成します。
  4. オプション: Kata エージェントポリシーをカスタマイズします。
  5. ピア Pod の config map を作成します。
  6. オプション: ピア Pod の仮想マシン (VM) イメージと仮想マシンイメージ config map を作成します。
  7. KataConfig カスタムリソースを作成します。
  8. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

5.2.1. OpenShift Sandboxed Containers Operator のインストール

OpenShift Container Platform Web コンソールを使用して、OpenShift sandboxed containers Operator をインストールできます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. Web コンソールで、OperatorsOperatorHub に移動します。
  2. Filter by keyword フィールドに OpenShift sandboxed containers と入力します。
  3. OpenShift sandboxed containers Operator タイルを選択し、Install をクリックします。
  4. Install Operator ページで、利用可能な Update Channel オプションの一覧から stable を選択します。
  5. Installed NamespaceOperator recommended Namespace が選択されていることを確認します。これにより、Operator が必須の openshift-sandboxed-containers-operator namespace にインストールされます。この namespace がまだ存在しない場合は、自動的に作成されます。

    注記

    OpenShift Sandboxed Containers Operator を openshift-sandboxed-containers-operator 以外の namespace にインストールしようとすると、インストールに失敗します。

  6. Approval StrategyAutomatic が選択されていることを確認します。Automatic がデフォルト値であり、新しい z-stream リリースが利用可能になると、OpenShift Sandboxed Containers への自動更新が有効になります。
  7. Install をクリックします。
  8. OperatorInstalled Operator に移動して、Operator がインストールされていることを確認します。

5.2.2. Google Cloud のポート 15150 の有効化

Compute Engine で実行されているピア Pod との内部通信を許可するには、OpenShift Container Platform でポート 15150 を有効にする必要があります。

前提条件

  • Google Cloud コマンドラインインターフェイス (CLI) ツールがインストールされている。
  • roles/container.admin ロールを持つユーザーとして OpenShift Container Platform クラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、プロジェクト ID 変数を設定します。

    $ export GCP_PROJECT_ID="<project_id>"
  2. 次のコマンドを実行して Google Cloud にログインします。

    $ gcloud auth login
  3. 次のコマンドを実行して、Google Cloud プロジェクト ID を設定します。

    $ gcloud config set project ${GCP_PROJECT_ID}
  4. 次のコマンドを実行してポート 15150 を開きます。

    $ gcloud compute firewall-rules create allow-port-15150-restricted \
       --project=${GCP_PROJECT_ID} \
       --network=default \
       --allow=tcp:15150 \
       --source-ranges=<external_ip_cidr-1>[,<external_ip_cidr-2>,...] 1
    1
    1 つ以上の IP アドレスまたは範囲を CIDR 形式でコンマで区切って指定します。たとえば、203.0.113.5/32,198.51.100.0/24 です。

検証

  • 次のコマンドを実行して、ポート 15150 が開いていることを確認します。

    $ gcloud compute firewall-rule list

5.2.3. ピア Pod シークレットの作成

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、OpenShift sandboxed containers のピア Pod シークレットを手動で作成する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • コンピュート Engine リソースを管理するための、roles/compute.instanceAdmin.v1 などの権限を持つ Google Cloud サービスアカウントを作成した。

手順

  1. Google Cloud コンソールで IAM & AdminService AccountsKeys に移動し、キーを JSON ファイルとして保存します。
  2. 次のコマンドを実行して、JSON ファイルを 1 行の文字列に変換します。

    $ cat <key_file>.json | jq -c .
  3. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  4. OpenShift sandboxed containers Operator タイルをクリックします。
  5. 右上隅のインポートアイコン (+) をクリックします。
  6. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      GCP_CREDENTIALS: "<gc_service_account_key_json>" 1
    1
    <gc_service_account_key_json> は、Google Cloud サービスアカウントキーの JSON ファイルから作成した 1 行の文字列に置き換えます。
  7. Save をクリックして変更を適用します。
  8. WorkloadsSecrets に移動して、ピア Pod シークレットを確認します。

5.2.4. ピア Pod config map の作成

OpenShift sandboxed containers のピア Pod config map を作成する必要があります。

手順

  1. Compute Engine インスタンスにログインして、次の環境変数を設定します。

    1. 次のコマンドを実行してプロジェクト ID を取得します。

      $ GCP_PROJECT_ID=$(gcloud config get-value project)
    2. 次のコマンドを実行してゾーンを取得します。

      $ GCP_ZONE=$(gcloud config get-value compute/zone)
    3. 次のコマンドを実行して、ネットワーク名のリストを取得します。

      $ gcloud compute networks list --format="value(name)"
    4. 次のコマンドを実行してネットワークを指定します。

      $ GCP_NETWORK=<network_name> 1
      1
      <network_name> は、ネットワークの名前に置き換えます。
  2. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  3. Operator のリストから OpenShift Sandboxed Containers Operator を選択します。
  4. 右上隅にあるインポートアイコン (+) をクリックします。
  5. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "gcp"
      PROXY_TIMEOUT: "5m"
      GCP_PROJECT_ID: "<gcp_project_id>" 1
      GCP_ZONE: "<gcp_zone>" 2
      GCP_MACHINE_TYPE: "e2-medium" 3
      GCP_NETWORK: "<gcp_network>" 4
      PEERPODS_LIMIT_PER_NODE: "10" 5
      TAGS: "key1=value1,key2=value2" 6
      DISABLECVM: "true"
    1
    使用するプロジェクト ID を指定します。
    2
    取得した GCP_ZONE 値を指定します。このゾーンはワークロードを実行します。
    3
    ワークロードの要件に一致するマシンタイプを指定します。
    4
    取得した GCP_NETWORK 値を指定します。
    5
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    6
    Pod 仮想マシンインスタンスの key:value ペアとしてカスタムタグを設定して、ピア Pod のコストを追跡したり、異なるクラスター内のピア Pod を識別したりできます。
  6. Save をクリックして変更を適用します。
  7. 新しい config map を表示するには、WorkloadsConfigMaps に移動します。

5.2.5. ピア Pod VM イメージの作成

QCOW2 ピア Pod 仮想マシン (VM) イメージを作成する必要があります。

前提条件

  • podman がインストールされている。
  • コンテナーレジストリーにアクセスできる。

手順

  1. 次のコマンドを実行して、OpenShift Sandboxed Containers リポジトリーのクローンを作成します。

    $ git clone https://github.com/openshift/sandboxed-containers-operator.git
  2. 次のコマンドを実行して、sandboxed-containers-operator/config/peerpods/podvm/bootc に移動します。

    $ cd sandboxed-containers-operator/config/peerpods/podvm/bootc
  3. 次のコマンドを実行して、registry.redhat.io にログインします。

    $ podman login registry.redhat.io

    podman build プロセスはレジストリーでホストされる Containerfile.rhel コンテナーイメージにアクセスする必要があるため、registry.redhat.io にログインする必要があります。

  4. 次のコマンドを実行して、コンテナーレジストリーのイメージパスを設定します。

    $ IMG="<container_registry_url>/<username>/podvm-bootc:latest"
  5. 次のコマンドを実行して、Pod 仮想マシン bootc イメージをビルドします。

    $ podman build -t ${IMG} -f Containerfile.rhel .
  6. 次のコマンドを実行して、コンテナーレジストリーにログインします。

    $ podman login <container_registry_url>
  7. 次のコマンドを実行して、イメージをコンテナーレジストリーにプッシュします。

    $ podman push ${IMG}

    テストや開発のために、イメージを公開できます。

  8. 次のコマンドを実行して、podvm-bootc イメージを確認します。

    $ podman images

    出力例

    REPOSITORY                               TAG     IMAGE ID      CREATED         SIZE
    example.com/example_user/podvm-bootc     latest  88ddab975a07  2 seconds ago   1.82 GB

5.2.6. ピア Pod 仮想マシンイメージ config map の作成

Pod 仮想マシン (VM) イメージの config map を作成します。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. Operator のリストから OpenShift Sandboxed Containers Operator を選択します。
  3. 右上隅にあるインポートアイコン (+) をクリックします。
  4. Import YAML ウィンドウに、次の YAML マニフェストを貼り付けます。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: gc-podvm-image-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      IMAGE_TYPE: pre-built
      PODVM_IMAGE_URI: <container_registry_url>/<username>/podvm-bootc:latest
      IMAGE_BASE_NAME: "podvm-image"
      IMAGE_VERSION: "0-0-0"
    
      INSTALL_PACKAGES: "no"
      DISABLE_CLOUD_CONFIG: "true"
      UPDATE_PEERPODS_CM: "yes"
      BOOT_FIPS: "no"
    
      BOOTC_BUILD_CONFIG: |
        [[customizations.user]]
        name = "peerpod"
        password = "peerpod"
        groups = ["wheel", "root"]
    
        [[customizations.filesystem]]
        mountpoint = "/"
        minsize = "5 GiB"
    
        [[customizations.filesystem]]
        mountpoint = "/var/kata-containers"
        minsize = "15 GiB"
  5. Save をクリックして変更を適用します。
  6. 新しい config map を表示するには、WorkloadsConfigMaps に移動します。

5.2.7. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

5.2.8. KataConfig カスタムリソースの作成

ワーカーノードに kata-remoteRuntimeClass としてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

kata-remote ランタイムクラスは、デフォルトですべてのワーカーノードにインストールされます。kata-remote を特定のノードにのみインストールする場合は、それらのノードにラベルを追加し、KataConfig CR でラベルを定義できます。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。次の要因により再起動時間が長くなる可能性があります。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • オプション: ノードの適格性チェックを有効にする場合は、Node Feature Discovery Operator をインストールしておきます。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. OpenShift sandboxed containers Operator を選択します。
  3. KataConfig タブで、Create KataConfig をクリックします。
  4. 以下の詳細を入力します。

    • Name: オプション: デフォルト名は example-kataconfig です。
    • Labels: オプション: 関連する識別属性を KataConfig リソースに入力します。各ラベルはキーと値のペアを表します。
    • enablePeerPods: パブリッククラウド、IBM Z®、および IBM® LinuxONE デプロイメントの場合に選択します。
    • kataConfigPoolSelector。オプション: 選択したノードに kata-remote をインストールするには、選択したノードのラベルに一致する式を追加します。

      1. kataConfigPoolSelector エリアを展開します。
      2. kataConfigPoolSelector エリアで、matchExpressions を展開します。これは、ラベルセレクターの要件のリストです。
      3. Add matchExpressions をクリックします。
      4. Key フィールドに、セレクターの適用先のラベルキーを入力します。
      5. Operator フィールドに、キーとラベル値の関係を入力します。有効な演算子は、InNotInExistsDoesNotExist です。
      6. Values エリアを展開し、Add value をクリックします。
      7. Value フィールドで、true または falsekey ラベル値として入力します。
    • logLevel: ランタイムクラスが kata-remote のノードに対して取得されるログデータのレベルを定義します。
  5. Create をクリックします。KataConfig CR が作成され、ワーカーノードに kata-remote ランタイムクラスをインストールします。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

検証

  1. KataConfig タブで、KataConfig CR をクリックして詳細を表示します。
  2. YAML タブをクリックして status スタンザを表示します。

    status スタンザには、conditions および kataNodes キーが含まれています。status.kataNodes の値はノード配列であり、各ノードには kata-remote インストールの特定の状態にあるノードがリストされます。更新があるたびにメッセージが表示されます。

  3. Reload をクリックして、YAML を更新します。

    status.kataNodes 配列内のすべてのワーカーに、値 installed と、理由が指定されていない conditions.InProgress: False が表示される場合、kata-remote はクラスターにインストールされています。

関連情報
Pod VM イメージの確認

kata-remote がクラスターにインストールされると、OpenShift sandboxed containers Operator は、ピア Pod の作成に使用される Pod 仮想マシンイメージを作成します。イメージがクラウドインスタンス上に作成されるため、このプロセスには時間がかかる場合があります。クラウドプロバイダー用に作成した config map を確認し、Pod 仮想マシンイメージが正常に作成されたことを確認できます。

手順

  1. WorkloadsConfigMaps に移動します。
  2. プロバイダー config map をクリックすると、詳細が表示されます。
  3. YAML タブをクリックします。
  4. YAML ファイルの status スタンザを確認します。

    PODVM_IMAGE_NAME パラメーターが入力されている場合は、Pod 仮想マシンイメージが正常に作成されています。

トラブルシューティング

  1. 次のコマンドを実行してイベントログを取得します。

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
  2. 次のコマンドを実行して、ジョブログを取得します。

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation

問題を解決できない場合は、Red Hat サポートケースを送信し、両方のログの出力を添付してください。

5.2.9. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata-remote を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. 次の例のように、各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに spec.runtimeClassName: kata-remote を追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata-remote の場合、ワークロードはピア Pod を使用して OpenShift Sandboxed Containers で実行されています。

5.3. コマンドラインを使用した OpenShift Sandboxed Containers のデプロイ

コマンドラインインターフェイス (CLI) を使用して次のタスクを実行することにより、Google Cloud に OpenShift sandboxed containers をデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: 各ワーカーノードで実行されている仮想マシンの数を変更します。
  3. オプション: ピア Pod との内部通信を許可するには、ポート 15150 を有効にします。
  4. オプション: OpenShift sandboxed containers Operator とともにインストールされる Cloud Credential Operator をアンインストールした場合は、ピア Pod シークレットを作成します。
  5. ピア Pod の config map を作成します。
  6. Pod 仮想マシンイメージ config map を作成します。
  7. オプション: Kata エージェントポリシーをカスタマイズします。
  8. KataConfig カスタムリソースを作成します。
  9. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

5.3.1. OpenShift Sandboxed Containers Operator のインストール

CLI を使用して、OpenShift Sandboxed Containers Operator をインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. osc-namespace.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
  2. 以下のコマンドを実行して namespace を作成します。

    $ oc apply -f osc-namespace.yaml
  3. osc-operatorgroup.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
  4. 以下のコマンドを実行して Operator グループを作成します。

    $ oc apply -f osc-operatorgroup.yaml
  5. osc-subscription.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.9.0
  6. 次のコマンドを実行して、サブスクリプションを作成します。

    $ oc apply -f osc-subscription.yaml
  7. 次のコマンドを実行して、Operator が正常にインストールされていることを確認します。

    $ oc get csv -n openshift-sandboxed-containers-operator

    このコマンドが完了するまでに数分かかる場合があります。

  8. 次のコマンドを実行してプロセスを監視します。

    $ watch oc get csv -n openshift-sandboxed-containers-operator

    出力例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.9.0    1.8.1        Succeeded

5.3.2. Google Cloud のポート 15150 の有効化

Compute Engine で実行されているピア Pod との内部通信を許可するには、OpenShift Container Platform でポート 15150 を有効にする必要があります。

前提条件

  • Google Cloud コマンドラインインターフェイス (CLI) ツールがインストールされている。
  • roles/container.admin ロールを持つユーザーとして OpenShift Container Platform クラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、プロジェクト ID 変数を設定します。

    $ export GCP_PROJECT_ID="<project_id>"
  2. 次のコマンドを実行して Google Cloud にログインします。

    $ gcloud auth login
  3. 次のコマンドを実行して、Google Cloud プロジェクト ID を設定します。

    $ gcloud config set project ${GCP_PROJECT_ID}
  4. 次のコマンドを実行してポート 15150 を開きます。

    $ gcloud compute firewall-rules create allow-port-15150-restricted \
       --project=${GCP_PROJECT_ID} \
       --network=default \
       --allow=tcp:15150 \
       --source-ranges=<external_ip_cidr-1>[,<external_ip_cidr-2>,...] 1
    1
    1 つ以上の IP アドレスまたは範囲を CIDR 形式でコンマで区切って指定します。たとえば、203.0.113.5/32,198.51.100.0/24 です。

検証

  • 次のコマンドを実行して、ポート 15150 が開いていることを確認します。

    $ gcloud compute firewall-rule list

5.3.3. ピア Pod シークレットの作成

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、OpenShift sandboxed containers のピア Pod シークレットを手動で作成する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • コンピュート Engine リソースを管理するための、roles/compute.instanceAdmin.v1 などの権限を持つ Google Cloud サービスアカウントを作成した。
  • Google Cloud SDK (gcloud) をインストールし、サービスアカウントで認証した。

手順

  1. 次のコマンドを実行して、Google Cloud サービスアカウントキーを作成し、JSON ファイルとして保存します。

    $ gcloud iam service-accounts keys create <key_filename>.json \
      --iam-account=<service_account_email_address>
  2. 次のコマンドを実行して、JSON ファイルを 1 行の文字列に変換します。

    $ cat <key_file>.json | jq -c .
  3. 次の例に従って peer-pods-secret.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      GCP_CREDENTIALS: "<gc_service_account_key_json>" 1
    1
    <gc_service_account_key_json> は、Google Cloud サービスアカウントキーの JSON ファイルから作成した 1 行の文字列に置き換えます。
  4. 以下のコマンドを実行してシークレットを作成します。

    $ oc apply -f peer-pods-secret.yaml

5.3.4. ピア Pod config map の作成

OpenShift sandboxed containers のピア Pod config map を作成する必要があります。

手順

  1. Compute Engine インスタンスにログインして、次の環境変数を設定します。

    1. 次のコマンドを実行してプロジェクト ID を取得します。

      $ GCP_PROJECT_ID=$(gcloud config get-value project)
    2. 次のコマンドを実行してゾーンを取得します。

      $ GCP_ZONE=$(gcloud config get-value compute/zone)
    3. 次のコマンドを実行して、ネットワーク名のリストを取得します。

      $ gcloud compute networks list --format="value(name)"
    4. 次のコマンドを実行してネットワークを指定します。

      $ GCP_NETWORK=<network_name> 1
      1
      <network_name> は、ネットワークの名前に置き換えます。
  2. 以下の例に従って peer-pods-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "gcp"
      PROXY_TIMEOUT: "5m"
      GCP_PROJECT_ID: "<gcp_project_id>" 1
      GCP_ZONE: "<gcp_zone>" 2
      GCP_MACHINE_TYPE: "e2-medium" 3
      GCP_NETWORK: "<gcp_network>" 4
      PEERPODS_LIMIT_PER_NODE: "10" 5
      TAGS: "key1=value1,key2=value2" 6
      DISABLECVM: "true"
    1
    使用するプロジェクト ID を指定します。
    2
    取得した GCP_ZONE 値を指定します。このゾーンはワークロードを実行します。
    3
    ワークロードの要件に一致するマシンタイプを指定します。
    4
    取得した GCP_NETWORK 値を指定します。
    5
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    6
    Pod 仮想マシンインスタンスの key:value ペアとしてカスタムタグを設定して、ピア Pod のコストを追跡したり、異なるクラスター内のピア Pod を識別したりできます。
  3. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f peer-pods-cm.yaml

5.3.5. ピア Pod VM イメージの作成

QCOW2 ピア Pod 仮想マシン (VM) イメージを作成する必要があります。

前提条件

  • podman がインストールされている。
  • コンテナーレジストリーにアクセスできる。

手順

  1. 次のコマンドを実行して、OpenShift Sandboxed Containers リポジトリーのクローンを作成します。

    $ git clone https://github.com/openshift/sandboxed-containers-operator.git
  2. 次のコマンドを実行して、sandboxed-containers-operator/config/peerpods/podvm/bootc に移動します。

    $ cd sandboxed-containers-operator/config/peerpods/podvm/bootc
  3. 次のコマンドを実行して、registry.redhat.io にログインします。

    $ podman login registry.redhat.io

    podman build プロセスはレジストリーでホストされる Containerfile.rhel コンテナーイメージにアクセスする必要があるため、registry.redhat.io にログインする必要があります。

  4. 次のコマンドを実行して、コンテナーレジストリーのイメージパスを設定します。

    $ IMG="<container_registry_url>/<username>/podvm-bootc:latest"
  5. 次のコマンドを実行して、Pod 仮想マシン bootc イメージをビルドします。

    $ podman build -t ${IMG} -f Containerfile.rhel .
  6. 次のコマンドを実行して、コンテナーレジストリーにログインします。

    $ podman login <container_registry_url>
  7. 次のコマンドを実行して、イメージをコンテナーレジストリーにプッシュします。

    $ podman push ${IMG}

    テストや開発のために、イメージを公開できます。

  8. 次のコマンドを実行して、podvm-bootc イメージを確認します。

    $ podman images

    出力例

    REPOSITORY                               TAG     IMAGE ID      CREATED         SIZE
    example.com/example_user/podvm-bootc     latest  88ddab975a07  2 seconds ago   1.82 GB

5.3.6. ピア Pod 仮想マシンイメージ config map の作成

Pod 仮想マシン (VM) イメージの config map を作成します。

手順

  1. 次の内容を含む、gc-podvm-image-cm.yaml という名前の Pod 仮想マシンイメージの config map マニフェストを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: gc-podvm-image-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      IMAGE_TYPE: pre-built
      PODVM_IMAGE_URI: <container_registry_url>/<username>/podvm-bootc:latest
      IMAGE_BASE_NAME: "podvm-image"
      IMAGE_VERSION: "0-0-0"
    
      INSTALL_PACKAGES: "no"
      DISABLE_CLOUD_CONFIG: "true"
      UPDATE_PEERPODS_CM: "yes"
      BOOT_FIPS: "no"
    
      BOOTC_BUILD_CONFIG: |
        [[customizations.user]]
        name = "peerpod"
        password = "peerpod"
        groups = ["wheel", "root"]
    
        [[customizations.filesystem]]
        mountpoint = "/"
        minsize = "5 GiB"
    
        [[customizations.filesystem]]
        mountpoint = "/var/kata-containers"
        minsize = "15 GiB"
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f gc-podvm-image-cm.yaml

5.3.7. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

5.3.8. KataConfig カスタムリソースの作成

ワーカーノードに kata-remote をランタイムクラスとしてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

KataConfig CR を作成すると、OpenShift Sandboxed Containers Operator がトリガーされ、以下が実行されます。

  • デフォルト設定で kata-remote という名前の RuntimeClass CR を作成します。これにより、RuntimeClassName フィールドの CR を参照して、kata-remote をランタイムとして使用するようにワークロードを設定できるようになります。この CR は、ランタイムのリソースオーバーヘッドも指定します。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
    1
    オプション: 特定のノードに kata-remote をインストールするためにノードラベルを適用した場合は、キーと値を指定します (例: osc: 'true')
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードに kata-remote がランタイムクラスとしてインストールされます。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata-remote はクラスターにインストールされます。

  4. 次のコマンドを実行してデーモンセットを確認します。

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
  5. 次のコマンドを実行してランタイムクラスを確認します。

    $ oc get runtimeclass

    出力例

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

Pod VM イメージの確認

kata-remote がクラスターにインストールされると、OpenShift sandboxed containers Operator は、ピア Pod の作成に使用される Pod 仮想マシンイメージを作成します。イメージがクラウドインスタンス上に作成されるため、このプロセスには時間がかかる場合があります。クラウドプロバイダー用に作成した config map を確認し、Pod 仮想マシンイメージが正常に作成されたことを確認できます。

手順

  1. ピア Pod 用に作成した config map を取得します。

    $ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml
  2. YAML ファイルの status スタンザを確認します。

    PODVM_IMAGE_NAME パラメーターが入力されている場合は、Pod 仮想マシンイメージが正常に作成されています。

トラブルシューティング

  1. 次のコマンドを実行してイベントログを取得します。

    $ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation
  2. 次のコマンドを実行して、ジョブログを取得します。

    $ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation

問題を解決できない場合は、Red Hat サポートケースを送信し、両方のログの出力を添付してください。

5.3.9. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata-remote を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. 次の例のように、各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに spec.runtimeClassName: kata-remote を追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata-remote の場合、ワークロードはピア Pod を使用して OpenShift Sandboxed Containers で実行されています。

第6章 IBM Z および IBM LinuxONE への OpenShift Sandboxed Containers のデプロイ

OpenShift sandboxed containers を IBM Z® および IBM® LinuxONE にデプロイできます。

OpenShift sandboxed containers はピア Pod をデプロイします。ピア Pod 設計により、ネストされた仮想化の必要性が回避されます。詳細は、ピア Pod および Peer pods technical dive を参照してください。

重要

IBM Z® および IBM® LinuxONE 上の OpenShift sandboxed containers は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

クラスターの要件

  • OpenShift sandboxed containers Operator をインストールするクラスターに Red Hat OpenShift Container Platform 4.14 以降をインストールしている。
  • クラスターには 3 つのコントロールプレーンノードと少なくとも 2 つのワーカーノードがある。
  • クラスターノードとピア Pod は、同じ IBM Z® KVM ホスト論理パーティション (LPAR) 内にある。
  • クラスターノードとピア Pod が同じサブネットに接続されている。

OpenShift Container Platform を IBM Z® および IBM® LinuxONE にインストールする方法の詳細は IBM Z® および IBM® LinuxONE へのインストール を参照してください。

6.1. ピア Pod のリソース要件

クラスターに十分なリソースがあることを確認する。

ピア Pod 仮想マシン (VM) には、次の 2 つの場所にリソースが必要です。

  • ワーカーノード。ワーカーノードは、メタデータ、Kata shim リソース (containerd-shim-kata-v2)、リモートハイパーバイザーリソース (cloud-api-adaptor)、およびワーカーノードとピア Pod VM 間のトンネル設定を保存します。
  • libvirt 仮想マシンインスタンス。これは、LPAR (KVM ホスト) で実行されている実際のピア Pod 仮想マシンです。

Kubernetes ワーカーノードで使用される CPU およびメモリーリソースは、ピア Pod の作成に使用される RuntimeClass (kata-remote) 定義に含まれる Pod オーバーヘッド によって処理されます。

クラウド内で実行されているピア Pod VM の合計数は、Kubernetes ノード拡張リソースとして定義されます。この制限はノードごとに設定され、peer-pods-cm config map の PEERPODS_LIMIT_PER_NODE 属性によって設定されます。

拡張リソースの名前は kata.peerpods.io/vm で、Kubernetes スケジューラーが容量の追跡とアカウンティングを処理できるようにします。

OpenShift Sandboxed Containers Operator のインストール後に、環境の要件に基づいてノードごとの制限を編集できます。

mutating Webhook により、拡張リソース kata.peerpods.io/vm が Pod 仕様に追加されます。また、リソース固有のエントリーが存在する場合は、Pod 仕様から削除されます。こうすることで、Kubernetes スケジューラーがこれらの拡張リソースを考慮できるようになり、リソースが利用可能な場合にのみピア Pod がスケジュールされるようになります。

mutating Webhook は、次のように Kubernetes Pod を変更します。

  • mutating Webhook は、TARGET_RUNTIME_CLASS 環境変数で指定された RuntimeClassName の想定値であるか、Pod をチェックします。Pod 仕様の値が TARGET_RUNTIME_CLASS の値と一致しない場合、Webhook は Pod を変更せずに終了します。
  • RuntimeClassName の値が一致する場合、Webhook は Pod 仕様に次の変更を加えます。

    1. この Webhook は、Pod 内のすべてのコンテナーおよび初期化コンテナーの resources フィールドからすべてのリソース仕様を削除します。
    2. Webhook は、Pod 内の最初のコンテナーのリソースフィールドを変更して、拡張リソース (kata.peerpods.io/vm) を仕様に追加します。拡張リソース kata.peerpods.io/vm は Kubernetes スケジューラーによってアカウンティング目的で使用されます。
注記

mutating Webhook は、OpenShift Container Platform の特定のシステム namespace が変更されないように除外します。これらのシステム namespace でピア Pod が作成された場合、Pod の仕様に拡張リソースが含まれていない限り、Kubernetes 拡張リソースを使用したリソースアカウンティングは機能しません。

ベストプラクティスとして、特定の namespace でのみピア Pod の作成を許可するクラスター全体のポリシーを定義します。

6.2. IBM Z および IBM LinuxONE への OpenShift Sandboxed Containers のデプロイ

コマンドラインインターフェイス (CLI) を使用して次のタスクを実行することにより、OpenShift sandboxed containers を IBM Z® および IBM® LinuxONE にデプロイできます。

  1. OpenShift Sandboxed Containers Operator を再インストールします。
  2. オプション: 各ワーカーノードで実行されている仮想マシンの数を変更します。
  3. オプション: libvirt ボリュームを設定します。
  4. オプション: カスタムピア Pod 仮想マシンイメージを作成します。
  5. ピア Pod シークレットを作成します。
  6. ピア Pod の config map を作成します。
  7. Pod 仮想マシンイメージ config map を作成します。
  8. KVM ホストシークレットを作成します。
  9. オプション: カスタムピア Pod 仮想マシンイメージを選択します。
  10. オプション: Kata エージェントポリシーをカスタマイズします。
  11. KataConfig カスタムリソースを作成します。
  12. OpenShift Sandboxed Containers のワークロードオブジェクトを設定します。

6.2.1. OpenShift Sandboxed Containers Operator のインストール

CLI を使用して、OpenShift Sandboxed Containers Operator をインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. osc-namespace.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-sandboxed-containers-operator
  2. 以下のコマンドを実行して namespace を作成します。

    $ oc apply -f osc-namespace.yaml
  3. osc-operatorgroup.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
  4. 以下のコマンドを実行して Operator グループを作成します。

    $ oc apply -f osc-operatorgroup.yaml
  5. osc-subscription.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.9.0
  6. 次のコマンドを実行して、サブスクリプションを作成します。

    $ oc apply -f osc-subscription.yaml
  7. 次のコマンドを実行して、Operator が正常にインストールされていることを確認します。

    $ oc get csv -n openshift-sandboxed-containers-operator

    このコマンドが完了するまでに数分かかる場合があります。

  8. 次のコマンドを実行してプロセスを監視します。

    $ watch oc get csv -n openshift-sandboxed-containers-operator

    出力例

    NAME                             DISPLAY                                  VERSION             REPLACES                   PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.9.0    1.8.1        Succeeded

6.2.2. libvirt ボリュームの設定

OpenShift sandboxed containers Operator は、インストール中に KVM ホスト上の libvirt ボリュームとプールを自動的に設定します。必要に応じて、追加の libvirt ボリュームおよびプールを手動で設定または作成できます。

前提条件

  • OpenShift Container Platform Web コンソールまたはコマンドラインを使用して、OpenShift Container Platform クラスターに OpenShift sandboxed containers Operator をインストールしている。
  • KVM ホストの管理者権限がある。
  • KVM ホストに podman がインストールされている。
  • KVM ホストに virt-customize がインストールされている。
  • イメージ用の /var/lib/libvirt/images/ ディレクトリーがある。

手順

  1. KVM ホストにログインします。
  2. 次のコマンドを実行して、libvirt プールの名前を設定します。

    $ export LIBVIRT_POOL=<libvirt_pool>

    libvirt プロバイダーのシークレットを作成するには、LIBVIRT_POOL 値が必要です。

  3. 次のコマンドを実行して、libvirt ボリュームの名前を設定します。

    $ export LIBVIRT_VOL_NAME=<libvirt_volume>

    libvirt プロバイダーのシークレットを作成するには、LIBVIRT_VOL_NAME 値が必要です。

  4. 次のコマンドを実行して、デフォルトのストレージプールの場所のパスを設定します。

    $ export LIBVIRT_POOL_DIRECTORY="/var/lib/libvirt/images/"
  5. 次のコマンドを実行して、libvirt プールを作成します。

    $ virsh pool-define-as $LIBVIRT_POOL --type dir --target "$LIBVIRT_POOL_DIRECTORY"
  6. 次のコマンドを実行して、libvirt プールを開始します。

    $ virsh pool-start $LIBVIRT_POOL
  7. 次のコマンドを実行して、プールの libvirt ボリュームを作成します。

    $ virsh -c qemu:///system \
      vol-create-as --pool $LIBVIRT_POOL \
      --name $LIBVIRT_VOL_NAME \
      --capacity 20G \
      --allocation 2G \
      --prealloc-metadata \
      --format qcow2

6.2.3. カスタムピア Pod 仮想マシンイメージの作成

デフォルトの Operator ビルドイメージを使用する代わりに、カスタムピア Pod 仮想マシン (VM) イメージを作成できます。

ピア Pod QCOW2 イメージを使用して Open Container Initiative (OCI) コンテナーを構築します。後で、コンテナーレジストリー URL とイメージパスをピア Pod 仮想マシンイメージ config map に追加します。

手順

  1. Dockerfile.podvm-oci ファイルを作成します。

    FROM scratch
    
    ARG PODVM_IMAGE_SRC
    ENV PODVM_IMAGE_PATH="/image/podvm.qcow2"
    
    COPY $PODVM_IMAGE_SRC $PODVM_IMAGE_PATH
  2. 次のコマンドを実行して、Pod 仮想マシン QCOW2 イメージを含むコンテナーを構築します。

    $ docker build -t podvm-libvirt \
      --build-arg PODVM_IMAGE_SRC=<podvm_image_source> \ 1
      --build-arg PODVM_IMAGE_PATH=<podvm_image_path> \ 2
      -f Dockerfile.podvm-oci .
    1
    ホスト上の QCOW2 イメージソースを指定します。
    2
    オプション: デフォルトの /image/podvm.qcow2 を使用しない場合は、QCOW2 イメージのパスを指定します。

6.2.4. ピア Pod シークレットの作成

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、OpenShift sandboxed containers のピア Pod シークレットを手動で作成する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • LIBVIRT_URI。この値は、libvirt ネットワークのデフォルトのゲートウェイ IP アドレスです。この値を取得するには、libvirt ネットワーク設定を確認してください。

    注記

    libvirt がデフォルトのブリッジ仮想ネットワークを使用する場合は、以下のコマンドを実行して LIBVIRT_URI を取得できます。

    $ virtint=$(bridge_line=$(virsh net-info default | grep Bridge);  echo "${bridge_line//Bridge:/}" | tr -d [:blank:])
    
    $ LIBVIRT_URI=$( ip -4 addr show $virtint | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
    
    $ LIBVIRT_GATEWAY_URI="qemu+ssh://root@${LIBVIRT_URI}/system?no_verify=1"
  • REDHAT_OFFLINE_TOKENRed Hat API トークン で RHEL イメージをダウンロードするためにこのトークンを生成している。

手順

  1. 次の例に従って peer-pods-secret.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      CLOUD_PROVIDER: "libvirt"
      LIBVIRT_URI: "<libvirt_gateway_uri>" 1
      REDHAT_OFFLINE_TOKEN: "<rh_offline_token>" 2
    1
    libvirt URI を指定します。
    2
    Operator ビルドイメージに必要な Red Hat オフライントークンを指定します。
  2. 以下のコマンドを実行してシークレットを作成します。

    $ oc apply -f peer-pods-secret.yaml

6.2.5. ピア Pod config map の作成

OpenShift sandboxed containers のピア Pod config map を作成する必要があります。

手順

  1. 以下の例に従って peer-pods-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "libvirt"
      PEERPODS_LIMIT_PER_NODE: "10" 1
      LIBVIRT_POOL: "<libvirt_pool>" 2
      LIBVIRT_VOL_NAME: "<libvirt_volume>" 3
      LIBVIRT_DIR_NAME: "/var/lib/libvirt/images/<directory_name>" 4
      LIBVIRT_NET: "default" 5
      DISABLECVM: "true"
    1
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    2
    libvirt プールを指定します。libvirt プールを手動で設定した場合は、KVM ホスト設定と同じ名前を使用します。
    3
    libvirt ボリューム名を指定します。libvirt ボリュームを手動で設定した場合は、KVM ホスト設定と同じ名前を使用します。
    4
    .qcow2.raw ファイルなどの仮想マシンのディスクイメージを保存するための libvirt ディレクトリーを指定します。libvirt に読み取りおよび書き込みアクセス権限があることを確認するには、libvirt ストレージディレクトリーのサブディレクトリーを使用します。デフォルトは /var/lib/libvirt/images/ です。
    5
    オプション: デフォルトのネットワークを使用しない場合は、libvirt ネットワークを指定します。
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f peer-pods-cm.yaml

6.2.6. ピア Pod 仮想マシンイメージ config map の作成

ピア Pod 仮想マシン (VM) イメージの config map を作成する必要があります。

前提条件

  • Red Hat Hybrid Cloud Console を使用してアクティベーションキーを作成する。
  • オプション (Cloud API アダプターのカスタムイメージを使用する場合): イメージの名前、URL、ブランチまたはタグ。

手順

  1. 次の例に従って、libvirt-podvm-image-cm.yaml マニフェストを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: libvirt-podvm-image-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      PODVM_DISTRO: "rhel"
      DOWNLOAD_SOURCES: "no" 1
      CAA_SRC: "https://github.com/confidential-containers/cloud-api-adaptor" 2
      CAA_REF: "main" 3
      CONFIDENTIAL_COMPUTE_ENABLED: "yes"
      UPDATE_PEERPODS_CM: "yes"
      ORG_ID: "<rhel_organization_id>"
      ACTIVATION_KEY: "<rhel_activation_key>" 4
      IMAGE_NAME: "<podvm_libvirt_image>" 5
      PODVM_IMAGE_URI: "oci::<image_repo_url>:<image_tag>::<image_path>" 6
      SE_BOOT: "true" 7
      BASE_OS_VERSION: "<rhel_image_os_version>" 8
    1
    カスタム Cloud API アダプターソースを使用して Pod 仮想マシンイメージを構築する場合は、yes を指定します。
    2
    オプション: Cloud API アダプターのカスタムイメージの URL を指定します。
    3
    オプション: Cloud API アダプターのカスタムイメージのブランチまたはタグを指定します。
    4
    RHEL アクティベーションキーを指定します。
    5
    カスタムピア Pod 仮想マシンイメージ名を指定します。
    6
    オプション: カスタムピア Pod 仮想マシンイメージを作成した場合は、コンテナーレジストリー URL、イメージタグ、およびイメージパス (デフォルト: /image/podvm.qcow2) を指定します。それ以外の場合は、値を "" に設定します。
    7
    デフォルト値 true は、デフォルトの Operator ビルドイメージに対して IBM Secure Execution を有効にします。カスタムピア Pod 仮想マシンイメージを使用する場合は、false に設定します。
    8
    RHEL イメージのオペレーティングシステムのバージョンを指定します。IBM Z® Secure Execution は RHEL 9.5 以降のバージョンをサポートします。
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f libvirt-podvm-image-cm.yaml

    libvirt プロバイダー用に libvirt Pod 仮想マシンイメージ config map が作成されます。

6.2.7. KVM ホストシークレットの作成

KVM ホストのシークレットを作成する必要があります。

手順

  1. 次のコマンドを実行して、SSH キーペアを生成します。

    $ ssh-keygen -f ./id_rsa -N ""
  2. SSH 公開鍵を KVM ホストにコピーします。

    $ ssh-copy-id -i ./id_rsa.pub <KVM_HOST_IP> 1
    1
    ピア Pod 仮想マシンが実行されている KVM ホストまたは LPAR の IP アドレスを指定します。たとえば、192.168.122.1 です。
  3. 以下のコマンドを実行して Secret オブジェクトを作成します。

    $ oc create secret generic ssh-key-secret \
      -n openshift-sandboxed-containers-operator \
      --from-file=id_rsa.pub=./id_rsa.pub \
      --from-file=id_rsa=./id_rsa
  4. 作成した SSH 鍵を削除します。

    $ shred --remove id_rsa.pub id_rsa

6.2.8. カスタムピア Pod 仮想マシンイメージの選択

Pod マニフェストにアノテーションを追加することで、ワークロード要件に合わせてカスタマイズされたカスタムピア Pod 仮想マシン (VM) イメージを選択できます。カスタムイメージは、ピア Podconfig map で指定されたデフォルトイメージをオーバーライドします。libvirt プールに新しい libvirt ボリュームを作成し、カスタムピア Pod 仮想マシンイメージを新しいボリュームにアップロードします。次に、カスタムピア Pod 仮想マシンイメージを使用するように Pod マニフェストを更新します。

前提条件

  • 使用予定のカスタム Pod 仮想マシンイメージの ID が利用でき、クラウドプロバイダーまたはハイパーバイザーと互換性がある。

手順

  1. 次のコマンドを実行して、libvirt プールの名前を設定します。

    $ export LIBVIRT_POOL=<libvirt_pool> 1
    1
    既存の libvirt プール名を指定します。
  2. 次のコマンドを実行して、新しい libvirt ボリュームの名前を設定します。

    $ export LIBVIRT_VOL_NAME=<new_libvirt_volume>
  3. 次のコマンドを実行して、プールの libvirt ボリュームを作成します。

    $ virsh -c qemu:///system \
      vol-create-as --pool $LIBVIRT_POOL \
      --name $LIBVIRT_VOL_NAME \
      --capacity 20G \
      --allocation 2G \
      --prealloc-metadata \
      --format qcow2
  4. カスタムピア Pod 仮想マシンイメージを libvirt ボリュームにアップロードします。

    $ virsh -c qemu:///system vol-upload \
      --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \ 1
      --pool $LIBVIRT_POOL --sparse
    1
    カスタムピア Pod 仮想マシンイメージ名を指定します。
  5. 次の例に従って、pod-manifest.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<new_libvirt_volume>" 1
    spec:
      runtimeClassName: kata-remote 2
      containers:
      - name: <example_container> 3
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    1
    カスタムピア Pod 仮想マシンイメージをアップロードした libvirt ボリューム名を指定します。
    2
    ピア Pod を作成するには、runtimeClassName フィールドが kata-remote に設定されていることを確認します。
    3
    コンテナー名を指定します。
  6. 以下のコマンドを実行して Pod を作成します。

    $ oc apply -f pod-manifest.yaml

6.2.9. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

6.2.10. KataConfig カスタムリソースの作成

ワーカーノードに kata-remote をランタイムクラスとしてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

KataConfig CR を作成すると、OpenShift Sandboxed Containers Operator がトリガーされ、以下が実行されます。

  • デフォルト設定で kata-remote という名前の RuntimeClass CR を作成します。これにより、RuntimeClassName フィールドの CR を参照して、kata-remote をランタイムとして使用するようにワークロードを設定できるようになります。この CR は、ランタイムのリソースオーバーヘッドも指定します。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
    1
    オプション: 特定のノードに kata-remote をインストールするためにノードラベルを適用した場合は、キーと値を指定します (例: osc: 'true')
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードに kata-remote がランタイムクラスとしてインストールされます。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata-remote はクラスターにインストールされます。

  4. 次のコマンドを実行して、ピア Pod イメージが構築され、libvirt ボリュームにアップロードされたことを確認します。

    $ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator

    出力例

    Name: peer-pods-cm
    Namespace: openshift-sandboxed-containers-operator
    Labels: <none>
    Annotations: <none>
    
    Data
    ====
    CLOUD_PROVIDER: libvirt
    
    BinaryData
    ====
    Events: <none>

  5. 次のコマンドを実行して、kata-oc マシン設定プールの進行状況を監視し、UPDATEDMACHINECOUNTMACHINECOUNT と等しいときに UPDATED 状態であることを確認します。

    $ watch oc get mcp/kata-oc
  6. 次のコマンドを実行してデーモンセットを確認します。

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
  7. 次のコマンドを実行してランタイムクラスを確認します。

    $ oc get runtimeclass

    出力例

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

6.2.11. ワークロードオブジェクトの設定

次の Pod テンプレートオブジェクトのランタイムクラスとして kata-remote を設定して、OpenShift sandboxed containers のワークロードオブジェクトを設定する必要があります。

  • Pod オブジェクト
  • ReplicaSet オブジェクト
  • ReplicationController オブジェクト
  • StatefulSet オブジェクト
  • Deployment オブジェクト
  • DeploymentConfig オブジェクト
重要

Operator namespace にワークロードをデプロイしないでください。これらのリソース専用の namespace を作成します。

前提条件

  • KataConfig カスタムリソース (CR) を作成している。

手順

  1. 次の例のように、各 Pod テンプレート化されたワークロードオブジェクトのマニフェストに spec.runtimeClassName: kata-remote を追加します。

    apiVersion: v1
    kind: <object>
    # ...
    spec:
      runtimeClassName: kata-remote
    # ...

    OpenShift Container Platform はワークロードオブジェクトを作成し、スケジュールを開始します。

検証

  • Pod テンプレートオブジェクトの spec.runtimeClassName フィールドを検査します。値が kata-remote の場合、ワークロードはピア Pod を使用して OpenShift Sandboxed Containers で実行されています。

第7章 Azure での Confidential Containers のデプロイ

OpenShift Sandboxed Containers をデプロイした後に、Microsoft Azure Cloud Computing Services に Confidential Containers をデプロイすることができます。

重要

Azure の Confidential Containers はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

クラスターの要件

  • Pod 仮想マシンサブネットの送信接続が設定されている。
  • Confidential compute attestation Operator をインストールするクラスターに Red Hat OpenShift Container Platform 4.15 以降がインストールされている。

次の手順を実行して、Confidential Containers をデプロイします。

  1. Confidential compute attestation Operator をインストールします。
  2. Trustee のルートを作成します。
  3. Confidential Containers フィーチャーゲートを有効にします。
  4. initdata を作成します。
  5. ピア Pod config map を更新します。
  6. オプション: Kata エージェントポリシーをカスタマイズします。
  7. KataConfig カスタムリソース (CR) を削除します。
  8. KataConfig CR を再作成します。
  9. Trustee 認証シークレットを作成します。
  10. Trustee config map を作成します。
  11. Trustee の値、ポリシー、およびシークレットを設定します。
  12. KbsConfig CR を作成します。
  13. Trustee の設定を確認します。
  14. アテステーションプロセスを確認します。

7.1. Confidential compute attestation Operator のインストール

CLI を使用して、Confidential compute attestation Operator を Azure にインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. trustee-namespace.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: trustee-operator-system
  2. 次のコマンドを実行して、trustee-operator-system namespace を作成します。

    $ oc apply -f trustee-namespace.yaml
  3. trustee-operatorgroup.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: trustee-operator-group
      namespace: trustee-operator-system
    spec:
      targetNamespaces:
      - trustee-operator-system
  4. 以下のコマンドを実行して Operator グループを作成します。

    $ oc apply -f trustee-operatorgroup.yaml
  5. trustee-subscription.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: trustee-operator-system
      namespace: trustee-operator-system
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: trustee-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
  6. 次のコマンドを実行して、サブスクリプションを作成します。

    $ oc apply -f trustee-subscription.yaml
  7. 次のコマンドを実行して、Operator が正常にインストールされていることを確認します。

    $ oc get csv -n trustee-operator-system

    このコマンドが完了するまでに数分かかる場合があります。

  8. 次のコマンドを実行してプロセスを監視します。

    $ watch oc get csv -n trustee-operator-system

    出力例

    NAME                      DISPLAY                        PHASE
    trustee-operator.v0.3.0   Trustee Operator  0.3.0        Succeeded

7.2. Confidential Containers フィーチャーゲートの有効化

Confidential Containers フィーチャーゲートを有効にする必要があります。

前提条件

  • OpenShift Sandboxed Containers Operator にサブスクライブした。

手順

  1. cc-feature-gate.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: osc-feature-gates
      namespace: openshift-sandboxed-containers-operator
    data:
      confidential: "true"
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f cc-feature-gate.yaml

7.3. Trustee のルートの作成

Trustee のエッジ TLS 終端を使用してセキュアなルートを作成できます。外部の Ingress トラフィックは HTTPS としてルーター Pod に到達し、HTTP として Trustee Pod に渡されます。

前提条件

  • Confidential compute attestation Operator がインストールされている。

手順

  1. 次のコマンドを実行してエッジルートを作成します。

    $ oc create route edge --service=kbs-service --port kbs-port \
      -n trustee-operator-system
    注記

    注記: 現在、有効な CA 署名証明書を持つルートのみがサポートされています。自己署名証明書を使用したルートは使用できません。

  2. 次のコマンドを実行して、TRUSTEE_HOST 変数を設定します。

    $ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \
      -o jsonpath={.spec.host})
  3. 次のコマンドを実行してルートを確認します。

    $ echo $TRUSTEE_HOST

    出力例

    kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io

    ピア Pod Config Map のこの値を記録します。

7.4. initdata について

initdata 仕様は、実行時に機密データまたはワークロード固有のデータを使用してピア Pod を初期化する柔軟な方法を提供し、そのようなデータを仮想マシン (VM) イメージに埋め込む必要性を回避します。これにより、機密情報の漏洩が減り、セキュリティーが強化され、カスタムイメージビルドがなくなることで柔軟性が向上します。たとえば、initdata には次の 3 つの設定を含めることができます。

  • 安全な通信のための X.509 証明書。
  • 認証用の暗号化キー。
  • デフォルトの Kata Agent ポリシーを上書きするときに実行時の動作を強制する任意の Kata Agent policy.rego ファイル。

次のいずれかの方法を使用して、initdata 設定を適用できます。

  • ピア Pod の config map に含めることでグローバルに、すべての Pod に対してクラスター全体のデフォルトを設定します。
  • 特定の Pod に対して Pod ワークロードオブジェクトを設定するときに、個々のワークロードのカスタマイズが可能になります。

    Pod ワークロードオブジェクトを設定するときに指定する io.katacontainers.config.runtime.cc_init_data アノテーションは、その特定の Pod のピア Podconfig map 内のグローバル INITDATA 設定をオーバーライドします。Kata ランタイムは、Pod の作成時にこの優先順位を自動的に処理します。

initdata コンテンツは次のコンポーネントを設定します。

  • Attestation Agent (AA) は、アテステーションのために受託者に証拠を送信することで、ピア Pod の信頼性を検証します。
  • Confidential Data Hub (CDH) は、ピア Pod 仮想マシン内の秘密と安全なデータアクセスを管理します。
  • Kata エージェントは、ランタイムポリシーを適用し、Pod 仮想マシン内のコンテナーのライフサイクルを管理します。

7.5. initdata の作成

initdata を使用して TOML ファイルを作成し、そのファイルを Base64 でエンコードされた文字列に変換します。この文字列を使用して、ピア Podconfig map、ピア Pod マニフェスト、または verification-pod.yaml ファイルの値を指定します。

重要

Trustee config map で insecure_http = true を設定する場合は、kbs_cert 設定を削除する必要があります。

手順

  1. initdata.toml 設定ファイルを作成します。

    ```toml
    algorithm = "sha384"
    version = "0.1.0"
    
    [data]
    "aa.toml" = '''
    [token_configs]
    [token_configs.coco_as]
    url = '<url>:<port>' 1
    
    
    [token_configs.kbs]
    url = '<url>:<port>'
    cert = """
    -----BEGIN CERTIFICATE-----
    <kbs_certificate> 2
    -----END CERTIFICATE-----
    """
    '''
    
    "cdh.toml"  = '''
    socket = 'unix:///run/confidential-containers/cdh.sock'
    credentials = []
    
    [kbc]
    name = 'cc_kbc'
    url = '<url>:<port>'
    kbs_cert = """ 3
    -----BEGIN CERTIFICATE-----
    <kbs_certificate> 4
    -----END CERTIFICATE-----
    """
    '''
    
    "policy.rego" = ''' 5
    package agent_policy
    
    default AddARPNeighborsRequest := true
    default AddSwapRequest := true
    default CloseStdinRequest := true
    default CopyFileRequest := true
    default CreateContainerRequest := true
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true
    default GetMetricsRequest := true
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default ListInterfacesRequest := true
    default ListRoutesRequest := true
    default MemHotplugByProbeRequest := true
    default OnlineCPUMemRequest := true
    default PauseContainerRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default ReseedRandomDevRequest := true
    default ResumeContainerRequest := true
    default SetGuestDateTimeRequest := true
    default SetPolicyRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StartTracingRequest := true
    default StatsContainerRequest := true
    default StopTracingRequest := true
    default TtyWinResizeRequest := true
    default UpdateContainerRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := true
    '''
    ```
    1
    Trustee インスタンスの URL とポートを指定します。テスト目的で insecure_http を使用して Trustee を設定する場合は、HTTP を使用します。それ以外の場合は HTTPS を使用します。実稼働システムでは、プロキシーなどを使用して TLS を外部で処理するように環境を設定しない限り、insecure_http を使用しないでください。
    2
    attestation agent の Base64 でエンコードされた TLS 証明書を指定します。これはテスト目的では必要ありませんが、実稼働システムには推奨されます。
    3
    Trustee config map で insecure_http = true を設定する場合は、kbs_cert 設定を削除します。
    4
    Trustee インスタンスの Base64 エンコードされた TLS 証明書を指定します。
    5
    オプション: カスタム Kata エージェントポリシーを指定できます。
  2. 次のコマンドを実行して、initdata.toml ファイルをテキストファイル内の Base64 エンコードされた文字列に変換します。

    $ base64 -w0 initdata.toml > initdata.txt

7.6. ピア Pod の更新 config map

Confidential Containers のピア Pod config map を更新する必要があります。

注記

セキュアブートをデフォルトで有効にするには、これを true に設定します。デフォルト値は false で、これはセキュリティー上のリスクがあります。

手順

  1. Azure インスタンスから以下の値を取得します。

    1. Azure リソースグループを取得して記録します。

      $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
    2. Azure VNet 名を取得し、記録します。

      $ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)

      この値は、Azure サブネット ID を取得するために使用されます。

    3. Azure サブネット ID を取得して記録します。

      $ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""
    4. Azure ネットワークセキュリティーグループ (NSG) ID を取得して記録します。

      $ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""
    5. Azure リージョンを取得して記録します。

      $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
  2. 以下の例に従って peer-pods-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "azure"
      VXLAN_PORT: "9000"
      AZURE_INSTANCE_SIZE: "Standard_DC2as_v5" 1
      AZURE_INSTANCE_SIZES: "Standard_DC2as_v5, Standard_DC4as_v5, Standard_DC8as_v5" 2
      AZURE_SUBNET_ID: "<azure_subnet_id>" 3
      AZURE_NSG_ID: "<azure_nsg_id>" 4
      PROXY_TIMEOUT: "5m"
      AZURE_IMAGE_ID: "<azure_image_id>" 5
      AZURE_REGION: "<azure_region>" 6
      AZURE_RESOURCE_GROUP: "<azure_resource_group>" 7
      PEERPODS_LIMIT_PER_NODE: "10" 8
      TAGS: "key1=value1,key2=value2" 9
      INITDATA: "<base64_encoded_initdata>" 10
      ENABLE_SECURE_BOOT: "true" 11
      DISABLECVM: "false"
    1
    インスタンスサイズがワークロードで定義されていない場合、"Standard_DC2as_v5" 値がデフォルトになります。インスタンスタイプが信頼できる環境をサポートすることを確認します。デフォルトの "Standard_DC2as_v5" 値は、AMD SEV-SNP 用です。TEE が Intel TDX の場合は、Standard_EC4eds_v5 を指定します。
    2
    Pod の作成時に指定できるすべてのインスタンスサイズを一覧表示します。これにより、メモリーと CPU をあまり必要としないワークロードには小さいインスタンスサイズを定義したり、ワークロードが大きい場合は大きいインスタンスサイズを定義したりすることができます。Intel TDX の場合は、"Standard_EC4eds_v5, Standard_EC8eds_v5, Standard_EC16eds_v5" を指定します。
    3
    取得した AZURE_SUBNET_ID 値を指定します。
    4
    取得した AZURE_NSG_ID 値を指定します。
    5
    オプション: デフォルトでは、この値は、クラスターの認証情報に基づく Azure イメージ ID を使用して KataConfig CR を実行するときに入力されます。独自の Azure イメージを作成する場合は、正しいイメージ ID を指定します。
    6
    取得した AZURE_REGION 値を指定します。
    7
    取得した AZURE_RESOURCE_GROUP 値を指定します。
    8
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    9
    Pod 仮想マシンインスタンスの key:value ペアとしてカスタムタグを設定して、ピア Pod のコストを追跡したり、異なるクラスター内のピア Pod を識別したりできます。
    10
    initdata.txt ファイルで作成した Base64 でエンコードされた文字列を指定します。
    11
    セキュアブートをデフォルトで有効にするには true を指定します。
  3. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f peer-pods-cm.yaml
  4. 次のコマンドを実行して、ds/osc-caa-ds デーモンセットを再起動します。

    $ oc set env ds/osc-caa-ds \
      -n openshift-sandboxed-containers-operator REBOOT="$(date)"

7.7. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

デフォルトでは、Kata エージェントポリシーは exec APIlog API を無効にします。これは、これらの API がコントロールプレーンを介して暗号化されていないデータを送受信する可能性があり、安全ではないためです。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

重要

Confidential Containers ワークロードで exec API または log API を有効にすると、機密情報が公開される可能性があります。実稼働環境ではこれらの API を有効にしないでください。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

7.8. KataConfig カスタムリソースの削除

コマンドラインを使用して、KataConfig カスタムリソース (CR) を削除できます。

KataConfig CR を削除すると、ランタイムと関連リソースがクラスターから削除されます。

重要

KataConfig CR を削除すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードドライブへのデプロイメント。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、KataConfig CR を削除します。

    $ oc delete kataconfig example-kataconfig

    OpenShift Sandboxed Containers Operator は、クラスターでランタイムを有効化するために初期に作成されていたリソースをすべて削除します。

    重要

    KataConfig CR を削除すると、すべてのワーカーノードが再起動するまで CLI は応答を停止します。削除プロセスが完了するのを待ってから、検証を実行する必要があります。

  2. 以下のコマンドを実行して、カスタムリソースが削除されたことを確認します。

    $ oc get kataconfig example-kataconfig

    出力例

    No example-kataconfig instances exist

重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

7.9. カスタムピア Pod 仮想マシンイメージの選択

Pod マニフェストにアノテーションを追加することで、ワークロード要件に合わせてカスタマイズされたカスタムピア Pod 仮想マシン (VM) イメージを選択できます。カスタムイメージは、ピア Podconfig map で指定されたデフォルトイメージをオーバーライドします。

前提条件

  • 使用予定のカスタム Pod 仮想マシンイメージの ID が利用でき、クラウドプロバイダーまたはハイパーバイザーと互換性がある。

手順

  1. io.katacontainers.config.hypervisor.image アノテーションを追加して Pod マニフェストを編集し、pod-manifest.yaml ファイルに保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<custom_image_id>" 1
    spec:
      runtimeClassName: kata-remote 2
      containers:
      - name: <example_container> 3
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    1
    カスタムピア Pod イメージ ID を指定します。
    2
    ピア Pod を作成するには、runtimeClassName フィールドが kata-remote に設定されていることを確認します。
    3
    コンテナー名を指定します。
  2. 以下のコマンドを実行して Pod を作成します。

    $ oc apply -f pod-manifest.yaml

7.10. KataConfig カスタムリソースの再作成

Confidential Containers の KataConfig カスタムリソース (CR) を再作成する必要があります。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
    1
    オプション: 特定のノードに kata-remote をインストールするためにノードラベルを適用した場合は、キーと値を指定します (例: cc: 'true')
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードに kata-remote がランタイムクラスとしてインストールされます。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata-remote はクラスターにインストールされます。

  4. 次のコマンドを実行してデーモンセットを確認します。

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
  5. 次のコマンドを実行してランタイムクラスを確認します。

    $ oc get runtimeclass

    出力例

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

7.11. Trustee 認証シークレットの作成

Trustee の認証シークレットを作成する必要があります。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、秘密鍵を作成します。

    $ openssl genpkey -algorithm ed25519 > privateKey
  2. 次のコマンドを実行して、公開鍵を作成します。

    $ openssl pkey -in privateKey -pubout -out publicKey
  3. 次のコマンドを実行してシークレットを作成します。

    $ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
  4. 次のコマンドを実行してシークレットを確認します。

    $ oc get secret -n trustee-operator-system

7.12. Trustee config map の作成

Trustee サーバーを設定するには、config map を作成する必要があります。

注記

次の設定例では、セキュリティー機能を無効にして、テクノロジープレビュー機能のデモンストレーションを有効にします。実稼働環境向けではありません。

前提条件

  • Trustee のルートを作成している。

手順

  1. kbs-config-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kbs-config-cm
      namespace: trustee-operator-system
    data:
      kbs-config.json: |
        {
          "insecure_http" : true,
          "sockets": ["0.0.0.0:8080"],
          "auth_public_key": "/etc/auth-secret/publicKey",
          "attestation_token_config": {
            "attestation_token_type": "CoCo"
          },
          "repository_config": {
            "type": "LocalFs",
            "dir_path": "/opt/confidential-containers/kbs/repository"
          },
          "as_config": {
            "work_dir": "/opt/confidential-containers/attestation-service",
            "policy_engine": "opa",
            "attestation_token_broker": "Simple",
              "attestation_token_config": {
              "duration_min": 5
              },
            "rvps_config": {
              "store_type": "LocalJson",
              "store_config": {
                "file_path": "/opt/confidential-containers/rvps/reference-values/reference-values.json"
              }
             }
          },
          "policy_engine_config": {
            "policy_path": "/opt/confidential-containers/opa/policy.rego"
          }
        }
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f kbs-config-cm.yaml

7.13. Trustee の値、ポリシー、およびシークレットの設定

Trustee には次の値、ポリシー、およびシークレットを設定できます。

  • オプション: 参照値プロバイダーサービスの参照値。
  • オプション: アテステーションポリシー
  • Intel Trust Domain Extensions (TDX) 用の証明書キャッシュサービスをプロビジョニングします。
  • オプション: Trustee クライアントのカスタムキーのシークレット。
  • オプション: コンテナーイメージの署名検証用のシークレット。
  • コンテナーイメージの署名検証ポリシー。このポリシーは必須です。コンテナーイメージの署名検証を使用しない場合は、署名を検証しないポリシーを作成する必要があります。
  • リソースアクセスポリシー

7.13.1. 参照値の設定

ハードウェアプラットフォームの信頼できるダイジェストを指定することにより、Reference Value Provider Service (RVPS) の参照値を設定できます。

クライアントは、実行中のソフトウェア、Trusted Execution Environment (TEE) のハードウェアとファームウェアから測定値を収集し、請求とともに見積りを Attestation Server に送信します。これらの測定値は、Trustee に登録された信頼できるダイジェストと一致する必要があります。このプロセスにより、Confidential VM (CVM) が期待どおりのソフトウェアスタックを実行し、改ざんがされていないように確認します。

手順

  1. rvps-configmap.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: rvps-reference-values
      namespace: trustee-operator-system
    data:
      reference-values.json: |
        [ 1
        ]
    1
    必要に応じて、お使いのハードウェアプラットフォームの信頼できるダイジェストを指定します。それ以外の場合は、空のままにします。
  2. 次のコマンドを実行して、RVPS config map を作成します。

    $ oc apply -f rvps-configmap.yaml

7.13.2. アテステーションポリシーの作成

デフォルトの設定アテステーションポリシーをオーバーライドする設定アテステーションポリシーを作成できます。

手順

  1. 次の例に従って、attestation-policy.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: attestation-policy
      namespace: trustee-operator-system
    data:
      default.rego: |
        package policy 1
        import future.keywords.every
    
        default allow = false
    
        allow {
          every k, v in input {
              judge_field(k, v)
          }
        }
    
        judge_field(input_key, input_value) {
          has_key(data.reference, input_key)
          reference_value := data.reference[input_key]
          match_value(reference_value, input_value)
        }
    
        judge_field(input_key, input_value) {
          not has_key(data.reference, input_key)
        }
    
        match_value(reference_value, input_value) {
          not is_array(reference_value)
          input_value == reference_value
        }
    
        match_value(reference_value, input_value) {
          is_array(reference_value)
          array_include(reference_value, input_value)
        }
    
        array_include(reference_value_array, input_value) {
          reference_value_array == []
        }
    
        array_include(reference_value_array, input_value) {
          reference_value_array != []
          some i
          reference_value_array[i] == input_value
        }
    
        has_key(m, k) {
          _ = m[k]
        }
    1
    アテステーションポリシーは、Open Policy Agent 仕様に準拠します。この例では、アテステーションポリシーは、アテステーションレポートで提供されたクレームを RVPS データベースに登録されている参照値と比較します。すべての値が一致する場合にのみ、アテステーションプロセスは成功します。
  2. 以下のコマンドを実行して、アテステーションポリシー config map を作成します。

    $ oc apply -f attestation-policy.yaml

7.13.3. TDX 用の PCCS 設定

Intel Trust Domain Extensions (TDX) を使用する場合は、Provisioning Certificate Caching Service (PCCS) を使用するように Trustee を設定する必要があります。

PCCS はプロビジョニング証明書キー (PCK) 証明書を取得し、ローカルデータベースにキャッシュします。

重要

パブリック Intel PCCS サービスを使用しないでください。オンプレミスまたはパブリッククラウド上のローカルキャッシュサービスを使用します。

手順

  1. 次の例に従って、tdx-config.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tdx-config
      namespace: trustee-operator-system
    data:
      sgx_default_qcnl.conf: | \
          {
            "collateral_service": "https://api.trustedservices.intel.com/sgx/certification/v4/",
            "pccs_url": "<pccs_url>" 1
          }
    1
    PCCS URL を指定します (例: https://localhost:8081/sgx/certification/v4/)。
  2. 以下のコマンドを実行して TDX config map を作成します。

    $ oc apply -f tdx-config.yaml

7.13.4. クライアント用のカスタムキーを使用したシークレットの作成

Trustee クライアント用の 1 つ以上のカスタムキーを含むシークレットを作成できます。

この例では、kbsres1 シークレットには 2 つのエントリー (key1key2) があり、クライアントはそれらを取得します。同じ形式を使用して、要件に応じて追加のシークレットを追加できます。

前提条件

  • 1 つ以上のカスタムキーが作成されている。

手順

  • 次の例に従って、カスタムキーのシークレットを作成します。

    $ oc apply secret generic kbsres1 \
      --from-literal key1=<custom_key1> \ 1
      --from-literal key2=<custom_key2> \
      -n trustee-operator-system
    1
    カスタムキーを指定します。

    kbsres1 シークレットは、KbsConfig カスタムリソースの spec.kbsSecretResources キーで指定されます。

7.13.5. コンテナーイメージの署名検証用のシークレット作成

コンテナーイメージの署名検証を使用する場合は、公開コンテナーイメージ署名鍵を含むシークレットを作成する必要があります。

Confidential compute attestation Operator はシークレットを使用して署名を検証し、信頼され、認証されたコンテナーイメージのみが環境にデプロイされるようにします。

Red Hat Trusted Artifact Signer またはその他のツールを使用して、コンテナーイメージに署名できます。

手順

  1. 次のコマンドを実行して、コンテナーイメージの署名検証用のシークレットを作成します。

    $ oc apply secret generic <type> \ 1
      --from-file=<tag>=./<public_key_file> \ 2
      -n trustee-operator-system
    1
    KBS シークレットタイプ (例: img-sig) を指定します。
    2
    シークレットタグ (例: pub-key) とパブリックコンテナーイメージ署名鍵を指定します。
  2. <type> の値を記録します。KbsConfig カスタムリソースを作成するときに、この値を spec.kbsSecretResources キーに追加する必要があります。

7.13.6. コンテナーイメージ署名検証ポリシーの作成

署名検証は常に有効になっているため、コンテナーイメージ署名検証ポリシーを作成します。このポリシーがない場合、Pod は起動しません。

コンテナーイメージの署名検証を使用していない場合は、署名検証なしでポリシーを作成します。

詳細は、containers-policy.json 5 を参照してください。

手順

  1. 次の例に従って、security-policy-config.json ファイルを作成します。

    • 署名検証なし:

      {
        "default": [
        {
          "type": "insecureAcceptAnything"
        }],
        "transports": {}
      }
    • 署名検証あり:

      {
        "default": [
            {
            "type": "insecureAcceptAnything"
            }
        ],
        "transports": {
            "<transport>": { 1
                "<registry>/<image>": 2
                [
                    {
                        "type": "sigstoreSigned",
                        "keyPath": "kbs:///default/<type>/<tag>" 3
                    }
                ]
            }
        }
      }
      1
      transport のイメージリポジトリーを指定します (例: "docker")。詳細は、containers-transports 5 を参照してください。
      2
      コンテナーレジストリーとイメージを指定します (例: "quay.io/my-image")。
      3
      作成したコンテナーイメージ署名検証シークレットのタイプとタグを指定します (例: img-sig/pub-key)。
  2. 次のコマンドを実行してセキュリティーポリシーを作成します。

    $ oc apply secret generic security-policy \
      --from-file=osc=./<security-policy-config.json> \
      -n trustee-operator-system

    シークレットタイプ security-policy または osc のキーを変更しないでください。

    security-policy シークレットは、KbsConfig カスタムリソースの spec.kbsSecretResources キーで指定されます。

7.13.7. リソースアクセスポリシーの作成

Trustee ポリシーエンジンのリソースアクセスポリシーを設定します。このポリシーは、Trustee がアクセスできるリソースを決定します。

注記

Trustee ポリシーエンジンは、TEE 証拠の有効性を決定するアテステーション Service ポリシーエンジンとは異なります。

手順

  1. resourcepolicy-configmap.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: resource-policy
      namespace: trustee-operator-system
    data:
      policy.rego: | 1
        package policy 2
        default allow = false
        allow {
          input["tee"] != "sample"
        }
    1
    リソースポリシーの名前 policy.rego は、Trustee config map で定義されたリソースポリシーと一致する必要があります。
    2
    リソースポリシーは Open Policy Agent 仕様に準拠します。この例では、TEE がサンプルのアテスターでない場合にすべてのリソースを取得できます。
  2. 次のコマンドを実行して、リソースポリシーの config map を作成します。

    $ oc apply -f resourcepolicy-configmap.yaml

7.14. KbsConfig カスタムリソースの作成

Trustee を起動するには、KbsConfig カスタムリソース (CR) を作成します。

次に、Trustee Pod および Pod ログをチェックして設定を確認します。

手順

  1. kbsconfig-cr.yaml マニフェストファイルを作成します。

    apiVersion: confidentialcontainers.org/v1alpha1
    kind: KbsConfig
    metadata:
      labels:
        app.kubernetes.io/name: kbsconfig
        app.kubernetes.io/instance: kbsconfig
        app.kubernetes.io/part-of: trustee-operator
        app.kubernetes.io/managed-by: kustomize
        app.kubernetes.io/created-by: trustee-operator
      name: kbsconfig
      namespace: trustee-operator-system
    spec:
      kbsConfigMapName: kbs-config-cm
      kbsAuthSecretName: kbs-auth-public-key
      kbsDeploymentType: AllInOneDeployment
      kbsRvpsRefValuesConfigMapName: rvps-reference-values
      kbsSecretResources: ["kbsres1", "security-policy", "<type>"] 1
      kbsResourcePolicyConfigMapName: resource-policy
    # tdxConfigSpec:
    #   kbsTdxConfigMapName: tdx-config 2
    # kbsAttestationPolicyConfigMapName: attestation-policy 3
    # kbsServiceType: <service_type> 4
    1
    オプション: シークレットを作成した場合は、コンテナーイメージ署名検証シークレットの type 値 (例: img-sig) を指定します。シークレットを作成していない場合は、kbsSecretResources の値を ["kbsres1", "security-policy"] に設定します。
    2
    Intel Trust Domain Extensions の tdxConfigSpec.kbsTdxConfigMapName: tdx-config をアンコメントします。
    3
    カスタマイズされたアテステーションポリシーを作成する場合は、kbsAttestationPolicyConfigMapName: アテステーション -policy のコメントを解除します。
    4
    デフォルトの ClusterIP サービス以外のサービスタイプを作成して、クラスターの外部トラフィック内のアプリケーションを公開する場合は、kbsServiceType: <service_type> をアンコメントします。NodePortLoadBalancer、または ExternalName を指定できます。
  2. 以下のコマンドを実行して KbsConfig CR を作成します。

    $ oc apply -f kbsconfig-cr.yaml

7.15. Trustee 設定の確認

Trustee Pod とログをチェックして、Trustee 設定を確認します。

手順

  1. 次のコマンドを実行して、デフォルトのプロジェクトを設定します。

    $ oc project trustee-operator-system
  2. 次のコマンドを実行して Trustee Pod を確認します。

    $ oc get pods -n trustee-operator-system

    出力例

    NAME                                                   READY   STATUS    RESTARTS   AGE
    trustee-deployment-8585f98449-9bbgl                    1/1     Running   0          22m
    trustee-operator-controller-manager-5fbd44cd97-55dlh   2/2     Running   0          59m

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

    $ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)
  4. 次のコマンドを実行して、Pod ログを確認します。

    $ oc logs -n trustee-operator-system $POD_NAME

    出力例

    [2024-05-30T13:44:24Z INFO  kbs] Using config file /etc/kbs-config/kbs-config.json
    [2024-05-30T13:44:24Z WARN  attestation_service::rvps] No RVPS address provided and will launch a built-in rvps
    [2024-05-30T13:44:24Z INFO  attestation_service::token::simple] No Token Signer key in config file, create an ephemeral key and without CA pubkey cert
    [2024-05-30T13:44:24Z INFO  api_server] Starting HTTPS server at [0.0.0.0:8080]
    [2024-05-30T13:44:24Z INFO  actix_server::builder] starting 12 workers
    [2024-05-30T13:44:24Z INFO  actix_server::server] Tokio runtime found; starting in existing Tokio runtime

7.16. アテステーションプロセスの確認

テスト Pod を作成し、そのシークレットを取得することで、アテステーションプロセスを検証できます。

重要

この手順は、アテステーションが機能していることを確認する例です。データはメモリーダンプを使用してキャプチャーされる可能性があるため、機密データを標準 I/O に書き込まないでください。メモリーに書き込まれたデータのみが暗号化されます。

デフォルトでは、Pod 仮想マシン (VM) イメージに埋め込まれた Kata エージェントポリシーによって、Confidential Containers Pod の exec API と log API が無効になります。このポリシーは、クラスター管理者が Pod 内でプロセスを実行して機密データが抜き出されないようにすると同時に、機密データが標準 I/O に誤って書き込まれないようにします。

テストシナリオでは、ポリシーアノテーションを Pod に追加することで、実行時に制限をオーバーライドできます。テクノロジープレビューの場合、ランタイムポリシーアノテーションはリモートアテステーションによって検証されません。

前提条件

  • Trustee サーバーとテスト Pod が同じクラスター内で実行されていない場合は、ルートが作成されている。

手順

  1. verification-pod.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: ocp-cc-pod
      labels:
        app: ocp-cc-pod
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy> 1
        io.katacontainers.config.runtime.cc_init_data: <base64_initdata> 2
    spec:
      runtimeClassName: kata-remote
      containers:
        - name: skr-openshift
          image: registry.access.redhat.com/ubi9/ubi:9.3
          command:
            - sleep
            - "36000"
          securityContext:
            privileged: false
            seccompProfile:
              type: RuntimeDefault
    1
    この Pod アノテーションは、機密データが標準 I/O に書き込まれないようにするデフォルトのエージェントポリシーをオーバーライドします。
    2
    この Pod アノテーションは、ピア Podconfig map でグローバルに設定された initdata.toml ファイルの Base64 エンコード文字列をオーバーライドします。

    エージェントポリシーで io.katacontainers.config.agent.policy アノテーションと io.katacontainers.config.runtime.cc_init_data アノテーションの両方を指定すると、initdata のアノテーションはエージェントポリシーのアノテーションよりも優先されます。

  2. 以下のコマンドを実行して Pod を作成します。

    $ oc create -f verification-pod.yaml
  3. 次のコマンドを実行して、ocp-cc-pod の Bash シェルに接続します。

    $ oc exec -it ocp-cc-pod -- bash
  4. 次のコマンドを実行して Pod シークレットを取得します。

    $ curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1

    出力例

    res1val1

    Trustee サーバーは、証明書が成功した場合にのみシークレットを返します。

第8章 IBM Z および IBM LinuxONE への Confidential Containers のデプロイ

OpenShift sandboxed containers をデプロイした後、IBM Z® および IBM® LinuxONE に Confidential Containers をデプロイできます。

重要

IBM Z® および IBM® LinuxONE の Confidential Containers は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

クラスターの要件

  • Confidential compute attestation Operator をインストールするクラスターに Red Hat OpenShift Container Platform 4.15 以降がインストールされている。

LPAR の要件

  • LinuxONE Emperor 4 がある。
  • 論理パーティション (LPAR) で Secure Unpack Facility を有効化している。これは、IBM Secure Execution に必要です。詳細は、Enabling the KVM host for IBM Secure Execution を参照してください。

次の手順を実行して、Confidential Containers をデプロイします。

  1. Confidential compute attestation Operator をインストールします。
  2. Trustee のルートを作成します。
  3. Confidential Containers フィーチャーゲートを有効にします。
  4. initdata を作成します。
  5. ピア Pod config map を更新します。
  6. オプション: Kata エージェントポリシーをカスタマイズします。
  7. KataConfig カスタムリソース (CR) を削除します。
  8. ピア Pod のシークレットを更新します。
  9. オプション: カスタムピア Pod 仮想マシンイメージを選択します。
  10. KataConfig CR を再作成します。
  11. Trustee 認証シークレットを作成します。
  12. Trustee config map を作成します。
  13. IBM Secure Execution (SE) ヘッダーを取得します。
  14. SE 証明書とキーを設定します。
  15. 永続ストレージコンポーネントを作成します。
  16. Trustee の値、ポリシー、およびシークレットを設定します。
  17. KbsConfig CR を作成します。
  18. Trustee の設定を確認します。
  19. アテステーションプロセスを確認します。

8.1. Confidential compute attestation Operator のインストール

CLI を使用して、IBM Z® および IBM® LinuxONE に Confidential compute attestation Operator をインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. trustee-namespace.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: trustee-operator-system
  2. 次のコマンドを実行して、trustee-operator-system namespace を作成します。

    $ oc apply -f trustee-namespace.yaml
  3. trustee-operatorgroup.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: trustee-operator-group
      namespace: trustee-operator-system
    spec:
      targetNamespaces:
      - trustee-operator-system
  4. 以下のコマンドを実行して Operator グループを作成します。

    $ oc apply -f trustee-operatorgroup.yaml
  5. trustee-subscription.yaml マニフェストファイルを作成します。

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: trustee-operator-system
      namespace: trustee-operator-system
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: trustee-operator
      source: trustee-operator-catalog
      sourceNamespace: openshift-marketplace
  6. 次のコマンドを実行して、サブスクリプションを作成します。

    $ oc apply -f trustee-subscription.yaml
  7. 次のコマンドを実行して、Operator が正常にインストールされていることを確認します。

    $ oc get csv -n trustee-operator-system

    このコマンドが完了するまでに数分かかる場合があります。

  8. 次のコマンドを実行してプロセスを監視します。

    $ watch oc get csv -n trustee-operator-system

    出力例

    NAME                      DISPLAY                        PHASE
    trustee-operator.v0.3.0   Trustee Operator  0.3.0        Succeeded

8.2. Confidential Containers フィーチャーゲートの有効化

Confidential Containers フィーチャーゲートを有効にする必要があります。

前提条件

  • OpenShift Sandboxed Containers Operator にサブスクライブした。

手順

  1. cc-feature-gate.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: osc-feature-gates
      namespace: openshift-sandboxed-containers-operator
    data:
      confidential: "true"
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f cc-feature-gate.yaml

8.3. Trustee のルートの作成

Trustee のエッジ TLS 終端を使用してセキュアなルートを作成できます。外部の Ingress トラフィックは HTTPS としてルーター Pod に到達し、HTTP として Trustee Pod に渡されます。

前提条件

  • Confidential compute attestation Operator がインストールされている。

手順

  1. 次のコマンドを実行してエッジルートを作成します。

    $ oc create route edge --service=kbs-service --port kbs-port \
      -n trustee-operator-system
    注記

    注記: 現在、有効な CA 署名証明書を持つルートのみがサポートされています。自己署名証明書を使用したルートは使用できません。

  2. 次のコマンドを実行して、TRUSTEE_HOST 変数を設定します。

    $ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \
      -o jsonpath={.spec.host})
  3. 次のコマンドを実行してルートを確認します。

    $ echo $TRUSTEE_HOST

    出力例

    kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io

8.4. initdata について

initdata 仕様は、実行時に機密データまたはワークロード固有のデータを使用してピア Pod を初期化する柔軟な方法を提供し、そのようなデータを仮想マシン (VM) イメージに埋め込む必要性を回避します。これにより、機密情報の漏洩が減り、セキュリティーが強化され、カスタムイメージビルドがなくなることで柔軟性が向上します。たとえば、initdata には次の 3 つの設定を含めることができます。

  • 安全な通信のための X.509 証明書。
  • 認証用の暗号化キー。
  • デフォルトの Kata Agent ポリシーを上書きするときに実行時の動作を強制する任意の Kata Agent policy.rego ファイル。

次のいずれかの方法を使用して、initdata 設定を適用できます。

  • ピア Pod の config map に含めることでグローバルに、すべての Pod に対してクラスター全体のデフォルトを設定します。
  • 特定の Pod に対して Pod ワークロードオブジェクトを設定するときに、個々のワークロードのカスタマイズが可能になります。

    Pod ワークロードオブジェクトを設定するときに指定する io.katacontainers.config.runtime.cc_init_data アノテーションは、その特定の Pod のピア Podconfig map 内のグローバル INITDATA 設定をオーバーライドします。Kata ランタイムは、Pod の作成時にこの優先順位を自動的に処理します。

initdata コンテンツは次のコンポーネントを設定します。

  • Attestation Agent (AA) は、アテステーションのために受託者に証拠を送信することで、ピア Pod の信頼性を検証します。
  • Confidential Data Hub (CDH) は、ピア Pod 仮想マシン内の秘密と安全なデータアクセスを管理します。
  • Kata エージェントは、ランタイムポリシーを適用し、Pod 仮想マシン内のコンテナーのライフサイクルを管理します。

8.5. initdata の作成

initdata を使用して TOML ファイルを作成し、そのファイルを Base64 でエンコードされた文字列に変換します。この文字列を使用して、ピア Pod config map、ピア Pod マニフェスト、または busybox.yaml ファイルの値を指定します。

重要

Trustee config map で insecure_http = true を設定する場合は、kbs_cert 設定を削除する必要があります。

手順

  1. 次のコマンドを実行して、Trustee IP アドレスを取得します。

    $ oc get node $(oc get pod -n trustee-operator-system -o jsonpath='{.items[0].spec.nodeName}') -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'

    出力例

    192.168.122.22

  2. 次のコマンドを実行して Trustee ポートを取得します。

    $ oc get svc kbs-service -n trustee-operator-system

    出力例

    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kbs-service  NodePort    172.30.116.11   <none>        8080:32178/TCP   12d

  3. initdata.toml 設定ファイルを作成します。

    ```toml
    algorithm = "sha384"
    version = "0.1.0"
    
    [data]
    "aa.toml" = '''
    [token_configs]
    [token_configs.coco_as]
    url = 'https://<worker_node_ip>:<node_port>' 1
    
    
    [token_configs.kbs]
    url = 'https://<worker_node_ip>:<node_port>'
    cert = """
    -----BEGIN CERTIFICATE-----
    <kbs_certificate> 2
    -----END CERTIFICATE-----
    """
    '''
    
    "cdh.toml"  = '''
    socket = 'unix:///run/confidential-containers/cdh.sock'
    credentials = []
    
    [kbc]
    name = 'cc_kbc'
    url = 'https://<worker_node_ip>:<node_port>'
    kbs_cert = """ 3
    -----BEGIN CERTIFICATE-----
    <kbs_certificate> 4
    -----END CERTIFICATE-----
    """
    '''
    
    "policy.rego" = ''' 5
    package agent_policy
    
    default AddARPNeighborsRequest := true
    default AddSwapRequest := true
    default CloseStdinRequest := true
    default CopyFileRequest := true
    default CreateContainerRequest := true
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true
    default GetMetricsRequest := true
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default ListInterfacesRequest := true
    default ListRoutesRequest := true
    default MemHotplugByProbeRequest := true
    default OnlineCPUMemRequest := true
    default PauseContainerRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default ReseedRandomDevRequest := true
    default ResumeContainerRequest := true
    default SetGuestDateTimeRequest := true
    default SetPolicyRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StartTracingRequest := true
    default StatsContainerRequest := true
    default StopTracingRequest := true
    default TtyWinResizeRequest := true
    default UpdateContainerRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := true
    '''
    ```
    1
    Trustee IP アドレスとポートを指定します (例: https://192.168.122.22:32178)。
    2
    attestation agent の Base64 でエンコードされた TLS 証明書を指定します。これはテスト目的では必要ありませんが、実稼働システムには推奨されます。
    3
    Trustee config map で insecure_http = true を設定する場合は、kbs_cert 設定を削除します。
    4
    Trustee インスタンスの Base64 エンコードされた TLS 証明書を指定します。
    5
    オプション: カスタム Kata エージェントポリシーを指定できます。
  4. 次のコマンドを実行して、initdata.toml ファイルをテキストファイル内の Base64 エンコードされた文字列に変換します。

    $ base64 -w0 initdata.toml > initdata.txt

8.6. ピア Pod の更新 config map

Confidential Containers のピア Pod config map を更新する必要があります。

注記

セキュアブートをデフォルトで有効にするには、これを true に設定します。デフォルト値は false で、これはセキュリティー上のリスクがあります。

手順

  1. 以下の例に従って peer-pods-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "libvirt"
      PEERPODS_LIMIT_PER_NODE: "10" 1
      LIBVIRT_POOL: "<libvirt_pool>" 2
      LIBVIRT_VOL_NAME: "<libvirt_volume>" 3
      LIBVIRT_DIR_NAME: "/var/lib/libvirt/images/<directory_name>" 4
      LIBVIRT_NET: "default" 5
      INITDATA: "<base64_encoded_initdata>" 6
      DISABLECVM: "false"
    1
    ノードごとに作成できるピア Pod の最大数を指定します。デフォルト値は 10 です。
    2
    libvirt プールを指定します。libvirt プールを手動で設定した場合は、KVM ホスト設定と同じ名前を使用します。
    3
    libvirt ボリューム名を指定します。libvirt ボリュームを手動で設定した場合は、KVM ホスト設定と同じ名前を使用します。
    4
    .qcow2.raw ファイルなどの仮想マシンのディスクイメージを保存するための libvirt ディレクトリーを指定します。libvirt に読み取りおよび書き込みアクセス権限があることを確認するには、libvirt ストレージディレクトリーのサブディレクトリーを使用します。デフォルトは /var/lib/libvirt/images/ です。
    5
    オプション: デフォルトのネットワークを使用しない場合は、libvirt ネットワークを指定します。
    6
    initdata.txt ファイルで作成した Base64 でエンコードされた文字列を指定します。
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f peer-pods-cm.yaml
  3. 次のコマンドを実行して、ds/osc-caa-ds デーモンセットを再起動します。

    $ oc set env ds/osc-caa-ds \
      -n openshift-sandboxed-containers-operator REBOOT="$(date)"

8.7. Kata エージェントポリシーのカスタマイズ

Kata エージェントポリシーは、Kata ランタイムで実行されている Pod のエージェント API 要求を制御するセキュリティーメカニズムです。このポリシーは Rego で記述され、Pod 仮想マシン (VM) 内の Kata エージェントによって適用され、許可または拒否される操作を決定します。

デフォルトでは、Kata エージェントポリシーは exec APIlog API を無効にします。これは、これらの API がコントロールプレーンを介して暗号化されていないデータを送受信する可能性があり、安全ではないためです。

セキュリティーが問題にならない開発やテストなどの特定のユースケースでは、デフォルトのポリシーをカスタムポリシーで上書きできます。たとえば、コントロールプレーンを信頼できる環境で実行する場合があります。カスタムポリシーは、複数の方法で適用できます。

  • ポリシーを Pod VM イメージに組み込む。
  • ピア Pod の config map にパッチを適用する。
  • ワークロード Pod YAML にアノテーションを追加する。

実稼働システムの場合、initdata を使用して Kata エージェントポリシーをオーバーライドする方法が推奨されます。以下の手順では、io.katacontainers.config.agent.policy アノテーションを使用してカスタムポリシーを個々の Pod に適用します。ポリシーは Base64 でエンコードされた Rego 形式で提供されます。このアプローチでは、Pod 仮想マシンイメージを変更せずに、Pod 作成時にデフォルトのポリシーをオーバーライドします。

重要

Confidential Containers ワークロードで exec API または log API を有効にすると、機密情報が公開される可能性があります。実稼働環境ではこれらの API を有効にしないでください。

注記

カスタムポリシーは、デフォルトのポリシーを完全に置き換えます。特定の API のみを変更するには、完全なポリシーを含め、関連するルールを調整します。

手順

  1. カスタムポリシーを含む policy.rego ファイルを作成します。次の例では、デモ用に execlog を有効にした、設定可能なすべての API を示しています。

    package agent_policy
    
    import future.keywords.in
    import input
    
    default CopyFileRequest := false
    default CreateContainerRequest := false
    default CreateSandboxRequest := true
    default DestroySandboxRequest := true
    default ExecProcessRequest := true  # Enabled to allow exec API
    default GetOOMEventRequest := true
    default GuestDetailsRequest := true
    default OnlineCPUMemRequest := true
    default PullImageRequest := true
    default ReadStreamRequest := true   # Enabled to allow log API
    default RemoveContainerRequest := true
    default RemoveStaleVirtiofsShareMountsRequest := true
    default SignalProcessRequest := true
    default StartContainerRequest := true
    default StatsContainerRequest := true
    default TtyWinResizeRequest := true
    default UpdateEphemeralMountsRequest := true
    default UpdateInterfaceRequest := true
    default UpdateRoutesRequest := true
    default WaitProcessRequest := true
    default WriteStreamRequest := false

    このポリシーは、exec (ExecProcessRequest) および log (ReadStreamRequest) API を有効にします。必要に応じて、true または false の値を調整してポリシーをさらにカスタマイズします。

  2. 次のコマンドを実行して、policy.rego ファイルを Base64 でエンコードされた文字列に変換します。

    $ base64 -w0 policy.rego

    次のステップで使用するために出力をコピーします。

  3. Base64 でエンコードされたポリシーを my-pod.yaml Pod 仕様ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: <pod_name>
      annotations:
        io.katacontainers.config.agent.policy: <base64_encoded_policy>
    spec:
      runtimeClassName: kata-remote
      containers:
      - name: <container_name>
        image: registry.access.redhat.com/ubi9/ubi:latest
        command:
        - sleep
        - "36000"
        securityContext:
          privileged: false
          seccompProfile:
            type: RuntimeDefault
  4. 以下のコマンドを実行して Pod マニフェストを適用します。

    $ oc apply -f my-pod.yaml

8.8. KataConfig カスタムリソースの削除

コマンドラインを使用して、KataConfig カスタムリソース (CR) を削除できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、KataConfig CR を削除します。

    $ oc delete kataconfig example-kataconfig
  2. 以下のコマンドを実行して、カスタムリソースが削除されたことを確認します。

    $ oc get kataconfig example-kataconfig

    出力例

    No example-kataconfig instances exist

重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

8.9. ピア Pod シークレットの更新

ピア Pod のシークレットが空で、Cloud Credential Operator (CCO) がインストールされている場合、OpenShift sandboxed containers Operator は CCO を使用してシークレットを取得します。CCO をアンインストールした場合は、機密コンテナーのピア Pod シークレットを手動で更新する必要があります。そうしないと、ピア Pod は動作しなくなります。

シークレットには、Pod 仮想マシン (VM) イメージとピア Pod インスタンスを作成するための認証情報が保存されます。

デフォルトでは、OpenShift Sandboxed Containers Operator はクラスターの作成に使用される認証情報に基づいてシークレットを作成します。ただし、異なる認証情報を使用するシークレットを手動で作成することはできます。

前提条件

  • REDHAT_OFFLINE_TOKENRed Hat API トークン で RHEL イメージをダウンロードするためにこのトークンを生成している。
  • HOST_KEY_CERTS。IBM Z® でのセキュアな実行を可能にする Host Key Document (HKD) 証明書がある。詳細は、IBM ドキュメントの Obtaining a host key document from Resource Link を参照してください。

手順

  1. 次の例に従って peer-pods-secret.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      CLOUD_PROVIDER: "libvirt"
      LIBVIRT_URI: "<libvirt_gateway_uri>" 1
      REDHAT_OFFLINE_TOKEN: "<rh_offline_token>" 2
      HOST_KEY_CERTS: "<host_key_crt_value>" 3
    1
    libvirt URI を指定します。
    2
    Operator ビルドイメージに必要な Red Hat オフライントークンを指定します。
    3
    Operator が構築したイメージに対して IBM Secure Execution を有効にするには、HKD 証明書の値を指定します。
  2. 以下のコマンドを実行してシークレットを作成します。

    $ oc apply -f peer-pods-secret.yaml

8.10. カスタムピア Pod 仮想マシンイメージの選択

Pod マニフェストにアノテーションを追加することで、ワークロード要件に合わせてカスタマイズされたカスタムピア Pod 仮想マシン (VM) イメージを選択できます。カスタムイメージは、ピア Podconfig map で指定されたデフォルトイメージをオーバーライドします。libvirt プールに新しい libvirt ボリュームを作成し、カスタムピア Pod 仮想マシンイメージを新しいボリュームにアップロードします。次に、カスタムピア Pod 仮想マシンイメージを使用するように Pod マニフェストを更新します。

前提条件

  • 使用予定のカスタム Pod 仮想マシンイメージの ID が利用でき、クラウドプロバイダーまたはハイパーバイザーと互換性がある。

手順

  1. 次のコマンドを実行して、libvirt プールの名前を設定します。

    $ export LIBVIRT_POOL=<libvirt_pool> 1
    1
    既存の libvirt プール名を指定します。
  2. 次のコマンドを実行して、新しい libvirt ボリュームの名前を設定します。

    $ export LIBVIRT_VOL_NAME=<new_libvirt_volume>
  3. 次のコマンドを実行して、プールの libvirt ボリュームを作成します。

    $ virsh -c qemu:///system \
      vol-create-as --pool $LIBVIRT_POOL \
      --name $LIBVIRT_VOL_NAME \
      --capacity 20G \
      --allocation 2G \
      --prealloc-metadata \
      --format qcow2
  4. カスタムピア Pod 仮想マシンイメージを libvirt ボリュームにアップロードします。

    $ virsh -c qemu:///system vol-upload \
      --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \ 1
      --pool $LIBVIRT_POOL --sparse
    1
    カスタムピア Pod 仮想マシンイメージ名を指定します。
  5. 次の例に従って、pod-manifest.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-manifest
      annotations:
        io.katacontainers.config.hypervisor.image: "<new_libvirt_volume>" 1
    spec:
      runtimeClassName: kata-remote 2
      containers:
      - name: <example_container> 3
        image: registry.access.redhat.com/ubi9/ubi:9.3
        command: ["sleep", "36000"]
    1
    カスタムピア Pod 仮想マシンイメージをアップロードした libvirt ボリューム名を指定します。
    2
    ピア Pod を作成するには、runtimeClassName フィールドが kata-remote に設定されていることを確認します。
    3
    コンテナー名を指定します。
  6. 以下のコマンドを実行して Pod を作成します。

    $ oc apply -f pod-manifest.yaml

8.11. KataConfig カスタムリソースの再作成

Confidential Containers の KataConfig カスタムリソース (CR) を再作成する必要があります。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
    1
    オプション: 特定のノードに kata-remote をインストールするためにノードラベルを適用した場合は、キーと値を指定します (例: cc: 'true')
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードに kata-remote がランタイムクラスとしてインストールされます。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata-remote はクラスターにインストールされます。

  4. 次のコマンドを実行して、ピア Pod イメージが構築され、libvirt ボリュームにアップロードされたことを確認します。

    $ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator

    出力例

    Name: peer-pods-cm
    Namespace: openshift-sandboxed-containers-operator
    Labels: <none>
    Annotations: <none>
    
    Data
    ====
    CLOUD_PROVIDER: libvirt
    DISABLECVM: false 1
    LIBVIRT_IMAGE_ID: fa-pp-vol 2
    
    BinaryData
    ====
    Events: <none>

    1
    Operator ビルドイメージの IBM Secure Execution 中に Confidential VM を有効にします。
    2
    ピア Pod イメージを構築し、libvirt ボリュームにアップロードした場合、値が含まれます。
  5. 次のコマンドを実行して、kata-oc マシン設定プールの進行状況を監視し、UPDATEDMACHINECOUNTMACHINECOUNT と等しいときに UPDATED 状態であることを確認します。

    $ watch oc get mcp/kata-oc
  6. 次のコマンドを実行してデーモンセットを確認します。

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
  7. 次のコマンドを実行してランタイムクラスを確認します。

    $ oc get runtimeclass

    出力例

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

8.12. Trustee 認証シークレットの作成

Trustee の認証シークレットを作成する必要があります。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、秘密鍵を作成します。

    $ openssl genpkey -algorithm ed25519 > privateKey
  2. 次のコマンドを実行して、公開鍵を作成します。

    $ openssl pkey -in privateKey -pubout -out publicKey
  3. 次のコマンドを実行してシークレットを作成します。

    $ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
  4. 次のコマンドを実行してシークレットを確認します。

    $ oc get secret -n trustee-operator-system

8.13. Trustee config map の作成

Trustee サーバーを設定するには、config map を作成する必要があります。

注記

次の設定例では、セキュリティー機能を無効にして、テクノロジープレビュー機能のデモンストレーションを有効にします。実稼働環境向けではありません。

前提条件

  • Trustee のルートを作成している。

手順

  1. kbs-config-cm.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kbs-config-cm
      namespace: trustee-operator-system
    data:
      kbs-config.toml: |
        [http_server]
        sockets = ["0.0.0.0:8080"]
        insecure_http = false
        private_key = "/etc/https-key/https.key"
        certificate = "/etc/https-cert/https.crt"
    
        [admin]
        insecure_api = false
        auth_public_key = "/etc/auth-secret/publicKey"
    
        [attestation_token]
        insecure_key = true
        attestation_token_type = "CoCo"
    
        [attestation_service]
        type = "coco_as_builtin"
        work_dir = "/opt/confidential-containers/attestation-service"
        policy_engine = "opa"
    
        [attestation_service.attestation_token_broker]
        type = "Simple"
        policy_dir = "/opt/confidential-containers/attestation-service/policies"
    
        [attestation_service.attestation_token_config]
        duration_min = 5
    
        [attestation_service.rvps_config]
        type = "BuiltIn"
    
        [attestation_service.rvps_config.storage]
        type = "LocalJson"
        file_path = "/opt/confidential-containers/rvps/reference-values/reference-values.json"
    
        [[plugins]]
        name = "resource"
        type = "LocalFs"
        dir_path = "/opt/confidential-containers/kbs/repository"
    
        [policy_engine]
        policy_path = "/opt/confidential-containers/opa/policy.rego"
  2. 以下のコマンドを実行して config map を作成します。

    $ oc apply -f kbs-config-cm.yaml

8.14. IBM Secure Execution 証明書と鍵の設定

ワーカーノードの IBM Secure Execution (SE) 証明書とキーを設定する必要があります。

前提条件

  • bastion ノードの IP アドレスがある。
  • ワーカーノードの内部 IP アドレスがある。

手順

  1. 次の手順を実行して、キーブローカーサービス (KBS) 証明書とキーを生成します。

    1. 次の例に従って kbs.conf 設定ファイルを作成します。

      [req]
      default_bits = 2048
      default_keyfile = localhost.key
      distinguished_name = req_distinguished_name
      req_extensions = req_ext
      x509_extensions = v3_ca
      
      [req_distinguished_name]
      countryName = Country Name (2-letter code)
      countryName_default = <country_name>
      stateOrProvinceName = State or Province Name (full name)
      stateOrProvinceName_default = <state_name>
      localityName = Locality Name (eg, city)
      localityName_default = <locality_name>
      organizationName = Organization Name (eg, company)
      organizationName_default = Red Hat
      organizationalUnitName = organizationalunit
      organizationalUnitName_default = Development
      commonName = Common Name (e.g. server FQDN or
      YOUR name)
      commonName_default = kbs-service
      commonName_max = 64
      
      [req_ext]
      subjectAltName = @alt_names
      
      [v3_ca]
      subjectAltName = @alt_names
      
      [alt_names]
      IP.1  = <trustee_ip>
      DNS.1  = localhost
      DNS.2  = 127.0.0.1
    2. 次のコマンドを実行して、KBS キーと自己署名証明書を生成します。

      openssl req -x509 -nodes -days 365 \
         -newkey rsa:2048 \
         -keyout kbs.key \
         -out kbs.crt \
         -config kbs.conf \
         -passin pass:
    3. 次のコマンドを実行して、KBS キーを ibmse ディレクトリーにコピーします。

      $ cp kbs.key /tmp/ibmse/kbs.key
    4. 次のコマンドを実行して、KBS 証明書を ibmse ディレクトリーにコピーします。

      $ cp kbs.crt /tmp/ibmse/kbs.crt
  2. 次の手順を実行して、アテステーションポリシーフィールドを取得します。

    1. 次のコマンドを実行して、GetRvps.sh スクリプトをダウンロードするディレクトリーを作成します。

      $ mkdir -p Rvps-Extraction/
    2. 次のコマンドを実行してスクリプトをダウンロードします。

      $ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/GetRvps.sh -O $PWD/GetRvps.sh
    3. 次のコマンドを実行してサブディレクトリーを作成します。

      $ mkdir -p Rvps-Extraction/static-files
    4. 次のコマンドを実行して、static-files ディレクトリーに移動します。

      $ cd Rvps-Extraction/static-files
    5. 次のコマンドを実行して、pvextract-hdr ツールをダウンロードします。

      $ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/pvextract-hdr -O $PWD/pvextract-hdr
    6. 次のコマンドを実行して、ツールを実行可能にします。

      $ chmod +x pvextract-hdr
    7. 次のコマンドを実行して、se_parse_hdr.py スクリプトをダウンロードします。

      $ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/se_parse_hdr.py -O $PWD/se_parse_hdr.py
    8. 次のコマンドを実行して、Host Key Document (HKD) 証明書を static-files ディレクトリーにコピーします。

      $ cp ~/path/to/<hkd_cert.crt> .

      static-files ディレクトリーには次のファイルが含まれています。

      • HKD.crt
      • pvextract-hdr
      • se_parse_hdr.py
    9. 次のコマンドを実行して、Rvps-Extraction ディレクトリーに移動します。

      $ cd ..
    10. 次のコマンドを実行して、GetRvps.sh スクリプトを実行可能にします。

      $ chmod +x GetRvps.sh
    11. スクリプトを実行します。

      $ ./GetRvps.sh

      出力例

      ***Installing necessary packages for RVPS values extraction ***
      Updating Subscription Management repositories.
      Last metadata expiration check: 0:37:12 ago on Mon Nov 18 09:20:29 2024.
      Package python3-3.9.19-8.el9_5.1.s390x is already installed.
      Package python3-cryptography-36.0.1-4.el9.s390x is already installed.
      Package kmod-28-10.el9.s390x is already installed.
      Dependencies resolved.
      Nothing to do.
      Complete!
      ***Installation Finished ***
      1) Generate the RVPS From Local Image from User pc
      2) Generate RVPS from Volume
      3) Quit
      Please enter your choice:

      1. ボリュームから参照値プロバイダーサービスを生成するには、2 を入力します。

        Please enter your choice: 2
      2. libvirt プール名として fa-pp を入力します。

        Enter the Libvirt Pool Name: fa-pp
      3. libvirt ゲートウェイ URI を入力します。

        Enter the Libvirt URI Name: <libvirt-uri> 1
        1
        ピア Pod シークレット を作成するために使用した LIBVIRT_URI 値を指定します。
      4. libvirt ボリューム名として fa-pp-vol と入力します。

        Enter the Libvirt Volume Name: fa-pp-vol

        出力例

        Downloading from PODVM Volume...
        
        mount: /mnt/myvm: special device /dev/nbd3p1 does not exist.
        Error: Failed to mount the image. Retrying...
        Mounting on second attempt passed
        /dev/nbd3 disconnected
        SE header found at offset 0x014000
        SE header written to '/root/Rvps-Extraction/output-files/hdr.bin' (640 bytes)
        se.tag:  42f3fe61e8a7e859cab3bb033fd11c61
        se.image_phkh:  92d0aff6eb86719b6b1ea0cb98d2c99ff2ec693df3efff2158f54112f6961508
        provenance = ewogICAgInNlLmF0dGVzdGF0aW9uX3Boa2giOiBbCiAgICAgICAgIjkyZDBhZmY2ZWI4NjcxOWI2YjFlYTBjYjk4ZDJjOTlmZjJlYzY5M2RmM2VmZmYyMTU4ZjU0MTEyZjY5NjE1MDgiCiAgICBdLAogICAgInNlLnRhZyI6IFsKICAgICAgICAiNDJmM2ZlNjFlOGE3ZTg1OWNhYjNiYjAzM2ZkMTFjNjEiCiAgICBdLAogICAgInNlLmltYWdlX3Boa2giOiBbCiAgICAgICAgIjkyZDBhZmY2ZWI4NjcxOWI2YjFlYTBjYjk4ZDJjOTlmZjJlYzY5M2RmM2VmZmYyMTU4ZjU0MTEyZjY5NjE1MDgiCiAgICBdLAogICAgInNlLnVzZXJfZGF0YSI6IFsKICAgICAgICAiMDAiCiAgICBdLAogICAgInNlLnZlcnNpb24iOiBbCiAgICAgICAgIjI1NiIKICAgIF0KfQo=
        -rw-r--r--. 1 root root 640 Dec 16 10:57 /root/Rvps-Extraction/output-files/hdr.bin
        -rw-r--r--. 1 root root 446 Dec 16 10:57 /root/Rvps-Extraction/output-files/ibmse-policy.rego
        -rw-r--r--. 1 root root 561 Dec 16 10:57 /root/Rvps-Extraction/output-files/se-message

  3. 次の手順を実行して、証明書と証明書失効リスト (CRL) を取得します。

    1. 次のコマンドを実行して、証明書用の一時ディレクトリーを作成します。

      $ mkdir /tmp/ibmse/certs
    2. 以下のコマンドを実行して、ibm-z-host-key-signing-gen2.crt 証明書をダウンロードします。

      $ wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-signing-gen2.crt -O /tmp/ibmse/certs/ibm-z-host-key-signing-gen2.crt
    3. 次のコマンドを実行して、DigiCertCA.crt 証明書をダウンロードします。

      $ wget https://www.ibm.com/support/resourcelink/api/content/public/DigiCertCA.crt -O /tmp/ibmse/certs/DigiCertCA.crt
    4. 次のコマンドを実行して、CRL の一時ディレクトリーを作成します。

      $ mkdir /tmp/ibmse/crls
    5. 次のコマンドを実行して、ibm-z-host-key-gen2.crl ファイルをダウンロードします。

      $ wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-gen2.crl -O /tmp/ibmse/crls/ibm-z-host-key-gen2.crl
    6. 次のコマンドを実行して、DigiCertTrustedRootG4.crl ファイルをダウンロードします。

      $ wget http://crl3.digicert.com/DigiCertTrustedRootG4.crl -O /tmp/ibmse/crls/DigiCertTrustedRootG4.crl
    7. 次のコマンドを実行して、DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl ファイルをダウンロードします。

      $ wget http://crl3.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl -O /tmp/ibmse/crls/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl
    8. 次のコマンドを実行して、hdr.bin ファイル用の一時ディレクトリーを作成します。

      $ mkdir -p /tmp/ibmse/hdr/
    9. 次のコマンドを実行して、hdr.bin ファイルを hdr ディレクトリーにコピーします。

      $ cp /root/Rvps-Extraction/output-files/hdr.bin /tmp/ibmse/hdr/
    10. 次のコマンドを実行して、Host Key Document (HKD) 証明書用の一時ディレクトリーを作成します。

      $ mkdir -p /tmp/ibmse/hkds
    11. 次のコマンドを実行して、HKD 証明書を hkds ディレクトリーにコピーします。

      $ cp ~/path/to/<hkd_cert.crt> /tmp/ibmse/hkds/
  4. RSA 鍵を生成します。

    1. 次のコマンドを実行して RSA のキーペアを生成します。

      $ openssl genrsa -aes256 -passout pass:<password> -out /tmp/encrypt_key-psw.pem 4096 1
      1
      RSA 鍵のパスワードを指定します。
    2. 次のコマンドを実行して、RSA 鍵の一時ディレクトリーを作成します。

      $ mkdir -p /tmp/ibmse/rsa
    3. 次のコマンドを実行して encrypt_key.pub 鍵を作成します。

      $ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -pubout -out /tmp/ibmse/rsa/encrypt_key.pub
    4. 以下のコマンドを実行して encrypt_key.pem 鍵を作成します。

      $ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -out /tmp/ibmse/rsa/encrypt_key.pem
  5. 次のコマンドを実行して、/tmp/ibmse ディレクトリーの構造を確認します。

    $ tree /tmp/ibmse

    出力例

    /tmp/ibmse
    ├──kbs.key
    ├──kbs.crt
    |
    ├── certs
    │ ├── ibm-z-host-key-signing-gen2.crt
    | └── DigiCertCA.crt
    ├── crls
    │ └── ibm-z-host-key-gen2.crl
    │ └── DigiCertTrustedRootG4.crl
    │ └── DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl
    ├── hdr
    │ └── hdr.bin
    ├── hkds
    │ └── <hkd_cert.crt>
    └── rsa
    ├── encrypt_key.pem
    └── encrypt_key.pub

  6. 以下の手順を実行して、これらのファイルを OpenShift Container Platform ワーカーノードにコピーします。

    1. 以下のコマンドを実行して、/tmp/ibmse ディレクトリーから圧縮ファイルを作成します。

      $ tar -czf ibmse.tar.gz -C /tmp/ ibmse
    2. 次のコマンドを実行して、.tar.gz ファイルをクラスターの bastion ノードにコピーします。

      $ scp /tmp/ibmse.tar.gz root@<ocp_bastion_ip>:/tmp 1
      1
      bastion ノードの IP アドレスを指定します。
    3. 次のコマンドを実行して、SSH 経由で bastion ノードに接続します。

      $ ssh root@<ocp_bastion_ip>
    4. 次のコマンドを実行して、.tar.gz ファイルを各ワーカーノードにコピーします。

      $ scp /tmp/ibmse.tar.gz core@<worker_node_ip>:/tmp 1
      1
      ワーカーノードの IP アドレスを指定します。
    5. 次のコマンドを実行して、各ワーカーノードで .tar.gz を抽出します。

      $ ssh core@<worker_node_ip> 'sudo mkdir -p /opt/confidential-containers/ && sudo tar -xzf /tmp/ibmse.tar.gz -C /opt/confidential-containers/'
    6. 次のコマンドを実行して、ibmse フォルダーの権限を更新します。

      $ ssh core@<worker_node_ip> 'sudo chmod -R 755 /opt/confidential-containers/ibmse/'
  7. 次の手順を実行して、KBS キーと証明書を使用してクラスター内にシークレットを作成します。

    1. 次の例に従って、kbs-https-certificate.yaml マニフェストファイルを作成します。

      apiVersion: v1
      kind: Secret
      metadata:
       name: kbs-https-certificate
       namespace: trustee-operator-system
      data:
       https.crt: $(cat /tmp/ibmse/kbs.crt | base64 -w 0)
    2. 次のコマンドを実行して、KBS 証明書を含むシークレットを作成します。

      $ oc apply -f kbs-https-certificate.yaml
    3. 次の例に従って、kbs-https-key.yaml マニフェストファイルを作成します。

      apiVersion: v1
      kind: Secret
      metadata:
        name: kbs-https-key
        namespace: trustee-operator-system
      data:
       https.key: $(cat /tmp/ibmse/kbs.key | base64 -w 0)
    4. 次のコマンドを実行して、KBS キーを使用してシークレットを作成します。

      $ oc apply -f kbs-https-key.yaml

8.15. 永続ストレージコンポーネントの作成

ibmse フォルダーを Trustee Pod にマウントするには、永続ストレージコンポーネント、永続ボリューム (PV)、および永続ボリューム要求 (PVC) を作成する必要があります。

手順

  1. persistent-volume.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: ibmse-pv
      namespace: trustee-operator-system
    spec:
      capacity:
        storage: 100Mi
      accessModes:
        - ReadOnlyMany
      storageClassName: ""
      local:
        path: /opt/confidential-containers/ibmse
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
                - key: node-role.kubernetes.io/worker
                  operator: Exists
  2. 以下のコマンドを実行して永続ボリュームを作成します。

    $ oc apply -f persistent-volume.yaml
  3. persistent-volume-claim.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ibmse-pvc
      namespace: trustee-operator-system
    spec:
      accessModes:
        - ReadOnlyMany
      storageClassName: ""
      resources:
        requests:
          storage: 100Mi
  4. 以下のコマンドを実行して永続ボリューム要求を作成します。

    $ oc apply -f persistent-volume-claim.yaml

8.16. Trustee の値、ポリシー、およびシークレットの設定

Trustee には次の値、ポリシー、およびシークレットを設定できます。

  • 参照値プロバイダーサービスの参照値。
  • IBM Secure Execution のアテステーションポリシー。
  • Trustee クライアントのカスタムキーのシークレット。
  • コンテナーイメージの署名検証用のシークレット。
  • コンテナーイメージの署名検証ポリシー。このポリシーは必須です。コンテナーイメージの署名検証を使用しない場合は、署名を検証しないポリシーを作成する必要があります。
  • リソースアクセスポリシー

8.16.1. 参照値の設定

ハードウェアプラットフォームの信頼できるダイジェストを指定することにより、Reference Value Provider Service (RVPS) の参照値を設定できます。

クライアントは、実行中のソフトウェア、Trusted Execution Environment (TEE) のハードウェアとファームウェアから測定値を収集し、請求とともに見積りを Attestation Server に送信します。これらの測定値は、Trustee に登録された信頼できるダイジェストと一致する必要があります。このプロセスにより、Confidential VM (CVM) が期待どおりのソフトウェアスタックを実行し、改ざんがされていないように確認します。

手順

  1. rvps-configmap.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: rvps-reference-values
      namespace: trustee-operator-system
    data:
      reference-values.json: |
        [ 1
        ]
    1
    この値は空のままにします。
  2. 次のコマンドを実行して、RVPS config map を作成します。

    $ oc apply -f rvps-configmap.yaml

8.16.2. IBM Secure Execution のアテステーションポリシーの作成

IBM Secure Execution のアテステーションポリシーを作成する必要があります。

手順

  1. attestation-policy.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: attestation-policy
      namespace: trustee-operator-system
    data:
      default.rego: | 1
        package policy
        import rego.v1
        default allow = false
        converted_version := sprintf("%v", [input["se.version"]])
        allow if {
            input["se.attestation_phkh"] == "<se.attestation_phkh>" 2
            input["se.image_phkh"] == "<se.image_phkh>"
            input["se.tag"] == "<se.tag>"
            converted_version == "256"
        }
    1
    ポリシー名は変更しないでください。
    2
    se_parse_hdr.py スクリプトを実行して、取得したアテステーションポリシーフィールドを指定します。
  2. 以下のコマンドを実行して、アテステーションポリシー config map を作成します。

    $ oc apply -f attestation-policy.yaml

8.16.3. クライアント用のカスタムキーを使用したシークレットの作成

Trustee クライアント用の 1 つ以上のカスタムキーを含むシークレットを作成できます。

この例では、kbsres1 シークレットには 2 つのエントリー (key1key2) があり、クライアントはそれらを取得します。同じ形式を使用して、要件に応じて追加のシークレットを追加できます。

前提条件

  • 1 つ以上のカスタムキーが作成されている。

手順

  • 次の例に従って、カスタムキーのシークレットを作成します。

    $ oc apply secret generic kbsres1 \
      --from-literal key1=<custom_key1> \ 1
      --from-literal key2=<custom_key2> \
      -n trustee-operator-system
    1
    カスタムキーを指定します。

    kbsres1 シークレットは、KbsConfig カスタムリソースの spec.kbsSecretResources キーで指定されます。

8.16.4. コンテナーイメージの署名検証用のシークレット作成

コンテナーイメージの署名検証を使用する場合は、公開コンテナーイメージ署名鍵を含むシークレットを作成する必要があります。

Confidential compute attestation Operator はシークレットを使用して署名を検証し、信頼され、認証されたコンテナーイメージのみが環境にデプロイされるようにします。

Red Hat Trusted Artifact Signer またはその他のツールを使用して、コンテナーイメージに署名できます。

手順

  1. 次のコマンドを実行して、コンテナーイメージの署名検証用のシークレットを作成します。

    $ oc apply secret generic <type> \ 1
      --from-file=<tag>=./<public_key_file> \ 2
      -n trustee-operator-system
    1
    KBS シークレットタイプ (例: img-sig) を指定します。
    2
    シークレットタグ (例: pub-key) とパブリックコンテナーイメージ署名鍵を指定します。
  2. <type> の値を記録します。KbsConfig カスタムリソースを作成するときに、この値を spec.kbsSecretResources キーに追加する必要があります。

8.16.5. コンテナーイメージ署名検証ポリシーの作成

署名検証は常に有効になっているため、コンテナーイメージ署名検証ポリシーを作成します。このポリシーがない場合、Pod は起動しません。

コンテナーイメージの署名検証を使用していない場合は、署名検証なしでポリシーを作成します。

詳細は、containers-policy.json 5 を参照してください。

手順

  1. 次の例に従って、security-policy-config.json ファイルを作成します。

    • 署名検証なし:

      {
        "default": [
        {
          "type": "insecureAcceptAnything"
        }],
        "transports": {}
      }
    • 署名検証あり:

      {
          "default": [
          ],
          "transports": {
              "docker": {
                  "<container_registry_url>/<username>/busybox:latest": 1
                  [
                      {
                          "type": "sigstoreSigned",
                          "keyPath": "kbs:///default/img-sig/pub-key" 2
                      }
                  ]
              }
          }
      }
      1
      コンテナーレジストリー URL (例: "quay.io") を指定します。
      2
      作成したコンテナーイメージ署名検証シークレットのタイプとタグを指定します (例: img-sig/pub-key)。
  2. 次のコマンドを実行してセキュリティーポリシーを作成します。

    $ oc apply secret generic security-policy \
      --from-file=osc=./<security-policy-config.json> \
      -n trustee-operator-system

    シークレットタイプ security-policy または osc のキーを変更しないでください。

    security-policy シークレットは、KbsConfig カスタムリソースの spec.kbsSecretResources キーで指定されます。

8.16.6. リソースアクセスポリシーの作成

Trustee ポリシーエンジンのリソースアクセスポリシーを設定します。このポリシーは、Trustee がアクセスできるリソースを決定します。

注記

Trustee ポリシーエンジンは、TEE 証拠の有効性を決定するアテステーション Service ポリシーエンジンとは異なります。

手順

  1. resourcepolicy-configmap.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: resource-policy
      namespace: trustee-operator-system
    data:
      policy.rego: | 1
        package policy 2
        default allow = false
        allow {
          input["tee"] == "se"
        }
    1
    リソースポリシーの名前 policy.rego は、Trustee config map で定義されたリソースポリシーと一致する必要があります。
    2
    リソースポリシーは Open Policy Agent 仕様に準拠します。この例では、TEE がサンプルのアテスターでない場合にすべてのリソースを取得できます。
  2. 次のコマンドを実行して、リソースポリシーの config map を作成します。

    $ oc apply -f resourcepolicy-configmap.yaml

8.17. KbsConfig カスタムリソースの作成

Trustee を起動するには、KbsConfig カスタムリソース (CR) を作成します。

次に、Trustee Pod および Pod ログをチェックして設定を確認します。

手順

  1. kbsconfig-cr.yaml マニフェストファイルを作成します。

    apiVersion: confidentialcontainers.org/v1alpha1
    kind: KbsConfig
    metadata:
      labels:
        app.kubernetes.io/name: kbsconfig
        app.kubernetes.io/instance: kbsconfig
        app.kubernetes.io/part-of: trustee-operator
        app.kubernetes.io/managed-by: kustomize
        app.kubernetes.io/created-by: trustee-operator
      name: kbsconfig
      namespace: trustee-operator-system
    spec:
      kbsConfigMapName: kbs-config-cm
      kbsAuthSecretName: kbs-auth-public-key
      kbsDeploymentType: AllInOneDeployment
      kbsRvpsRefValuesConfigMapName: rvps-reference-values
      kbsSecretResources: ["kbsres1", "security-policy", "<type>"] 1
      kbsResourcePolicyConfigMapName: resource-policy
      kbsAttestationPolicyConfigMapName: attestation-policy
      kbsHttpsKeySecretName: kbs-https-key
      kbsHttpsCertSecretName: kbs-https-certificate
      kbsServiceType: NodePort
      ibmSEConfigSpec:
        certStorePvc: ibmse-pvc
      KbsEnvVars:
        SE_SKIP_CERTS_VERIFICATION: "false" 2
    1
    オプション: シークレットを作成した場合は、コンテナーイメージ署名検証シークレットの type 値 (例: img-sig) を指定します。シークレットを作成していない場合は、kbsSecretResources の値を ["kbsres1", "security-policy"] に設定します。
    2
    true は、テスト目的でのみ指定します。
  2. 以下のコマンドを実行して KbsConfig CR を作成します。

    $ oc apply -f kbsconfig-cr.yaml

8.18. Trustee 設定の確認

Trustee Pod とログをチェックして、Trustee 設定を確認します。

手順

  1. 次のコマンドを実行して、デフォルトのプロジェクトを設定します。

    $ oc project trustee-operator-system
  2. 次のコマンドを実行して Trustee Pod を確認します。

    $ oc get pods -n trustee-operator-system

    出力例

    NAME                                                   READY   STATUS    RESTARTS   AGE
    trustee-deployment-8585f98449-9bbgl                    1/1     Running   0          22m
    trustee-operator-controller-manager-5fbd44cd97-55dlh   2/2     Running   0          59m

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

    $ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)
  4. 次のコマンドを実行して、Pod ログを確認します。

    $ oc logs -n trustee-operator-system $POD_NAME

    出力例

    [2024-05-30T13:44:24Z INFO  kbs] Using config file /etc/kbs-config/kbs-config.json
    [2024-05-30T13:44:24Z WARN  attestation_service::rvps] No RVPS address provided and will launch a built-in rvps
    [2024-05-30T13:44:24Z INFO  attestation_service::token::simple] No Token Signer key in config file, create an ephemeral key and without CA pubkey cert
    [2024-05-30T13:44:24Z INFO  api_server] Starting HTTPS server at [0.0.0.0:8080]
    [2024-05-30T13:44:24Z INFO  actix_server::builder] starting 12 workers
    [2024-05-30T13:44:24Z INFO  actix_server::server] Tokio runtime found; starting in existing Tokio runtime

  5. 次のコマンドを実行して、kbs-service がノードポートで公開されていることを確認します。

    $ oc get svc kbs-service -n trustee-operator-system

    出力例

    NAME          TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kbs-service   NodePort   198.51.100.54   <none>        8080:31862/TCP   23h

  6. 次のコマンドを実行して、Trustee デプロイメント Pod 名を取得します。

    $ oc get pods -n trustee-operator-system | grep -i trustee-deployment

    出力例

    NAME                                                   READY   STATUS    RESTARTS   AGE
    trustee-deployment-d746679cd-plq82                     1/1     Running   0          2m32s

8.19. アテステーションプロセスの確認

BusyBox Pod を作成することで、アテステーションプロセスを検証できます。Pod イメージは、キーを取得できる機密ワークロードをデプロイします。

重要

この手順は、アテステーションが機能していることを確認する例です。データはメモリーダンプを使用してキャプチャーされる可能性があるため、機密データを標準 I/O に書き込まないでください。メモリーに書き込まれたデータのみが暗号化されます。

手順

  1. busybox.yaml マニフェストファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
      namespace: default
      labels:
        run: busybox
    spec:
      runtimeClassName: kata-remote
      restartPolicy: Never
      containers:
      - name: busybox
        image: quay.io/prometheus/busybox:latest
        imagePullPolicy: Always
        command:
          - "sleep"
          - "3600"
  2. 以下のコマンドを実行して Pod を作成します。

    $ oc create -f busybox.yaml
  3. 次のコマンドを実行して、Pod にログインします。

    $ oc exec -it busybox -n default -- /bin/sh
  4. 次のコマンドを実行して秘密鍵を取得します。

    $ wget http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1

    出力例

    Connecting to 127.0.0.1:8006 (127.0.0.1:8006)
    saving to 'key1'
    key1                 100% |*******************************************|     8  0:00:00 ETA
    'key1' saved

  5. 次のコマンドを実行して、key1 の値を表示します。

    $ cat key1

    出力例

    res1val1/ #

第9章 モニタリング

OpenShift Container Platform Web コンソールを使用して、サンドボックス化されたワークロードおよびノードのヘルスステータスに関連するメトリクスを監視できます。

OpenShift sandboxed containers には、OpenShift Container Platform Web コンソールで事前に設定されたダッシュボードがあります。管理者は Prometheus を通じて生のメトリクスにアクセスし、クエリーを実行することもできます。

9.1. メトリクスについて

OpenShift Sandboxed Containers メトリックにより、管理者は Sandboxed Containers の実行状況を監視できます。OpenShift Container Platform Web コンソールのメトリクス UI でこれらのメトリクスを照会できます。

OpenShift Sandboxed Containers のメトリックは、次のカテゴリーで収集されます。

Kata エージェントの指標
カタエージェントメトリックには、Sandboxed Containers に埋め込まれた VM で実行しているカタエージェントプロセスに関する情報が表示されます。これらのメトリックには、/proc/<pid>/[io, stat, status] からのデータが含まれます。
Kata ゲストオペレーティングシステムのメトリクス
Kata ゲストのオペレーティングシステムメトリクスには、サンドボックス化されたコンテナーで実行しているゲストオペレーティングシステムのデータが表示されます。これらのメトリクスには、/proc/[stats, diskstats, meminfo, vmstats] および /proc/net/dev からのデータが含まれます。
ハイパーバイザーメトリック
ハイパーバイザーメトリックには、Sandboxed Containers に埋め込まれた仮想マシンを実行しているハイパーバイザーに関するデータが表示されます。これらのメトリックには、主に /proc/<pid>/[io, stat, status] からのデータが含まれます。
Kata モニターのメトリクス
Kata モニターは、メトリックデータを収集し、Prometheus で利用できるようにするプロセスです。kata モニターメトリックには、kata-monitor プロセス自体のリソース使用状況に関する詳細情報が表示されます。これらのメトリクスには、Prometheus データコレクションからのカウンターも含まれます。
Kata containerd shim v2 メトリクス
Kata containerd shim v2 メトリクスには、kata shim プロセスに関する詳細情報が表示されます。これらのメトリクスには、/proc/<pid>/[io, stat, status] からのデータと詳細なリソース使用メトリクスが含まれます。

9.2. メトリクスの表示

OpenShift Container Platform Web コンソールの Metrics ページから、OpenShift sandboxed containers のメトリクスにアクセスできます。

前提条件

  • cluster-admin ロールまたはすべてのプロジェクトの表示パーミッションを持つユーザーとしてクラスターにアクセスできる。

手順

  1. OpenShift Container Platform Web コンソールで、ObserveMetrics に移動します。
  2. 入力フィールドに、監視するメトリクスのクエリーを入力します。以下に例を示します。

    kata 関連のメトリクスはすべて kata で始まります。kata と入力すると、使用可能なすべての kata メトリクスのリストが表示されます。

クエリーのメトリクスがページに視覚化されます。

第10章 アンインストール

OpenShift sandboxed containers をアンインストールし、Confidential Containers 環境を削除できます。

10.1. OpenShift Sandboxed Containers のアンインストール

OpenShift Container Platform Web コンソールまたはコマンドラインを使用して、OpenShift sandboxed containers をアンインストールできます。

以下のタスクを実行して、OpenShift Sandboxed Containers をアンインストールします。

  1. ワークロード Pod を削除します。
  2. KataConfig カスタムリソース (CR) を削除します。
  3. OpenShift Sandboxed Containers Operator をアンインストールします。
  4. KataConfig カスタムリソース定義 (CRD) を削除します。
重要

KataConfig CR を削除する前に、ワークロード Pod を削除する必要があります。Pod 名には通常、接頭辞 podvm と、カスタムタグが指定されている場合はカスタムタグが付きます。クラウドプロバイダーに OpenShift sandboxed containers または Confidential Containers をデプロイし、上記の手順を実行した後もリソースが残っている場合は、クラウドプロバイダーから、そのリソースに対して、予期しない請求を受領する可能性があります。クラウドプロバイダーで OpenShift sandboxed containers のアンインストールが完了したら、クラウドプロバイダーコンソールをチェックして、この手順ですべてのリソースが削除されていることを確認します。

10.1.1. Web コンソールを使用した OpenShift Sandboxed Containers のアンインストール

OpenShift Container Platform Web コンソールを使用して OpenShift sandboxed containers をアンインストールできます。

10.1.1.1. ワークロード Pod の削除

OpenShift Container Platform Web コンソールを使用して、OpenShift sandboxed containers のワークロード Pod を削除できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • OpenShift Sandboxed Containers のランタイムクラスを使用する Pod のリストがあります。

手順

  1. OpenShift Container Platform Web コンソールで、WorkloadsPods に移動します。
  2. Search by name フィールドに、削除する Pod の名前を入力します。
  3. Pod 名をクリックして開きます。
  4. Details ページで、Runtime classkata または kata-remote が表示されていることを確認します。
  5. Options メニュー kebab をクリックし、Delete Pod を選択します。
  6. Delete をクリックします。

Pod ごとにこの手順を繰り返します。

重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

10.1.1.2. KataConfig カスタムリソースの削除

Web コンソールを使用して、KataConfig カスタムリソース (CR) を削除できます。

KataConfig CR を削除すると、kata または kata-remote ランタイムとその関連リソースがクラスターから削除され、アンインストールされます。

重要

KataConfig CR を削除すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードドライブへのデプロイメント。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. Search by name フィールドに OpenShift sandboxed containers Operator と入力します。
  3. Operator をクリックして開き、KataConfig タブをクリックします。
  4. Options メニュー kebab をクリックし、Delete KataConfig を選択します。
  5. 確認ウィンドウで Delete をクリックします。

kata または kata-remote ランタイムとリソースがアンインストールされ、ワーカーノードが再起動されるまで待ってから、次の手順に進みます。

重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

10.1.1.3. OpenShift Sandboxed Containers Operator のアンインストール

OpenShift Container Platform Web コンソールを使用して、OpenShift sandboxed containers Operator をアンインストールできます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。
  • KataConfig カスタムリソースが削除されている。

手順

  1. OperatorsInstalled Operators に移動します。
  2. Search by name フィールドに OpenShift sandboxed containers Operator と入力します。
  3. Operator Details ページの右側で、Actions 一覧から Uninstall Operator を選択します。

    Uninstall Operator? ダイアログボックスが表示されます。

  4. Uninstall を選択し、Operator、Operator デプロイメント、および Pod を削除します。
  5. AdministrationNamespaces に移動します。
  6. Search by name フィールドに openshift-sandboxed-containers-operator と入力します。
  7. Options メニュー kebab をクリックし、Delete Namespace を選択します。
  8. 確認ダイアログで openshift-sandboxed-containers-operator と入力し、Delete をクリックします。
10.1.1.4. KataConfig CRD の削除

OpenShift Container Platform Web コンソールを使用して、KataConfig カスタムリソース定義 (CRD) を削除できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。
  • KataConfig カスタムリソースが削除されている。
  • OpenShift Sandboxed Containers Operator がアンインストールされている。

手順

  1. Web コンソールで、AdministrationCustomResourceDefinitions に移動します。
  2. Search by name フィールドに KataConfig 名を入力します。
  3. Options メニューをクリックし、Delete CustomResourceDefinition を選択します。
  4. 確認ウィンドウで Delete をクリックします。

10.1.2. CLI を使用した OpenShift Sandboxed Containers のアンインストール

コマンドラインインターフェイス (CLI) を使用して、OpenShift sandboxed containers をアンインストールできます。

10.1.2.1. ワークロード Pod の削除

CLI を使用して、OpenShift Sandboxed Containers のワークロード Pod を削除できます。

前提条件

  • JSON プロセッサー (jq) ユーティリティーがインストールされている。

手順

  1. 次のコマンドを実行して、Pod を検索します。

    $ oc get pods -A -o json | jq -r '.items[] | \
      select(.spec.runtimeClassName == "<runtime>").metadata.name' 1
    1
    ベアメタルデプロイメントの場合は <runtime>kata に、AWS、Azure、IBM Z®、および IBM® LinuxONE デプロイメントの場合は kata-remote に置き換えます。
  2. 次のコマンドを実行して、各 Pod を削除します。

    $ oc delete pod <pod>
重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

10.1.2.2. KataConfig カスタムリソースの削除

コマンドラインを使用して、KataConfig カスタムリソース (CR) を削除できます。

KataConfig CR を削除すると、ランタイムと関連リソースがクラスターから削除されます。

重要

KataConfig CR を削除すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードドライブへのデプロイメント。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。

手順

  1. 次のコマンドを実行して、KataConfig CR を削除します。

    $ oc delete kataconfig example-kataconfig

    OpenShift Sandboxed Containers Operator は、クラスターでランタイムを有効化するために初期に作成されていたリソースをすべて削除します。

    重要

    KataConfig CR を削除すると、すべてのワーカーノードが再起動するまで CLI は応答を停止します。削除プロセスが完了するのを待ってから、検証を実行する必要があります。

  2. 以下のコマンドを実行して、カスタムリソースが削除されたことを確認します。

    $ oc get kataconfig example-kataconfig

    出力例

    No example-kataconfig instances exist

重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

10.1.2.3. OpenShift Sandboxed Containers Operator のアンインストール

コマンドラインを使用して、OpenShift Sandboxed Containers Operator をアンインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。
  • KataConfig カスタムリソースが削除されている。

手順

  1. 次のコマンドを実行して、サブスクリプションを削除します。

    $ oc delete subscription sandboxed-containers-operator -n openshift-sandboxed-containers-operator
  2. 以下のコマンドを実行して namespace を削除します。

    $ oc delete namespace openshift-sandboxed-containers-operator
10.1.2.4. KataConfig CRD の削除

コマンドラインを使用して、KataConfig カスタムリソース定義 (CRD) を削除できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。
  • KataConfig カスタムリソースが削除されている。
  • OpenShift Sandboxed Containers Operator がアンインストールされている。

手順

  1. 次のコマンドを実行して、KataConfig CRD を削除します。

    $ oc delete crd kataconfigs.kataconfiguration.openshift.io
  2. 次のコマンドを実行して、CRD が削除されたことを確認します。

    $ oc get crd kataconfigs.kataconfiguration.openshift.io

    出力例

    Unknown CRD kataconfigs.kataconfiguration.openshift.io

10.2. Confidential Containers 環境の削除

OpenShift Container Platform Web コンソールまたはコマンドラインを使用して Confidential Containers 環境を削除できます。

次のタスクを実行して、Confidential Containers 環境を削除します。

  1. KbsConfig カスタムリソースを削除します。
  2. Confidential compute attestation Operator をアンインストールします。
  3. KbsConfig カスタムリソース定義を削除します。

10.2.1. Web コンソールを使用した Confidential Containers 環境の削除

OpenShift Container Platform Web コンソールを使用して Confidential Containers 環境を削除できます。

10.2.1.1. KbsConfig カスタムリソースの削除

Web コンソールを使用して、KbsConfig カスタムリソース (CR) を削除できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • OpenShift Sandboxed Containers がアンインストールされている。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsInstalled Operators に移動します。
  2. Search by name フィールドに Confidential compute attestation と入力します。
  3. Operator をクリックして開き、KbsConfig タブをクリックします。
  4. Options メニュー kebab をクリックし、Delete KbsConfig を選択します。
  5. 確認ウィンドウで Delete をクリックします。
重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

10.2.1.2. Confidential compute attestation Operator のアンインストール

OpenShift Container Platform Web コンソールを使用して、Confidential compute attestation Operator をアンインストールできます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。
  • KbsConfig カスタムリソースが削除されている。

手順

  1. OperatorsInstalled Operators に移動します。
  2. Search by name フィールドに Confidential compute attestation と入力します。
  3. Operator Details ページの右側で、Actions 一覧から Uninstall Operator を選択します。

    Uninstall Operator? ダイアログボックスが表示されます。

  4. Uninstall を選択し、Operator、Operator デプロイメント、および Pod を削除します。
  5. AdministrationNamespaces に移動します。
  6. Search by name フィールドに trustee-operator-system と入力します。
  7. Options メニュー kebab をクリックし、Delete Namespace を選択します。
  8. 確認ダイアログで trustee-operator-system と入力し、Delete をクリックします。
10.2.1.3. KbsConfig CRD の削除

OpenShift Container Platform Web コンソールを使用して、KbsConfig カスタムリソース定義 (CRD) を削除できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。
  • KbsConfig カスタムリソースが削除されている。
  • Confidential compute attestation Operator をアンインストールしている。

手順

  1. Web コンソールで、AdministrationCustomResourceDefinitions に移動します。
  2. Search by name フィールドに KbsConfig 名を入力します。
  3. Options メニューをクリックし、Delete CustomResourceDefinition を選択します。
  4. 確認ウィンドウで Delete をクリックします。

10.2.2. CLI を使用した Confidential Containers 環境の削除

コマンドラインインターフェイス (CLI) を使用して、Confidential Containers 環境を削除できます。

10.2.2.1. KbsConfig カスタムリソースの削除

コマンドラインを使用して、KbsConfig カスタムリソース (CR) を削除できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • OpenShift Sandboxed Containers がアンインストールされている。

手順

  1. 次のコマンドを実行して、KbsConfig CR を削除します。

    $ oc delete kbsconfig kbsconfig
  2. 以下のコマンドを実行して、カスタムリソースが削除されたことを確認します。

    $ oc get kbsconfig kbsconfig

    出力例

    No kbsconfig instances exist

重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

10.2.2.2. Confidential compute attestation Operator のアンインストール

コマンドラインを使用して、Confidential compute attestation Operator をアンインストールできます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • KbsConfig カスタムリソースが削除されている。

手順

  1. 次のコマンドを実行して、サブスクリプションを削除します。

    $ oc delete subscription trustee-operator -n trustee-operator-system
  2. 以下のコマンドを実行して namespace を削除します。

    $ oc delete namespace trustee-operator-system
10.2.2.3. KbsConfig CRD の削除

コマンドラインを使用して、KbsConfig カスタムリソース定義 (CRD) を削除できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • kata または kata-remoteruntimeClass として使用するすべての Pod が削除されている。
  • KbsConfig カスタムリソースが削除されている。
  • Confidential compute attestation Operator をアンインストールしている。

手順

  1. 次のコマンドを実行して、KbsConfig CRD を削除します。

    $ oc delete crd kbsconfigs.confidentialcontainers.org
  2. 次のコマンドを実行して、CRD が削除されたことを確認します。

    $ oc get crd kbsconfigs.confidentialcontainers.org

    出力例

    Unknown CRD kbsconfigs.confidentialcontainers.org

第11章 アップグレード

OpenShift Sandboxed Containers コンポーネントのアップグレードは、次の手順で構成されます。

  1. OpenShift Container Platform をアップグレードして、Kata ランタイムとその依存関係を更新します。
  2. OpenShift Sandboxed Containers Operator をアップグレードして、Operator サブスクリプションを更新します。

以下に示す 1 つの例外を除いて、OpenShift sandboxed containers Operator のアップグレードの前または後に OpenShift Container Platform をアップグレードできます。OpenShift Sandboxed Containers Operator をアップグレードした直後に、常に KataConfig パッチを適用します。

11.1. リソースのアップグレード

Red Hat Enterprise Linux CoreOS (RHCOS) 拡張機能は、OpenShift Sandboxed Containers リソースをクラスターにデプロイします。

RHCOS 拡張 sandboxed containers、Kata コンテナーランタイム、ハイパーバイザー QEMU、その他の依存関係など、OpenShift sandboxed containers を実行するために必要なコンポーネントが含まれています。クラスターを OpenShift Container Platform の新しいリリースにアップグレードすることで、拡張機能をアップグレードします。

OpenShift Container Platform のアップグレードに関する詳細は、クラスターの更新 を参照してください。

11.2. Operator のアップグレード

Operator Lifecycle Manager (OLM) を使用して、OpenShift Sandboxed Containers Operator を手動で設定するか、自動的にアップグレードできます。初期導入時に手動アップグレードか自動アップグレードかを選択することで、将来のアップグレードモードが決まります。手動アップグレードの場合、OpenShift Container Platform Web コンソールに、クラスター管理者がインストールできる利用可能な更新が表示されます。

Operator Lifecycle Manager (OLM) での OpenShift Sandboxed Containers Operator のアップグレードの詳細は、インストール済み Operator の更新 を参照してください。

11.3. Pod 仮想マシンイメージの更新

AWS、Azure、および IBM デプロイメントの場合、Pod 仮想マシンイメージを更新する必要があります。enablePeerpods: paramter が true の場合に、OpenShift Sandboxed Containers Operator をアップグレードしても、既存の Pod 仮想マシンイメージは自動的に更新されません。アップグレード後に Pod 仮想マシンイメージを更新するには、KataConfig CR を削除して再作成する必要があります。

注記

AWS および Azure デプロイメントのピア Pod config map を確認して、KataConfig CR を再作成する前にイメージ ID が空であることを確認することもできます。

11.3.1. KataConfig カスタムリソースの削除

コマンドラインを使用して、KataConfig カスタムリソース (CR) を削除できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 次のコマンドを実行して、KataConfig CR を削除します。

    $ oc delete kataconfig example-kataconfig
  2. 以下のコマンドを実行して、カスタムリソースが削除されたことを確認します。

    $ oc get kataconfig example-kataconfig

    出力例

    No example-kataconfig instances exist

重要

クラウドプロバイダーを使用してデプロイされた OpenShift sandboxed containers をアンインストールする場合は、すべての Pod を削除する必要があります。Pod リソースが残っていると、クラウドプロバイダーから予期しない請求が発生する可能性があります。

11.3.2. ピア Pod の CM イメージ ID が空であることを確認します。

KataConfig CR を削除する場合は、ピア Pod の CM イメージ ID を削除する必要があります。AWS および Azure デプロイメントの場合、ピア Pod CM イメージ ID が空であることを確認します。

手順

  1. ピア Pod 用に作成した config map を取得します。

    $ oc get cm -n openshift-sandboxed-containers-operator peer-pods-cm -o jsonpath="{.data.AZURE_IMAGE_ID}"

    AWS には PODVM_AMI_ID を使用します。Azure には AZURE_IMAGE_ID を使用します。

  2. YAML ファイルの status スタンザを確認します。
  3. AWS の PODVM_AMI_ID パラメーターまたは Azure の AZURE_IMAGE_ID パラメーターに値が含まれている場合は、値を "" に設定します。
  4. 値を "" に設定した場合は、ピア Pod config map にパッチを適用します。

    $ oc patch configmap peer-pods-cm -n openshift-sandboxed-containers-operator -p '{"data":{"AZURE_IMAGE_ID":""}}'

    AWS には PODVM_AMI_ID を使用します。Azure には AZURE_IMAGE_ID を使用します。

11.3.3. KataConfig カスタムリソースの作成

ワーカーノードに kata-remote をランタイムクラスとしてインストールするには、KataConfig カスタムリソース (CR) を作成する必要があります。

KataConfig CR を作成すると、OpenShift Sandboxed Containers Operator がトリガーされ、以下が実行されます。

  • デフォルト設定で kata-remote という名前の RuntimeClass CR を作成します。これにより、RuntimeClassName フィールドの CR を参照して、kata-remote をランタイムとして使用するようにワークロードを設定できるようになります。この CR は、ランタイムのリソースオーバーヘッドも指定します。

OpenShift Sandboxed Containers は、kata-remote をプライマリーランタイムとしてではなく、クラスター上の セカンダリーオプション のランタイムとしてインストールします。

重要

KataConfig CR を作成すると、ワーカーノードが自動的に再起動します。再起動には 10 分から 60 分以上かかる場合があります。再起動時間を妨げる要因は次のとおりです。

  • より多くのワーカーノードを持つ大規模な OpenShift Container Platform デプロイメント。
  • BIOS および診断ユーティリティーが有効である。
  • SSD ではなくハードディスクドライブにデプロイしている。
  • 仮想ノードではなく、ベアメタルなどの物理ノードにデプロイしている。
  • CPU とネットワークが遅い。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 以下の例に従って example-kataconfig.yaml マニフェストファイルを作成します。

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
  2. 次のコマンドを実行して、KataConfig CR を作成します。

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig CR が作成され、ワーカーノードに kata-remote がランタイムクラスとしてインストールされます。

    インストールを確認する前に、kata-remote のインストールが完了し、ワーカーノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します。

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes の下にあるすべてのワーカーのステータスが installed で、理由を指定せずに InProgress の条件が False の場合、kata-remote はクラスターにインストールされます。

  4. 次のコマンドを実行してデーモンセットを確認します。

    $ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
  5. 次のコマンドを実行してランタイムクラスを確認します。

    $ oc get runtimeclass

    出力例

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

第12章 トラブルシューティング

OpenShift Sandboxed Containers のトラブルシューティングを行う場合、サポートケースを開き、must-gather ツールを使用してデバッグ情報を提供できます。

クラスター管理者は、自分でログを確認して、より詳細なレベルのログを有効にすることもできます。

12.1. Red Hat サポート用のデータ収集

サポートケースを作成する際、ご使用のクラスターに関するデバッグ情報を Red Hat サポートに提供していただくと Red Hat のサポートに役立ちます。

must-gather ツールを使用すると、仮想マシンおよび OpenShift Sandboxed Container に関連する他のデータを含む、OpenShift Container Platform クラスターに関する診断情報を収集できます。

迅速なサポートのために、OpenShift Container Platform と OpenShift sandboxed containers の両方の診断情報を提供してください。

must-gather ツールの使用

oc adm must-gather CLI コマンドは、以下のような問題のデバッグに必要となる可能性のあるクラスターからの情報を収集します。

  • リソース定義
  • サービスログ

デフォルトで、oc adm must-gather コマンドはデフォルトのプラグインイメージを使用し、./must-gather.local に書き込みを行います。

または、以下のセクションで説明されているように、適切な引数を指定してコマンドを実行すると、特定の情報を収集できます。

  • 1 つ以上の特定の機能に関連するデータを収集するには、以下のセクションに示すように、イメージと共に --image 引数を使用します。

    以下に例を示します。

    $ oc adm must-gather --image=registry.redhat.io/openshift-sandboxed-containers/osc-must-gather-rhel9:1.9.0
  • 監査ログを収集するには、以下のセクションで説明されているように -- /usr/bin/gather_audit_logs 引数を使用します。

    以下に例を示します。

    $ oc adm must-gather -- /usr/bin/gather_audit_logs
    注記

    ファイルのサイズを小さくするために、監査ログはデフォルトの情報セットの一部として収集されません。

oc adm must-gather を実行すると、ランダムな名前を持つ新規 Pod がクラスターの新規プロジェクトに作成されます。データは Pod で収集され、must-gather.local で始まる新規ディレクトリーに保存されます。このディレクトリーは、現行の作業ディレクトリーに作成されます。

以下に例を示します。

NAMESPACE                      NAME                 READY   STATUS      RESTARTS      AGE
...
openshift-must-gather-5drcj    must-gather-bklx4    2/2     Running     0             72s
openshift-must-gather-5drcj    must-gather-s8sdh    2/2     Running     0             72s
...

任意で、--run-namespace オプションを使用して、特定の namespace で oc adm must-gather コマンドを実行できます。

以下に例を示します。

$ oc adm must-gather --run-namespace <namespace> --image=registry.redhat.io/openshift-sandboxed-containers/osc-must-gather-rhel9:1.9.0

12.2. ログデータの収集

次の機能とオブジェクトは、OpenShift sandboxed containers に関連付けられています。

  • OpenShift Sandboxed Containers リソースに属するすべての namespace とその子オブジェクト
  • すべての OpenShift Sandboxed Containers のカスタムリソース定義 (CRD)

kata ランタイムで実行されている各 Pod の以下のコンポーネントログを収集できます。

  • Kata エージェントログ
  • Kata ランタイムログ
  • QEMU ログ
  • 監査ログ
  • CRI-O ログ

12.2.1. CRI-O ランタイムのデバッグログの有効化

KataConfig CR の logLevel フィールドを更新することで、デバッグログを有効にできます。これにより、OpenShift Sandboxed Containers を実行しているワーカーノードの CRI-O ランタイムのログレベルが変更されます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. 既存の KataConfig CR の logLevel フィールドを debug に変更します。

    $ oc patch kataconfig <kataconfig> --type merge --patch '{"spec":{"logLevel":"debug"}}'
  2. UPDATED の値が True になり、すべてのワーカーノードが更新されたことが示されるまで kata-oc マシン設定プールを監視します。

    $ oc get mcp kata-oc

    出力例

    NAME     CONFIG                 UPDATED  UPDATING  DEGRADED  MACHINECOUNT  READYMACHINECOUNT  UPDATEDMACHINECOUNT  DEGRADEDMACHINECOUNT  AGE
    kata-oc  rendered-kata-oc-169   False    True      False     3             1                  1                    0                     9h

検証

  1. マシン設定プールのノードでデバッグセッションを開始します。

    $ oc debug node/<node_name>
  2. ルートディレクトリーを /host に変更します。

    # chroot /host
  3. crio.conf ファイルの変更を確認します。

    # crio config | egrep 'log_level

    出力例

    log_level = "debug"

12.2.2. コンポーネントのデバッグログの表示

クラスター管理者は、デバッグログを使用して問題のトラブルシューティングを行うことができます。各ノードのログは、ノードジャーナルに出力されます。

次の OpenShift Sandboxed Containers コンポーネントのログを確認できます。

  • Kata エージェント
  • Kata ランタイム (containerd-shim-kata-v2)
  • virtiofsd

QEMU は警告ログとエラーログのみを生成します。これらの警告とエラーは、追加の qemuPid フィールドとともに Kata ランタイムログと CRI-O ログの両方でノードジャーナルに出力されます。

QEMU ログの例

Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.587116986Z" level=info msg="Start logging QEMU (qemuPid=2241693)" name=containerd-shim-v2 pid=2241647 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu

Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.607339014Z" level=error msg="qemu-kvm: -machine q35,accel=kvm,kernel_irqchip=split,foo: Expected '=' after parameter 'foo'" name=containerd-shim-v2 pid=2241647 qemuPid=2241693 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu

Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.60890737Z" level=info msg="Stop logging QEMU (qemuPid=2241693)" name=containerd-shim-v2 pid=2241647 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu

Kata ランタイムは、QEMU が起動すると Start logging QEMU を出力し、QEMU が停止すると Stop Logging QEMU を出力します。エラーは、qemuPid フィールドが含まれる、これら 2 つのログメッセージの間に表示されます。QEMU からの実際のエラーメッセージは赤色で表示されます。

QEMU ゲストのコンソールはノードジャーナルにも出力されます。ゲストコンソールログを Kata エージェントログと一緒に表示できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  • Kata エージェントログとゲストコンソールログを確認するには、次のコマンドを実行します。

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata -g “reading guest console”
  • Kata ランタイムログを確認するには、次のコマンドを実行します。

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata
  • virtiofsd ログを確認するには、次のコマンドを実行します。

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t virtiofsd
  • QEMU ログを確認するには、次のコマンドを実行します。

    $ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata -g "qemuPid=\d+"

関連情報

付録A KataConfig ステータスメッセージ

次の表は、2 つのワーカーノードを持つクラスターの KataConfig カスタムリソース (CR) のステータスメッセージを示しています。

表A.1 KataConfig ステータスメッセージ
ステータス説明

Initial installation

KataConfig CR が作成され、両方のワーカーに kata-remote のインストールが開始されると、次のステータスが数秒間表示されます。

 conditions:
    message: Performing initial installation of kata-remote on cluster
    reason: Installing
    status: 'True'
    type: InProgress
 kataNodes:
   nodeCount: 0
   readyNodeCount: 0

インストール

数秒以内にステータスが変わります。

 kataNodes:
   nodeCount: 2
   readyNodeCount: 0
   waitingToInstall:
   - worker-0
   - worker-1

Installing (Worker-1 インストール開始)

短期間、ステータスが変化し、一方のノードが kata-remote のインストールを開始し、他方のノードが待機状態であることを示します。これは、常に 1 つのノードだけが使用不能になる可能性があるためです。両方のノードが最終的に kata-remote を受信するため、nodeCount は 2 のままですが、どちらのノードもまだその状態に達していないため、readyNodeCount は現在 0 です。

 kataNodes:
   installing:
   - worker-1
   nodeCount: 2
   readyNodeCount: 0
   waitingToInstall:
   - worker-0

Installing (Worker-1 がインストールされ、Worker-0 のインストールが開始されました)

しばらくすると、worker-1 がインストールを完了し、ステータスを変更します。readyNodeCount が 1 に更新され、worker-1kata-remote ワークロードを実行する準備が整ったことを示します。インストールプロセスの最後にランタイムクラスが作成されるまで、kata-remote ワークロードのスケジュールや実行はできません。

 kataNodes:
   installed:
   - worker-1
   installing:
   - worker-0
   nodeCount: 2
   readyNodeCount: 1

Installed

インストールされると、両方のワーカーがインストール済みとしてリストされ、理由を指定せずに InProgress 条件が False に移行し、クラスターへの kata-remote のインストールが成功したことを示します。

 conditions:
    message: ""
    reason: ""
    status: 'False'
    type: InProgress
 kataNodes:
   installed:
   - worker-0
   - worker-1
   nodeCount: 2
   readyNodeCount: 2
ステータス説明

Initial uninstall

kata-remote が両方のワーカーにインストールされていて、KataConfig を削除してクラスターから kata-remote を削除すると、両方のワーカーが数秒間待機状態になります。

 conditions:
    message: Removing kata-remote from cluster
    reason: Uninstalling
    status: 'True'
    type: InProgress
 kataNodes:
   nodeCount: 0
   readyNodeCount: 0
   waitingToUninstall:
   - worker-0
   - worker-1

アンインストール

数秒後、ワーカーの 1 つがアンインストールを開始します。

 kataNodes:
   nodeCount: 0
   readyNodeCount: 0
   uninstalling:
   - worker-1
   waitingToUninstall:
   - worker-0

アンインストール

Worker-1 が終了し、worker-0 がアンインストールを開始します。

 kataNodes:
   nodeCount: 0
   readyNodeCount: 0
   uninstalling:
   - worker-0
注記

reason フィールドには、次のような原因も報告されます。

  • Failed: これは、ノードが移行を完了できない場合に報告されます。statusTrue と報告し、messageNode <node_name> Degraded: <error_message_from_the_node> です。
  • BlockedByExistingKataPods : これは、kata-remote のアンインストール中に kata-remote ランタイムを使用するクラスター上で実行している Pod がある場合に報告されます。status フィールドは False で、messageExisting pods using "kata-remote" RuntimeClass found.Please delete the pods manually for KataConfig deletion to proceed です。クラスターコントロールプレーンとの通信が失敗した場合は、Failed to list kata pods: <error_message> のような技術的なエラーメッセージが報告される場合もあります。

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat 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 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 は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat, Inc.