#chiroito ’s blog

Java を中心とした趣味の技術について

OpenShiftにイメージレジストリを構築

背景

QuarkusのOpenShiftエクステンションを使用して、Single Node OpenShiftへデプロイしようとしたらエラーが発生しました。

[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: BuildConfig wake-on-lan
[ERROR] Failed to upload archive file for the build: wake-on-lan
[ERROR] Please check cluster events via `oc get events` to see what could have possibly gone wrong
[WARNING] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] An exception: 'Can't instantiate binary build, due to error reading/writing stream. Can be caused if the output stream was closed by the server.See if something's wrong in recent events in Cluster = InvalidOutput wake-on-lan-1.17d881cb2b5ed3fc Error starting build: an image stream cannot be used as build output because the integrated container image registry is not configured
BuildFailed wake-on-lan-1.17d881cb2d2462e0 Build home/wake-on-lan-1 failed
 ' occurred while instantiating the build, however the build has been started.

Error starting build: an image stream cannot be used as build output because the integrated container image registry is not configured と出力されていたのでイメージレジストリを構築したら無事にビルドができるようになりました。

環境

  • OpenShift 4.15
  • デフォルトの StorageClasses は構成済み

参考

access.redhat.com

イメージレジストリの構築

イメージレジストリを構築しましょう。 全体の流れは以下のとおりです。

  1. イメージレジストリの管理状態の変更
  2. イメージレジストリーストレージの設定

0. 事前確認

事前に以下の4つを確認します。

  • イメージレジストリのPodがいるかどうか
  • オペレータのステータス
  • インスタンスがあるかどうか
  • インスタンスの設定値

イメージレジストリのPodがいるかどうか

リソースがなければOKです。

> oc get pod -n openshift-image-registry -l docker-registry=default
No resources found in openshift-image-registry namespace

以下のようにリソースが表示されればイメージレジストリは設定されてます。そのため、作業は不要です。

NAME                             READY   STATUS    RESTARTS   AGE
image-registry-f79ccc88f-8sm2s   1/1     Running   0          15h

オペレータのステータス

オペレータのステータスでAVAILABLETrueになっているか確認します。

> oc get clusteroperator image-registry
NAME             VERSION              AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
image-registry   4.15                 True        False         False      15h

インスタンスがあるかどうか

デフォルトで作成されているclusterというインスタンスがあればOK。

oc get configs.imageregistry.operator.openshift.io
NAME      AGE
cluster   93d

インスタンスの設定値

spec.managementStateRemovedになっていればOK。

> oc get configs.imageregistry cluster -o=jsonpath='{.spec.managementState}{"\n"}'
Removed

1. イメージレジストリの管理状態の変更

oc patch configs.imageregistry.operator.openshift.io cluster --type merge --patch '{"spec":{"managementState":"Managed"}}'

2. イメージレジストリストレージの設定

2箇所換えます。

  • configs.imageregistry.operator.openshift.io
  • configs.imageregistry/cluster

configs.imageregistry.operator.openshift.io

oc edit configs.imageregistry.operator.openshift.io

こうなっているのを

spec:
  storage: {}

以下のように変えます。

spec:
  storage:
    pvc:
      claim:

configs.imageregistry/cluster

oc edit configs.imageregistry/cluster

以下のようにmanagementStateRemovedになっていたら

spec
  managementState: Removed

Managedに換える

spec
  managementState: Managed

確認

以下のようにイメージレジストリのPodが表示されればイメージレジストリが使えるようになります。

> oc get pod -n openshift-image-registry -l docker-registry=default
NAME                             READY   STATUS    RESTARTS   AGE
image-registry-f79ccc88f-8sm2s   1/1     Running   0          15h