|
| 1 | +--- |
| 2 | +title: "oc-mirror v2で遊んでみた" |
| 3 | +date: 2024-09-10T00:00:00+09:00 |
| 4 | +draft: false |
| 5 | +categories: |
| 6 | + - openshift |
| 7 | +tags: |
| 8 | + - openshift |
| 9 | + - podman |
| 10 | +image: mirror.jpg |
| 11 | +slug: oc-mirror-v2-image-deletion |
| 12 | +--- |
| 13 | + |
| 14 | +Header Photo by [Ivan Rohovchenko](https://unsplash.com/ja/@ivrn) on [Unsplash](https://unsplash.com/photos/black-telescope-during-day-time-8SjeH5pZbjw) |
| 15 | + |
| 16 | +## oc-mirror plugin v2 |
| 17 | + |
| 18 | +インターネット接続性のない環境では、OpenShiftのインストールに必要なコンテナイメージやOperatorが使うコンテナイメージを、Red Hatが公開するインターネット上のコンテナレジストリからミラーレジストリにミラーリングする必要があります。そんなときに便利なoc-mirror pluginですが、バグの多いの機能の改善や再実装、新機能の追加をした[oc-mirror plugin v2](https://github.com/openshift/oc-mirror/tree/main/v2)の開発が進められています。詳細は、[OpenShift 4.16のリリースノートのこの辺り](https://docs.openshift.com/container-platform/4.16/release_notes/ocp-4-16-release-notes.html#ocp-4-16-oc-mirror-v2_release-notes)をご確認ください。 |
| 19 | + |
| 20 | +なお、[OpenShift 4.16時点では、oc-mirror plugin v2によるミラーリングはTech Preview](https://docs.openshift.com/container-platform/4.16/installing/disconnected_install/about-installing-oc-mirror-v2.html)です。 |
| 21 | + |
| 22 | +今回は、oc-mirror plugin v2で追加された、ミラーレジストリ上にあるイメージ削除の機能で遊んでみたいと思います。 |
| 23 | + |
| 24 | +## oc-mirror pluginによるミラーリングとイメージ削除 |
| 25 | +従来のoc-mirror v1では、ミラーリング実行時に、前回までのミラーリングの履歴から自動でイメージをプルーニングするため、利用者が明示的にイメージを削除することはありませんでした。 |
| 26 | +この挙動は一見便利そうですが、`ImageSetConfiguration` という設定ファイルをわりと作成・更新しないと意図しないイメージを消してしまうこともしばしばありました。またバグが報告されることも多かったそうで、oc-mirror plugin v2では、自動でプルーニングを行わないように根本的に実装が見直されています。 |
| 27 | + |
| 28 | +### `DeleteImageSetConfiguration` の導入 |
| 29 | +oc-mirror では、`ImageSetConfiguration` という設定ファイルにミラーリング対象のコンテナイメージを定義していました。v1では、このファイルの変更履歴から削除対象となるイメージを自動で算出していたわけですが、v2からは `DeleteImageSetConfiguration` が導入され、`ImageSetConfiguration` と同じような書式で削除したいイメージを明示的に定義することができます。 |
| 30 | + |
| 31 | +## oc-mirror v2でイメージ削除してみる |
| 32 | + |
| 33 | +### イメージのミラーリング |
| 34 | +ミラーレジストリからイメージを削除してみたいのですが、そもそも消すイメージがないので、まずミラーリングを実行します。以下のような内容の `ImageSetConfiguration` で、OpenShift 4.16.5 と 4.16.6のリリースイメージをミラーリングしてみます。v1と比較して、CRD(のようなもの)の`kind`は同じですが、`apiVersion` が異なるため注意してください。 |
| 35 | + |
| 36 | +```yaml |
| 37 | +kind: ImageSetConfiguration |
| 38 | +apiVersion: mirror.openshift.io/v2alpha1 |
| 39 | +mirror: |
| 40 | + platform: |
| 41 | + channels: |
| 42 | + - name: stable-4.16 |
| 43 | + minVersion: 4.16.5 |
| 44 | + maxVersion: 4.16.6 |
| 45 | +``` |
| 46 | +
|
| 47 | +なお、ミラーレジストリには、[Mirror registry for Red Hat OpenShift](https://docs.openshift.com/container-platform/4.16/installing/disconnected_install/installing-mirroring-creating-registry.html)を使うのが簡単です。OpenShiftインストールのためのミラーリング用途限定で、PodmanでRed Hat Quayをデプロイしてくれます。この記事ではミラーレジストリの構築は省略します。 |
| 48 | +
|
| 49 | +ミラーレジストリへログイン後、ミラーリングを実行します。 |
| 50 | +
|
| 51 | +``` |
| 52 | +$ podman login registry.ocp4.tanishim.local:8443 -u init --authfile mirror-pull-secret.txt |
| 53 | +Password: |
| 54 | +Login Succeeded! |
| 55 | + |
| 56 | +$ oc mirror --v2 --authfile mirror-pull-secret.txt -c ./imagesetconfig.yaml --workspace file://./v2-workspace docker://registry.ocp4.tanishim.local:8443 |
| 57 | +... |
| 58 | +2024/09/04 16:14:01 [INFO] : _ setting up the environment for you... |
| 59 | +2024/09/04 16:14:01 [INFO] : __ workflow mode: mirrorToMirror |
| 60 | +2024/09/04 16:14:01 [INFO] : _ going to discover the necessary images... |
| 61 | +2024/09/04 16:14:01 [INFO] : __ collecting release images... |
| 62 | +2024/09/04 16:14:02 [INFO] : __ collecting operator images... |
| 63 | +2024/09/04 16:14:02 [INFO] : __ collecting additional images... |
| 64 | +2024/09/04 16:14:02 [INFO] : __ Start copying the images... |
| 65 | +2024/09/04 16:14:05 [INFO] : === Overall Progress - image 1 / 384 === |
| 66 | +2024/09/04 16:14:05 [INFO] : release image 1 / 384 |
| 67 | +2024/09/04 16:14:05 [INFO] : image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:5bb98edf376dfa838ce6899b0fc0e867237f34df63e8bf476d0ba9d2195131bd |
| 68 | +2024/09/04 16:14:05 [INFO] : ========================================= |
| 69 | +2024/09/04 16:14:07 [INFO] : === Overall Progress - image 2 / 384 === |
| 70 | +2024/09/04 16:14:07 [INFO] : release image 2 / 384 |
| 71 | +2024/09/04 16:14:07 [INFO] : image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:6a8a7825b2039759548c6d83db384979cf4bf0a17d231c2a588c57e80623f74c |
| 72 | +2024/09/04 16:14:07 [INFO] : ========================================= |
| 73 | +2024/09/04 16:14:15 [INFO] : === Overall Progress - image 3 / 384 === |
| 74 | +2024/09/04 16:14:15 [INFO] : release image 3 / 384 |
| 75 | +2024/09/04 16:14:15 [INFO] : image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:667efccd05c2154ebda8ae7a14fbb3ed4523ad8c1f459df9eda77a041239ae1c |
| 76 | +2024/09/04 16:14:15 [INFO] : ========================================= |
| 77 | +2024/09/04 16:14:19 [INFO] : === Overall Progress - image 4 / 384 === |
| 78 | +2024/09/04 16:14:19 [INFO] : release image 4 / 384 |
| 79 | +2024/09/04 16:14:19 [INFO] : image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:355407f1b51db63278a581de341542521972e68c607a0e10f521733795619214 |
| 80 | +2024/09/04 16:14:19 [INFO] : ========================================= |
| 81 | +2024/09/04 16:14:26 [INFO] : === Overall Progress - image 5 / 384 === |
| 82 | +2024/09/04 16:14:26 [INFO] : release image 5 / 384 |
| 83 | +2024/09/04 16:14:26 [INFO] : image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:041d983c6807129d0e0cf371133f8a1c0d5fde78a813c60aa1f293e64004fb43 |
| 84 | +2024/09/04 16:14:26 [INFO] : ========================================= |
| 85 | +__2024/09/04 16:14:31 [INFO] : === Overall Progress - image 6 / 384 === |
| 86 | +2024/09/04 16:14:31 [INFO] : release image 6 / 384 |
| 87 | +... |
| 88 | +2024/09/04 17:58:09 [INFO] : === Overall Progress - image 384 / 384 === |
| 89 | +2024/09/04 17:58:09 [INFO] : release image 384 / 384 |
| 90 | +2024/09/04 17:58:09 [INFO] : image: quay.io/openshift-release-dev/ocp-release:4.16.5-x86_64 |
| 91 | +2024/09/04 17:58:09 [INFO] : =========================================== |
| 92 | +2024/09/04 17:58:09 [INFO] : === Results === |
| 93 | +2024/09/04 17:58:09 [INFO] : All release images mirrored successfully 384 / 384 __ |
| 94 | +2024/09/04 17:58:09 [INFO] : __ Generating IDMS file... |
| 95 | +2024/09/04 17:58:09 [INFO] : v2-workspace/working-dir/cluster-resources/idms-oc-mirror.yaml file created |
| 96 | +2024/09/04 17:58:09 [INFO] : __ Generating ITMS file... |
| 97 | +2024/09/04 17:58:09 [INFO] : v2-workspace/working-dir/cluster-resources/itms-oc-mirror.yaml file created |
| 98 | +2024/09/04 17:58:09 [INFO] : __ No catalogs mirrored. Skipping CatalogSource file generation. |
| 99 | +2024/09/04 17:58:09 [INFO] : mirror time : 1h44m7.951974594s |
| 100 | +2024/09/04 17:58:09 [INFO] : __ Goodbye, thank you for using oc-mirror |
| 101 | +``` |
| 102 | +
|
| 103 | +
|
| 104 | +oc-mirrorを使ったことがある方ならわかると思いますが、標準出力されるログの見やすさが桁違いです。プログレスバーのように、ミラーリングの進捗がわかりやすいですし、タイムスタンプも有用です。 |
| 105 | +`--workspace` というフラグはoc-mirror v2で追加された便利機能の1つです。指定したディレクトリに、こんな感じでアーティファクトが生成されていました。ログやミラーしたOperator、OpenShift リリースの情報、インストール後クラスタに適用する `ImageDigestMirrorSet` および `ImageTagMirrorSet` のYAMLマニフェストが入ります |
| 106 | + |
| 107 | +``` |
| 108 | +$ tree v2-workspace/ -d |
| 109 | +v2-workspace/ |
| 110 | +`-- working-dir |
| 111 | + |-- cluster-resources |
| 112 | + |-- hold-operator |
| 113 | + |-- hold-release |
| 114 | + | `-- ocp-release |
| 115 | + | |-- 4.16.5-x86_64 |
| 116 | + | | `-- release-manifests |
| 117 | + | `-- 4.16.6-x86_64 |
| 118 | + | `-- release-manifests |
| 119 | + |-- info |
| 120 | + |-- logs |
| 121 | + |-- release-filters |
| 122 | + |-- release-images |
| 123 | + | `-- ocp-release |
| 124 | + | |-- 4.16.5-x86_64 |
| 125 | + | | `-- blobs |
| 126 | + | | `-- sha256 |
| 127 | + | `-- 4.16.6-x86_64 |
| 128 | + | `-- blobs |
| 129 | + | `-- sha256 |
| 130 | + `-- signatures |
| 131 | +``` |
| 132 | +
|
| 133 | +``` |
| 134 | +$ cat v2-workspace/working-dir/cluster-resources/*.yaml |
| 135 | +--- |
| 136 | +apiVersion: config.openshift.io/v1 |
| 137 | +kind: ImageDigestMirrorSet |
| 138 | +metadata: |
| 139 | + name: idms-release-0 |
| 140 | +spec: |
| 141 | + imageDigestMirrors: |
| 142 | + - mirrors: |
| 143 | + - registry.ocp4.tanishim.local:8443/openshift-release-dev |
| 144 | + source: quay.io/openshift-release-dev |
| 145 | +status: {} |
| 146 | +--- |
| 147 | +apiVersion: config.openshift.io/v1 |
| 148 | +kind: ImageTagMirrorSet |
| 149 | +metadata: |
| 150 | + name: itms-release-0 |
| 151 | +spec: |
| 152 | + imageTagMirrors: |
| 153 | + - mirrors: |
| 154 | + - registry.ocp4.tanishim.local:8443/openshift-release-dev |
| 155 | + source: quay.io/openshift-release-dev |
| 156 | +status: {} |
| 157 | +``` |
| 158 | +
|
| 159 | +Mirror Registry側を念の為確認すると、今回ミラーリングしたOCP 4.16.5と4.16.6 のリリースイメージが入っています。 |
| 160 | +
|
| 161 | + |
| 162 | +
|
| 163 | +### `DeleteImageSetConfiguration` によるイメージの削除 |
| 164 | +
|
| 165 | +いよいよ本題です。4.16.5用のイメージだけを削除してみます。以下の内容で作成した `DeleteImageSetConfiguration` と先ほどミラーリングした際に生成されたメタデータを読み込んで、イメージ削除に必要な設定ファイルを生成します。`oc mirror delete` コマンドに `--generate` フラグをつけるという、なんともややこしい感じです。 |
| 166 | +
|
| 167 | +```yaml |
| 168 | +apiVersion: mirror.openshift.io/v2alpha1 |
| 169 | +kind: DeleteImageSetConfiguration |
| 170 | +delete: |
| 171 | + platform: |
| 172 | + channels: |
| 173 | + - name: stable-4.16 |
| 174 | + minVersion: 4.16.5 |
| 175 | + maxVersion: 4.16.5 |
| 176 | +``` |
| 177 | + |
| 178 | +``` |
| 179 | +$ oc mirror --v2 delete --generate --authfile mirror-pull-secret.txt --config deleteimagesetconfig.yaml --workspace file://./v2-workspace docker://registry.ocp4.tanishim.local:8443 |
| 180 | +2024/09/05 15:48:04 [WARN] : _ --v2 flag identified, flow redirected to the oc-mirror v2 version. This is Tech Preview, it is still under development and it is not production ready. |
| 181 | +2024/09/05 15:48:04 [INFO] : __ Hello, welcome to oc-mirror |
| 182 | +2024/09/05 15:48:04 [INFO] : _ setting up the environment for you... |
| 183 | +2024/09/05 15:48:04 [INFO] : __ workflow mode: mirrorToMirror / delete |
| 184 | +2024/09/05 15:48:04 [INFO] : _ going to discover the necessary images... |
| 185 | +2024/09/05 15:48:04 [INFO] : __ collecting release images... |
| 186 | +2024/09/05 15:48:04 [INFO] : __ collecting operator images... |
| 187 | +2024/09/05 15:48:04 [INFO] : __ collecting additional images... |
| 188 | +2024/09/05 15:48:04 [INFO] : __ Generating delete file... |
| 189 | +2024/09/05 15:48:04 [INFO] : v2-workspace/working-dir/delete file created |
| 190 | +v2-workspace/working-dir/delete2024/09/05 15:49:31 [INFO] : delete time : 1m26.960963111s |
| 191 | +2024/09/05 15:49:31 [INFO] : __ Goodbye, thank you for using oc-mirror |
| 192 | +``` |
| 193 | + |
| 194 | +`v2-workspace/working-dir/delete` に何か作ってくれたようです。見てみましょう。 |
| 195 | + |
| 196 | +``` |
| 197 | +$ ls v2-workspace/working-dir/delete |
| 198 | +delete-images.yaml delete-imageset-config.yaml |
| 199 | +
|
| 200 | +$ cat v2-workspace/working-dir/delete/delete-imageset-config.yaml |
| 201 | +apiVersion: mirror.openshift.io/v2alpha1 |
| 202 | +delete: |
| 203 | + helm: {} |
| 204 | + platform: |
| 205 | + architectures: |
| 206 | + - amd64 |
| 207 | + channels: |
| 208 | + - maxVersion: 4.16.5 |
| 209 | + minVersion: 4.16.5 |
| 210 | + name: stable-4.16 |
| 211 | + type: ocp |
| 212 | +kind: DeleteImageSetConfiguration |
| 213 | +
|
| 214 | +$ cat v2-workspace/working-dir/delete/delete-images.yaml |
| 215 | +... |
| 216 | +- imageName: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:ffeb6edc9f09e75011c3547b2149b8120c68e7721d8ba2e7a6d659e6c83229bc |
| 217 | + imageReference: docker://registry.ocp4.tanishim.local:8443/openshift-release-dev/ocp-v4.0-art-dev@sha256:ffeb6edc9f09e75011c3547b2149b8120c68e7721d8ba2e7a6d659e6c83229bc |
| 218 | + relatedBlobs: |
| 219 | + - sha256:86592d87dea5f0c55992dc4aadd236cde96f5e4f3d3dfd0456ca38dca2d2e151 |
| 220 | + - sha256:9a0e86afac7b17960e2411a55e234d639aead65defac982719003eaa242da807 |
| 221 | + - sha256:b958cf13e572cbd92209b5c01a8e65203cf88c4b017258ec8ff9bfd5d722b715 |
| 222 | + - sha256:ca1636478fe5b8e2a56600e24d6759147feb15020824334f4a798c1cb6ed58e2 |
| 223 | + - sha256:e5e8178c6af6b5832361eb52e25232f851a6979c63bbad694e063afdd71ca459 |
| 224 | + - sha256:ffeb6edc9f09e75011c3547b2149b8120c68e7721d8ba2e7a6d659e6c83229bc |
| 225 | +kind: DeleteImageList |
| 226 | +``` |
| 227 | + |
| 228 | +`DeleteImageSetConfiguration` と `DeleteImageList` のマニフェストが作成されています。前者は先ほど自分で与えたファイルと同じ内容です。後者は、それを元に実際に削除対象となるイメージとダイジェストをリストにしたもののようです。この段階ではイメージの削除は行われていません。先ほど生成された `DeleteImageList` のYAMLファイル `delete-images.yaml`を使って削除処理を実行します。 |
| 229 | + |
| 230 | +``` |
| 231 | +$ oc mirror --v2 delete --authfile mirror-pull-secret.txt --delete-yaml-file ./v2-workspace/working-dir/delete/delete-images.yaml docker://registry.ocp4.tanishim.local:8443 |
| 232 | +... |
| 233 | +2024/09/05 16:01:03 [INFO] : image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:ffbe0d4c61d5a2e42923b1d063179bbd99fe2bf7a679c5a2f1ae444ba0d5d6c6 |
| 234 | +2024/09/05 16:01:03 [INFO] : =========================================== |
| 235 | +2024/09/05 16:01:03 [INFO] : === Overall Progress - image 192 / 192 === |
| 236 | +2024/09/05 16:01:03 [INFO] : image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:ffeb6edc9f09e75011c3547b2149b8120c68e7721d8ba2e7a6d659e6c83229bc |
| 237 | +2024/09/05 16:01:03 [INFO] : =========================================== |
| 238 | +2024/09/05 16:01:03 [INFO] : === Results === |
| 239 | +2024/09/05 16:01:03 [INFO] : All images deleted successfully 192 / 192 __ |
| 240 | +2024/09/05 16:01:03 [INFO] : delete time : 1m33.308334555s |
| 241 | +2024/09/05 16:01:03 [INFO] : __ Remember to execute a garbage collect (or similar) on your remote repository |
| 242 | +2024/09/05 16:01:03 [INFO] : __ Goodbye, thank you for using oc-mirror |
| 243 | +``` |
| 244 | + |
| 245 | +完了後、ミラーレジストリを見てみると、期待した通り、4.16.5のリリースイメージ(のタグ)だけが削除されたことが確認できます。 |
| 246 | + |
| 247 | + |
| 248 | + |
| 249 | + |
| 250 | + |
| 251 | +## 余談 |
| 252 | +### oc-mirror v2のイメージ削除の注意点 |
| 253 | + |
| 254 | +oc-mirror v2の新機能である `DeleteImageSetConfiguration` によるイメージ削除では、イメージのマニフェストのみを削除しています。そのため、ストレージの使用量は減りません。不要なイメージの実体を削除し、ストレージを空けたい場合は、コンテナレジストリ側でガーベージコレクションを有効にしてください。なお、[Red Hat Quay では、ガーベージコレクションはデフォルトで有効](https://docs.redhat.com/en/documentation/red_hat_quay/3/html/manage_red_hat_quay/garbage-collection#garbage-collection-configuration-fields)になっています。今回使ったOpenShift Mirror Registryも中身はQuayなので同様です。 |
| 255 | + |
| 256 | +### oc-mirror on RHEL 8 |
| 257 | +最近のバージョンのoc-mirrorをRHEL 8で実行しようとすると、以下のようなエラーが出るかもしれません。 |
| 258 | + |
| 259 | +``` |
| 260 | +/lib64/libc.so.6: version `GLIBC_2.33' not found |
| 261 | +``` |
| 262 | + |
| 263 | +RHEL 8の`glibc` のバージョンが、`glibc-2.28` であるためです。このような場合、RHEL 8のマシンでUBI 9なPodmanコンテナで一時対処する方法があります。以下のようにコンテナを実行し、bashセッションを起動して、oc-mirrorを試せばよいでしょう。必要であれば、ホストOS上にあるミラーレジストリのプルシークレットやCA証明書をコピーします。 |
| 264 | + |
| 265 | +``` |
| 266 | +$ podman run -dt -v ./:/oc-mirror:Z --name ubi9 registry.redhat.io/ubi9 |
| 267 | +$ podman exec -it ubi9 /bin/bash |
| 268 | +``` |
0 commit comments