Skip to content

Commit e949e5c

Browse files
authored
Add oc-mirror-v2-image-deletion
Signed-off-by: nishipy <goodisonev4@gmail.com>
1 parent f6bd00d commit e949e5c

File tree

5 files changed

+268
-0
lines changed

5 files changed

+268
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
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+
![](tag_history_1.jpg)
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+
![](tag-history-2.jpg)
248+
249+
![](tag-history-3.jpg)
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+
```
Loading
Loading
Loading
Loading

0 commit comments

Comments
 (0)