イメージ
OpenShift Container Platform でのイメージおよびイメージストリームの作成および管理
概要
第1章 イメージの概要 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でコンテナー化されたアプリケーションがどのように動作するかを理解するには、コンテナー、イメージ、およびイメージストリームについて知っておく必要があります。この概要では、これらの主要な概念と、それらがクラスター内でどのように連携して機能するかを説明します。
1.1. イメージ リンクのコピーリンクがクリップボードにコピーされました!
コンテナーイメージは、1 つのコンテナーを実行するために必要なものをすべて含んでいるバイナリーです。OpenShift Container Platform では、イメージを使用してアプリケーションをパッケージ化し、複数のコンテナーとホストに一貫してデプロイできます。
コンテナーは、作成時にコンテナーに追加のアクセスを付与しない限り、イメージで定義されるリソースにのみアクセスできます。同じイメージを複数のホストにまたがって複数のコンテナーにデプロイし、それらの間で負荷を分散することにより、OpenShift Container Platform はイメージにパッケージ化されたサービスの冗長性および水平的なスケーリングを提供できます。
イメージをビルドするために podman または docker CLI を直接使用することはできますが、OpenShift Container Platform は、コードまたは設定を既存イメージに追加して新規イメージの作成を支援するビルダーイメージも提供します。
アプリケーションは一定期間をかけて開発されるため、単一のイメージ名が同じイメージの数多くの異なるバージョンを参照する場合があります。それぞれの異なるイメージは、通常は 12 文字 (例: fd44297e2ddb) に省略されるそのハッシュ (fd44297e2ddb050ec4f… などの長い 16 進数) で一意に参照されます。
1.2. Image registry リンクのコピーリンクがクリップボードにコピーされました!
イメージレジストリーとは、OpenShift Container Platform においてコンテナーイメージを保存および提供するコンテンツサーバーのことです。レジストリーを使用すると、外部ソースまたは OpenShift Container Platform に統合されたレジストリーからコンテナーイメージにアクセスできます。
レジストリーには、1 つ以上のイメージリポジトリー群が含まれています。各リポジトリーには、1 つ以上のタグ付けされたイメージが含まれています。Red Hat は、サブスクリプションをお持ちのお客様に対して registry.redhat.io でレジストリーを提供しています。OpenShift Container Platform は、カスタムコンテナーイメージを管理するための独自の OpenShift イメージレジストリーを提供することもできます。
1.3. イメージリポジトリー リンクのコピーリンクがクリップボードにコピーされました!
イメージリポジトリーとは、関連するコンテナーイメージと、それらを識別するタグの集合体です。イメージリポジトリーを使用すると、OpenShift Container Platform 内の関連するコンテナーイメージを整理および管理できます。
たとえば、OpenShift Container Platform Jenkins イメージは次のリポジトリーにあります。
docker.io/openshift/jenkins-2-centos7
1.4. イメージストリームにおけるイメージタグの理解 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のイメージタグを使用すると、イメージストリーム内のコンテナーイメージの特定のバージョンを整理、識別、参照できます。タグとは、特定のイメージレイヤーやダイジェストへのポインターとして機能する、人間が読みやすいラベルのことです。
タグは、イメージストリーム内で可変ポインターとして機能します。新しいイメージがストリームにインポートまたはタグ付けされると、タグは新しいイメージの不変の SHA ダイジェストを指すように更新されます。1 つのイメージダイジェストには、複数のタグを同時に割り当てることができます。たとえば、:v3.11.59-2 と :latest という タグは、同じイメージダイジェストに割り当てられます。
タグには主に 2 つの利点があります。
- タグは、ビルドやデプロイメントにおいて、イメージストリームから特定のバージョンのイメージを要求するための主要なメカニズムとして機能します。
-
タグは、イメージの明確性を維持し、異なる環境間でのイメージ共有を容易にするのに役立ちます。たとえば、
:testタグのイメージを:prodタグに昇格させることができます。
イメージタグは主に設定ファイル内のイメージを参照するために使用されますが、OpenShift Container Platform では、イメージストリーム内でタグを直接管理するための oc tag コマンドが提供されています。このコマンドは、podman の tag コマンド や docker の tag コマンドに似ていますが、ローカルイメージを直接操作するのではなく、イメージストリームに対して操作を行います。これは、イメージストリーム内で新しいタグポインターを作成したり、既存のタグポインターを更新して新しいイメージを指すようにするために使用されます。
イメージタグは、コロン (:) を区切り文字として使用して、イメージ名またはイメージストリーム名に追加されます。
| コンテキスト | 構文形式 | 例 |
|---|---|---|
| 外部レジストリー |
|
|
| ローカルイメージストリーム |
|
|
1.5. イメージ ID リンクのコピーリンクがクリップボードにコピーされました!
イメージ ID は、OpenShift Container Platform においてコンテナーイメージを一意に識別するセキュアハッシュアルゴリズム (SHA) コードです。イメージ ID を使用すると、決して変更されない特定のバージョンのイメージをプルできます。
たとえば、次のイメージ ID は docker.io/openshift/jenkins-2-centos7 イメージのものです。
docker.io/openshift/jenkins-2-centos7@sha256:ab312bda324
1.6. コンテナー リンクのコピーリンクがクリップボードにコピーされました!
コンテナーとは、OpenShift Container Platform アプリケーションの基本単位として機能する、コンテナーイメージの独立した実行インスタンスのことです。コンテナーを理解することで、コンテナー化されたアプリケーションを操作し、クラスター内での実行方法を管理できるようになります。
数多くのアプリケーションインスタンスは、相互のプロセス、ファイル、ネットワークなどを可視化せずに単一ホストのコンテナーで実行される可能性があります。通常、コンテナーは任意のワークロードに使用されますが、各コンテナーは Web サーバーまたはデータベースなどの (通常はマイクロサービスと呼ばれることの多い) 単一サービスを提供します。
Linux カーネルは数年にわたりコンテナーテクノロジーの各種機能を統合してきました。Docker プロジェクトはホスト上の Linux コンテナーの便利な管理インターフェイスを開発しました。さらに最近では、Open Container Initiative により、コンテナー形式およびコンテナーランタイムのオープン標準が策定されています。OpenShift Container Platform および Kubernetes は複数ホストのインストール間で OCI および Docker 形式のコンテナーのオーケストレーションを実行する機能を追加しています。
OpenShift Container Platform を使用する際にコンテナーランタイムと直接対話することはありませんが、それらの OpenShift Container Platform におけるロールやコンテナー内でのアプリケーションの機能を理解する上で、それらの機能および用語を理解しておくことは重要です。
Podman などのツールは、コンテナーを直接実行および管理するための Docker コマンドラインツールの代わりとして使用できます。podman CLI を使用すると、OpenShift Container Platform と切り離してコンテナーを試すことができます。
1.7. イメージストリームの使用 リンクのコピーリンクがクリップボードにコピーされました!
イメージストリームは、OpenShift Container Platform 内でコンテナーイメージを参照するための抽象化を提供します。イメージストリームを使用すると、イメージバージョンの管理、クラスター内でのビルドおよびデプロイメントの自動化を行うことができます。
イメージストリームには実際のイメージデータは含まれませんが、イメージリポジトリーと同様に、関連するイメージの単一の仮想ビューが提示されます。
ビルドおよびデプロイメントをそれぞれ実行し、ビルドおよびデプロイメントを、新規イメージが追加される際やこれに対応する際の通知をイメージストリームで確認できるように設定できます。
たとえば、デプロイメントで特定のイメージを使用していて、そのイメージの新規バージョンが作成される場合、デプロイメントを、そのイメージの新規バージョンを選択できるように自動的に実行きます。
デプロイメントまたはビルドで使用するイメージストリームタグが更新されない場合には、コンテナーイメージレジストリーのコンテナーイメージが更新されても、ビルドまたはデプロイメントは以前の、既知でおそらく適切であると予想されるイメージをそのまま使用します。
ソースイメージは以下のいずれかに保存できます。
- OpenShift Container Platform の統合レジストリー
- registry.redhat.io または quay.io などの外部レジストリー
- OpenShift Container Platform クラスターの他のイメージストリーム
ビルドまたはデプロイメント設定などのイメージストリームタグを参照するオブジェクトを定義する場合には、リポジトリーではなく、イメージストリームタグを参照します。アプリケーションのビルドまたはデプロイ時に、OpenShift Container Platform がこのイメージストリームタグを使用してリポジトリーに対してクエリーし、対象のイメージに関連付けられた ID を特定して、そのイメージを使用します。
イメージストリームメタデータは他のクラスター情報と共に etcd インスタンスに保存されます。
イメージストリームの使用には、いくつかの大きな利点があります。
- コマンドラインを使用して再プッシュすることなく、タグ付けや、タグのロールバック、およびイメージの迅速な処理を実行できます。
- 新規イメージがレジストリーにプッシュされると、ビルドおよびデプロイメントをトリガーできます。また、OpenShift Container Platform には他のリソースの汎用トリガーがあります (Kubernetes オブジェクトなど)。
- 定期的な再インポートを実行するためにタグにマークを付けることができます。ソースイメージが変更されると、その変更は選択され、イメージストリームに反映されます。これにより、ビルドまたはデプロイメント設定に応じてビルドまたはデプロイメントフローがトリガーされます。
- 詳細なアクセス制御を使用してイメージを共有し、チーム間でイメージを迅速に分散できます。
- ソースイメージが変更されると、イメージストリームタグはイメージの既知の適切なバージョンをポイントしたままになり、アプリケーションが予期せずに損傷しないようにします。
- イメージストリームオブジェクトのパーミッションを使用して、イメージを表示し、使用できるユーザーにセキュリティーを設定できます。
- クラスターレベルでイメージを読み込んだり、リスト表示するパーミッションのないユーザーは、イメージストリームを使用してプロジェクトでタグ付けされたイメージを取得できます。
1.8. イメージストリームタグ リンクのコピーリンクがクリップボードにコピーされました!
イメージストリームタグは、OpenShift Container Platform のイメージストリーム内のイメージへの名前付きポインターです。ユーザーは、特定のバージョンのコンテナーイメージを参照するようにイメージストリームタグを設定できます。
1.9. イメージストリームイメージ リンクのコピーリンクがクリップボードにコピーされました!
イメージストリームイメージは、OpenShift Container Platform における API リソースオブジェクトであり、イメージストリームから特定のコンテナーイメージを取得します。イメージストリームイメージを使用すると、特定のイメージ SHA 識別子に関するメタデータにアクセスできます。
1.10. イメージストリームトリガー リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のイメージストリームトリガーは、イメージストリームタグが変更されたときに特定のアクションを実行します。ユーザーは、新しいイメージのインポート時にビルドまたはデプロイを自動的に開始するようにトリガーを設定できます。
たとえば、新しいイメージをインポートすると、タグの値が変更されることがあります。このとき、値の変更を待ち受けているデプロイメントやビルドなどのリソースがあると、トリガーが起動します。
1.11. Cluster Samples Operator の使用方法 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でサンプルイメージストリームとテンプレートを管理するには、Cluster Samples Operator を使用できます。Cluster Samples Operator は、初期起動時にデフォルトのサンプルを作成し、openshift ネームスペース内のイメージストリームとテンプレートを初期化します。
第2章 Cluster Samples Operator の設定 リンクのコピーリンクがクリップボードにコピーされました!
openshift namespace で動作する Cluster Samples Operator は、Red Hat Enterprise Linux (RHEL) ベースの OpenShift Container Platform イメージストリームおよび OpenShift Container Platform テンプレートをインストールし、更新します。
Cluster Samples Operator は非推奨になりました。Cluster Samples Operator には、新しいテンプレート、サンプル、または非 Source-to-Image (非 S2I) イメージストリームは追加されません。ただし今後のリリースで Cluster Samples Operator が削除されるまで、既存の S2I ビルダーイメージストリームとテンプレートは引き続き更新されます。S2I イメージストリームとテンプレートには、次のものが含まれます。
- Ruby
- Python
- Node.js
- Perl
- PHP
- HTTPD
- Nginx
- EAP
- Java
- Webserver
- .NET
- Go
Cluster Samples Operator は、非 S2I サンプル (イメージストリームとテンプレート) の管理とサポートを停止します。要件や将来の計画は、イメージストリームまたはテンプレートの所有者に問い合わせてください。また、次のリンクも参照してください。
2.1. Cluster Samples Operator について リンクのコピーリンクがクリップボードにコピーされました!
Operator はインストール時に独自にデフォルト設定オブジェクトを作成し、その後にクイックスタートテンプレートを含む、サンプルのイメージストリームおよびテンプレートを作成します。
認証情報を必要とする他のレジストリーからのイメージストリームのインポートを容易にするには、クラスター管理者は、イメージのインポートに必要な Docker config.json ファイルの内容を含む追加のシークレットを openshift namespace に作成できます。
Cluster Samples Operator の設定は、クラスター全体のリソースです。この Operator は、openshift-cluster-samples-operator namespace にデプロイされます。
Cluster Samples Operator のイメージには、関連付けられている OpenShift Container Platform リリースのイメージストリームとテンプレート定義が含まれています。各サンプルが作成または更新されると、Cluster Samples Operator には OpenShift Container Platform のバージョンを示すアノテーションが含まれます。Operator はこのアノテーションを使用して、各サンプルをリリースバージョンに一致させるようにします。このインベントリーの外にあるサンプルは省略されるサンプルであるために無視されます。バージョンのアノテーションが変更または削除されると、Operator が管理するサンプルに変更が加えてもそれらの変更は自動的に元に戻されます。
Jenkins イメージはインストールからのイメージペイロードの一部であり、イメージストリームに直接タグ付けされます。
Cluster Samples Operator 設定リソースには、削除時に以下を消去するファイナライザーが含まれます。
- Operator 管理のイメージストリーム
- Operator 管理のテンプレート
- Operator が生成する設定リソース
- クラスターステータスのリソース
サンプルリソースが削除されると、Cluster Samples Operator はデフォルト設定を使用してリソースを再作成します。
インストール中に Cluster Samples Operator が削除された場合は、別のレジストリーで Cluster Samples Operator を使用することで、コンテンツをインポートできるようになります。その後、Cluster Samples Operator を Managed に設定してサンプルを取得できます。以下の手順を使用してください。
認証情報の設定の詳細は、次のリンクを参照してください。
2.2. Cluster Samples Operator による管理状態の使用 リンクのコピーリンクがクリップボードにコピーされました!
Cluster Samples Operator はデフォルトで Managed としてブートストラップされるか、グローバルプロキシーが設定されている場合にブートストラップされます。
Managed 状態では、レジストリーからサンプルイメージストリームとイメージをプルし、必要なサンプルテンプレートがインストールされた状態になるように、Cluster Samples Operator がリソースを積極的に管理し、コンポーネントをアクティブな状態に維持します。
次のような特定の状況では、Cluster Samples Operator が Removed 状態でブートストラップされます。
- クリーンインストール後の最初の起動時に、Cluster Samples Operator が 3 分経過してもレジストリーにアクセスできない場合。
- Cluster Samples Operator が IPv6 ネットワーク上にあることが Operator 自身によって検出された場合。
イメージコントローラーの設定パラメーターにより、デフォルトのイメージレジストリーまたは
samplesRegistry設定で指定されたイメージレジストリーを使用してイメージストリームを作成できない場合。詳細は、以下のリンクをご覧ください。
OpenShift Container Platform の場合、デフォルトのイメージレジストリーは registry.redhat.io です。
ただし、Cluster Samples Operator が IPv6 ネットワーク上にあることが検出され、かつ OpenShift Container Platform グローバルプロキシーが設定されている場合は、IPv6 チェックがすべてのチェックよりも優先されます。その結果、Cluster Samples Operator はそれ自体を Removed としてブートストラップします。
現在、IPv6 インストールはレジストリーによってサポートされていません。Cluster Samples Operator は、ほとんどのサンプルイメージストリームとイメージをレジストリーからプルします。
2.2.1. ネットワークが制限されたインストール リンクのコピーリンクがクリップボードにコピーされました!
Cluster Samples Operator は、registry.redhat.io にアクセスできない場合、自身を Removed 状態でブートストラップします。これは、ネットワーク制限がすでに適用されている環境でのインストールを容易にするためです。
Operator が Removed 状態でブートストラップされると、クラスター管理者は、サンプルが必要かどうかを判断するための時間をより多く確保できます。管理状態が Removed の場合、サンプルイメージストリームのインポートが失敗しているというアラートが Cluster Samples Operator によって送信されないためです。Cluster Samples Operator の管理状態が Managed であり、Operator がサンプルイメージストリームをインストールしようとすると、最初のインストールから 2 時間後にインポート失敗のアラートが起動します。
2.2.2. 初期のネットワークアクセスが設定された状態でのネットワークが制限されたインストール リンクのコピーリンクがクリップボードにコピーされました!
最終的に制限されたネットワーク上で運用されるクラスターであっても、初期インストール時にネットワークアクセスが存在する場合、Cluster Samples Operator は registry.redhat.io からコンテンツをインストールします。
この場合、接続環境におけるインストールのデフォルト設定である Managed をオーバーライドすることで、必要なサンプルを判断するまで、サンプルのインストールを延期することができます。
インストール時にはネットワークアクセスがある環境で Cluster Samples Operator を Removed 管理状態でブートストラップする場合は、次の手順を使用して Cluster Samples Operator のデフォルト設定をオーバーライドしてください。
制限された環境でサンプルをホストするには、次の手順を使用してください。
また、openshift-install create manifest プロセスによって作成された openshift ディレクトリーに、次の追加の YAML ファイルを配置する必要があります。
managementState: Removed が設定された Cluster Samples Operator YAML ファイルのサンプル
apiVersion: samples.operator.openshift.io/v1
kind: Config
metadata:
name: cluster
spec:
architectures:
- x86_64
managementState: Removed
2.3. Cluster Samples Operator によるイメージストリームインポートの追跡およびエラー回復 リンクのコピーリンクがクリップボードにコピーされました!
サンプルイメージストリームの作成または更新後に、Cluster Samples Operator はそれぞれのイメージストリームタグのイメージインポートの進捗をモニターします。
インポートが失敗した場合、Cluster Samples Operator は、次のいずれかが発生するまで、約 15 分ごとにイメージストリームイメージインポート API を介してインポートを再試行します。
- インポートが成功する。
-
Cluster Samples Operator 設定が変更され、イメージストリームが
skippedImagestreamsリストに追加されるか、管理状態がRemovedに変更される。
2.3.1. ミラーリングの Cluster Samples Operator のサポート リンクのコピーリンクがクリップボードにコピーされました!
インストール中に、OpenShift Container Platform は、openshift-cluster-samples-operator namespace に imagestreamtag-to-image という名前の config map を作成します。
imagestreamtag-to-image config map には、各イメージストリームタグのエントリー (入力されるイメージ) が含まれています。
この config map に含まれるデータフィールドの各エントリーのキーは、<image_stream_name>_<image_stream_tag_name> という形式です。
OpenShift Container Platform の非接続インストール時に、Cluster Samples Operator のステータスは Removed に設定されます。これを Managed に変更することを選択した場合、サンプルがインストールされます。
ネットワークが制限されている環境や非接続環境でサンプルを使用するには、ネットワーク外部のサービスにアクセスする必要がある場合があります。サービスの例には、Github、Maven Central、npm、RubyGems、PyPi などがあります。場合によっては、Cluster Samples Operator オブジェクトが必要なサービスに到達できるようにするために、追加の手順を実行する必要があります。
イメージストリームによるインポート用に、どのイメージをミラーリングする必要があるかを判断する際には、次の原則を使用してください。
-
Cluster Samples Operator が
Removedに設定される場合、ミラーリングされたレジストリーを作成するか、使用する必要のある既存のミラーリングされたレジストリーを判別できます。 - 新しい config map をガイドとして使用し、ミラーリングされたレジストリーに必要なサンプルをミラーリングします。
-
Cluster Samples Operator 設定オブジェクトの
skippedImagestreamsリストに、ミラーリングされていないイメージストリームを追加します。 -
Cluster Samples Operator 設定オブジェクトの
samplesRegistryをミラーリングされたレジストリーに設定します。 -
次に、Cluster Samples Operator を
Managedに設定し、ミラーリングしたイメージストリームをインストールします。
2.4. Cluster Samples Operator の設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
サンプルリソースは以下の設定フィールドを提供します。
| パラメーター | 説明 |
|---|---|
|
|
|
|
|
イメージコンテンツについてイメージストリームがアクセスするレジストリーを指定できます。 注記
RHEL コンテンツの作成または更新は、
RHEL コンテンツの作成または更新は、 |
|
| アーキテクチャーのタイプを選択するためのプレースホルダー。 |
|
|
Cluster Samples Operator のインベントリーにあるものの、クラスター管理者が Operator に無視させるか、管理させないようにするイメージストリーム。このパラメーターにイメージストリーム名のリストを追加できます。例: |
|
| Cluster Samples Operator のインベントリーにあるものの、クラスター管理者が Operator に無視させるか、管理させないようにするテンプレート。 |
シークレット、イメージストリーム、およびテンプレート監視イベントは、初期サンプルリソースオブジェクトの作成前に追加することができ、Cluster Samples Operator はイベントを検出し、再度キューに入れます。
2.4.1. 設定の制限 リンクのコピーリンクがクリップボードにコピーされました!
Cluster Samples Operator が複数のアーキテクチャーのサポートを開始すると、Operator が Managed 状態にある間はアーキテクチャーのリストを変更できなくなります。
アーキテクチャーの値を変更するために、クラスター管理者は以下を実行する必要があります。
-
Management StateにRemovedのマークを付け、変更を保存します。 -
その後の変更では、アーキテクチャーを編集し、
Management StateをManagedに戻します。
Cluster Samples Operator は Removed 状態の場合に依然としてシークレットを処理します。Removed に切り替える前にシークレットを作成でき、Managed に切り替える前の Removed 状態で、または Managed 状態に切り替えた後にシークレットを作成できます。Managed に切り替えた後にシークレットを作成すると、シークレットイベントが処理されるまでの間、サンプルの作成に遅延が発生します。この仕組みは、レジストリーの変更作業を容易にするものであり、レジストリーを切り替える前にすべてのサンプルを削除し、まっさらな状態を確保する場合に役立ちます。切り替え前にすべてのサンプルを削除する必要はありません。
2.4.2. サンプルリソースの条件 リンクのコピーリンクがクリップボードにコピーされました!
サンプルリソースには以下の条件とそのステータスが適用されます。
| 条件 | 説明 |
|---|---|
|
|
サンプルが |
|
|
これは OpenShift Container Platform では非推奨にされています。 |
|
|
前述の制限された変更のいずれかが送信されるかどうかに応じて |
|
|
|
|
| イメージストリームのタグのいずれかについて、イメージストリームでイメージインポートフェーズにエラーがあったことを示すインジケーター。
|
|
|
バージョンが現在のサンプルセットのインストールに使用した Cluster Samples Operator のバージョンと異なることを Cluster Samples Operator が検出した場合、 これは OpenShift Container Platform では非推奨にされています。 |
2.5. Cluster Samples Operator 設定へのアクセス リンクのコピーリンクがクリップボードにコピーされました!
Cluster Samples Operator は、提供されるパラメーターでファイルを編集して設定できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。
手順
次のコマンドを実行して、Cluster Samples Operator 設定にアクセスします。
$ oc edit configs.samples.operator.openshift.io/clusterCluster Samples Operator 設定は以下の例のようになります。
apiVersion: samples.operator.openshift.io/v1 kind: Config # ...
2.6. Cluster Samples Operator からの非推奨のイメージストリームタグの削除 リンクのコピーリンクがクリップボードにコピーされました!
Cluster Samples Operator は、ユーザーが非推奨のイメージストリームタグを使用するデプロイメントを持っている可能性があるため、非推奨のイメージストリームタグをイメージストリームに残します。
oc tag コマンドでイメージストリームを編集して、非推奨のイメージストリームタグを削除できます。
サンプルプロバイダーがイメージストリームから削除した非推奨のイメージストリームタグは初期インストールに含まれません。
前提条件
-
OpenShift CLI (
oc) がインストールされている。
手順
次の
oc tagコマンドを使用してイメージストリームを編集し、非推奨のイメージストリームタグを削除します。$ oc tag -d <image_stream_name:tag>出力例
Deleted tag default/<image_stream_name:tag>.
第3章 代替レジストリーでの Cluster Samples Operator の使用 リンクのコピーリンクがクリップボードにコピーされました!
最初にミラーレジストリーを作成して、別のレジストリーで Cluster Samples Operator を使用できます。ミラーレジストリーを作成する前に、ミラーホストを準備する必要があります。
3.1. ミラーレジストリーについて リンクのコピーリンクがクリップボードにコピーされました!
必要なコンテナーイメージを取得するには、インターネットへのアクセスが必要です。代替レジストリーを使用するということは、使用しているネットワークとインターネットの両方にアクセスできるミラーホストにミラーレジストリーを配置することを意味します。
OpenShift Container Platform のインストールとその後の製品更新に必要なイメージは、Red Hat Quay、JFrog Artifactory、Sonatype Nexus Repository、Harbor などのコンテナーミラーレジストリーにミラーリングできます。大規模なコンテナーレジストリーにアクセスできない場合は、OpenShift Container Platform サブスクリプションに含まれる小規模なコンテナーレジストリーである mirror registry for Red Hat OpenShift を使用できます。
Red Hat Quay、mirror registry for Red Hat OpenShift、Artifactory、Sonatype Nexus リポジトリー、Harbor など、Dockerv2-2 をサポートする任意のコンテナーレジストリーを使用できます。選択したレジストリーに関係なく、インターネット上の Red Hat がホストするサイトから分離されたイメージレジストリーにコンテンツをミラーリングする手順は同じです。コンテンツをミラーリングした後に、各クラスターをミラーレジストリーからこのコンテンツを取得するように設定します。
OpenShift イメージレジストリーはターゲットレジストリーとして使用できません。これは、ミラーリングプロセスで必要となるタグを使わないプッシュをサポートしないためです。
mirror registry for Red Hat OpenShift 以外のコンテナーレジストリーを選択する場合は、プロビジョニングするクラスター内のすべてのマシンからそのレジストリーにアクセスできる必要があります。レジストリーに到達できない場合、インストール、更新、またはワークロードの再配置などの通常の操作が失敗する可能性があります。そのため、ミラーレジストリーは可用性の高い方法で実行し、ミラーレジストリーは少なくとも OpenShift Container Platform クラスターの実稼働環境の可用性の条件に一致している必要があります。
ミラーレジストリーを OpenShift Container Platform イメージで設定する場合、2 つのシナリオを実行することができます。インターネットとミラーレジストリーの両方にアクセスできるホストがあり、クラスターノードにアクセスできない場合は、そのマシンからコンテンツを直接ミラーリングできます。このプロセスは、connected mirroring (接続ミラーリング) と呼ばれます。このようなホストがない場合は、イメージをファイルシステムにミラーリングしてから、そのホストまたはリムーバブルメディアを制限された環境に配置する必要があります。このプロセスは、disconnected mirroring (非接続ミラーリング) と呼ばれます。
ミラーリングされたレジストリーの場合は、プルされたイメージのソースを表示するには、CRI-O ログで Trying to access のログエントリーを確認する必要があります。ノードで crictl images コマンドを使用するなど、イメージのプルソースを表示する他の方法では、イメージがミラーリングされた場所からプルされている場合でも、ミラーリングされていないイメージ名を表示します。
Red Hat は、OpenShift Container Platform を使用してサードパーティーのレジストリーをテストしません。
3.1.1. Linux への OpenShift CLI のインストール リンクのコピーリンクがクリップボードにコピーされました!
コマンドラインからクラスターを管理し、アプリケーションをデプロイするには、Linux に OpenShift CLI (oc) バイナリーをインストールしてください。
以前のバージョンの oc をインストールした場合、それを使用して OpenShift Container Platform のすべてのコマンドを実行することはできません。
新しいバージョンの oc をダウンロードしてインストールしてください。
手順
- Red Hat カスタマーポータルの Download OpenShift Container Platform ページに移動します。
- Product Variant リストからアーキテクチャーを選択します。
- Version リストから適切なバージョンを選択します。
- OpenShift v4.20 Linux Clients エントリーの横にある Download Now をクリックして、ファイルを保存します。
アーカイブを展開します。
$ tar xvf <file>ocバイナリーを、PATHにあるディレクトリーに配置します。PATHを確認するには、以下のコマンドを実行します。$ echo $PATH
検証
OpenShift CLI のインストール後に、
ocコマンドを使用して利用できます。$ oc <command>
3.1.2. Windows への OpenShift CLI のインストール リンクのコピーリンクがクリップボードにコピーされました!
コマンドラインからクラスターを管理し、アプリケーションをデプロイするには、Windows に OpenShift CLI (oc) バイナリーをインストールしてください。
以前のバージョンの oc をインストールした場合、それを使用して OpenShift Container Platform のすべてのコマンドを実行することはできません。
新しいバージョンの oc をダウンロードしてインストールしてください。
手順
- Red Hat カスタマーポータルの Download OpenShift Container Platform ページに移動します。
- Version リストから適切なバージョンを選択します。
- OpenShift v4.20 Windows Client エントリーの横にある Download Now をクリックして、ファイルを保存します。
- ZIP プログラムでアーカイブを展開します。
ocバイナリーを、PATH 環境変数に含まれるディレクトリーに移動してください。PATH環境変数を確認するには、コマンドプロンプトを開き、次のコマンドを実行してください。C:\> path
検証
OpenShift CLI のインストール後に、
ocコマンドを使用して利用できます。C:\> oc <command>
3.1.3. macOS への OpenShift CLI のインストール リンクのコピーリンクがクリップボードにコピーされました!
コマンドラインからクラスターを管理し、アプリケーションをデプロイするには、macOS に OpenShift CLI (oc) バイナリーをインストールしてください。
以前のバージョンの oc をインストールした場合、それを使用して OpenShift Container Platform のすべてのコマンドを実行することはできません。
新しいバージョンの oc をダウンロードしてインストールしてください。
手順
- Red Hat カスタマーポータルの Download OpenShift Container Platform ページに移動します。
- Product Variant リストからアーキテクチャーを選択します。
- Version リストから適切なバージョンを選択します。
OpenShift v4.20 macOS Clients エントリーの横にある Download Now をクリックして、ファイルを保存します。
注記macOS arm64 の場合は、OpenShift v4.20 macOS arm64 Client エントリーを選択します。
- アーカイブを展開し、解凍します。
ocバイナリーをPATH 環境変数で指定したディレクトリーに移動してください。PATH環境変数を確認するには、ターミナルを開いて次のコマンドを実行してください。$ echo $PATH
検証
ocコマンドを使用してインストールを確認します。$ oc <command>
3.2. イメージのミラーリングを可能にする認証情報の設定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat からミラーにイメージをミラーリングできるように、コンテナーイメージレジストリー認証情報ファイルを作成します。インストールホストで以下の手順を実行します。
前提条件
- 切断された環境で使用するミラーレジストリーを設定しました。
手順
-
registry.redhat.ioプルシークレットを Red Hat OpenShift Cluster Manager からダウンロードします。 次のコマンドを実行して、プルシークレットのコピーを JSON 形式で作成します。
$ cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json>プルシークレットを保存するディレクトリーへのパスと、作成する JSON ファイルの名前を指定します。
プルシークレットの例
{ "auths": { "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }次のコマンドを実行して、ミラーレジストリーの base64 でエンコードされたユーザー名とパスワードまたはトークンを生成します。
$ echo -n '<user_name>:<password>' | base64 -w0<user_name>および<password>には、レジストリーに設定したユーザー名およびパスワードを指定します。出力例
BGVtbYk3ZHAtqXs=JSON ファイルを編集し、レジストリーを記述するセクションをこれに追加します。
"auths": { "<mirror_registry>": { "auth": "<credentials>", "email": "you@example.com" } },-
<mirror_registry>の値には、レジストリードメイン名と、ミラーレジストリーがコンテンツを提供するために使用するポートをオプションで指定します (例:registry.example.comまたはregistry.example.com:8443)。 <credentials>の値には、ミラーレジストリーの base64 でエンコードされたユーザー名およびパスワードを指定します。変更済みのプルシークレットの例
{ "auths": { "registry.example.com": { "auth": "BGVtbYk3ZHAtqXs=", "email": "you@example.com" }, "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }
-
3.3. OpenShift Container Platform イメージリポジトリーのミラーリング リンクのコピーリンクがクリップボードにコピーされました!
クラスターのインストールまたはアップグレード時に使用するために、OpenShift Container Platform イメージリポジトリーをお使いのレジストリーにミラーリングします。ミラーホストで以下の手順を実行します。
前提条件
- ミラーホストがインターネットにアクセスできる。
- ネットワークが制限された環境で使用するミラーレジストリーを設定し、設定した証明書および認証情報にアクセスできる。
- Red Hat OpenShift Cluster Manager からプルシークレット をダウンロードし、ミラーリポジトリーへの認証を組み込むように変更している。
- 自己署名証明書を使用する場合は、証明書にサブジェクトの別名を指定しています。
手順
- Download OpenShift Container Platform ページを確認して、インストールする OpenShift Container Platform のバージョンを判別し、Repository Tags ページで対応するタグを判別します。
次の必須環境変数を設定します。
リリースバージョンをエクスポートします。
$ OCP_RELEASE=<release_version><release_version>には、インストールする OpenShift Container Platform のバージョンに対応するタグ (4.20.1など) を指定します。ローカルレジストリー名とホストポートをエクスポートします。
$ LOCAL_REGISTRY='<local_registry_host_name>:<local_registry_host_port>'<local_registry_host_name>には、ミラーレジストリーのレジストリードメイン名を指定し、<local_registry_host_port>には、コンテンツの送信に使用するポートを指定します。ローカルリポジトリー名をエクスポートします。
$ LOCAL_REPOSITORY='<local_repository_name>'<local_repository_name>には、ocp4/openshift4などのレジストリーに作成するリポジトリーの名前を指定します。ミラーリングするリポジトリーの名前をエクスポートします。
$ PRODUCT_REPO='openshift-release-dev'実稼働環境のリリースの場合には、
openshift-release-devを指定する必要があります。パスをレジストリープルシークレットにエクスポートします。
$ LOCAL_SECRET_JSON='<path_to_pull_secret>'<path_to_pull_secret>には、作成したミラーレジストリーのプルシークレットの絶対パスおよびファイル名を指定します。リリースミラーをエクスポートします。
$ RELEASE_NAME="ocp-release"実稼働環境のリリースは、
ocp-releaseを指定する必要があります。クラスターのアーキテクチャーのタイプをエクスポートします。
$ ARCHITECTURE=<cluster_architecture>x86_64、aarch64、s390x、またはppc64leなど、クラスターのアーキテクチャーを指定します。ミラーリングされたイメージをホストするためにディレクトリーへのパスをエクスポートします。
$ REMOVABLE_MEDIA_PATH=<path>最初のスラッシュ (/) 文字を含む完全パスを指定します。
バージョンイメージをミラーレジストリーにミラーリングします。
ミラーホストがインターネットにアクセスできない場合は、以下の操作を実行します。
- リムーバブルメディアをインターネットに接続しているシステムに接続します。
ミラーリングするイメージおよび設定マニフェストを確認します。
$ oc adm release mirror -a ${LOCAL_SECRET_JSON} \ --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE} \ --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \ --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE} --dry-run-
直前のコマンドの出力の
imageContentSourcesセクション全体を記録します。ミラーの情報はミラーリングされたリポジトリーに一意であり、インストール時にimageContentSourcesセクションをinstall-config.yamlファイルに追加する必要があります。 イメージをリムーバブルメディア上のディレクトリーにミラーリングします。
$ oc adm release mirror -a ${LOCAL_SECRET_JSON} --to-dir=${REMOVABLE_MEDIA_PATH}/mirror quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE}メディアをネットワークが制限された環境に移し、イメージをローカルコンテナーレジストリーにアップロードします。
$ oc image mirror -a ${LOCAL_SECRET_JSON} --from-dir=${REMOVABLE_MEDIA_PATH}/mirror "file://openshift/release:${OCP_RELEASE}*" ${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}REMOVABLE_MEDIA_PATH変数には、イメージのミラーリング時に指定した同じパスを使用する必要があります。重要oc image mirrorコマンドを実行すると、error: unable to retrieve source imageエラーが発生する場合があります。このエラーは、イメージレジストリーに存在しなくなったイメージへの参照がイメージインデックスに含まれている場合に発生します。イメージインデックスは、それらのイメージを実行しているユーザーがアップグレードグラフの新しいポイントへのアップグレードパスを実行できるように、古い参照を保持する場合があります。一時的な回避策として、--skip-missingオプションを使用してエラーを回避し、イメージインデックスのダウンロードを続行できます。詳細は、Service Mesh Operator mirroring failed を参照してください。
ローカルコンテナーレジストリーがミラーホストに接続されている場合は、以下の操作を実行します。
以下のコマンドを使用して、リリースイメージをローカルレジストリーに直接プッシュします。
$ oc adm release mirror -a ${LOCAL_SECRET_JSON} \ --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE}-${ARCHITECTURE} \ --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \ --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}このコマンドは、リリース情報をダイジェストとしてプルします。その出力には、クラスターのインストール時に必要な
imageContentSourcesデータが含まれます。直前のコマンドの出力の
imageContentSourcesセクション全体を記録します。ミラーの情報はミラーリングされたリポジトリーに一意であり、インストール時にimageContentSourcesセクションをinstall-config.yamlファイルに追加する必要があります。注記ミラーリングプロセス中にイメージ名に Quay.io のパッチが適用され、Podman イメージにはブートストラップ仮想マシンのレジストリーに Quay.io が表示されます。
ミラーリングしたコンテンツに基づくインストールプログラムを作成するために、インストールプログラムを展開してリリースに固定します。
ミラーホストがインターネットにアクセスできない場合は、以下のコマンドを実行します。
$ oc adm release extract -a ${LOCAL_SECRET_JSON} --icsp-file=<file> --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}" \ --insecure=trueオプション: ターゲットレジストリーの信頼を設定しない場合は、
--insecure=trueフラグを追加します。ローカルコンテナーレジストリーがミラーホストに接続されている場合は、以下のコマンドを実行します。
$ oc adm release extract -a ${LOCAL_SECRET_JSON} --command=openshift-install "${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}-${ARCHITECTURE}"重要選択した OpenShift Container Platform のバージョンに適したイメージを確実に使用するために、ミラーリングしたコンテンツからインストールプログラムを展開する必要があります。
インターネット接続のあるマシンで、このステップを実行する必要があります。
installer-provisioned infrastructure を使用するクラスターの場合は、以下のコマンドを実行します。
$ openshift-install
3.4. 代替のレジストリーまたはミラーリングされたレジストリーでの Cluster Samples Operator イメージストリームの使用 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat レジストリーを使用する代わりに、代替レジストリーまたはミラーレジストリーを使用してイメージストリームをホストできます。
Cluster Samples Operator によって管理される openshift namespace のほとんどのイメージストリームは、Red Hat レジストリーの registry.redhat.io にあるイメージを参照します。
cli、installer、must-gather、および tests イメージストリームはインストールペイロードの一部ですが、Cluster Samples Operator によって管理されません。これは、この手順で扱いません。
Cluster Samples Operator は、非接続環境では Managed に設定する必要があります。イメージストリームをインストールするには、ミラーリングされたレジストリーが必要です。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 - ミラーレジストリーのプルシークレットの作成。
手順
ミラーリングする特定のイメージストリームのイメージにアクセスします。
$ oc get is <imagestream> -n openshift -o json | jq .spec.tags[].from.name | grep registry.redhat.io必要なイメージストリームに関連付けられた registry.redhat.io のイメージをミラーリングします。
$ oc image mirror registry.redhat.io/rhscl/ruby-25-rhel7:latest ${MIRROR_ADDR}/rhscl/ruby-25-rhel7:latest次のコマンドを実行して、クラスターのイメージ設定オブジェクトを作成します。
$ oc create configmap registry-config --from-file=${MIRROR_ADDR_HOSTNAME}..5000=$path/ca.crt -n openshift-configイメージ設定オブジェクトに、ミラーに必要な信頼される CA を追加します。
$ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-config"}}}' --type=mergeCluster Samples Operator 設定オブジェクトの
samplesRegistryフィールドを、ミラー設定で定義されたミラーの場所のhostnameの部分を含むように更新します。$ oc edit configs.samples.operator.openshift.io -n openshift-cluster-samples-operator重要現時点では、イメージストリームのインポートプロセスでミラーまたは検索メカニズムが使用されないため、このステップが必要です。
Cluster Samples Operator 設定オブジェクトの
skippedImagestreamsフィールドにミラーリングされないイメージストリームを追加します。または、サンプルイメージストリームのいずれもサポートする必要がない場合は、Cluster Samples Operator を Cluster Samples Operator 設定オブジェクトのRemovedに設定します。注記Cluster Samples Operator は、イメージストリームのインポートに失敗した場合にアラートを発行しますが、Cluster Samples Operator は定期的に再試行する場合もあれば、それらを再試行していないように見える場合もあります。
openshiftnamespace のテンプレートの多くはイメージストリームを参照します。Removedを使用すると、イメージストリームとテンプレートの両方をパージできます。これにより、イメージストリームが欠落しているためにテンプレートが機能しない場合でもテンプレートを使用しようとする可能性が排除されます。
3.4.1. ミラーリングの Cluster Samples Operator のサポート リンクのコピーリンクがクリップボードにコピーされました!
インストール中に、OpenShift Container Platform は、openshift-cluster-samples-operator namespace に imagestreamtag-to-image という名前の config map を作成します。
imagestreamtag-to-image config map には、各イメージストリームタグのエントリー (入力されるイメージ) が含まれています。
この config map に含まれるデータフィールドの各エントリーのキーは、<image_stream_name>_<image_stream_tag_name> という形式です。
OpenShift Container Platform の非接続インストール時に、Cluster Samples Operator のステータスは Removed に設定されます。これを Managed に変更することを選択した場合、サンプルがインストールされます。
ネットワークが制限されている環境や非接続環境でサンプルを使用するには、ネットワーク外部のサービスにアクセスする必要がある場合があります。サービスの例には、Github、Maven Central、npm、RubyGems、PyPi などがあります。場合によっては、Cluster Samples Operator オブジェクトが必要なサービスに到達できるようにするために、追加の手順を実行する必要があります。
イメージストリームによるインポート用に、どのイメージをミラーリングする必要があるかを判断する際には、次の原則を使用してください。
-
Cluster Samples Operator が
Removedに設定される場合、ミラーリングされたレジストリーを作成するか、使用する必要のある既存のミラーリングされたレジストリーを判別できます。 - 新しい config map をガイドとして使用し、ミラーリングされたレジストリーに必要なサンプルをミラーリングします。
-
Cluster Samples Operator 設定オブジェクトの
skippedImagestreamsリストに、ミラーリングされていないイメージストリームを追加します。 -
Cluster Samples Operator 設定オブジェクトの
samplesRegistryをミラーリングされたレジストリーに設定します。 -
次に、Cluster Samples Operator を
Managedに設定し、ミラーリングしたイメージストリームをインストールします。
第4章 イメージの作成 リンクのコピーリンクがクリップボードにコピーされました!
使用可能な事前にビルドされたイメージを使用して独自のコンテナーイメージを作成する方法を確認します。このプロセスには、イメージの作成、イメージのメタデータの定義、イメージのテストおよびカスタムビルダーワークフローを使用した OpenShift Container Platform で使用するイメージの作成のベストプラクティスを理解することが含まれます。イメージを作成したら、それを OpenShift イメージレジストリーにプッシュできます。
4.1. コンテナーのベストプラクティスについて リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で実行するコンテナーイメージを作成する場合には、イメージの作成者は、イメージの使いやすさの点で数多くのベストプラクティスを考慮する必要があります。イメージは変更不可で、そのままの状態で使用されることが意図されているため、以下のガイドラインは、イメージを使用しやすく、OpenShift Container Platform で簡単に使用できるようにするのに役立ちます。
4.1.1. コンテナーイメージの一般的なガイドライン リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でのデプロイメントにおいてセキュア、効率的、再現可能なコンテナーイメージを確保するために、コンテナーイメージ作成の基本的なガイドラインに準拠します。
4.1.1.1. イメージの再利用 リンクのコピーリンクがクリップボードにコピーされました!
可能な場合は、FROM ステートメントを使用し、適切なアップストリームイメージをベースとしてイメージを設定します。これにより、依存関係を直接更新する必要なく、イメージが更新時にアップストリームイメージからセキュリティー修正を簡単に取得できるようになります。
さらに、FROM 命令 (例: rhel:rhel7) のタグを使用して、お使いのイメージがどのバージョンのイメージをベースとしているかを明確にします。アップストリームイメージの latest バージョンを使用すると互換性に影響のある変更が組み込まれる可能性があるため、latest 以外のタグを使用することができます。
4.1.1.2. タグ内の互換性の維持 リンクのコピーリンクがクリップボードにコピーされました!
独自のイメージにタグを付ける場合には、タグ内で後方互換性が維持されるようにします。たとえば、image という名前のイメージがあり、現時点でバージョン 1.0 が含まれている場合には、image:v1 のタグを指定します。イメージの更新時には、元のイメージとの互換性がある限り、新しいイメージに image:v1 のタグを付けることができ、このタグのダウンストリームのコンシューマーは、互換性に関する影響を被ることなく更新を取得できるようになります。
互換性のない更新を後にリリースした場合には、image:v2 などの新しいタグに切り替えます。これにより、ダウンストリームのコンシューマーはいつでも新しいバージョンに移行できますが、意図せずにこの互換性のない新規イメージによる影響を受けることはありません。image:latest を使用するダウンストリームコンシューマーには、互換性のない変更が導入されるリスクがあります。
4.1.1.3. 複数プロセスの回避 リンクのコピーリンクがクリップボードにコピーされました!
データベースや SSHD など複数のサービスを 1 つのコンテナー内で起動しないようにしてください。コンテナーは軽量で、複数のプロセスをオーケストレーションするために簡単にリンクできるので、複数プロセスの実行は不要です。OpenShift Container Platform では、関連のあるイメージを 1 つの Pod にグループ化して、簡単に共存させ、共同管理することができます。
このように共存させることで、コンテナーはネットワークの namespace とストレージを通信用に共有できるようになります。また、イメージの更新頻度が低く、個別に更新されるので、更新による中断の可能性が低くなります。シグナル処理フローは、複数の起動したプロセスへのルーティングシグナルを管理する必要がないので、単一プロセスによって明確になります。
4.1.1.4. ラッパースクリプトでの exec の使用 リンクのコピーリンクがクリップボードにコピーされました!
多くのイメージはラッパースクリプトを使用して、実行されるソフトウェアのプロセスを開始する前にいくつかの設定を行います。イメージがこのようなスクリプトを使用する場合、そのスクリプトは、スクリプトのプロセスがソフトウェアによって置き換えられるように exec を使用します。exec を使用しない場合、コンテナーランタイムによって送信されるシグナルが、ソフトウェアのプロセスではなくラッパースクリプトに送られます。これは望ましい動作ではありません。
一部のサーバーのプロセスを開始するラッパースクリプトがあるとします。podman run -i などを使用してコンテナーを起動すると、それによりラッパースクリプトが実行され、次にプロセスが開始されます。CTRL+C でコンテナーを閉じる必要があるとします。ラッパースクリプトがサーバープロセスを開始するために exec を使用している場合、podman は SIGINT をサーバープロセスに送信し、すべてが予想通りに機能します。ラッパースクリプトで exec を使用しなかった場合、podman はラッパースクリプトのプロセスに SIGINT を送信し、プロセスは何も生じなかったかのように実行し続けます。
また、コンテナー内で実行されると、プロセスは PID 1 として実行される点に留意してください。つまり、主なプロセスが中断された場合には、コンテナー全体が停止され、PID 1 プロセスから起動した子プロセスが終了します。
4.1.1.5. 一時ファイルの消去 リンクのコピーリンクがクリップボードにコピーされました!
ビルドプロセスで作成される一時ファイルはすべて削除します。これには、ADD コマンドで追加したファイルも含まれます。たとえば、yum install の操作を実行してから、yum clean コマンドを実行します。
yum キャッシュがイメージレイヤーに残らないように、以下のように RUN ステートメントを作成します。
RUN yum -y install mypackage && yum -y install myotherpackage && yum clean all -y
以下のように記述した場合には注意してください。
RUN yum -y install mypackage
RUN yum -y install myotherpackage && yum clean all -y
上記のように記述すると、最初の yum 呼び出しにより、対象のレイヤーに追加のファイルが残り、yum clean 操作を後に実行してもこれらのファイルは削除できません。これらの追加ファイルは最終イメージでは確認できませんが、下位レイヤーには存在します。
現在のコンテナービルドプロセスでは、前のレイヤーで何かが削除された場合でも、後のレイヤーでコマンドを実行してイメージが使用する容量を縮小できません。ただし、これは今後変更される可能性があります。後のレイヤーでファイルが表示されていなくても rm コマンドを実行したとしても、ダウンロードするイメージの全体のサイズを縮小することになりません。そのため、yum clean の場合のように、可能な場合は後にレイヤーに書き込まれないように、ファイルの作成に使用したのと同じコマンドでファイルを削除することが最も適切と言えます。
また、単一の RUN ステートメントで複数のコマンドを実行すると、イメージのレイヤー数が減り、ダウンロードと実行時間が短縮されます。
4.1.1.6. 正しい順序での命令の指定 リンクのコピーリンクがクリップボードにコピーされました!
コンテナービルダーは Dockerfile を読み取り、トップダウンで命令を実行します。命令が正常に実行されると、同じイメージが次回ビルドされるときや、別のイメージがビルドされる時に再利用することができるレイヤーが作成されます。Dockerfile の上部にほとんど変更されない命令を配置することは非常に重要です。こうすることで、上位レイヤーで加えられた変更によってキャッシュが無効にならないので、同じイメージの次回のビルドをすばやく実行できます。
たとえば、反復するファイルをインストールするための ADD コマンドと、パッケージを yum install する RUN コマンドが含まれる Dockerfile で作業を行う場合には、ADD コマンドを最後に配置することが最善の方法です。
FROM foo
RUN yum -y install mypackage && yum clean all -y
ADD myfile /test/myfile
これにより、myfile を編集して podman build または docker build を返すたびに、システムは yum コマンドのキャッシュされたレイヤーを再利用し、ADD 操作に対してのみ新規レイヤーを生成します。
代わりに Dockerfile を以下のように作成した場合:
FROM foo
ADD myfile /test/myfile
RUN yum -y install mypackage && yum clean all -y
myfile を変更して、podman build または docker build を再実行するたびに、ADD 操作は RUN レイヤーのキャッシュを無効にするので、yum 操作も再実行する必要があります。
4.1.1.7. 重要なポートのマーク付け リンクのコピーリンクがクリップボードにコピーされました!
EXPOSE 命令は、ホストシステムで利用できるコンテナーおよび他のコンテナーにポートを作成します。ポートを podman run の起動で公開されるように指定できますが、Dockerfile で EXPOSE 命令を使用すると、ソフトウェアが実行する必要のあるポートを明示的に宣言することで、人間とソフトウェアの両方がイメージをより簡単に使用できるようになります。
-
公開されるポートは、イメージから作成されるコンテナーに関連付けられる
podman psの下に表示されます。 -
公開されるポートは、
podman inspectによって返されるイメージのメタデータに表示されます。 - 公開されるポートは、1 つのコンテナーを別のコンテナーにリンクする際にリンクされます。
4.1.1.8. 環境変数の設定 リンクのコピーリンクがクリップボードにコピーされました!
ENV 命令で環境変数を設定することが適切です。一例として、プロジェクトのバージョンを設定するなどが挙げられます。バージョンを設定することで、Dockerfile を確認せずにバージョンを簡単に見つけ出すことができます。別の例としては、JAVA_HOME など、別のプロセスで使用可能なシステムでパスを公開する場合などです。
4.1.1.9. デフォルトのパスワードの回避 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトのパスワードは設定しないようにしてください。イメージを拡張して、デフォルトのパスワードを削除または変更するのを忘れることが多くあります。これは、実稼働環境で使用するユーザーに誰でも知っているパスワードが割り当てられると、セキュリティーの問題に発展する可能性があります。パスワードは、環境変数を使用して設定できます。
デフォルトのパスワードを設定することにした場合には、コンテナーの起動時に適切な警告メッセージが表示されるようにしてください。メッセージはデフォルトパスワードの値をユーザーに通知し、環境変数の設定など、パスワードの変更方法を説明するものである必要があります。
4.1.1.10. sshd の回避 リンクのコピーリンクがクリップボードにコピーされました!
イメージで sshd を実行しないようにしてください。ローカルホストで実行中のコンテナーにアクセスするには、podman exec または docker exec コマンドを使用できます。または、oc exec コマンドまたは oc rsh コマンドを使用して、OpenShift Container Platform クラスターで実行中のコンテナーにアクセスできます。イメージで sshd をインストールし、実行すると、攻撃の経路が増え、セキュリティー修正が必要になります。
4.1.1.11. 永続データ向けのボリュームの使用 リンクのコピーリンクがクリップボードにコピーされました!
イメージは、永続データ用に ボリューム を使用する必要があります。こうすることで、OpenShift Container Platform により、コンテナーを実行するノードにネットワークストレージがマウントされ、コンテナーが新しいノードに移動した場合に、ストレージはそのノードに再度割り当てられます。永続ストレージのすべての要件に対応するようにボリュームを使用することで、コンテナーが再起動されたり、移動されたりしても、コンテンツは保存されます。イメージがコンテナー内の任意の場所にデータを書き込む場合には、コンテンツは保存されない可能性があります。
コンテナーが破棄された後も保存する必要のあるデータはすべて、ボリュームに書き込む必要があります。コンテナーエンジンはコンテナーの readonly フラグをサポートしており、このフラグを使用して、コンテナーの一時ストレージにデータが決して記述されないようにすることができます。イメージをこの機能に基づいて設計すると、この機能を後に利用することがより簡単になります。
Dockerfile でボリュームを明示的に定義すると、イメージの利用者がイメージの実行時に定義する必要のあるボリュームがどれかを簡単に理解できるようになります。
OpenShift Container Platform でのボリュームの使用方法の詳細は、Kubernetes ドキュメント を参照してください。
永続ボリュームでも、イメージの各インスタンスには独自のボリュームがあり、ファイルシステムはインスタンス間で共有されません。つまり、ボリュームを使用してクラスターの状態を共有できません。
4.1.2. OpenShift Container Platform 固有のガイドライン リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform の統合されたイメージビルド機能を使用して、ソースコードまたは Dockerfile から直接、再現可能なコンテナーイメージを作成、管理、およびデプロイします。
4.1.2.1. Source-To-Image (S2I) 向けのイメージの有効化 リンクのコピーリンクがクリップボードにコピーされました!
開発者が提供した Ruby コードを実行するように設計された Ruby イメージなど、サードパーティー提供のアプリケーションコードを実行することが目的のイメージの場合には、イメージを Source-to-Image (S2I) ビルドツールと連携できるようにすることができます。S2I は、インプットとして、アプリケーションのソースコードを受け入れるイメージを簡単に記述でき、アセンブルされたアプリケーションをアウトプットとして実行する新規イメージを簡単に生成することができるフレームワークです。
4.1.2.2. 任意のユーザー ID のサポート リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは OpenShift Container Platform は、任意に割り当てられたユーザー ID を使用してコンテナーを実行します。こうすることで、コンテナーエンジンの脆弱性が原因でコンテナーから出ていくプロセスに対して追加のセキュリティーを設定でき、ホストノードでパーミッションのエスカレーションが可能になります。
イメージが任意ユーザーとしての実行をサポートできるように、イメージ内のプロセスで記述されるディレクトリーやファイルは、root グループが所有し、このグループに対して読み取り/書き込みの権限を割り当てる必要があります。実行予定のファイルには、グループの実行権限も必要です。
以下を Dockerfile に追加すると、root グループのユーザーがビルドされたイメージでアクセスできるように、ディレクトリーおよびファイルのパーミッションが設定されます。
RUN chgrp -R 0 /some/directory && \
chmod -R g=u /some/directory
コンテナーユーザーは常に root グループのメンバーであるため、コンテナーユーザーはこれらのファイルに対する読み取り、書き込みが可能です。
コンテナーの機密領域のディレクトリーとファイルパーミッションを変更する場合は注意が必要です。/etc/passwd ファイルなどの機密領域に変更を適用すると、意図しないユーザーによるこれらのファイルの変更が許可され、コンテナーまたはホストがセキュリティーリスクにさらされる可能性があります。CRI-O は、コンテナーの /etc/passwd ファイルへに対する任意のユーザー ID の挿入をサポートしています。そのため、パーミッションを変更する必要はありません。
また、いずれのコンテナーイメージにも /etc/passwd ファイルが存在しないはずです。存在する場合、CRI-O コンテナーランタイムはランダムな UID を /etc/passwd ファイルに挿入できません。このような場合、コンテナーがアクティブな UID を解決する際に問題が発生する可能性があります。この要件を満たさない場合、特定のコンテナー化されたアプリケーションの機能に影響が及ぶ可能性があります。
さらに、コンテナーで実行中のプロセスは、特権のあるユーザーとして実行されていないので、特権のあるポート (1024 未満のポート) をリッスンできません。
S2I イメージに、ユーザーを数値で指定した USER 宣言が含まれない場合には、デフォルトで、ビルドが失敗します。名前が指定されたユーザーや root (0) ユーザーを使用するイメージを OpenShift Container Platform でビルドできるようにするには、プロジェクトのビルダーサービスアカウント (system:serviceaccount:<your-project>:builder) を anyuid SCC (security context constraint) に追加できます。または、すべてのイメージをどのユーザーでも実行できるようにできます。
4.1.2.3. イメージ間通信でのサービスの使用 リンクのコピーリンクがクリップボードにコピーされました!
データの保存や取得のためにデータベースイメージにアクセスする必要のある Web フロントエンドイメージなど、別のイメージが提供するサービスとイメージが通信する場合には、イメージは OpenShift Container Platform サービスを使用します。サービスは、コンテナーが停止、開始、または移動しても変更されない静的アクセスエンドポイントを提供します。さらに、サービスにより、要求が負荷分散されます。
4.1.2.4. 共通のライブラリーの提供 リンクのコピーリンクがクリップボードにコピーされました!
サードパーティーが提供するアプリケーションコードの実行を目的とするイメージの場合は、プラットフォーム用として共通に使用されるライブラリーをイメージに含めるようにしてください。とくに、プラットフォームで使用する共通のデータベース用のデータベースドライバーを設定してください。たとえば、Java フレームワークイメージを作成する場合に、MySQL や PostgreSQL には JDBC ドライバーを設定します。このように設定することで、アプリケーションのアセンブリー時に共通の依存関係をダウンロードする必要がなくなり、アプリケーションイメージのビルドがスピードアップします。また、すべての依存関係の要件を満たすためのアプリケーション開発者の作業が簡素化されます。
4.1.2.5. 設定での環境変数の使用 リンクのコピーリンクがクリップボードにコピーされました!
イメージのユーザーは、ダウンストリームイメージをイメージに基づいて作成しなくても、イメージを設定できます。つまり、ランタイム設定は環境変数を使用して処理されます。単純な設定の場合、実行中のプロセスは環境変数を直接使用できます。より複雑な設定や、これをサポートしないランタイムの場合、起動時に処理されるテンプレート設定ファイルを定義してランタイムを設定します。このプロセス時に、環境変数を使用して渡される値は設定ファイルで置き換えることも、この値を使用して、設定ファイルに指定するオプションを決定することもできます。
環境変数を使用して、コンテナーに証明書やキーなどのシークレットを渡すこともでき、これは推奨されています。環境変数を使用することで、シークレット値がイメージにコミットされたり、コンテナーイメージレジストリーに漏洩されることはありません。
環境変数を指定することで、イメージの利用者は、イメージ上に新しいレイヤーを作成することなく、データベースの設定、パスワード、パフォーマンスチューニングなどの動作をカスタマイズできます。Pod の定義時に環境変数の値を定義するだけで、イメージの再ビルドなしに設定を変更できます。
非常に複雑なシナリオの場合、ランタイム時にコンテナーにマウントされるボリュームを使用して設定を指定することも可能です。ただし、この方法を使用する場合には、必要なボリュームや設定が存在しない場合に明確なエラーメッセージが起動時に表示されるように、イメージが設定されている必要があります。
サービスエンドポイントの情報を渡す環境変数としてデータソースなどの設定を定義される点で、これはイメージ間の通信でのサービスの使用に関するトピックと関連しています。これにより、アプリケーションは、アプリケーションイメージを変更せずに、OpenShift Container Platform 環境に定義されているデータソースサービスを動的に使用できます。
さらに、コンテナーの cgroups 設定を確認して、調整します。これにより、イメージは利用可能なメモリー、CPU、他のリソースに合わせてチューニングが可能になります。たとえば、Java ベースのイメージは、制限を超えず、メモリー不足のエラーが表示されないように、cgroup の最大メモリーパラメーターを基にヒープをチューニングします。
4.1.2.6. イメージのメタデータ設定 リンクのコピーリンクがクリップボードにコピーされました!
イメージのメタデータを定義することで、OpenShift Container Platform によるコンテナーイメージの使用が改善され、開発者が OpenShift Container Platform でイメージを使用しやすくなります。たとえば、メタデータを追加して、イメージに関する役立つ情報を提供したり、必要とされる他のイメージを提案したりできます。
4.1.2.7. クラスタリング リンクのコピーリンクがクリップボードにコピーされました!
イメージの複数のインスタンスを実行するとはどういうことかを十分に理解しておく必要があります。最も単純な例では、サービスの負荷分散機能は、イメージのすべてのインスタンスにトラフィックをルーティングします。ただし、セッションの複製などで、リーダーの選択やフェイルオーバーの状態を実行するには、多くのフレームワークが情報を共有する必要があります。
OpenShift Container Platform での実行時に、インスタンスでこのような通信を実現する方法を検討します。Pod 同士は直接通信できますが、Pod が起動、停止、移動するたびに IP アドレスが変更されます。そのため、クラスタリングスキームを動的にしておくことが重要です。
4.1.2.8. ロギング リンクのコピーリンクがクリップボードにコピーされました!
すべてのロギングを標準出力に送信することが推奨されます。OpenShift Container Platform はコンテナーから標準出力を収集し、表示が可能な中央ロギングサービスに送信します。ログコンテンツを分離する必要がある場合には、出力の接頭辞に適切なキーワードを指定して、メッセージをフィルタリングできるようにしてください。
お使いのイメージがファイルにロギングをする場合には、手動で実行中のコンテナーに入り、ログファイルを取得または表示する必要があります。
4.1.2.9. Liveness および Readiness プローブ リンクのコピーリンクがクリップボードにコピーされました!
イメージで使用可能な liveness および readiness プローブの例をまとめます。これらのプローブにより、処理の準備ができるまでトラフィックがコンテナーにルーティングされず、プロセスが正常でない状態になる場合にコンテナーが再起動されるので、ユーザーはイメージを安全にデプロイできます。
4.1.2.10. テンプレート リンクのコピーリンクがクリップボードにコピーされました!
イメージと共にテンプレートサンプルを提供することも検討してください。テンプレートがあると、ユーザーは、正しく機能する設定を指定してイメージをすばやく簡単にデプロイできるようになります。完全を期すため、テンプレートには、イメージに関連して記述した liveness および readiness プローブを含めるようにしてください。
4.2. イメージへのメタデータの組み込み リンクのコピーリンクがクリップボードにコピーされました!
作成中に包括的なイメージメタデータを定義して、OpenShift Container Platform がイメージのランタイム設定を正しく設定し、イメージの系統とコンプライアンスを追跡できるようにします。これにより、イメージを使用する開発者に優れたエクスペリエンスを提供できます。
たとえば、メタデータを追加して、イメージに関する役立つ情報を提供したり、必要とされる可能性のある他のイメージを提案したりできます。
このトピックでは、現在の一連のユースケースに必要なメタデータのみを定義します。他のメタデータまたはユースケースは、今後追加される可能性があります。
4.2.1. イメージメタデータの定義 リンクのコピーリンクがクリップボードにコピーされました!
Dockerfile で LABEL 命令を使用して、イメージのメタデータを定義することができます。ラベルは、イメージやコンテナーに割り当てるキーと値のペアである点で環境変数と似ています。ただし、ラベルは、実行中のアプリケーションに表示されず、イメージやコンテナーをすばやく検索する場合にも使用できる点で、環境変数とは異なります。
LABEL 命令に関する詳細は、Docker ドキュメント を参照してください。
通常、ラベル名には namespace が付けられています。namespace は、対象のラベルを選択して使用するプロジェクトを反映するように設定されます。OpenShift Container Platform の場合、namespace は io.openshift に、Kubernetes の場合は、namespace は io.k8s に設定されます。
形式に関する詳細は、Docker のカスタムメタデータ に関するドキュメントを参照してください。
| 変数 | 説明 |
|---|---|
|
| このラベルには、コンマ区切りの文字列値のリストとして表現されているタグのリストが含まれます。タグを使用して、コンテナーイメージを幅広い機能エリアに分類します。タグを使用すると、UI および生成ツールがアプリケーションの作成プロセスで適切なコンテナーイメージを提案しやすくなります。
|
|
|
コンテナーイメージにすでにタグが指定されていない場合に、生成ツールと UI が適切な提案を行うのに使用するタグのリストを指定します。たとえば、コンテナーイメージに
|
|
| このラベルは、コンテナーイメージの利用者に、このイメージが提供するサービスや機能に関する詳細情報を提供するのに使用できます。UI は、この説明とコンテナーイメージ名を使用して、人間が解読しやすい情報をエンドユーザーに提供します。
|
|
|
イメージは、この変数を使用して、スケーリングがサポートされていないことを示す場合があります。その後、UI はこれをそのイメージのコンシューマーに通知します。スケーリング不可にした場合は
|
|
| このラベルは、コンテナーイメージが正しく機能するにはどの程度リソースが必要かを提案します。UI でユーザーに対し、このコンテナーイメージをデプロイすると、ユーザークォータを超過する可能性があることを警告する場合があります。この値は、Kubernetes の数量と互換性がある必要があります。
|
4.3. Source-to-Image によるソースコードからのイメージの作成 リンクのコピーリンクがクリップボードにコピーされました!
Source-to-Image (S2I) は、アプリケーションのソースコードを入力として取り、アセンブルされたアプリケーションを出力として実行する新規イメージを生成するイメージを簡単に作成できるようにするフレームワークです。
再生成可能なコンテナーイメージのビルドに S2I を使用する主な利点として、開発者の使い勝手の良さが挙げられます。ビルダーイメージの作成者は、イメージが最適な S2I パフォーマンスを実現できるように、ビルドプロセスと S2I スクリプトの基本的なコンセプト 2 点を理解する必要があります。
4.3.1. Source-to-Image ビルドプロセスについて リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform の Source-to-image (S2I) プロセスを活用して、アプリケーションのソースコードをすぐに実行できる再現可能なコンテナーイメージにシームレスに変換します。
ビルドプロセスは次の 3 つの基本要素で構成されます。これらを組み合わせて最終的なコンテナーイメージが作成されます。
- ソース
- S2I スクリプト
- ビルダーイメージ
S2I は、最初の FROM 命令として、ビルダーイメージで Dockerfile を生成します。S2I によって生成される Dockerfile は Buildah に渡されます。
4.3.2. Source-to-Image スクリプトの作成方法 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform が再現性の高いコンテナーイメージをビルド、カスタマイズ、実行できるように、assemble や run などの必須の Source-to-image (S2I) スクリプトを定義します。
S2I スクリプトは、ビルダーイメージ内でスクリプトを実行できる限り、どのプログラム言語でも記述できます。S2I は assemble/run/save-artifacts スクリプトを提供する複数のオプションをサポートします。ビルドごとに、これらの場所はすべて、以下の順番にチェックされます。
- ビルド設定に指定されるスクリプト
-
アプリケーションソースの
.s2i/binディレクトリーにあるスクリプト -
io.openshift.s2i.scripts-urlラベルを含むデフォルトの URL にあるスクリプト
イメージで指定した io.openshift.s2i.scripts-url ラベルも、ビルド設定で指定したスクリプトも、以下の形式のいずれかを使用します。
-
image:///path_to_scripts_dir: S2I スクリプトが配置されているディレクトリーへのイメージ内の絶対パス。 -
file:///path_to_scripts_dir: S2I スクリプトが配置されているディレクトリーへのホスト上の相対パスまたは絶対パス。 -
http(s)://path_to_scripts_dir: S2I スクリプトが配置されているディレクトリーの URL。
| スクリプト | 説明 |
|---|---|
|
|
|
|
|
|
|
|
これらの依存関係は |
|
|
|
|
|
注記
|
S2I スクリプトの例
以下の S2I スクリプトの例は Bash で記述されています。各例では、tar の内容が /tmp/s2i ディレクトリーに展開されていることを前提としています。
assemble スクリプト:
#!/bin/bash
# restore build artifacts
if [ "$(ls /tmp/s2i/artifacts/ 2>/dev/null)" ]; then
mv /tmp/s2i/artifacts/* $HOME/.
fi
# move the application source
mv /tmp/s2i/src $HOME/src
# build application artifacts
pushd ${HOME}
make all
# install the artifacts
make install
popd
run スクリプト:
#!/bin/bash
# run the application
/opt/application/run.sh
save-artifacts スクリプト:
#!/bin/bash
pushd ${HOME}
if [ -d deps ]; then
# all deps contents to tar stream
tar cf - deps
fi
popd
usage スクリプト:
#!/bin/bash
# inform the user how to use the image
cat <<EOF
This is a S2I sample builder image, to use it, install
https://github.com/openshift/source-to-image
EOF
4.4. Source-to-Image イメージのテストについて リンクのコピーリンクがクリップボードにコピーされました!
Source-to-image (S2I) 環境と、結果として得られるアプリケーションイメージを検証し、OpenShift Container Platform 内でコンテナーのデプロイメントが成功し、再現可能であることを確認します。
S2I ビルダーイメージの作成者は、S2I イメージをローカルでテストして、自動テストや継続的な統合に OpenShift Container Platform ビルドシステムを使用できます。
S2I ビルドを正常に実行するには、S2I に assemble と run スクリプトが必要です。S2I 外のコンテナーイメージを実行した場合に、save-artifacts スクリプトがあると、ビルドのアーティファクトが再利用され、usage スクリプトがあると、使用に関する情報がコンソールに出力されるようになります。
S2I イメージのテストは、ベースのコンテナーイメージを変更したり、コマンドが使用するツールが更新されたりした場合でも、上記のコマンドが正しく機能することを確認するのが目的です。
4.4.1. テスト要件について リンクのコピーリンクがクリップボードにコピーされました!
test スクリプトは、基本的に test/run に配置されます。このスクリプトは、OpenShift Container Platform S2I イメージビルダーが呼び出し、単純な Bash スクリプトか静的な Go バイナリーのいずれかの形式を取ることができます。
test/run スクリプトは S2I ビルドを実行するので、S2I バイナリーを $PATH で利用可能にしておく必要があります。必要に応じて、S2I README のインストール手順に従います。
S2I は、アプリケーションのソースコードおよびビルダーイメージを統合します。これをテストするには、ソースが実行可能なコンテナーイメージに変換されることを検証するためのサンプルアプリケーションのソースが必要です。サンプルアプリケーションは単純なものである必要がありますが、assemble および run スクリプトの重要な手順を実行できる必要があります。
4.4.2. スクリプトおよびツールの生成 リンクのコピーリンクがクリップボードにコピーされました!
S2I ツールは、新しい S2I イメージの作成プロセスを加速化する強力な生成ツールと共に提供されます。s2i create コマンドでは、Makefile 以外に、必要とされる S2I スクリプトとテストツールすべてが生成されます。
$ s2i create <image_name> <destination_directory>
生成された test/run スクリプトは、より使いやすくするために調整する必要がありますが、このスクリプトを開発の開始段階で使用することが推奨されます。
s2i create コマンドで生成した test/run スクリプトでは、サンプルアプリケーションのソースを test/test-app ディレクトリーに配置しておく必要があります。
4.4.3. ローカルでのテスト リンクのコピーリンクがクリップボードにコピーされました!
S2I イメージテストをローカルに実行する最も簡単な方法として、生成した Makefile を使用することができます。
s2i create コマンドを使用しない場合には、以下の Makefile テンプレートをコピーして、IMAGE_NAME パラメーターをお使いのイメージ名に置き換えることができます。
Makefile の例
IMAGE_NAME = openshift/ruby-20-centos7
CONTAINER_ENGINE := $(shell command -v podman 2> /dev/null | echo docker)
build:
${CONTAINER_ENGINE} build -t $(IMAGE_NAME) .
.PHONY: test
test:
${CONTAINER_ENGINE} build -t $(IMAGE_NAME)-candidate .
IMAGE_NAME=$(IMAGE_NAME)-candidate test/run
4.4.4. テストの基本的なワークフロー リンクのコピーリンクがクリップボードにコピーされました!
test スクリプトは、テストするイメージをすでにビルドしていることが前提です。必要に応じて、以下のコマンドで S2I イメージを先にビルドしてください。以下のいずれかのコマンドを実行してください。
Podman を使用する場合は、以下のコマンドを実行します。
$ podman build -t <builder_image_name>Docker を使用する場合は、以下のコマンドを実行します。
$ docker build -t <builder_image_name>
以下の手順では、S2I イメージビルダーをテストするデフォルトのワークフローを説明しています。
usageスクリプトが機能していることを確認します。Podman を使用する場合は、以下のコマンドを実行します。
$ podman run <builder_image_name> .Docker を使用する場合は、以下のコマンドを実行します。
$ docker run <builder_image_name> .
イメージをビルドします。
$ s2i build file:///path-to-sample-app _<BUILDER_IMAGE_NAME>_ _<OUTPUT_APPLICATION_IMAGE_NAME>_-
オプション:
save-artifactsをサポートする場合には、再度手順 2 を実行して、保存して復元するアーティファクトが正しく機能することを確認します。 コンテナーを実行します。
Podman を使用する場合は、以下のコマンドを実行します。
$ podman run <output_application_image_name>Docker を使用する場合は、以下のコマンドを実行します。
$ docker run <output_application_image_name>
- コンテナーが実行され、アプリケーションが応答していることを確認します。
これらの手順を実行すると、通常はビルダーイメージが予想通りに機能しているかどうかが分かります。
4.4.5. イメージのビルドでの OpenShift Container Platform の使用 リンクのコピーリンクがクリップボードにコピーされました!
新しい S2I ビルダーイメージを設定する Dockerfile と他のアーティファクトが準備できたら、それらを git リポジトリーに配置して、OpenShift Container Platform を使用し、イメージをビルドしてプッシュします。お使いのリポジトリーを参照する Docker ビルドを定義します。
OpenShift Container Platform インスタンスが公開 IP アドレスでホストされる場合、ビルドは、S2I ビルダーイメージ GitHub リポジトリーにプッシュするたびにトリガーされます。
ImageChangeTrigger を使用して、更新した S2I ビルダーイメージに基づくアプリケーションの再ビルドをトリガーすることもできます。
第5章 イメージの管理 リンクのコピーリンクがクリップボードにコピーされました!
5.1. イメージの管理の概要 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のイメージストリームは、コンテナーイメージの上に抽象化レイヤーを提供し、CI/CD パイプラインの自動化を可能にします。ビルドとデプロイメントを設定することで、イメージストリームを監視し、イメージが更新されたときに新しいビルドまたはデプロイメントを自動的にトリガーすることができます。
イメージストリームを使用する主な利点は、継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインの自動化を可能にすることです。以下に例を示します。
- イメージストリームを使用すると、OpenShift Container Platform のビルドやデプロイメントなどのリソースがイメージストリームを監視できるようになります。
- ストリームに新しいイメージが追加された場合、または既存のタグが新しいイメージを指すように変更された場合、監視対象のリソースに通知が送信されます。
- 通知を受信すると、監視対象のリソースは自動的に反応し、新しいビルドや新しいデプロイメントを実行できます。
5.2. イメージのタグ付け リンクのコピーリンクがクリップボードにコピーされました!
イメージタグは、イメージストリーム内のコンテナーイメージの特定のバージョンを識別します。イメージタグを使用すると、イメージを整理したり、ビルドやデプロイメントで使用するバージョンを制御したりできます。
5.2.1. イメージストリームにおけるイメージタグの理解 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のイメージタグを使用すると、イメージストリーム内のコンテナーイメージの特定のバージョンを整理、識別、参照できます。タグとは、特定のイメージレイヤーやダイジェストへのポインターとして機能する、人間が読みやすいラベルのことです。
タグは、イメージストリーム内で可変ポインターとして機能します。新しいイメージがストリームにインポートまたはタグ付けされると、タグは新しいイメージの不変の SHA ダイジェストを指すように更新されます。1 つのイメージダイジェストには、複数のタグを同時に割り当てることができます。たとえば、:v3.11.59-2 と :latest という タグは、同じイメージダイジェストに割り当てられます。
タグには主に 2 つの利点があります。
- タグは、ビルドやデプロイメントにおいて、イメージストリームから特定のバージョンのイメージを要求するための主要なメカニズムとして機能します。
-
タグは、イメージの明確性を維持し、異なる環境間でのイメージ共有を容易にするのに役立ちます。たとえば、
:testタグのイメージを:prodタグに昇格させることができます。
イメージタグは主に設定ファイル内のイメージを参照するために使用されますが、OpenShift Container Platform では、イメージストリーム内でタグを直接管理するための oc tag コマンドが提供されています。このコマンドは、podman の tag コマンド や docker の tag コマンドに似ていますが、ローカルイメージを直接操作するのではなく、イメージストリームに対して操作を行います。これは、イメージストリーム内で新しいタグポインターを作成したり、既存のタグポインターを更新して新しいイメージを指すようにするために使用されます。
イメージタグは、コロン (:) を区切り文字として使用して、イメージ名またはイメージストリーム名に追加されます。
| コンテキスト | 構文形式 | 例 |
|---|---|---|
| 外部レジストリー |
|
|
| ローカルイメージストリーム |
|
|
5.2.2. イメージタグの規則 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform におけるイメージタグの命名規則は、効果的なイメージのプルーニングを可能にし、管理しやすいイメージストリームを維持するためのタグを作成するためのガイドラインを提供します。単一のリビジョンを指し示し、更新されないタグを避けるために、一貫性のある命名規則を使用してください。
タグが具体的すぎると、更新されることのない単一のイメージリビジョンにタグが固定されてしまう。たとえば、v2.0.1-may-2019 という名前のタグを作成した場合、そのタグはイメージの 1 つのリビジョンのみを指し、更新されることはありません。デフォルトのイメージプルーニングオプションを使用している場合、そのようなイメージは決して削除されません。
非常に大規模なクラスターでは、イメージが修正されるたびに新規タグが作成される設定の場合、古くなって久しいイメージの余分のタグメタデータで etcd データストアが一杯になる可能性があります。タグの名前が v2.0 である場合はイメージのリビジョンの数が多くなることが予想されます。これによりタグ履歴が長くなるため、イメージプルーナーが古くなり使われなくなったイメージを削除する可能性が高くなります。
適切なガベージコレクションを確保するには、新しいイメージリビジョンが構築された際に更新されるように設計された、より広範で汎用的なタグを使用してください。以下の表は 、< イメージ名 >:< イメージタグ > の 形式を使用した推奨タグ付け規則を示しています。
| 説明 | 例 |
|---|---|
| メジャー/マイナーバージョン (可変ポインターに最適) |
|
| 完全改訂 (追跡によく使用されるが、手動でのプルーニングが必要) |
|
| アーキテクチャー |
|
| ベースイメージ |
|
| 最新バージョン |
|
| 最新 (安定性がある) |
|
チームで v2.0.1-may-2019 のような固有の日付指定タグや大幅に改訂されたタグを使用する必要がある場合は、古いイメージやサポートされていないイメージや istag を 定期的に検査して削除する必要があります。そうしないと、古いイメージを保持して、リソースの使用量が増大する可能性があります。
5.2.3. イメージストリームへのタグの追加 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でイメージを整理したり、特定のバージョンにエイリアスを作成したり、ソースタグの変更を自動的に追跡したりするには、oc tag コマンドを使用してイメージストリームにタグを追加できます。
OpenShift Container Platform では、2 種類のタグが利用可能です。
- 永続タグ: 永続タグは、特定の時点における特定のイメージを指します。永続タグが使用されている状態で送信元が変更された場合、宛先のタグは変更されません。
- トラッキングタグ: トラッキングタグとは、ソースタグのインポート中に、宛先タグのメタデータが更新されることを意味します。
デフォルトの動作では、イメージ ID に固定される永続的なタグが作成されます。
手順
オプション: 以下のコマンドを入力して、イメージストリームにタグを追加します。デフォルトの動作では、イメージ ID に固定される永続的なタグが作成されます。
$ oc tag <source_reference> <destination_image_stream>:<destination_tag>たとえば、
rubyイメージストリームのstatic-2.0タグが、現在ruby:2.0タグが指している特定のイメージを常に参照するように設定するには、次のコマンドを入力します。$ oc tag ruby:2.0 ruby:static-2.0これにより、
rubyイメージストリームにstatic-2.0という名前のイメージストリームタグが新たに作成されます。新しいタグは、oc tagが実行された時点でruby:2.0イメージストリームタグが指していたイメージ ID を直接参照しており、そのタグが指すイメージは決して変わりません。オプション: トラッキングタグを作成するには、
--alias=trueフラグを使用します。これにより、ソースタグが新しいイメージを指すように変更された際に、宛先タグが自動的に更新 (追跡) されることが保証されます。たとえば、ruby:latestタグが常に現在ruby:2.0とタグ付けされているイメージを反映するようにするには、次のコマンドを入力します。$ oc tag --alias=true ruby:2.0 ruby:latest注記--alias=true オプションを指定して作成されたトラッキングタグは、ソースタグが変更されるたびにイメージ ID を自動的に更新します。共通して長期間使用されるエイリアスを作成するには、最新版または安定版のトラッキングタグを使用してください。この追跡機能は、単一のイメージストリーム内でのみ正しく動作します。複数のイメージストリーム間で使用されるエイリアスを作成しようとするとエラーが生じます。オプション: 宛先タグを定期的に更新または再インポートするには、
--scheduled=trueフラグを使用します。期間はシステムレベルでグローバルに設定できます。以下に例を示します。$ oc tag <source_reference> <destination_image_stream>:<destination_tag> --scheduled=trueオプション: インポートされないイメージストリームタグを作成するには、
--referenceフラグを使用します。このタグは、元のイメージに変更が加えられた場合でも、常に元の場所を指し示します。以下に例を示します。$ oc tag <source_reference> <destination_image_stream>:<destination_tag> --referenceオプション: ソースレジストリーが有効な HTTPS 証明書で保護されていない場合は、
--insecureフラグを使用してください。このフラグは、イメージストリームに対し、インポート処理中に証明書の検証をスキップするように指示します。以下に例を示します。$ oc tag <source_reference> <destination_image_stream>:<destination_tag> --insecureオプション:
--reference-policy=localフラグを使用すると、OpenShift Container Platform に対して、タグ付きイメージを常に統合レジストリーから取得するように指示できます。レジストリーはプルスルー (pull-through) 機能を使用してイメージをクライアントに提供します。デフォルトで、イメージ Blob はレジストリーによってローカルにミラーリングされます。その結果、それらが次回必要となる場合により迅速にプルされます。--reference-policy=localフラグを使用すると、イメージストリームに安全でないアノテーションが付いているか、タグに安全でないインポートポリシーが設定されている場合、コンテナーランタイムに--insecureフラグを指定する必要なく、安全でないレジストリーからプルできます。以下に例を示します。$ oc tag <source_reference> <destination_image_stream>:<destination_tag> --reference-policy=local
5.2.4. タグのイメージストリームからの削除 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でイメージストリームをクリーンに保ち、整理されたイメージ参照を維持するには、使用されていない、または古いイメージストリームタグを削除できます。タグを削除するには、` oc delete istag` コマンド または `oc tag -d` コマンドを使用します。
手順
イメージストリームからタグを削除するには、次のコマンドを入力します。
$ oc delete istag/<name>:<tag>たとえば、
rubyイメージストリームからruby:latestタグを削除するには、次のコマンドを入力します。$ oc delete istag/ruby:latestまたは、
`oc tag -d`コマンドを使用してタグを削除することもできます。$ oc tag -d <name>:<tag>たとえば、
rubyイメージストリームからruby:latestタグを削除するには、次のコマンドを入力します。$ oc tag -d ruby:latest
5.2.5. イメージストリーム参照構文を使用する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でビルドとデプロイメントが意図したイメージバージョンを使用するようにするには、正しい参照構文形式を使用する必要があります。
手順
クラスター内のイメージストリームから可変タグ (
ImageStreamTag) を使用してイメージを参照するには、ビルドまたはデプロイメントで<image_stream_name>:<tag>形式を使用します。以下に例を示します。# ... spec: containers: - name: my-app image: <image_stream_name>:<tag>ここでは、以下のようになります。
仕様コンテナーイメージ-
イメージストリームから使用するイメージを指定します。たとえば、
ruby:2.0。
イメージストリーム内の特定の不変のイメージ ID またはダイジェストを参照するには、ビルドまたはデプロイメントで
<image_stream_name>@<image_id>形式を使用します。以下に例を示します。# ... spec: containers: - name: my-app image: <image_stream_name>@<image_id>ここでは、以下のようになります。
仕様コンテナーイメージ-
イメージストリームから使用するイメージを指定します。たとえば、
ruby@sha256:3a335d7d8a452970c5b4054ad7118ff134b3a6b50a2bb6d0c07c746e8986b28e。
注記@id構文でイメージ ID を使用すると、タグが後で別のイメージを指すように更新された場合でも、設定では常にまったく同じイメージが使用されることが保証されます。DockerImage 形式を使用して外部レジストリーからイメージを参照するには、標準の Docker pull 仕様を使用します:
<registry>/<namespace>/<image_name>:<tag>。以下に例を示します。# ... spec: source: type: Dockerfile strategy: type: Docker dockerStrategy: from: kind: DockerImage name: <registry>/<namespace>/<image_name>:<tag>ここでは、以下のようになります。
spec.strategy.dockerStrategy.from.name-
外部レジストリーから使用するイメージを指定します。たとえば、
registry.redhat.io/rhel7:latestなど。
注記DockerImage参照でタグが指定されていない場合、最新のタグが使用されます。
5.2.6. イメージストリーム参照タイプの理解 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のイメージストリームを使用すると、さまざまな参照タイプを使用してコンテナーイメージを参照できます。これらの参照タイプは、ビルドおよびデプロイメントで使用する特定のイメージバージョンを定義します。
ImageStreamImage オブジェクトは、イメージをイメージストリームにインポートまたはタグ付けすると、OpenShift Container Platform で自動的に作成されます。イメージストリームを作成するために使用するイメージストリーム定義において、ImageStreamImage オブジェクトを明示的に定義する必要は一切ありません。
イメージストリーム定義の例には、ImageStreamTag の定義と DockerImage への参照が含まれることが多いですが、ImageStreamImage の定義は含まれません。
| 参照タイプ | 説明 | 構文の例 |
|---|---|---|
|
| 指定されたイメージストリームと人間が判読可能なタグに基づいてイメージを参照または取得します。 |
|
|
| 指定されたイメージストリームと不変の SHA ID(ダイジェスト) に基づいてイメージを参照または取得します。 |
|
|
|
外部レジストリーからイメージを参照または取得します。標準の |
|
5.3. イメージプルポリシー リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でイメージの更新を管理し、Pod の起動パフォーマンスを最適化するには、コンテナー仕様で imagePullPolicy パラメーターを設定できます。この設定は、コンテナーイメージがレジストリーからプルされるタイミングを制御します。
5.3.1. imagePullPolicy パラメーターについて リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform がコンテナーの起動時にレジストリーからコンテナーイメージを取得するか、ローカルにキャッシュされたコピーを使用するかを制御するには、imagePullPolicy パラメーターを設定できます。このポリシーは、イメージの更新を管理し、Pod の起動パフォーマンスを最適化するのに役立ちます。
以下の表は、imagePullPolicy パラメーターに指定可能な値のリストです。
| 値 | 説明 |
|---|---|
|
| 常にイメージをプルします。 |
|
| イメージがノード上にない場合にのみイメージをプルします。 |
|
| イメージをプルしません。 |
次の例では、v1.2.3 タグが付いたイメージの imagePullPolicy パラメーターを IfNotPresent に設定しています。
imagePullPolicy の 設定例
apiVersion: apps/v1
kind: Deployment
# ...
spec:
# ...
template:
spec:
containers:
- name: my-app-container
image: registry.example.com/myapp:v1.2.3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
ここでは、以下のようになります。
spec.template.spec.containers.image-
使用するイメージを指定します。この例では、イメージタグが明示的に
v1.2.3に設定されています。 spec.template.spec.containers.imagePullPolicy-
使用するポリシーを指定します。この例では、イメージタグが
最新ではないため、ポリシーはIfNotPresentに設定されています。
5.3.1.1. imagePullPolicy パラメーターを省略する リンクのコピーリンクがクリップボードにコピーされました!
imagePullPolicy パラメーターを省略すると、OpenShift Container Platform はイメージタグに基づいてポリシーを自動的に決定します。このデフォルトの動作により、最新の タグは常に最新のイメージを取得し、特定のバージョンのタグは、利用可能な場合はローカルにキャッシュされたイメージを使用して効率を向上させます。
| Image tag | imagePullPolicy の 設定 | 動作 |
|---|---|---|
|
|
| 常にイメージを取り込む。このポリシーは、コンテナーが常に最新バージョンのイメージを使用することを保証するのに役立ちます。 |
|
その他のタグ (例: |
| 必要な場合のみ引っ張ってください。このポリシーでは、ノード上にローカルにキャッシュされたイメージが存在する場合、それを使用することで、レジストリーからの不要な取得を回避します。 |
5.4. イメージプルシークレットの使用 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーレジストリーで認証を行い、OpenShift Container Platform プロジェクト全体またはセキュリティー保護されたレジストリーからイメージをプルするには、イメージプルシークレットを設定して使用できます。
まず、レジストリー認証情報を取得します。これは通常、Docker の場合は ~/.docker/config.json ファイル、Podman の場合は ~/.config/containers/auth.json ファイルにあり、Red Hat OpenShift Cluster Manager プロセスからシークレットをプルすること で作成されます。このコンテンツは、クラスター内のグローバルな pullSecret オブジェクトを作成または更新するために使用され、quay.io および registry.redhat.io からのイメージへのアクセスを可能にします。
OpenShift イメージレジストリーを使用しており、同じプロジェクト内にあるイメージストリームからイメージを取得している場合、Pod サービスアカウントにはすでに適切な権限が付与されているはずです。追加の措置は必要ありません。
5.4.1. Pod が複数のプロジェクト間でイメージを参照できるようにする設定 リンクのコピーリンクがクリップボードにコピーされました!
ある OpenShift Container Platform プロジェクト内の Pod が別のプロジェクトのイメージを参照できるようにするには、対象プロジェクトの system:image-puller ロールにサービスアカウントをバインドします。プロジェクト間でイメージへのアクセス権を付与するには 、oc policy add-role-to-user コマンドまたは oc policy add-role-to-group コマンドを使用します。
Pod サービスアカウントまたは名前空間を作成する際は、サービスアカウントに Docker プルシークレットがプロビジョニングされるまでお待ちください。サービスアカウントが完全にプロビジョニングされる前に Pod を作成すると、Pod は OpenShift イメージレジストリーにアクセスできなくなります。
手順
以下のコマンドを入力することで、
プロジェクト aの Pod がプロジェクト bのイメージを参照できるようにします。この例では、プロジェクト aのサービスアカウントのデフォルトが、プロジェクト bのsystem:image-pullerロールにバインドされています。$ oc policy add-role-to-user \ system:image-puller system:serviceaccount:project-a:default \ --namespace=project-bオプション:
add-role-to-groupフラグを使用して、プロジェクト a内の任意のサービスアカウントにアクセスを許可します。以下に例を示します。$ oc policy add-role-to-group \ system:image-puller system:serviceaccounts:project-a \ --namespace=project-b
5.4.2. Pod が他のセキュリティー保護されたレジストリーからイメージを参照できるようにする設定 リンクのコピーリンクがクリップボードにコピーされました!
プルシークレットを使用すると、OpenShift Container Platform の Pod は、セキュリティーで保護されたレジストリーで認証を行い、コンテナーイメージをプルできます。Docker と Podman は認証情報を設定ファイルに保存するため、それを使ってサービスアカウントのプルシークレットを作成できます。
以前にセキュリティー保護されたレジストリーまたはセキュリティー保護されていないレジストリーにログインしたことがある場合、以下のファイルには認証情報が保存されます。
-
Docker: Docker は、デフォルトで
$HOME/.docker/config.jsonを使用します。 -
Podman: Podman は、デフォルトで
$HOME/.config/containers/auth.jsonを使用します。
quay.io や quay.io/<example_repository> のような一意のパスがある場合、Docker と Podman の認証情報ファイルおよび関連するプルシークレットには、同一レジストリーへの複数の参照を含めることができます。ただし、Docker および Podman のいずれも、まったく同じレジストリーパスの複数エントリーはサポートしていません。
config.json ファイルのサンプル
{
"auths":{
"cloud.openshift.com":{
"auth":"b3Blb=",
"email":"you@example.com"
},
"quay.io":{
"auth":"b3Blb=",
"email":"you@example.com"
},
"quay.io/repository-main":{
"auth":"b3Blb=",
"email":"you@example.com"
}
}
}
プルシークレットの例
apiVersion: v1
data:
.dockerconfigjson: ewogICAiYXV0aHMiOnsKICAgICAgIm0iOnsKICAgICAgIsKICAgICAgICAgImF1dGgiOiJiM0JsYj0iLAogICAgICAgICAiZW1haWwiOiJ5b3VAZXhhbXBsZS5jb20iCiAgICAgIH0KICAgfQp9Cg==
kind: Secret
metadata:
creationTimestamp: "2021-09-09T19:10:11Z"
name: pull-secret
namespace: default
resourceVersion: "37676"
uid: e2851531-01bc-48ba-878c-de96cfe31020
type: Opaque
5.4.2.1. プルシークレットの作成 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のコンテナーレジストリーで認証を行うには、既存の Docker または Podman 認証ファイルからプルシークレットを作成できます。oc create secret docker-registry コマンドを使用して、レジストリー認証情報を直接指定することで、シークレットを作成することもできます。
手順
既存の認証ファイルからシークレットを作成します。
.docker/config.jsonを使用する Docker クライアントの場合は、次のコマンドを入力します。$ oc create secret generic <pull_secret_name> \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson.config/containers/auth.jsonを使用する Podman クライアントの場合は、次のコマンドを入力します。$ oc create secret generic <pull_secret_name> \ --from-file=<path/to/.config/containers/auth.json> \ --type=kubernetes.io/podmanconfigjson
オプション: 保護されたレジストリー用の Docker 認証情報がまだない場合は、次のコマンドを実行してシークレットを作成できます。
$ oc create secret docker-registry <pull_secret_name> \ --docker-server=<registry_server> \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
5.4.2.2. ワークロードでのプルシークレットの使用 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のプライベートレジストリーからワークロードがイメージをプルできるようにするには、`oc secrets link` コマンドを入力するか、ワークロード設定の YAML ファイルで直接定義することにより、プルシークレットをサービスアカウントにリンクできます。
手順
以下のコマンドを入力して、プルシークレットをサービスアカウントにリンクします。サービスアカウントの名前は、Pod が使用するサービスアカウントの名前と一致する必要があることに注意してください。デフォルトのサービスアカウントは
defaultです。$ oc secrets link default <pull_secret_name> --for=pull以下のコマンドを入力して変更内容を確認してください。
$ oc get serviceaccount default -o yaml出力例
apiVersion: v1 imagePullSecrets: - name: default-dockercfg-123456 - name: <pull_secret_name> kind: ServiceAccount metadata: annotations: openshift.io/internal-registry-pull-secret-ref: <internal_registry_pull_secret> creationTimestamp: "2025-03-03T20:07:52Z" name: default namespace: default resourceVersion: "13914" uid: 9f62dd88-110d-4879-9e27-1ffe269poe3 secrets: - name: <pull_secret_name>オプション: シークレットをサービスアカウントにリンクする代わりに、Pod またはワークロード定義内で直接参照することもできます。これは ArgoCD などの GitOps ワークフローに役立ちます。以下に例を示します。
Pod 仕様の例
apiVersion: v1 kind: Pod metadata: name: <secure_pod_name> spec: containers: - name: <container_name> image: quay.io/my-private-image imagePullSecrets: - name: <pull_secret_name>ArgoCD ワークフローの例
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: <example_workflow> spec: entrypoint: <main_task> imagePullSecrets: - name: <pull_secret_name>
5.4.2.3. 委任された認証を使用したプライベートレジストリーからのプル リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で認証を別のサービスに委任するプライベートレジストリーからイメージをプルするには、認証サーバーとレジストリーエンドポイントの両方に対してプルシークレットを作成できます。各サービスごとに個別のシークレットを作成するには、`oc create secret docker-registry` コマンドを使用します。
手順
委任認証サーバーのシークレットを作成するには、次のコマンドを入力します。
$ oc create secret docker-registry \ --docker-server=sso.redhat.com \ --docker-username=developer@example.com \ --docker-password=******** \ --docker-email=unused \ redhat-connect-ssoプライベートレジストリー用のシークレットを作成するには、次のコマンドを入力します。
$ oc create secret docker-registry \ --docker-server=privateregistry.example.com \ --docker-username=developer@example.com \ --docker-password=******** \ --docker-email=unused \ private-registry
5.4.3. グローバルクラスターのプルシークレットの更新 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターに新しいレジストリーを追加したり、認証情報を変更したりするには、グローバルプルシークレットを置き換えるか、新しい認証情報を追加することで更新できます。`oc set data secret/pull-secret` コマンドを使用して、更新されたプルシークレットをクラスター内のすべてのノードに適用します。
クラスターを別の所有者に譲渡するには、OpenShift Cluster Manager で譲渡を開始してから、クラスターのプルシークレットを更新する必要があります。OpenShift Cluster Manager で委譲を開始せずに、クラスターのプルシークレットを更新すると、クラスターは OpenShift Cluster Manager での Telemetry メトリクスの報告を停止します。
詳細は、Red Hat OpenShift Cluster Manager ドキュメントの「クラスター所有権の譲渡」を参照してください。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
オプション: 既存のプルシークレットに新しいプルシークレットを追加するには:
以下のコマンドを入力して、プルシークレットをダウンロードしてください。
$ oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' > <pull_secret_location>ここでは、以下のようになります。
<pull_secret_location>- プルシークレットファイルへのパスを指定します。
以下のコマンドを入力して、新しいプルシークレットを追加します。
$ oc registry login --registry="<registry>" \ --auth-basic="<username>:<password>" \ --to=<pull_secret_location>ここでは、以下のようになります。
<registry>-
新しいレジストリーを指定します。同じレジストリー内に複数のリポジトリーを指定できます (例:
--registry="<registry/my-namespace/my-repository>)。 < ユーザー名 >:< パスワード >- 新しいレジストリーの認証情報を指定します。
<pull_secret_location>- プルシークレットファイルへのパスを指定します。
以下のコマンドを入力して、クラスターのグローバルプルシークレットを更新してください。このアップデートはすべてのノードに順次展開されるため、クラスターの規模によっては時間がかかる場合がありますのでご注意ください。
$ oc set data secret/pull-secret -n openshift-config \ --from-file=.dockerconfigjson=<pull_secret_location>ここでは、以下のようになります。
<pull_secret_location>- 新しいプルシークレットファイルへのパスを指定します。
第6章 イメージストリームの管理 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でコンテナーイメージを作成、更新し、バージョン変更を追跡するには、イメージストリームとタグを使用できます。イメージストリームタグを追加、更新、削除、インポートして、コンテナーイメージを管理します。
6.1. イメージストリームの使用 リンクのコピーリンクがクリップボードにコピーされました!
イメージストリームは、OpenShift Container Platform 内でコンテナーイメージを参照するための抽象化を提供します。イメージストリームを使用すると、イメージバージョンの管理、クラスター内でのビルドおよびデプロイメントの自動化を行うことができます。
イメージストリームには実際のイメージデータは含まれませんが、イメージリポジトリーと同様に、関連するイメージの単一の仮想ビューが提示されます。
ビルドおよびデプロイメントをそれぞれ実行し、ビルドおよびデプロイメントを、新規イメージが追加される際やこれに対応する際の通知をイメージストリームで確認できるように設定できます。
たとえば、デプロイメントで特定のイメージを使用していて、そのイメージの新規バージョンが作成される場合、デプロイメントを、そのイメージの新規バージョンを選択できるように自動的に実行きます。
デプロイメントまたはビルドで使用するイメージストリームタグが更新されない場合には、コンテナーイメージレジストリーのコンテナーイメージが更新されても、ビルドまたはデプロイメントは以前の、既知でおそらく適切であると予想されるイメージをそのまま使用します。
ソースイメージは以下のいずれかに保存できます。
- OpenShift Container Platform の統合レジストリー
- registry.redhat.io または quay.io などの外部レジストリー
- OpenShift Container Platform クラスターの他のイメージストリーム
ビルドまたはデプロイメント設定などのイメージストリームタグを参照するオブジェクトを定義する場合には、リポジトリーではなく、イメージストリームタグを参照します。アプリケーションのビルドまたはデプロイ時に、OpenShift Container Platform がこのイメージストリームタグを使用してリポジトリーに対してクエリーし、対象のイメージに関連付けられた ID を特定して、そのイメージを使用します。
イメージストリームメタデータは他のクラスター情報と共に etcd インスタンスに保存されます。
イメージストリームの使用には、いくつかの大きな利点があります。
- コマンドラインを使用して再プッシュすることなく、タグ付けや、タグのロールバック、およびイメージの迅速な処理を実行できます。
- 新規イメージがレジストリーにプッシュされると、ビルドおよびデプロイメントをトリガーできます。また、OpenShift Container Platform には他のリソースの汎用トリガーがあります (Kubernetes オブジェクトなど)。
- 定期的な再インポートを実行するためにタグにマークを付けることができます。ソースイメージが変更されると、その変更は選択され、イメージストリームに反映されます。これにより、ビルドまたはデプロイメント設定に応じてビルドまたはデプロイメントフローがトリガーされます。
- 詳細なアクセス制御を使用してイメージを共有し、チーム間でイメージを迅速に分散できます。
- ソースイメージが変更されると、イメージストリームタグはイメージの既知の適切なバージョンをポイントしたままになり、アプリケーションが予期せずに損傷しないようにします。
- イメージストリームオブジェクトのパーミッションを使用して、イメージを表示し、使用できるユーザーにセキュリティーを設定できます。
- クラスターレベルでイメージを読み込んだり、リスト表示するパーミッションのないユーザーは、イメージストリームを使用してプロジェクトでタグ付けされたイメージを取得できます。
6.2. イメージストリームの設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションのイメージ取得とセキュリティーポリシーをカスタマイズするには、OpenShift Container Platform 内でイメージストリームを設定します。このプロセスにより、イメージプル仕様の定義、タグの管理、信頼性の高いアプリケーションデプロイメントに必要なアクセス権限の制御が可能になります。
ImageStream オブジェクトには以下の要素が含まれます。
イメージストリームオブジェクト定義
apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
labels:
app: ruby-sample-build
template: application-template-stibuild
name: origin-ruby-sample
namespace: test
spec: {}
status:
dockerImageRepository: 172.30.56.218:5000/test/origin-ruby-sample
tags:
- items:
- created: 2017-09-02T10:15:09Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
generation: 2
image: sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
- created: 2017-09-01T13:40:11Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
generation: 1
image: sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
tag: latest
以下は、
name- イメージストリームの名前を指定します。
ruby-sample- 新規イメージをこのイメージストリームで追加または更新するためにプッシュできる Docker リポジトリーパスを指定します。
dockerImageReference- イメージストリームが現在参照する SHA ID を指定します。このイメージストリームタグを参照するリソースはこの ID を使用します。
image- このイメージストリームタグが以前に参照した SHA ID を指定します。これを使用して、古いイメージにロールバックできます。
tag- イメージストリームのタグ名を指定します。
6.3. イメージストリームイメージ リンクのコピーリンクがクリップボードにコピーされました!
特定のタグに関連付けられた実際のイメージコンテンツを正確に識別して管理するために、OpenShift Container Platform でイメージストリームイメージを参照して使用します。これにより、アプリケーションデプロイメントが確実にイミュータブルなイメージ定義をターゲットにします。
イメージストリームイメージは、イメージストリームから特定のイメージ ID をポイントします。
イメージストリームイメージにより、タグ付けされている特定のイメージストリームからイメージに関するメタデータを取得できます。
イメージストリームイメージオブジェクトは、イメージをイメージストリームにインポートしたり、タグ付けしたりする場合には OpenShift Container Platform に常に自動的に作成されます。イメージストリームを作成するために使用するイメージストリームイメージオブジェクトをイメージストリーム定義に明示的に定義する必要はありません。
イメージストリームのイメージは、リポジトリーからのイメージストリーム名とイメージ ID で構成されており、@ 記号で区切られています。
<image-stream-name>@<image-id>
ImageStream オブジェクトのサンプルでイメージを参照する際、イメージストリームのイメージは以下のようになります。
origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
6.4. イメージストリームタグ リンクのコピーリンクがクリップボードにコピーされました!
イミュータブルなイメージへの人間が判読できる参照を維持するには、OpenShift Container Platform 内でイメージストリームタグを活用します。これらのタグは、ビルドとデプロイメントで特定の安定したイメージコンテンツを正確にターゲットにするために不可欠です。
イメージストリームタグは、イメージストリームのイメージに対する名前付きポインターです。これは istag として省略されます。イメージストリームタグは、指定のイメージストリームおよびタグのイメージを参照するか、取得するために使用されます。
イメージストリームタグは、ローカル、または外部で管理されるイメージを参照できます。これには、タグが参照したすべてのイメージのスタックとして表されるイメージの履歴が含まれます。新規または既存のイメージが特定のイメージストリームタグでタグ付けされる場合はいつでも、これは履歴スタックの最初の位置に置かれます。これまで先頭の位置を占めていたイメージは 2 番目の位置に置かれます。これにより、タグを過去のイメージに再び参照させるよう簡単にロールバックできます。
以下のイメージストリームタグは、ImageStream オブジェクトからのものです。
履歴の 2 つのイメージを持つイメージストリームタグ
kind: ImageStream
apiVersion: image.openshift.io/v1
metadata:
name: my-image-stream
# ...
tags:
- items:
- created: 2017-09-02T10:15:09Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
generation: 2
image: sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
- created: 2017-09-01T13:40:11Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
generation: 1
image: sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
tag: latest
# ...
イメージストリームタグには permanent タグまたは tracking タグを使用できます。
- Permanent タグは、Python 3.5 などの特定バージョンのイメージを参照するバージョン固有のタグです。
tracking タグは別のイメージストリームタグに従う参照タグで、シンボリックリンクなどのように、フォローするイメージを変更するために更新される可能性があります。このような新規レベルでは後方互換性が確保されません。
たとえば、OpenShift Container Platform に同梱される
latestイメージストリームタグはトラッキングタグです。これは、latestイメージストリームタグのコンシューマーが、新規レべルが利用可能になるとイメージで提供されるフレームワークの最新レベルに更新されることを意味します。v3.10へのlatestイメージストリームタグはv3.11に変更される可能性が常にあります。これらのlatestイメージストリームタグは Dockerlatestタグと異なる動作をすることに注意してください。この場合、latestイメージストリームタグは Docker リポジトリーの最新イメージを参照しません。これは別のイメージストリームタグを参照し、これはイメージの最新バージョンではない可能性があります。たとえば、latestイメージストリームタグがイメージのv3.10を参照する場合、3.11バージョンがリリースされてもlatestタグはv3.11に自動的に更新されず、これがv3.11イメージストリームタグを参照するように手動で更新されるまでv3.10を参照したままになります。注記トラッキングタグは単一のイメージストリームに制限され、他のイメージストリームを参照できません。
各自のニーズに合わせて独自のイメージストリームタグを作成できます。
イメージストリームタグは、コロンで区切られた、イメージストリームの名前とタグで構成されています。
<imagestream name>:<tag>
たとえば、上記の ImageStream オブジェクトのサンプルで sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d イメージを参照するには、イメージストリームタグは以下のようになります。
origin-ruby-sample:latest
6.5. イメージストリーム変更トリガー リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションのライフサイクルを自動化して最新のコードを使用するために、OpenShift Container Platform でイメージストリームトリガーを設定します。イメージストリームトリガーにより、ビルドおよびデプロイメントは、アップストリームの新規バージョンが利用可能になると自動的に起動します。
たとえば、ビルドおよびデプロイメントは、イメージストリームタグの変更時に自動的に起動します。これは、特定のイメージストリームタグをモニターし、変更の検出時にビルドまたはデプロイメントに通知することで実行されます。
6.6. イメージストリームのマッピング リンクのコピーリンクがクリップボードにコピーされました!
イメージストリームマッピングを理解し、OpenShift Container Platform が新しくアップロードされたイメージを追跡する方法を管理します。統合レジストリーは、新しいイメージを受信すると、イメージの重要なプロジェクト、名前、タグ、メタデータを提供するイメージストリームマッピングを自動的に作成して送信します。
イメージストリームのマッピングの設定は高度な機能です。
この情報は、新規イメージを作成するする際 (すでに存在しない場合) やイメージをイメージストリームにタグ付けする際に使用されます。OpenShift Container Platform は、コマンド、エントリーポイント、および環境変数などの各イメージに関する完全なメタデータを保存します。OpenShift Container Platform のイメージはイミュータブル (変更不可能) であり、名前の最大長さは 63 文字です。
以下のイメージストリームマッピングのサンプルにより、イメージが test/origin-ruby-sample:latest としてタグ付けされます。
イメージストリームマッピングオブジェクト定義
apiVersion: image.openshift.io/v1
kind: ImageStreamMapping
metadata:
creationTimestamp: null
name: origin-ruby-sample
namespace: test
tag: latest
image:
dockerImageLayers:
- name: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
size: 0
- name: sha256:ee1dd2cb6df21971f4af6de0f1d7782b81fb63156801cfde2bb47b4247c23c29
size: 196634330
- name: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
size: 0
- name: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
size: 0
- name: sha256:ca062656bff07f18bff46be00f40cfbb069687ec124ac0aa038fd676cfaea092
size: 177723024
- name: sha256:63d529c59c92843c395befd065de516ee9ed4995549f8218eac6ff088bfa6b6e
size: 55679776
- name: sha256:92114219a04977b5563d7dff71ec4caa3a37a15b266ce42ee8f43dba9798c966
size: 11939149
dockerImageMetadata:
Architecture: amd64
Config:
Cmd:
- /usr/libexec/s2i/run
Entrypoint:
- container-entrypoint
Env:
- RACK_ENV=production
- OPENSHIFT_BUILD_NAMESPACE=test
- OPENSHIFT_BUILD_SOURCE=https://github.com/openshift/ruby-hello-world.git
- EXAMPLE=sample-app
- OPENSHIFT_BUILD_NAME=ruby-sample-build-1
- PATH=/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- STI_SCRIPTS_URL=image:///usr/libexec/s2i
- STI_SCRIPTS_PATH=/usr/libexec/s2i
- HOME=/opt/app-root/src
- BASH_ENV=/opt/app-root/etc/scl_enable
- ENV=/opt/app-root/etc/scl_enable
- PROMPT_COMMAND=. /opt/app-root/etc/scl_enable
- RUBY_VERSION=2.2
ExposedPorts:
8080/tcp: {}
Labels:
build-date: 2015-12-23
io.k8s.description: Platform for building and running Ruby 2.2 applications
io.k8s.display-name: 172.30.56.218:5000/test/origin-ruby-sample:latest
io.openshift.build.commit.author: Ben Parees <bparees@users.noreply.github.com>
io.openshift.build.commit.date: Wed Jan 20 10:14:27 2016 -0500
io.openshift.build.commit.id: 00cadc392d39d5ef9117cbc8a31db0889eedd442
io.openshift.build.commit.message: 'Merge pull request #51 from php-coder/fix_url_and_sti'
io.openshift.build.commit.ref: master
io.openshift.build.image: centos/ruby-22-centos7@sha256:3a335d7d8a452970c5b4054ad7118ff134b3a6b50a2bb6d0c07c746e8986b28e
io.openshift.build.source-location: https://github.com/openshift/ruby-hello-world.git
io.openshift.builder-base-version: 8d95148
io.openshift.builder-version: 8847438ba06307f86ac877465eadc835201241df
io.openshift.s2i.scripts-url: image:///usr/libexec/s2i
io.openshift.tags: builder,ruby,ruby22
io.s2i.scripts-url: image:///usr/libexec/s2i
license: GPLv2
name: CentOS Base Image
vendor: CentOS
User: "1001"
WorkingDir: /opt/app-root/src
Container: 86e9a4a3c760271671ab913616c51c9f3cea846ca524bf07c04a6f6c9e103a76
ContainerConfig:
AttachStdout: true
Cmd:
- /bin/sh
- -c
- tar -C /tmp -xf - && /usr/libexec/s2i/assemble
Entrypoint:
- container-entrypoint
Env:
- RACK_ENV=production
- OPENSHIFT_BUILD_NAME=ruby-sample-build-1
- OPENSHIFT_BUILD_NAMESPACE=test
- OPENSHIFT_BUILD_SOURCE=https://github.com/openshift/ruby-hello-world.git
- EXAMPLE=sample-app
- PATH=/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- STI_SCRIPTS_URL=image:///usr/libexec/s2i
- STI_SCRIPTS_PATH=/usr/libexec/s2i
- HOME=/opt/app-root/src
- BASH_ENV=/opt/app-root/etc/scl_enable
- ENV=/opt/app-root/etc/scl_enable
- PROMPT_COMMAND=. /opt/app-root/etc/scl_enable
- RUBY_VERSION=2.2
ExposedPorts:
8080/tcp: {}
Hostname: ruby-sample-build-1-build
Image: centos/ruby-22-centos7@sha256:3a335d7d8a452970c5b4054ad7118ff134b3a6b50a2bb6d0c07c746e8986b28e
OpenStdin: true
StdinOnce: true
User: "1001"
WorkingDir: /opt/app-root/src
Created: 2016-01-29T13:40:00Z
DockerVersion: 1.8.2.fc21
Id: 9d7fd5e2d15495802028c569d544329f4286dcd1c9c085ff5699218dbaa69b43
Parent: 57b08d979c86f4500dc8cad639c9518744c8dd39447c055a3517dc9c18d6fccd
Size: 441976279
apiVersion: "1.0"
kind: DockerImage
dockerImageMetadataVersion: "1.0"
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
6.7. イメージストリームの使用 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でコンテナーイメージを整理および管理するには、イメージストリームとイメージストリームタグを使用できます。イメージストリームを使用することで、イメージのバージョンを追跡し、デプロイメントを簡素化できます。
デフォルトプロジェクトでワークロードを実行したり、デフォルトプロジェクトへのアクセスを共有したりしないでください。デフォルトのプロジェクトは、コアクラスターコンポーネントを実行するために予約されています。
デフォルトプロジェクトである default、kube-public、kube-system、openshift、openshift-infra、openshift-node、および openshift.io/run-level ラベルが 0 または 1 に設定されているその他のシステム作成プロジェクトは、高い特権があるとみなされます。Pod セキュリティーアドミッション、Security Context Constraints、クラスターリソースクォータ、イメージ参照解決などのアドミッションプラグインに依存する機能は、高い特権を持つプロジェクトでは機能しません。
6.7.1. イメージストリームに関する情報の取得 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でイメージストリームを効率的に管理および監視するために、そのバージョンに関する情報を取得します。イメージストリームに関する一般情報と、それが指しているすべてのタグに関する詳細情報を取得できるため、デプロイされたアプリケーションが正しいイメージバージョンに依存していることを確認できます。
手順
イメージストリームに関する一般情報と、それが指しているすべてのタグに関する詳細情報を取得するには、次のコマンドを入力します。
$ oc describe is/<image-name>以下に例を示します。
$ oc describe is/python出力例
Name: python Namespace: default Created: About a minute ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2017-10-02T17:05:11Z Docker Pull Spec: docker-registry.default.svc:5000/default/python Image Lookup: local=false Unique Images: 1 Tags: 1 3.5 tagged from centos/python-35-centos7 * centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 About a minute ago特定のイメージストリームタグに関して利用可能なすべての情報を取得するには、次のコマンドを入力します。
$ oc describe istag/<image-stream>:<tag-name>以下に例を示します。
$ oc describe istag/python:latest出力例
Image Name: sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 Docker Image: centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 Name: sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 Created: 2 minutes ago Image Size: 251.2 MB (first layer 2.898 MB, last binary layer 72.26 MB) Image Created: 2 weeks ago Author: <none> Arch: amd64 Entrypoint: container-entrypoint Command: /bin/sh -c $STI_SCRIPTS_PATH/usage Working Dir: /opt/app-root/src User: 1001 Exposes Ports: 8080/tcp Docker Labels: build-date=20170801注記表示されている以上の情報が出力されます。
次のコマンドを入力して、イメージストリームタグがサポートするアーキテクチャーまたはオペレーティングシステムを検出します。
$ oc get istag <image-stream-tag> -ojsonpath="{range .image.dockerImageManifests[*]}{.os}/{.architecture}{'\n'}{end}"以下に例を示します。
$ oc get istag busybox:latest -ojsonpath="{range .image.dockerImageManifests[*]}{.os}/{.architecture}{'\n'}{end}"出力例
linux/amd64 linux/arm linux/arm64 linux/386 linux/mips64le linux/ppc64le linux/riscv64 linux/s390x
6.7.2. イメージストリームへのタグの追加 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーイメージの特定バージョンを正確に管理および追跡するために、OpenShift Container Platform 内のイメージストリームにタグを追加します。これにより、環境全体で信頼性の高い参照とデプロイメントを確保できます。
手順
既存タグのいずれかを参照するタグを追加するには、`oc tag` コマンドを使用できます。
$ oc tag <image-name:tag1> <image-name:tag2>以下に例を示します。
$ oc tag python:3.5 python:latest出力例
Tag python:latest set to python@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25.イメージストリームに、外部コンテナーイメージを参照するタグ (
3.5) と、この最初のタグに基づいて作成されているために同じイメージを参照する別のタグ (latest) の 2 つのタグが含まれることを確認します。$ oc describe is/python出力例
Name: python Namespace: default Created: 5 minutes ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2017-10-02T17:05:11Z Docker Pull Spec: docker-registry.default.svc:5000/default/python Image Lookup: local=false Unique Images: 1 Tags: 2 latest tagged from python@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 * centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 About a minute ago 3.5 tagged from centos/python-35-centos7 * centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 5 minutes ago
6.7.3. 外部イメージのタグの追加 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform リソースが外部レジストリーから取得したコンテナーイメージを追跡および使用できるように、対応するイメージストリームにタグを追加します。このアクションにより、外部のイメージコンテンツがクラスターのローカルイメージ管理システムに安全に統合されます。
手順
タグ関連のすべての操作に
oc tagコマンドを使用して、内部または外部イメージをポイントするタグを追加します。$ oc tag <repository/image> <image-name:tag>たとえば、このコマンドは
docker.io/python:3.6.0イメージをpythonイメージストリームの3.6タグにマップします。$ oc tag docker.io/python:3.6.0 python:3.6出力例
Tag python:3.6 set to docker.io/python:3.6.0.外部イメージのセキュリティーが保護されている場合、そのレジストリーにアクセスするために認証情報を使用してシークレットを作成する必要があります
6.7.4. イメージストリームタグの更新 リンクのコピーリンクがクリップボードにコピーされました!
デプロイメント定義の柔軟性と整合性を維持するために、イメージストリームタグを更新して、OpenShift Container Platform の別のタグを反映します。具体的には、タグを更新してイメージストリーム内の別のタグを反映することができます。これは、イメージバージョンを効果的に管理するために不可欠です。
手順
タグを更新します。
$ oc tag <image-name:tag> <image-name:latest>たとえば、以下は
latestタグを更新し、3.6タグをイメージタグに反映させます。$ oc tag python:3.6 python:latest出力例
Tag python:latest set to python@sha256:438208801c4806548460b27bd1fbcb7bb188273d13871ab43f.
6.7.5. イメージストリームタグの削除 リンクのコピーリンクがクリップボードにコピーされました!
イメージ履歴を制御し、OpenShift Container Platform 内での管理を単純化するために、イメージストリームから古いタグを削除できます。このアクションにより、リソースは現在の必要なイメージ参照のみを追跡します。
手順
古いタグをイメージストリームから削除します。
$ oc tag -d <image-name:tag>以下に例を示します。
$ oc tag -d python:3.6出力例
Deleted tag default/python:3.6
6.7.6. イメージストリームタグの定期的なインポートの設定 リンクのコピーリンクがクリップボードにコピーされました!
外部コンテナーイメージレジストリーからのイメージ定義を最新の状態に保つために、イメージストリームタグの定期的なインポートを設定します。このプロセスでは、--scheduled フラグを使用して、重要なセキュリティー更新のイメージをすばやく再インポートできます。
手順
イメージインポートのスケジュール
$ oc tag <repository/image> <image-name:tag> --scheduled以下に例を示します。
$ oc tag docker.io/python:3.6.0 python:3.6 --scheduled出力例
Tag python:3.6 set to import docker.io/python:3.6.0 periodically.このコマンドにより、OpenShift Container Platform はこの特定のイメージストリームタグを定期的に更新します。この期間はクラスター全体のデフォルトで 15 分に設定されます。
定期的なチェックを削除するには、上記のコマンド再実行しますが、
--scheduledフラグを省略します。これにより、その動作がデフォルトに再設定されます。$ oc tag <repositiory/image> <image-name:tag>
6.8. イメージとイメージストリームのインポートと操作 リンクのコピーリンクがクリップボードにコピーされました!
コンテナーイメージを OpenShift Container Platform クラスターに取り込み、その参照を管理するには、外部レジストリーからイメージをインポートし、イメージストリームを使用して整理することができます。このプロセスを利用することで、アプリケーション用のコンテナーイメージを一元管理されたレジストリーとして維持できます。
次のセクションでは、イメージストリームをインポートして操作する方法を説明します。
6.8.1. プライベートレジストリーからのイメージおよびイメージストリームのインポート リンクのコピーリンクがクリップボードにコピーされました!
外部ソースのコンテンツを安全に管理するために、認証を必要とするプライベートレジストリーからタグとイメージのメタデータをインポートするようにイメージストリームを設定します。この手順は、Cluster Samples Operator がコンテンツをプルするために使用するレジストリーをデフォルトの registry.redhat.io 以外に変更する場合に不可欠です。
セキュアでないレジストリーからインポートする場合には、シークレットに定義されたレジストリーの URL に :80 ポートの接尾辞を追加するようにしてください。追加していない場合にレジストリーからインポートしようとすると、このシークレットは使用されません。
手順
以下のコマンドを入力して、認証情報を保存するために使用する
secretオブジェクトを作成する必要があります。$ oc create secret generic <secret_name> --from-file=.dockerconfigjson=<file_absolute_path> --type=kubernetes.io/dockerconfigjsonシークレットが設定されたら、新規イメージストリームを作成するか、
oc import-imageコマンドを入力します。$ oc import-image <imagestreamtag> --from=<image> --confirmインポートプロセスで OpenShift Container Platform はシークレットを取得してリモートパーティーに提供します。
6.8.2. マニフェストリストの操作 リンクのコピーリンクがクリップボードにコピーされました!
マニフェストリスト内に含まれるマルチアーキテクチャーまたはバリアントイメージを正確に管理するために、oc import-image または oc tag CLI コマンドで --import-mode フラグを使用します。この機能を使用すると、マニフェストリストの単一のサブマニフェストまたはすべてのマニフェストをインポートして、イメージストリームコンテンツをきめ細かく制御できます。
場合によっては、ユーザーがサブマニフェストを直接使用したい場合があります。oc adm prune images が実行されている場合、または CronJob プルーナーが実行されている場合、サブマニフェストリストが使用されていることを検出できません。その結果、oc adm prune images または CronJob プルーナーを使用する管理者は、サブマニフェストを含むマニフェストリスト全体を削除する可能性があります。
この制限を回避するには、代わりにタグ別またはダイジェスト別のマニフェストリストを使用できます。
手順
次のコマンドを入力して、マルチアーキテクチャーイメージを含むイメージストリームを作成し、インポートモードを
PreserveOriginalに設定します。$ oc import-image <multiarch-image-stream-tag> --from=<registry>/<project_name>/<image-name> \ --import-mode='PreserveOriginal' --reference-policy=local --confirm出力例
--- Arch: <none> Manifests: linux/amd64 sha256:6e325b86566fafd3c4683a05a219c30c421fbccbf8d87ab9d20d4ec1131c3451 linux/arm64 sha256:d8fad562ffa75b96212c4a6dc81faf327d67714ed85475bf642729703a2b5bf6 linux/ppc64le sha256:7b7e25338e40d8bdeb1b28e37fef5e64f0afd412530b257f5b02b30851f416e1 ---または、次のコマンドを入力して、マニフェストリストを破棄し、単一のサブマニフェストをインポートする
Legacyインポートモードでイメージをインポートします。$ oc import-image <multiarch-image-stream-tag> --from=<registry>/<project_name>/<image-name> \ --import-mode='Legacy' --confirm注記--import-mode=のデフォルト値はLegacyです。この値を除外するか、LegacyまたはPreserveOriginalのいずれかを指定しないと、単一のサブマニフェストがインポートされます。無効なインポートモードは次のエラーを返します:error: valid ImportMode values are Legacy or PreserveOriginal。
6.8.2.1. マニフェストリストの定期的なインポートの設定 リンクのコピーリンクがクリップボードにコピーされました!
複雑なマルチアーキテクチャーイメージの最新のイメージ参照を維持するために、マニフェストリストの定期的なインポートを設定します。マニフェストリストを定期的に再インポートするには、--scheduled フラグを使用して、イメージストリームが外部レジストリーからの最新バージョンを追跡するようにします。
手順
次のコマンドを入力して、マニフェストリストを定期的に更新するようにイメージストリームを設定します。
$ oc import-image <multiarch-image-stream-tag> --from=<registry>/<project_name>/<image-name> \ --import-mode='PreserveOriginal' --scheduled=true
6.8.2.2. マニフェストリストのインポート時の SSL/TLS 設定 リンクのコピーリンクがクリップボードにコピーされました!
外部リポジトリーから取得したマニフェストリストの接続セキュリティーとアクセスポリシーを制御するために、イメージのインポート中に SSL/TLS 設定を指定します。マニフェストリストをインポートするときに SSL/TLS を設定するには、必要に応じて --insecure フラグを使用して標準の証明書検証要件をバイパスします。
手順
--insecure=trueを設定すると、マニフェストリストのインポートで SSL/TLS 検証がスキップされます。以下に例を示します。$ oc import-image <multiarch-image-stream-tag> --from=<registry>/<project_name>/<image-name> \ --import-mode='PreserveOriginal' --insecure=true
6.8.3. --import-mode のアーキテクチャーの指定 リンクのコピーリンクがクリップボードにコピーされました!
インポートしたイメージのアーキテクチャーを制御し、適切なデプロイメントを確実に行うために、--import-mode= フラグを使用します。必要に応じて、--import-mode= フラグを除外または含めることで、インポートしたイメージストリームをマルチアーキテクチャーとシングルアーキテクチャーの間で入れ替えることができます。
手順
次のコマンドを実行して、
--import-mode=フラグを除外して、イメージストリームをマルチアーキテクチャーからシングルアーキテクチャーに更新します。$ oc import-image <multiarch-image-stream-tag> --from=<registry>/<project_name>/<image-name>次のコマンドを実行して、イメージストリームをシングルアーキテクチャーからマルチアーキテクチャーに更新します。
$ oc import-image <multiarch_image_stream_tag> --from=<registry>/<project_name>/<image_name> \ --import-mode='PreserveOriginal'
6.8.4. --import-mode の設定フィールド リンクのコピーリンクがクリップボードにコピーされました!
--import-mode フラグを使用してマルチアーキテクチャーイメージ管理を実装するために、必要な設定フィールドを参照します。これらのフィールドは、特定のマニフェストを選択して OpenShift Container Platform クラスターにインポートするための正確なパラメーターを定義します。
次の表に、--import-mode= フラグで使用できるオプションを示します。
| パラメーター | 説明 |
|---|---|
| レガシー |
|
| PreserveOriginal | 指定すると、元のマニフェストが保持されます。マニフェスト一覧の場合は、マニフェストの一覧とそのすべてのサブマニフェストがインポートされます。 |
第7章 Kubernetes リソースでのイメージストリームの使用 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のネイティブリソースと標準の Kubernetes リソースの両方でイメージストリームを使用するには、リソース定義内でイメージストリームを参照します。イメージストリームは、Build、DeploymentConfigs、Job、ReplicationController、ReplicaSet、デプロイメント などのリソースと連携して動作します。
7.1. Kubernetes リソースでのイメージストリームの有効化 リンクのコピーリンクがクリップボードにコピーされました!
Kubernetes リソースを使用する場合は、イメージストリーム名とそのタグを識別する ruby:2.5 などのセグメント値を 1 つ指定して、同じプロジェクト内にあるイメージストリームを参照する必要があります。これにより、リソースがそのスコープ内のローカルイメージストリームを正しくターゲットにします。
デフォルトプロジェクトでワークロードを実行したり、デフォルトプロジェクトへのアクセスを共有したりしないでください。デフォルトのプロジェクトは、コアクラスターコンポーネントを実行するために予約されています。
デフォルトプロジェクトである default、kube-public、kube-system、openshift、openshift-infra、openshift-node、および openshift.io/run-level ラベルが 0 または 1 に設定されているその他のシステム作成プロジェクトは、高い特権があるとみなされます。Pod セキュリティーアドミッション、Security Context Constraints、クラスターリソースクォータ、イメージ参照解決などのアドミッションプラグインに依存する機能は、高い特権を持つプロジェクトでは機能しません。
Kubernetes リソースでイメージストリームを有効にする方法は 2 つあります。
- 特定のリソースでイメージストリームの解決を有効にする。これにより、このリソースのみがイメージフィールドのイメージストリーム名を使用できます。
- イメージストリームでイメージストリームの解決を有効にする。これにより、このイメージストリームを参照するすべてのリソースがイメージフィールドのイメージストリーム名を使用できます。
oc set image-lookup を使用して、特定のリソース上のイメージストリームの解決またはイメージストリーム上のイメージストリームの解決を有効にすることができます。
手順
すべてのリソースが
mysqlという名前のイメージストリームを参照できるようにするには、以下のコマンドを入力します。$ oc set image-lookup mysqlこれにより、
Imagestream.spec.lookupPolicy.localフィールドが true に設定されます。イメージルックアップが有効なイメージストリーム
apiVersion: image.openshift.io/v1 kind: ImageStream metadata: annotations: openshift.io/display-name: mysql name: mysql namespace: myproject spec: lookupPolicy: local: true有効な場合には、この動作はイメージストリーム内のすべてのタグに対して有効化されます。
次に、イメージストリームをクエリーし、このオプションが設定されているかどうかを確認できます。
$ oc set image-lookup imagestream --listオプション: 特定のリソースでイメージ検索を有効にできます。
mysqlという名前の Kubernetes デプロイメントがイメージストリームを使用できるようにするには、以下のコマンドを実行します。$ oc set image-lookup deploy/mysqlこれにより、
alpha.image.policy.openshift.io/resolve-namesアノテーションがデプロイメントに設定されます。イメージルックアップが有効にされたデプロイメント
apiVersion: apps/v1 kind: Deployment metadata: name: mysql namespace: myproject spec: replicas: 1 template: metadata: annotations: alpha.image.policy.openshift.io/resolve-names: '*' spec: containers: - image: mysql:latest imagePullPolicy: Always name: mysqlオプション: イメージ検索を無効にするには、
--enabled=falseを渡します。$ oc set image-lookup deploy/mysql --enabled=false
第8章 イメージストリームの変更時の更新のトリガー リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でイメージストリームタグが更新されると、プラットフォームはそれらのタグを参照するデプロイメントとビルドに新しいイメージを自動的に展開します。この自動トリガー動作の設定方法は、イメージストリームを使用するリソースの種類によって異なります。
8.1. OpenShift Container Platform リソース リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform デプロイメントの設定およびビルド設定は、イメージストリームタグの変更によって自動的にトリガーされます。トリガーされたアクションは更新されたイメージストリームタグで参照されるイメージの新規の値を使用して実行できます。
8.2. Kubernetes リソースのトリガー リンクのコピーリンクがクリップボードにコピーされました!
デプロイメント や ステートフルセット などの Kubernetes リソースが新しいイメージバージョンをシームレスに利用できるようにするには、OpenShift Container Platform でイメージストリームの変更トリガーを設定します。これにより、関連付けられたイメージストリームが変更を検出すると、アプリケーションのデプロイメントが自動的に更新されます。
API 定義の一部としてトリガーを制御するためのフィールドセットを含むデプロイメントおよびビルド設定とは異なり、Kubernetes リソースにはトリガー用のフィールドがありません。その代わりに、OpenShift Container Platform でアノテーションを使用してトリガーを要求できるようにします。
アノテーションは以下のように定義されます。
apiVersion: v1
kind: Pod
metadata:
annotations:
image.openshift.io/triggers:
[
{
"from": {
"kind": "ImageStreamTag",
"name": "example:latest",
"namespace": "myapp"
},
"fieldPath": "spec.template.spec.containers[?(@.name==\"web\")].image",
"paused": false
},
# ...
]
# ...
ここでは、以下のようになります。
kind-
トリガーの発生元となるリソースを指定します。値は必ず
ImageStreamTagとします。 name- イメージストリームタグの名前を指定します。
namespace- オブジェクトの namespace を指定します。このフィールドは任意です。
fieldPath-
変更する JSON パスを指定します。このフィールドは制限され、ID またはインデックスでコンテナーに正確に一致する JSON パス式のみを受け入れます。Pod の場合、JSON パスは
spec.containers[?(@.name='web')].imageです。 paused-
トリガーを一時停止するか指定します。これはオプションのフィールドで、デフォルト値は
falseです。このトリガーを一時的に無効にするには、値をtrueに設定します。
コア Kubernetes リソースの 1 つに Pod テンプレートとこのアノテーションの両方が含まれる場合、OpenShift Container Platform は現時点でトリガーで参照されるイメージストリームタグに関連付けられているイメージを使用してオブジェクトの更新を試行します。この更新は、指定の fieldPath に対して実行されます。
Pod テンプレートおよびアノテーションの両方が含まれるコア Kubernetes リソースの例には、以下が含まれます。
-
CronJobs -
Deployments -
StatefulSets -
DaemonSets -
Jobs -
ReplicationControllers -
Pods
8.3. Kubernetes リソースでのイメージトリガーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Kubernetes によって管理されるデプロイ済みのアプリケーションの自動更新を有効にするには、コマンドラインインターフェイス (CLI) を使用して、Kubernetes リソースにイメージストリーム変更トリガーを設定します。これにより、アップストリームイメージの新しいバージョンが利用可能になったときに、Deployments や StatefulSets などのリソースが自動的に呼び出されます。
イメージトリガーをデプロイメントに追加する際に、oc set triggers コマンドを使用できます。たとえば、この手順のコマンド例は、イメージ変更トリガーを example という名前のデプロイメントに追加し、example:latest イメージストリームタグの更新時に、デプロイメント内の web コンテナーが新規の値で更新されるようにします。このコマンドは、デプロイメントリソースに正しい image.openshift.io/triggers アノテーションを設定します。
手順
oc set triggersコマンドを入力して Kubernetes リソースをトリガーします。$ oc set triggers deploy/example --from-image=example:latest -c webトリガーアノテーションを使用したデプロイメントの例
apiVersion: apps/v1 kind: Deployment metadata: annotations: image.openshift.io/triggers: '[{"from":{"kind":"ImageStreamTag","name":"example:latest"},"fieldPath":"spec.template.spec.containers[?(@.name==\"container\")].image"}]' # ...デプロイメントが一時停止されない限り、この Pod テンプレートの更新により、デプロイメントはイメージの新規の値で自動的に実行されます。
第9章 イメージ設定リソース リンクのコピーリンクがクリップボードにコピーされました!
コンテナーイメージを保存および提供するためのイメージレジストリーを設定できます。
9.1. イメージコントローラー設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
image.config.openshift.io/cluster リソースの spec で、クラスター全体でイメージを処理する特定のパラメーターを設定できます。
次の設定不可能なパラメーターは表に示されていません。
-
DisableScheduledImport -
MaxImagesBulkImportedPerRepository -
MaxScheduledImportsPerMinute -
ScheduledImageImportMinimumIntervalSeconds -
InternalRegistryHostname
| フィールド名 | 説明 |
|---|---|
|
|
イメージの処理方法についてのクラスター全体の情報を保持します。この CR の標準かつ唯一の有効な名前は |
|
|
標準ユーザーがイメージのインポートに使用できるコンテナーイメージレジストリーを制限します。このリストを、有効なイメージを含むものとしてユーザーが信頼し、アプリケーションのインポート元となるレジストリーに設定します。イメージまたは このリストのすべての要素に、レジストリーのドメイン名で指定されるレジストリーの場所が含まれます。
|
|
|
この config map の namespace は |
|
|
デフォルトの外部イメージレジストリーのホスト名を指定します。外部ホスト名は、イメージレジストリーが外部に公開される場合にのみ設定される必要があります。最初の値は、イメージストリームの |
|
| コンテナーランタイムがビルドおよび Pod のイメージへのアクセス時に個々のレジストリーを処理する方法を決定する設定が含まれます。たとえば、非セキュアなアクセスを許可するかどうかなどです。内部クラスターレジストリーの設定は含まれません。
|
|
| イメージストリームのインポートモードの動作を制御します。
このフィールドに値を指定すると、この値がまだ手動で設定されていない、新しく作成されたイメージストリームタグにその値が適用されます。
このフィールドを設定しない場合、
マニフェストリストのインポートの詳細は、「マニフェストリストの操作」を参照してください。 重要
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。 |
allowedRegistries パラメーターを定義すると、明示的にリストされていない限り、registry.redhat.io、quay.io、およびデフォルトの OpenShift イメージレジストリーを含むすべてのレジストリーがブロックされます。ペイロードイメージに必要なすべてのレジストリーを allowedRegistries リストに追加する必要があります。たとえば、registry.redhat.io、quay.io、および internalRegistryHostname レジストリーをリストに追加します。非接続クラスターの場合は、ミラーレジストリーも追加する必要があります。そうしなければ、Pod で障害が発生する危険があります。
image.config.openshift.io/cluster リソースの status フィールドは、クラスターから観察される値を保持します。
| パラメーター | 説明 |
|---|---|
|
|
|
|
|
Image Registry Operator によって設定され、イメージレジストリーが外部に公開されるときに、イメージレジストリーの外部ホスト名を提供します。最初の値は、イメージストリームの |
9.2. Machine Config Operator の動作とレジストリーの変更 リンクのコピーリンクがクリップボードにコピーされました!
Machine Config Operator (MCO) は、image.config.openshift.io/cluster カスタムリソース (CR) を監視してレジストリーへの変更を検出し、レジストリーが変更された場合には特定の手順を実行します。
レジストリーへの変更が image.config.openshift.io/cluster CR に適用されると、MCO は以下の一連のアクションを実行します。
- ノードに対して cordon を実行します。特定のパラメーターではノードに対して drain が実行され、他のパラメーターでは実行されません。
- CRI-O を再起動して変更を適用します
ノードを解放します
注記MCO は、変更を検出してもノードを再起動しません。この期間中、サービスが利用できなくなる可能性があります。
9.2.1. レジストリーソースを許可またはブロックする場合 リンクのコピーリンクがクリップボードにコピーされました!
MCO は、image.config.openshift.io/cluster リソースでレジストリーの変更を監視します。MCO が変更を検出すると、machine config pool (MCP) 内のノードでロールアウトがトリガーされます。許可されたレジストリーのリストは、各ノードの /etc/containers/policy.json ファイルでイメージ署名ポリシーを更新するために使用されます。/etc/containers/policy.json ファイルへの変更において、ノードをドレインする必要はありません。
9.2.2. containerRuntimeSearchRegistries パラメーターを使用する場合 リンクのコピーリンクがクリップボードにコピーされました!
ノードが Ready 状態に戻った後に、containerRuntimeSearchRegistries パラメーターが追加されると、MCO はリスト表示されるレジストリーで各ノードの /etc/containers/registries.conf.d ディレクトリーにファイルを作成します。このファイルは、/etc/containers/registries.conf ファイルの非修飾検索レジストリーのデフォルトリストをオーバーライドします。修飾されていない検索レジストリーのデフォルトリストにフォールバックする方法はありません。
containerRuntimeSearchRegistries パラメーターは、Podman および CRI-O コンテナーエンジンを使用する場合のみ機能します。リストのレジストリーは、ビルドおよびイメージストリームではなく、Pod 仕様でのみ使用できます。
9.3. イメージレジストリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
image.config.openshift.io/cluster カスタムリソース (CR) を編集してイメージレジストリーの設定を行うことができます。
手順
次のコマンドを実行して、
image.config.openshift.io/clusterCR を編集します。$ oc edit image.config.openshift.io/cluster以下は、
image.config.openshift.io/clusterCR の例になります。apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: allowedRegistriesForImport: - domainName: quay.io insecure: false additionalTrustedCA: name: myconfigmap registrySources: allowedRegistries: - example.com - quay.io - registry.redhat.io - image-registry.openshift-image-registry.svc:5000 - reg1.io/myrepo/myapp:latest insecureRegistries: - insecure.com status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000注記allowedRegistries、blockedRegistries、またはinsecureRegistriesパラメーターを使用する場合、レジストリー内に個別のリポジトリーを指定できます。例:reg1.io/myrepo/myapp:latest起こりうるセキュリティーリスクを軽減するために、非セキュアな外部レジストリーの使用を避けてください。
検証
次のコマンドを実行してノードをリスト表示し、変更を確認します。
$ oc get nodes出力例
NAME STATUS ROLES AGE VERSION ip-10-0-137-182.us-east-2.compute.internal Ready,SchedulingDisabled worker 65m v1.33.4 ip-10-0-139-120.us-east-2.compute.internal Ready,SchedulingDisabled control-plane 74m v1.33.4 ip-10-0-176-102.us-east-2.compute.internal Ready control-plane 75m v1.33.4 ip-10-0-188-96.us-east-2.compute.internal Ready worker 65m v1.33.4 ip-10-0-200-59.us-east-2.compute.internal Ready worker 63m v1.33.4 ip-10-0-223-123.us-east-2.compute.internal Ready control-plane 73m v1.33.4
9.3.1. 特定のレジストリーを許可リストに追加する リンクのコピーリンクがクリップボードにコピーされました!
image.config.openshift.io/cluster カスタムリソース (CR) を編集することで、イメージのプルおよびプッシュアクションで許可されるレジストリーのリスト、またはレジストリー内の個々のレポジトリーを追加できます。
OpenShift Container Platform は、この CR への変更をクラスター内のすべてのノードに適用します。
イメージをプルまたはプッシュする場合、コンテナーランタイムは image.config.openshift.io/cluster CR の registrySources パラメーターの下にリスト表示されるレジストリーを検索します。allowedRegistries パラメーターの下にレジストリーのリストを作成している場合、コンテナーランタイムはそれらのレジストリーのみを検索します。許可リストにないレジストリーはブロックされます。
allowedRegistries パラメーターを定義すると、明示的にリストされていない限り、registry.redhat.io、quay.io、およびデフォルトの OpenShift イメージレジストリーを含むすべてのレジストリーがブロックされます。ペイロードイメージに必要なすべてのレジストリーを allowedRegistries リストに追加する必要があります。たとえば、registry.redhat.io、quay.io、および internalRegistryHostname レジストリーをリストに追加します。非接続クラスターの場合は、ミラーレジストリーも追加する必要があります。そうしなければ、Pod で障害が発生する危険があります。
手順
次のコマンドを実行して、
image.config.openshift.io/clusterカスタムリソースを編集します。$ oc edit image.config.openshift.io/cluster以下は、許可リストを含む
image.config.openshift.io/clusterリソースの例になります。apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: registrySources: allowedRegistries: - example.com - quay.io - registry.redhat.io - reg1.io/myrepo/myapp:latest - image-registry.openshift-image-registry.svc:5000 status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000設定を更新したら、次のコマンドを実行してノードをリスト表示します。
$ oc get nodes出力例
NAME STATUS ROLES AGE VERSION <node_name> Ready control-plane,master 37m v1.27.8+4fab27b次のコマンドを実行して、ノードでデバッグモードに入ります。
$ oc debug node/<node_name><node_name> はノードの名前に置き換えます。
プロンプトが表示されたら、ターミナルに
chroot /hostを入力します。sh-4.4# chroot /host
検証
次のコマンドを実行して、レジストリーがポリシーファイル内にあることを確認します。
sh-5.1# cat /etc/containers/policy.json | jq '.'以下のポリシーは、
example.com、quay.io、およびregistry.redhat.ioレジストリーのイメージのみがイメージのプルおよびプッシュにアクセスできることを示しています。イメージ署名ポリシーファイルの例
{ "default":[ { "type":"reject" } ], "transports":{ "atomic":{ "example.com":[ { "type":"insecureAcceptAnything" } ], "image-registry.openshift-image-registry.svc:5000":[ { "type":"insecureAcceptAnything" } ], "insecure.com":[ { "type":"insecureAcceptAnything" } ], "quay.io":[ { "type":"insecureAcceptAnything" } ], "reg4.io/myrepo/myapp:latest":[ { "type":"insecureAcceptAnything" } ], "registry.redhat.io":[ { "type":"insecureAcceptAnything" } ] }, "docker":{ "example.com":[ { "type":"insecureAcceptAnything" } ], "image-registry.openshift-image-registry.svc:5000":[ { "type":"insecureAcceptAnything" } ], "insecure.com":[ { "type":"insecureAcceptAnything" } ], "quay.io":[ { "type":"insecureAcceptAnything" } ], "reg4.io/myrepo/myapp:latest":[ { "type":"insecureAcceptAnything" } ], "registry.redhat.io":[ { "type":"insecureAcceptAnything" } ] }, "docker-daemon":{ "":[ { "type":"insecureAcceptAnything" } ] } } }注記クラスターが
registrySources.insecureRegistriesパラメーターを使用する場合、非セキュアなレジストリーが許可リストに含まれることを確認します。以下に例を示します。
spec: registrySources: insecureRegistries: - insecure.com allowedRegistries: - example.com - quay.io - registry.redhat.io - insecure.com - image-registry.openshift-image-registry.svc:5000
9.3.2. 特定のレジストリーのブロック リンクのコピーリンクがクリップボードにコピーされました!
image.config.openshift.io/cluster カスタムリソース (CR) を編集して、レジストリー、またはレジストリー内の個別のリポジトリーをブロックできます。
OpenShift Container Platform は、この CR への変更をクラスター内のすべてのノードに適用します。
イメージをプルまたはプッシュする場合、コンテナーランタイムは image.config.openshift.io/cluster CR の registrySources パラメーターの下にリスト表示されるレジストリーを検索します。blockedRegistries パラメーターの下にレジストリーのリストを作成した場合、コンテナーランタイムはそれらのレジストリーを検索しません。他のすべてのレジストリーは許可されます。
Pod の障害を防ぐために、registry.redhat.io および quay.io レジストリーを blockedRegistries リストに追加しないでください。環境内のペイロードイメージには、これらのレジストリーへのアクセスが必要です。
手順
次のコマンドを実行して、
image.config.openshift.io/clusterカスタムリソースを編集します。$ oc edit image.config.openshift.io/cluster以下は、ブロックリストを含む
image.config.openshift.io/clusterCR の例です。apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: registrySources: blockedRegistries: - untrusted.com - reg1.io/myrepo/myapp:latest status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000blockedRegistriesパラメーターとallowedRegistriesパラメーターの両方を設定することはできません。いずれかを選択する必要があります。次のコマンドを実行して、ノードのリストを取得します。
$ oc get nodes出力例
NAME STATUS ROLES AGE VERSION <node_name> Ready control-plane,master 37m v1.27.8+4fab27b次のコマンドを実行し、ノード上でデバッグモードに入ります。
$ oc debug node/<node_name><node_name> は、詳細が必要なノードの名前に置き換えます。
プロンプトが表示されたら、ターミナルに
chroot /hostを入力します。sh-4.4# chroot /host
検証
次のコマンドを実行して、レジストリーがポリシーファイル内にあることを確認します。
sh-5.1# cat etc/containers/registries.conf以下の例では、
untrusted.comレジストリーからのイメージが、イメージのプルおよびプッシュでブロックされることを示しています。出力例
unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] [[registry]] prefix = "" location = "untrusted.com" blocked = true
9.3.3. ペイロードレジストリーのブロック リンクのコピーリンクがクリップボードにコピーされました!
ミラーリング設定では、ImageContentSourcePolicy (ICSP) オブジェクトを使用して、非接続環境でアップストリームペイロードレジストリーをブロックできます。以下の手順例は、quay.io/openshift-payload ペイロードレジストリーをブロックする方法を示しています。
手順
ImageContentSourcePolicy(ICSP) オブジェクトを使用してミラー設定を作成し、ペイロードをインスタンスのレジストリーにミラーリングします。以下の ICSP ファイルの例は、ペイロードinternal-mirror.io/openshift-payloadをミラーリングします。apiVersion: operator.openshift.io/v1alpha1 kind: ImageContentSourcePolicy metadata: name: my-icsp spec: repositoryDigestMirrors: - mirrors: - internal-mirror.io/openshift-payload source: quay.io/openshift-payloadオブジェクトがノードにデプロイされたら、
/etc/containers/registries.confカスタムリソース (CR) をチェックして、ミラー設定が指定されていることを確認します。出力例
[[registry]] prefix = "" location = "quay.io/openshift-payload" mirror-by-digest-only = true [[registry.mirror]] location = "internal-mirror.io/openshift-payload"次のコマンドを使用して、
image.config.openshift.ioCR を編集します。$ oc edit image.config.openshift.io clusterペイロードレジストリーをブロックするには、次の設定を
image.config.openshift.ioCR に追加します。spec: registrySources: blockedRegistries: - quay.io/openshift-payload
検証
ノードの
/etc/containers/registries.confファイルをチェックして、上流のペイロードレジストリーがブロックされていることを確認します。サンプル
/etc/containers/registries.confファイル[[registry]] prefix = "" location = "quay.io/openshift-payload" blocked = true mirror-by-digest-only = true [[registry.mirror]] location = "internal-mirror.io/openshift-payload"
9.3.4. 非セキュアなレジストリー リンクのコピーリンクがクリップボードにコピーされました!
image.config.openshift.io/cluster カスタムリソース (CR) を編集して、非セキュアなレジストリー、またはレジストリー内の個別のリポジトリーを追加できます。
OpenShift Container Platform は、この CR への変更をクラスター内のすべてのノードに適用します。有効な SSL 証明書を使用しないレジストリー、または HTTPS 接続を必要としないレジストリーは、非セキュアであると見なされます。
起こりうるセキュリティーリスクを軽減するために、非セキュアな外部レジストリーの使用を避けてください。
+ :leveloffset: +1
allowedRegistries パラメーターを定義すると、明示的にリストされていない限り、registry.redhat.io、quay.io、およびデフォルトの OpenShift イメージレジストリーを含むすべてのレジストリーがブロックされます。ペイロードイメージに必要なすべてのレジストリーを allowedRegistries リストに追加する必要があります。たとえば、registry.redhat.io、quay.io、および internalRegistryHostname レジストリーをリストに追加します。非接続クラスターの場合は、ミラーレジストリーも追加する必要があります。そうしなければ、Pod で障害が発生する危険があります。
手順
次のコマンドを実行して、
image.config.openshift.io/clusterカスタムリソース (CR) を編集します。$ oc edit image.config.openshift.io/cluster以下は、非セキュアなレジストリーのリストを含む
image.config.openshift.io/clusterCR の例になります。apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: registrySources: insecureRegistries: - insecure.com - reg4.io/myrepo/myapp:latest allowedRegistries: - example.com - quay.io - registry.redhat.io - insecure.com - reg4.io/myrepo/myapp:latest - image-registry.openshift-image-registry.svc:5000 status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
検証
ノード上で次のコマンドを実行して、レジストリーがポリシーファイルに追加されていることを確認します。
$ cat /etc/containers/registries.conf以下の例は、
insecure.comレジストリーからのイメージが非セキュアであり、イメージのプルおよびプッシュで許可されることを示しています。出力例
unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] [[registry]] prefix = "" location = "insecure.com" insecure = true
9.4. イメージの短縮名を許可するレジストリーの追加について リンクのコピーリンクがクリップボードにコピーされました!
イメージの短縮名を使用すると、プル spec パラメーターに完全修飾ドメイン名を追加せずにイメージを検索できます。
たとえば、registry.access.redhat.com/rhe7/etcd の代わりに rhel7/etcd を使用できます。image.config.openshift.io/cluster カスタムリソース (CR) を編集して、イメージの短縮名を検索するためにレジストリーを追加できます。
完全パスを使用することが実際的ではない場合に、短縮名を使用できる場合があります。たとえば、クラスターが DNS が頻繁に変更される複数の内部レジストリーを参照する場合、毎回の変更ごとにプル仕様の完全修飾ドメイン名を更新する必要が生じる可能性があります。この場合は、イメージの短縮名を使用した方が良いでしょう。
イメージをプルまたはプッシュする場合、コンテナーランタイムは image.config.openshift.io/cluster CR の registrySources パラメーターの下にリスト表示されるレジストリーを検索します。短縮名を使用してイメージをプル際に、containerRuntimeSearchRegistries パラメーターでレジストリーのリストを作成している場合、コンテナーランタイムはそれらのレジストリーを検索します。
9.4.1. イメージの短縮名を使用しない場合 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でパブリックレジストリーを使用する際に、デプロイメントエラーやセキュリティーリスクを回避するには、短いイメージ名ではなく、完全修飾イメージ名を使用してください。短い名前は Red Hat の内部レジストリーやプライベートレジストリーでは機能しますが、認証を必要とするパブリックレジストリーでは、短い名前のイメージはデプロイされない可能性があります。
各パブリックレジストリーが異なる認証情報を必要とし、クラスターでグローバルプルシークレットにパブリックレジストリーがリストされない場合には、containerRuntimeSearchRegistries パラメーターの下に複数のパブリックレジストリーをリストできません。
認証が必要なパブリックレジストリーの場合、レジストリーの認証情報がグローバルプルシークレットに格納されている場合にのみ、イメージの短縮名を使用できます。
containerRuntimeSearchRegistries パラメーター (registry.redhat.io、docker.io、および quay.io レジストリーを含む) にパブリックレジストリーをリスト表示する場合、認証情報はリスト上のすべてのレジストリーに公開され、ネットワークおよびレジストリーの攻撃にされされるリスクが生じます。イメージをプルするためのプルシークレットは 1 つしかないため、グローバルプルシークレットで定義されているように、そのシークレットは、そのリスト内のすべてのレジストリーに対して認証するために使用されます。したがって、リストにパブリックレジストリーを含めると、セキュリティーリスクが発生します。
9.4.2. イメージの短縮名を許可するレジストリーの追加 リンクのコピーリンクがクリップボードにコピーされました!
image.config.openshift.io/cluster カスタムリソース (CR) を編集して、イメージの短縮名を検索するためにレジストリーを追加できます。OpenShift Container Platform は、この CR への変更をクラスター内のすべてのノードに適用します。
allowedRegistries パラメーターを定義すると、明示的にリストされていない限り、registry.redhat.io、quay.io、およびデフォルトの OpenShift イメージレジストリーを含むすべてのレジストリーがブロックされます。ペイロードイメージに必要なすべてのレジストリーを allowedRegistries リストに追加する必要があります。たとえば、registry.redhat.io、quay.io、および internalRegistryHostname レジストリーをリストに追加します。非接続クラスターの場合は、ミラーレジストリーも追加する必要があります。そうしなければ、Pod で障害が発生する危険があります。
手順
image.config.openshift.io/clusterカスタムリソースを編集します。$ oc edit image.config.openshift.io/cluster以下は、
image.config.openshift.io/clusterCR の例になります。apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: allowedRegistriesForImport: - domainName: quay.io insecure: false additionalTrustedCA: name: myconfigmap registrySources: containerRuntimeSearchRegistries: - reg1.io - reg2.io - reg3.io allowedRegistries: - example.com - quay.io - registry.redhat.io - reg1.io - reg2.io - reg3.io - image-registry.openshift-image-registry.svc:5000 ... status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000次のコマンドを実行して、ノードのリストを取得します。
$ oc get nodes出力例
NAME STATUS ROLES AGE VERSION <node_name> Ready control-plane,master 37m v1.27.8+4fab27b次のコマンドを実行し、ノード上でデバッグモードに入ります。
$ oc debug node/<node_name>プロンプトが表示されたら、ターミナルに
chroot /hostを入力します。sh-4.4# chroot /host
検証
次のコマンドを実行して、レジストリーがポリシーファイルに追加されていることを確認します。
sh-5.1# cat /etc/containers/registries.conf.d/01-image-searchRegistries.conf出力例
unqualified-search-registries = ['reg1.io', 'reg2.io', 'reg3.io']
9.4.3. イメージレジストリーアクセス用の追加トラストストアの設定 リンクのコピーリンクがクリップボードにコピーされました!
イメージレジストリーへのアクセス時に信頼すべき追加の認証局 (CA) を含む config map への参照を、image.config.openshift.io/cluster カスタムリソース (CR) に追加できます。
前提条件
- 認証局 (CA) は PEM でエンコードされている必要がある。
手順
openshift-confignamespace に config map を作成し、image.config.openshift.ioCR のAdditionalTrustedCAパラメーターで config map 名を使用します。これは、クラスターが外部イメージレジストリーと通信する際に信頼すべき認証局 (CA) を追加します。イメージレジストリー CA の config map の例
apiVersion: v1 kind: ConfigMap metadata: name: my-registry-ca data: registry.example.com: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- registry-with-port.example.com..5000: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----ここでは、以下のようになります。
data:registry.example.com:- この CA を信頼すべきレジストリーのホスト名の例。
data:registry-with-port.example.com..5000:この CA を信頼すべきポートを含むレジストリーのホスト名の例。レジストリーにポートがある場合 (例:
registry-with-port.example.com:5000)、:は..に置き換える必要があります。PEM 証明書の内容は、信頼すべき追加の各レジストリー CA の値です。
オプション: 次のコマンドを実行して追加の CA を設定します。
$ oc create configmap registry-config --from-file=<external_registry_address>=ca.crt -n openshift-config$ oc edit image.config.openshift.io clusterspec: additionalTrustedCA: name: registry-config
9.5. イメージレジストリーリポジトリーのミラーリングについて リンクのコピーリンクがクリップボードにコピーされました!
コンテナーレジストリーリポジトリーのミラーリングを設定すると、次のタスクを実行できます。
- ソースイメージのレジストリーのリポジトリーからイメージをプルする要求をリダイレクトするように OpenShift Container Platform クラスターを設定し、これをミラーリングされたイメージレジストリーのリポジトリーで解決できるようにします。
- 各ターゲットリポジトリーに対して複数のミラーリングされたリポジトリーを特定し、1 つのミラーがダウンした場合に別のミラーを使用できるようにします。
OpenShift Container Platform のリポジトリーミラーリングには、以下の属性が含まれます。
- イメージプルには、レジストリーのダウンタイムに対する回復性があります。
-
非接続環境のクラスターは、
quay.ioなどの重要な場所からイメージをプルし、企業のファイアウォールの背後にあるレジストリーに要求されたイメージを提供させることができる。 - イメージのプル要求時にレジストリーへの接続が特定の順序で試行され、通常は永続レジストリーが最後に試行されます。
-
入力したミラー情報は、OpenShift Container Platform クラスターの全ノードの
/etc/containers/registries.confファイルに追加されます。 - ノードがソースリポジトリーからイメージの要求を行うと、要求されたコンテンツを見つけるまで、ミラーリングされた各リポジトリーに対する接続を順番に試行します。すべてのミラーで障害が発生した場合、クラスターはソースリポジトリーに対して試行する。成功すると、イメージはノードにプルされる。
リポジトリーのミラーリングは次の方法で設定できます。
OpenShift Container Platform のインストール時:
OpenShift Container Platform に必要なコンテナーイメージをプルし、それらのイメージを会社のファイアウォールの背後に配置することで、非接続環境にあるデータセンターに OpenShift Container Platform をインストールできます。
OpenShift Container Platform の新規インストール後:
OpenShift Container Platform のインストール中にミラーリングを設定しなかった場合は、以下のカスタムリソース (CR) オブジェクトのいずれかを使用して、インストール後に設定できます。
-
ImageDigestMirrorSet(IDMS)。このオブジェクトを使用すると、ダイジェスト仕様を使用して、ミラーリングされたレジストリーからイメージを取得できます。IDMS CR を使用すると、イメージのプルが失敗した場合に、ソースレジストリーからのプルの継続的な試行を許可または停止するフォールバックポリシーを設定できます。 -
ImageTagMirrorSet(ITMS)。このオブジェクトを使用すると、イメージタグを使用して、ミラーリングされたレジストリーからイメージをプルできます。ITMS CR を使用すると、イメージのプルが失敗した場合に、ソースレジストリーからのプルの継続的な試行を許可または停止するフォールバックポリシーを設定できます。 ImageContentSourcePolicy(ICSP)。このオブジェクトを使用すると、ダイジェスト仕様を使用して、ミラーリングされたレジストリーからイメージを取得できます。ミラーが機能しない場合、ICSP CR は必ずソースレジストリーにフォールバックします。重要ImageContentSourcePolicy(ICSP) オブジェクトを使用してリポジトリーミラーリングを設定することは、非推奨の機能です。非推奨の機能は OpenShift Container Platform に引き続き含まれており、サポートが継続されます。これは今後のリリースでは削除される予定であり、新しいデプロイメントでの使用は推奨されません。ImageContentSourcePolicyオブジェクトの作成に使用した既存の YAML ファイルがある場合は、oc adm migrate icspコマンドを使用して、それらのファイルをImageDigestMirrorSetYAML ファイルに変換できます。詳細は、「イメージレジストリーリポジトリーミラーリング用の ImageContentSourcePolicy (ICSP) ファイルの変換」を参照してください。
-
これらのカスタムリソースオブジェクトはそれぞれ、次の情報を識別します。
- ミラーリングするコンテナーイメージリポジトリーのソース
- コンテンツを提供する各ミラーリポジトリーの個別のエントリー
次のアクションと、それがノードの drain 動作にどのように影響するかに注意してください。
- IDMS または ICSP CR オブジェクトを作成すると、MCO はノードの drain またはリブートを実行しません。
- ITMS CR オブジェクトを作成すると、MCO はノードの drain とリブートを実行します。
- ITMS、IDMS、または ICSP CR オブジェクトを削除すると、MCO はノードの drain とリブートを実行します。
ITMS、IDMS、または ICSP CR オブジェクトを変更すると、MCO はノードの drain とリブートを実行します。
重要MCO が以下の変更のいずれかを検出すると、ノードの drain (Pod の退避) の実行または再起動を行わずに更新を適用します。
-
マシン設定の
spec.config.passwd.users.sshAuthorizedKeysパラメーターの SSH キーの変更。 -
openshift-confignamespace でのグローバルプルシークレットまたはプルシークレットへの変更。 -
Kubernetes API Server Operator による
/etc/kubernetes/kubelet-ca.crt認証局 (CA) の自動ローテーション。
-
マシン設定の
MCO は、
/etc/containers/registries.confファイルへの変更 (ImageDigestMirrorSet、ImageTagMirrorSet、またはImageContentSourcePolicyオブジェクトの編集など) を検出すると、対応するノードの drain (Pod の退避) を実行し、変更を適用して、ノードをスケジューリング対象に戻します。次の変更ではノードの drain (Pod の退避) の実行は発生しません。-
pull-from-mirror = "digest-only"パラメーターがミラーごとに設定されたレジストリーの追加。 -
pull-from-mirror = "digest-only"パラメーターがレジストリーに設定されたミラーの追加。 -
unqualified-search-registriesへのアイテムの追加。
-
新しいクラスターの場合は、必要に応じて IDMS、ITMS、および ICSP CR オブジェクトを使用できます。ただし、IDMS と ITMS の使用を推奨します。
クラスターをアップグレードした場合、既存の ICSP オブジェクトは安定を維持し、IDMS オブジェクトと ICSP オブジェクトの両方がサポートされるようになります。ICSP オブジェクトを使用するワークロードは、引き続き期待どおりに機能し続けます。一方、IDMS CR で導入されたフォールバックポリシーを利用する場合は、oc adm migrate icsp コマンドを使用して、現在のワークロードを IDMS オブジェクトに移行できます。これは、後述の イメージレジストリーリポジトリーミラーリング用の ImageContentSourcePolicy (ICSP) ファイルの変換 セクションで説明しています。IDMS オブジェクトへの移行に、クラスターの再起動は必要ありません。
クラスターで ImageDigestMirrorSet、ImageTagMirrorSet、または ImageContentSourcePolicy オブジェクトを使用してリポジトリーミラーリングを設定する場合、ミラーリングされたレジストリーにはグローバルプルシークレットのみを使用できます。プロジェクトにプルシークレットを追加することはできません。
9.5.1. イメージレジストリーのリポジトリーミラーリングの設定 リンクのコピーリンクがクリップボードにコピーされました!
インストール後のミラー設定カスタムリソース (CR) を作成して、ソースイメージレジストリーからミラーリングされたイメージレジストリーにイメージプル要求をリダイレクトできます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
ミラーリングされたリポジトリーを設定します。以下のいずれかを実行します。
Red Hat Quay を使用してミラーリングされたリポジトリーを設定します。Red Hat Quay を使用して、あるリポジトリーから別のリポジトリーにイメージをコピーでき、これらのリポジトリーを一定期間繰り返し自動的に同期することもできます。
skopeoなどのツールを使用して、ソースリポジトリーからミラーリングされたリポジトリーにイメージを手動でコピーします。たとえば、{op-system-base-full system} に skopeo RPM パッケージをインストールした後、次の例に示すように
skopeoコマンドを使用します。$ skopeo copy --all \ docker://registry.access.redhat.com/ubi9/ubi-minimal:latest@sha256:5cf... \ docker://example.io/example/ubi-minimalこの例では、
example.ioという名前のコンテナーイメージレジストリーと、exampleという名前のイメージリポジトリーがあります。registry.access.redhat.comからexample.ioにubi9/ubi-minimalイメージをコピーする必要があります。ミラーリングされたレジストリーを作成した後、ソースリポジトリーに対する要求をミラーリングされたリポジトリーにリダイレクトするように OpenShift Container Platform クラスターを構成できます。
次の例のいずれかを使用して、インストール後のミラー設定カスタムリソース (CR) を作成します。
必要に応じて
ImageDigestMirrorSetまたはImageTagMirrorSetCR を作成し、ソースとミラーを独自のレジストリーとリポジトリーのペアとイメージに置き換えます。apiVersion: config.openshift.io/v1 kind: ImageDigestMirrorSet metadata: name: ubi9repo spec: imageDigestMirrors: - mirrors: - example.io/example/ubi-minimal - example.com/example2/ubi-minimal source: registry.access.redhat.com/ubi9/ubi-minimal mirrorSourcePolicy: AllowContactingSource - mirrors: - mirror.example.com/redhat source: registry.example.com/redhat mirrorSourcePolicy: AllowContactingSource - mirrors: - mirror.example.com source: registry.example.com mirrorSourcePolicy: AllowContactingSource - mirrors: - mirror.example.net/image source: registry.example.com/example/myimage mirrorSourcePolicy: AllowContactingSource - mirrors: - mirror.example.net source: registry.example.com/example mirrorSourcePolicy: AllowContactingSource - mirrors: - mirror.example.net/registry-example-com source: registry.example.com mirrorSourcePolicy: AllowContactingSourceImageContentSourcePolicyカスタムリソースを作成し、ソースとミラーを独自のレジストリーとリポジトリーのペアとイメージに置き換えます。apiVersion: operator.openshift.io/v1alpha1 kind: ImageContentSourcePolicy metadata: name: mirror-ocp spec: repositoryDigestMirrors: - mirrors: - mirror.registry.com:443/ocp/release source: quay.io/openshift-release-dev/ocp-release - mirrors: - mirror.registry.com:443/ocp/release source: quay.io/openshift-release-dev/ocp-v4.0-art-devここでは、以下のようになります。
- mirror.registry.com:443/ocp/release- ミラーイメージレジストリーおよびリポジトリーの名前を指定します。
source: quay.io/openshift-release-dev/ocp-release- ミラーリングされるコンテンツが含まれるオンラインレジストリーおよびリポジトリーを指定します。
次のコマンドを実行して、新しいオブジェクトを作成します。
$ oc create -f registryrepomirror.yamlオブジェクトの作成後、Machine Config Operator (MCO) は
ImageTagMirrorSetオブジェクトのみのノードの drain (Pod の退避) を実行します。MCO は、ImageDigestMirrorSetオブジェクトとImageContentSourcePolicyオブジェクトのノードの drain (Pod の退避) を実行しません。ミラーリングされた設定が適用されていることを確認するには、ノードのいずれかで以下を実行します。
ノードの一覧を表示します。
$ oc get node出力例
NAME STATUS ROLES AGE VERSION ip-10-0-137-44.ec2.internal Ready worker 7m v1.33.4 ip-10-0-138-148.ec2.internal Ready master 11m v1.33.4 ip-10-0-139-122.ec2.internal Ready master 11m v1.33.4 ip-10-0-147-35.ec2.internal Ready worker 7m v1.33.4 ip-10-0-153-12.ec2.internal Ready worker 7m v1.33.4 ip-10-0-154-10.ec2.internal Ready master 11m v1.33.4デバッグプロセスを開始し、ノードにアクセスします。
$ oc debug node/ip-10-0-147-35.ec2.internal出力例
Starting pod/ip-10-0-147-35ec2internal-debug ... To use host binaries, run `chroot /host`ルートディレクトリーを
/hostに変更します。sh-4.2# chroot /host/etc/containers/registries.confファイルをチェックして、変更が行われたことを確認します。sh-4.2# cat /etc/containers/registries.conf次の出力は、インストール後のミラー設定 CR が適用される
registries.confファイルを表しています。出力例
unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] short-name-mode = "" [[registry]] prefix = "" location = "registry.access.redhat.com/ubi9/ubi-minimal" [[registry.mirror]] location = "example.io/example/ubi-minimal" pull-from-mirror = "digest-only" [[registry.mirror]] location = "example.com/example/ubi-minimal" pull-from-mirror = "digest-only" [[registry]] prefix = "" location = "registry.example.com" [[registry.mirror]] location = "mirror.example.net/registry-example-com" pull-from-mirror = "digest-only" [[registry]] prefix = "" location = "registry.example.com/example" [[registry.mirror]] location = "mirror.example.net" pull-from-mirror = "digest-only" [[registry]] prefix = "" location = "registry.example.com/example/myimage" [[registry.mirror]] location = "mirror.example.net/image" pull-from-mirror = "digest-only" [[registry]] prefix = "" location = "registry.example.com" [[registry.mirror]] location = "mirror.example.com" pull-from-mirror = "digest-only" [[registry]] prefix = "" location = "registry.example.com/redhat" [[registry.mirror]] location = "mirror.example.com/redhat" pull-from-mirror = "digest-only" [[registry]] prefix = "" location = "registry.access.redhat.com/ubi9/ubi-minimal" blocked = true [[registry.mirror]] location = "example.io/example/ubi-minimal-tag" pull-from-mirror = "tag-only"[[registry]].location = "registry.access.redhat.com/ubi9/ubi-minimal":: プル仕様にリストされているリポジトリー。[[registry.mirror]].location = "example.io/example/ubi-minimal":: そのリポジトリーのミラーを示します。[[registry.mirror]].pull-from-mirror = "digest-only":: ミラーからプルされたイメージがダイジェスト参照イメージであることを意味します。[[registry]].blocked = true:: このリポジトリーにNeverContactSourceパラメーターが設定されていることを示します。[[registry.mirror]].pull-from-mirror = "tag-only":: ミラーからプルされたイメージがタグ参照イメージであることを示します。ソースからノードにイメージをプルし、ミラーによって解決されるかどうかを確認します。
sh-4.2# podman pull --log-level=debug registry.access.redhat.com/ubi9/ubi-minimal@sha256:5cf...
トラブルシューティング
リポジトリーのミラーリング手順が説明どおりに機能しない場合は、リポジトリーミラーリングの動作方法に関する以下の情報を使用して、問題のトラブルシューティングを行うことができます。
- 最初に機能するミラーは、プルされるイメージを指定するために使用されます。
- メインレジストリーは、他のミラーが機能していない場合にのみ使用されます。
-
システムコンテキストによって、
Insecureフラグがフォールバックとして使用されます。 -
/etc/containers/registries.confファイルの形式が最近変更されました。現在のバージョンはバージョン 2 で、TOML 形式です。
9.5.2. イメージレジストリーリポジトリーのミラーリング設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
次の表は、ミラーリング用にイメージリポジトリーを設定する際のパラメーターに関する情報を示しています。
| パラメーター | 値と情報 |
|---|---|
|
|
必須。値は |
|
|
プルタイプに応じたオブジェクトの kind。 |
|
|
イメージプルメソッドのタイプ。 |
|
| ミラーリングされたイメージのレジストリーとリポジトリーの名前。 |
|
| このパラメーターの値は、各ターゲットリポジトリーのセカンダリーミラーリポジトリーの名前です。1 つのミラーがダウンすると、ターゲットリポジトリーはセカンダリーミラーを使用できます。 |
|
| レジストリーとリポジトリーのソース。ソースは、イメージプル仕様にリストされているリポジトリーです。 |
|
|
イメージのプルが失敗した場合のフォールバックポリシーを示すオプションのパラメーター。 |
|
|
|
| レジストリーを示すオプションのパラメーター。そのレジストリー内の任意のイメージを許可します。レジストリー名を指定すると、ソースレジストリーからミラーレジストリーまでのすべてのリポジトリーにオブジェクトが適用されます。 |
|
|
イメージ |
|
|
ミラー |
|
9.5.3. イメージレジストリーリポジトリーミラーリング用の ImageContentSourcePolicy (ICSP) ファイルの変換 リンクのコピーリンクがクリップボードにコピーされました!
ImageContentSourcePolicy (ICSP) オブジェクトを使用してリポジトリーミラーリングを設定することは、非推奨の機能です。
この機能は引き続き OpenShift Container Platform に含まれており、引き続きサポートされます。ただし、この製品の将来のリリースでは削除される予定であり、新しいデプロイメントには推奨されません。
ICSP オブジェクトは、リポジトリーミラーリングを設定するために ImageDigestMirrorSet および ImageTagMirrorSet オブジェクトに置き換えられています。ImageContentSourcePolicy オブジェクトの作成に使用した既存の YAML ファイルがある場合は、oc adm migrate icsp コマンドを使用して、それらのファイルを ImageDigestMirrorSet YAML ファイルに変換できます。このコマンドは、API を現在のバージョンに更新し、kind 値を ImageDigestMirrorSet に変更し、spec.repositoryDigestMirrors を spec.imageDigestMirrors に変更します。ファイルの残りの部分は変更されません。
移行によって registries.conf ファイルは変更されないため、クラスターを再起動する必要はありません。
ImageDigestMirrorSet または ImageTagMirrorSet オブジェクトの詳細は、前のセクションの「イメージレジストリーリポジトリーミラーリングの設定」を参照してください。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
クラスターに
ImageContentSourcePolicyオブジェクトがあることを確認します。
手順
次のコマンドを使用して、1 つ以上の
ImageContentSourcePolicyYAML ファイルをImageDigestMirrorSetYAML ファイルに変換します。$ oc adm migrate icsp <file_name>.yaml <file_name>.yaml <file_name>.yaml --dest-dir <path_to_the_directory>ここでは、以下のようになります。
<file_name>-
ソース
ImageContentSourcePolicyYAML の名前を指定します。複数のファイル名をリストできます。 --dest-dirオプション: 出力
ImageDigestMirrorSetYAML のディレクトリーを指定します。設定されていない場合、ファイルは現在のディレクトリーに書き込まれます。たとえば、次のコマンドは
icsp.yamlおよびicsp-2.yamlファイルを変換し、新しい YAML ファイルをidms-filesディレクトリーに保存します。$ oc adm migrate icsp icsp.yaml icsp-2.yaml --dest-dir idms-files出力例
wrote ImageDigestMirrorSet to idms-files/imagedigestmirrorset_ubi8repo.5911620242173376087.yaml wrote ImageDigestMirrorSet to idms-files/imagedigestmirrorset_ubi9repo.6456931852378115011.yaml
次のコマンドを実行して CR オブジェクトを作成します。
$ oc create -f <path_to_the_directory>/<file-name>.yamlここでは、以下のようになります。
<path_to_the_directory>-
--dest-dirフラグを使用した場合は、ディレクトリーへのパスを指定します。 <file_name>-
ImageDigestMirrorSetYAML の名前を指定します。
- IDMS オブジェクトがロールアウトされた後、ICSP オブジェクトを削除します。
第10章 イメージの使用 リンクのコピーリンクがクリップボードにコピーされました!
10.1. イメージの使用の概要 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でコンテナー化されたアプリケーションを構築およびデプロイするには、Source-to-Image (S2I)、データベース、およびその他のコンテナーイメージを使用できます。これらのイメージは、クラスター上でアプリケーションを実行するために必要な基本コンポーネントを提供します。
Red Hat の公式コンテナーイメージは、registry.redhat.io の Red Hat レジストリーで提供されます。OpenShift Container Platform がサポートする S2I、データベース、Jenkins イメージは、Red Hat Quay レジストリーの openshift4 リポジトリーにあります。たとえば、quay.io/openshift-release-dev/ocp-v4.0-<address> は OpenShift Application Platform イメージの名前です。
xPaaS ミドルウェアイメージは、Red Hat レジストリーの適切な製品リポジトリーで提供されていますが、接尾辞として -openshift が付いています。たとえば、registry.redhat.io/jboss-eap-6/eap64-openshift は JBoss EAP イメージの名前です。
このセクションで説明する Red Hat のサポート対象イメージは、すべて Red Hat Ecosystem Catalog のコンテナーイメージのセクション に記載されています。各イメージのすべてのバージョンについて、そのコンテンツや用途の詳細を確認できます。関連するイメージを参照または検索してください。
コンテナーイメージの新しいバージョンは、OpenShift Container Platform の以前のバージョンとは互換性がありません。お使いの OpenShift Container Platform のバージョンに基づいて、正しいバージョンのコンテナーイメージを確認し、使用するようにしてください。
10.2. Source-to-Image リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform で、ランタイム環境を手動で設定することなくコンテナー化されたアプリケーションを作成するには、Source-to-Image (S2I) イメージを使用できます。S2I イメージは、Node.js、Python、Java などの言語のランタイムベースイメージであり、そこに独自のコードを挿入することができます。
Red Hat Software Collections のイメージは、Node.js、Perl、Python などの特定のランタイム環境に依存するアプリケーションの基盤として使用できます。
Java を使用するランタイム環境のリファレンスとして、OpenShift 用 source-to-image の概要 ドキュメントを使用できます。
S2I イメージは、Cluster Samples Operator からも入手できます。
10.2.1. OpenShift Container Platform Developer Console での S2I ビルダーイメージへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールの Developer Console から S2I ビルダーイメージにアクセスできます。このイメージは、ソースコードからコンテナー化されたアプリケーションをビルドするのに必要です。
手順
- ログイン認証情報を使用して OpenShift Container Platform Web コンソールにログインします。OpenShift Container Platform Web コンソールのデフォルトビューは Administrator パースペクティブです。
- パースペクティブスイッチャーを使用して、Developer パースペクティブに切り替えます。
- +Add ビューで、Project ドロップダウンリストを使用して既存プロジェクトを選択するか、新規プロジェクトを作成します。
- Developer Catalog タイルの All services をクリックします。
- Type の下の Builder Images をクリックして、利用可能な S2I イメージを表示します。
10.2.2. Source-to-Image ビルドプロセスの概要 リンクのコピーリンクがクリップボードにコピーされました!
ソーストゥイメージ (S2I) は、OpenShift Container Platform におけるビルドプロセスの一つで、ソースコードをコンテナーイメージに注入するものです。S2I は、手動設定なしで、アプリケーションのソースコードからすぐに実行可能なコンテナーイメージを自動的に作成します。
S2I は以下の手順を実行します。
-
FROM <builder image>コマンドを実行します。 - ソースコードをビルダーイメージの定義された場所にコピーします。
- ビルダーイメージから assemble スクリプトを実行します。
- デフォルトコマンドとしてビルダーイメージに run スクリプトを設定します。
Buildah は次にコンテナーイメージを作成します。
10.3. Source-to-Image イメージのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform のデフォルトのアセンブルおよび実行スクリプトの動作を変更するには、ソースからイメージへの変換 (S2I) ビルダーイメージをカスタマイズできます。デフォルトのスクリプトが適切でない場合は、特定のアプリケーション要件に合わせて S2I ビルダーを調整できます。
10.3.1. イメージに埋め込まれたスクリプトの呼び出し リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でサポートされているスクリプトロジックとアップグレード互換性を維持しながら、ビルダーイメージの動作を拡張するには、ラッパースクリプトを作成して組み込みの S2I イメージスクリプトを開始できます。これらのラッパースクリプトはカスタムロジックを実行し、その後イメージ内のデフォルトスクリプトを呼び出します。
手順
io.openshift.s2i.scripts-urlラベルの値を調べて、ビルダーイメージ内のスクリプトの場所を特定します。$ podman inspect --format='{{ index .Config.Labels "io.openshift.s2i.scripts-url" }}' wildfly/wildfly-centos7出力例
image:///usr/libexec/s2i他のコマンドでラップされた標準スクリプトのいずれかの呼び出しを含むスクリプトを作成します。
.s2i/bin/assembleスクリプト#!/bin/bash echo "Before assembling" /usr/libexec/s2i/assemble rc=$? if [ $rc -eq 0 ]; then echo "After successful assembling" else echo "After failed assembling" fi exit $rc以下の例では、メッセージを出力するカスタムの assemble スクリプトを表示し、イメージから標準の assemble スクリプトを実行して、assemble スクリプトの終了コードに応じて別のメッセージを出力します。
重要run スクリプトをラップする場合には、スクリプトの呼び出しに
execを実行して、シグナルが正しく処理されるようにする必要があります。execを使用すると、デフォルトのイメージ実行スクリプトを呼び出した後に追加でコマンドを実行できなくなります。.s2i/bin/runスクリプト#!/bin/bash echo "Before running application" exec /usr/libexec/s2i/run