7.3. クラスター上でのレイヤー化を使用してカスタムレイヤーイメージを適用する
クラスター上のビルドプロセスを使用してクラスターにカスタムレイヤーイメージを適用するには、次のパラメーターを指定した MachineOSConfig カスタムリソース (CR) を作成します。
- ビルドする Containerfile
- ビルドを関連付けるマシン設定プール
- 最終的なイメージをプッシュおよびプルする場所
- 使用するプッシュシークレットとプルシークレット
オブジェクトを作成すると、Machine Config Operator (MCO) によって MachineOSBuild オブジェクトと machine-os-builder Pod が作成されます。ビルドプロセスでは、設定マップなどの一時的なオブジェクトも作成されますが、これらはビルドの完了後にクリーンアップされます。
ビルドが完了すると、MCO は新しいカスタムレイヤーイメージをリポジトリーにプッシュし、新しいノードのデプロイ時に使用できるようにします。新しいカスタムレイヤーイメージのダイジェスト付きイメージプル仕様を、MachineOSBuild オブジェクトと machine-os-builder Pod で確認できます。
これらの新しいオブジェクトや machine-os-builder Pod を操作する必要はありません。ただし、これらのリソースは、必要に応じて、すべてトラブルシューティングに使用できます。
カスタムレイヤーイメージを使用するマシン設定プールごとに、個別の MachineOSConfig CR が必要です。
クラスター上でのイメージレイヤー化は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、以下のリンクを参照してください。
前提条件
-
フィーチャーゲートを使用して
TechPreviewNoUpgrade機能セットを有効にした。詳細は、「フィーチャーゲートを使用した機能の有効化」を参照してください。 MCO がベースオペレーティングシステムイメージをプルするために必要なプルシークレットのコピーが
openshift-machine-config-operatornamespace にある。たとえば、グローバルプルシークレットを使用している場合は、次のコマンドを実行できます。
$oc create secret docker-registry global-pull-secret-copy \ --namespace "openshift-machine-config-operator" \ --from-file=.dockerconfigjson=<(oc get secret/pull-secret -n openshift-config -o go-template='{{index .data ".dockerconfigjson" | base64decode}}')-
openshift-machine-apinamespace にetc-pki-entitlementシークレットのコピーがある。 - MCO が新しいカスタムレイヤーイメージをレジストリーにプッシュするために必要なプッシュシークレットがある。
- ノードがレジストリーから新しいカスタムレイヤーイメージをプルするために必要なプルシークレットがある。これは、イメージをリポジトリーにプッシュするために使用するシークレットとは異なるシークレットである必要があります。
- Containerfile を設定する方法をよく理解している。Containerfile の作成方法は、このドキュメントの範囲外です。
- オプション: カスタムレイヤーイメージを適用するノード用に、別のマシン設定プールがある。
手順
machineOSconfigオブジェクトを作成します。以下のような YAML ファイルを作成します。
apiVersion: machineconfiguration.openshift.io/v1alpha1 kind: MachineOSConfig metadata: name: layered spec: machineConfigPool: name: <mcp_name>1 buildInputs: containerFile:2 - containerfileArch: noarch3 content: |- FROM configs AS final4 RUN rpm-ostree install tree && \ ostree container commit imageBuilder:5 imageBuilderType: PodImageBuilder baseImagePullSecret:6 name: global-pull-secret-copy renderedImagePushspec: image-registry.openshift-image-registry.svc:5000/openshift/os-image:latest7 renderedImagePushSecret:8 name: builder-dockercfg-7lzwl buildOutputs:9 currentImagePullSecret: name: builder-dockercfg-mtcl23- 1
- カスタムレイヤーイメージをデプロイするためのマシン設定プールを指定します。
- 2
- カスタムレイヤーイメージを設定するための Containerfile を指定します。Containerfile では、複数のビルドステージを指定できます。
- 3
- ビルドするイメージのアーキテクチャーを指定します。このパラメーターを
noarchに設定する必要があります。 - 4
- ビルドステージを final として指定します。このフィールドは必須で、ビルドの最後のイメージに適用されます。
- 5
- 使用する Image Builder の名前を指定します。このパラメーターを
PodImageBuilderに設定する必要があります。 - 6
- MCO がレジストリーからベースオペレーティングシステムイメージをプルするために必要なプルシークレットの名前を指定します。
- 7
- 新しくビルドされたカスタムレイヤーイメージをプッシュするイメージレジストリーを指定します。これは、クラスターがアクセスできる任意のレジストリーにすることができます。この例では、内部 OpenShift Container Platform レジストリーを使用します。
- 8
- 新しくビルドされたカスタムレイヤーイメージを、そのレジストリーにプッシュするために MCO が必要とするプッシュシークレットの名前を指定します。
- 9
- 新しくビルドされたカスタムレイヤーイメージをプルするためにノードが必要とするイメージレジストリーに必要なシークレットを指定します。これは、イメージをリポジトリーにプッシュするために使用するシークレットとは異なるシークレットである必要があります。
MachineOSConfigオブジェクトを作成します。$ oc create -f <file_name>.yaml
MachineOSBuildオブジェクトが作成されてREADY状態になったら、必要に応じて、新しいカスタムレイヤーイメージを使用するノードのノード仕様を変更します。MachineOSBuildオブジェクトがREADYであることを確認します。SUCCEEDED値がTrueになったら、ビルドは完了です。$ oc get machineosbuildMachineOSBuildオブジェクトが準備完了状態であることを示す出力例NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED layered-rendered-layered-ad5a3cad36303c363cf458ab0524e7c0-builder False False True False FalseMachineOSConfigオブジェクトで指定したマシン設定プールのラベルを追加して、カスタムレイヤーイメージをデプロイするノードを編集します。$ oc label node <node_name> 'node-role.kubernetes.io/<mcp_name>='ここでは、以下のようになります。
- node-role.kubernetes.io/<mcp_name>=
- カスタムレイヤーイメージをデプロイするノードを特定するノードセレクターを指定します。
変更を保存すると、MCO がノードをドレインし、スケジューリング対象から外して再起動します。再起動後、ノードは新しいカスタムレイヤーイメージを使用します。
検証
次のコマンドを実行して、新しい Pod の準備ができていることを確認します。
$ oc get pods -n openshift-machine-config-operator出力例
NAME READY STATUS RESTARTS AGE build-rendered-layered-ad5a3cad36303c363cf458ab0524e7c0 2/2 Running 0 2m40s1 # ... machine-os-builder-6fb66cfb99-zcpvq 1/1 Running 0 2m42s2 次のコマンドを実行して、レイヤービルドの現在のステージを確認します。
$ oc get machineosbuilds出力例
NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED layered-rendered-layered-ef6460613affe503b530047a11b28710-builder False True False False False次のコマンドを実行して、
MachineOSBuildオブジェクトに新しいカスタムレイヤーイメージへの参照が含まれていることを確認します。$ oc describe machineosbuild <object_name>出力例
apiVersion: machineconfiguration.openshift.io/v1alpha1 kind: MachineOSBuild metadata: name: layered-rendered-layered-ad5a3cad36303c363cf458ab0524e7c0-builder spec: desiredConfig: name: rendered-layered-ad5a3cad36303c363cf458ab0524e7c0 machineOSConfig: name: layered renderedImagePushspec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image:latest # ... status: conditions: - lastTransitionTime: "2024-05-21T20:25:06Z" message: Build Ready reason: Ready status: "True" type: Succeeded finalImagePullspec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image@sha256:f636fa5b504e92e6faa22ecd71a60b089dab72200f3d130c68dfec07148d11cd1 - 1
- 新しいカスタムレイヤーイメージのダイジェスト付きイメージプル仕様。
適切なノードが新しいカスタムレイヤーイメージを使用していることを確認します。
コントロールプレーンノードの root としてデバッグセッションを開始します。
$ oc debug node/<node_name>/hostをデバッグシェル内のルートディレクトリーとして設定します。sh-4.4# chroot /hostrpm-ostree statusコマンドを実行して、カスタムレイヤーイメージが使用されていることを確認します。sh-5.1# rpm-ostree status出力例
# ... Deployments: * ostree-unverified-registry:quay.io/openshift-release-dev/os-image@sha256:f636fa5b504e92e6faa22ecd71a60b089dab72200f3d130c68dfec07148d11cd1 Digest: sha256:bcea2546295b2a55e0a9bf6dd4789433a9867e378661093b6fdee0031ed1e8a4 Version: 416.94.202405141654-0 (2024-05-14T16:58:43Z)- 1
- 新しいカスタムレイヤーイメージのダイジェスト付きイメージプル仕様。
関連情報