13.6. イメージの手動プルーニング
プルーニングカスタムリソースは、OpenShift イメージレジストリーからのイメージの自動イメージプルーニングを有効にします。管理者は、oc adm prune images <image_prune_option>
コマンドを使用してイメージを手動でプルーニングできます。以下に例を示します。
oc adm prune images <image_prune_option>
$ oc adm prune images <image_prune_option>
- 1
- 使用可能なプルーニングオプションの詳細は、「手動イメージプルーニングコマンドのオプション」を参照してください。
このコマンドは、システムで不要になったイメージを削除します。
必要に応じて、イメージの経過時間やタグ履歴に基づいてイメージをプルーニングしたり、プロジェクトが定義されたストレージ制限を超える原因となるイメージをプルーニングしたりできます。
13.6.1. イメージをプルーニングする際の考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
手動でイメージをプルーニングする前に、次の情報を考慮してください。
-
--namespace
フラグを使用してプルーニングしても、イメージは削除されません。イメージはクラスタースコープのリソースであるため、イメージストリームのみが削除されます。プルーニングを特定の namespace に制限すると、現在の使用状況を計算できなくなります。 デフォルトで、統合レジストリーは Blob のメタデータをキャッシュしてストレージに対する要求数を減らし、要求の処理速度を高めます。プルーニングによって統合レジストリーのキャッシュが更新されることはありません。プルーニング後の依然としてプルーニングされた層を含むイメージは破損します。キャッシュにメタデータを持つプルーニングされた層はプッシュされないためです。そのため、プルーニング後にキャッシュをクリアするためにレジストリーを再デプロイする必要があります。
oc rollout restart deployment/image-registry -n openshift-image-registry
$ oc rollout restart deployment/image-registry -n openshift-image-registry
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 統合レジストリーが Redis キャッシュを使用する場合、データベースを手動でクリーンアップする必要があります。
- プルーニング後にレジストリーを再デプロイすることがオプションでない場合は、キャッシュを永続的に無効にする必要があります。
-
oc adm prune images
操作ではレジストリーのルートが必要です。レジストリーのルートはデフォルトでは作成されません。
13.6.2. イメージをプルーニングする際の制限 リンクのコピーリンクがクリップボードにコピーされました!
イメージをプルーニングする場合、次の制限が適用されます。
- 外部レジストリーからイメージをプルーニングすることはサポートされていません。
-
イメージがプルーニングされると、
status.tags
にイメージが含まれているすべてのイメージストリームから、そのイメージへのすべての参照が削除されます。 - イメージによって参照されなくなったイメージ層は削除されます。
13.6.3. イメージのプルーニングの各種条件 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform は、イメージをプルーニングするための 2 つの方法をサポートしています。
- 経過時間とタグによるプルーニング
- サイズ制限によるプルーニング
これらの方法論は相互に排他的です。経過時間とタグでのプルーニング、またはサイズ制限でのプルーニングのどちらかを選択する必要があります。選択した方法にかかわらず、イメージプルーナーは使用中のイメージが削除されないようチェックします。
イメージは、主な条件を満たし、さらに システムコンポーネントによるアクティブな参照がない場合にのみ削除されます。
13.6.3.1. 経過時間とタグによるイメージのプルーニング リンクのコピーリンクがクリップボードにコピーされました!
経過時間とタグによるイメージのプルーニングは、デフォルトのプルーニングストラテジーです。--keep-younger-than
および --keep-tag-revisions
フラグを使用して、削除するイメージを識別します。イメージを経過時間とタグでプルーニングする場合は、イメージが --keep-younger-than
しきい値よりも古く、最新のタグリビジョンの 1 つではなく、アクティブなワークロードによって使用されていないことが条件となります。
イメージを経過時間とタグでプルーニングするには、次の条件 すべて を満たす必要があります。
-
イメージは OpenShift Container Platform によって管理されるか、
openshift.io/image.managed
アノテーションが付いている。 -
--keep-younger-than
フラグで指定された期間よりも古いイメージである。 -
--keep-tag-revisions
フラグで指定されているように、このタグの最新イメージの 1 つではない。 イメージは、次に示すアクティブまたは最近の API オブジェクトのいずれによっても 参照されていない。
-
--keep-younger-than
期間よりも最近に作成された Pod またはイメージストリーム。 - 実行中または保留中の Pod
- デプロイメント、レプリケーションコントローラー、レプリカセット、またはステートフルセット。
- ビルド、ビルド設定、ジョブ、または cron ジョブ。
-
イメージは、古く、最近のタグリビジョンではなく、システムコンポーネントによるアクティブな参照がないことが確認された場合にのみ削除されます。
13.6.3.2. サイズ制限によるイメージのプルーニング リンクのコピーリンクがクリップボードにコピーされました!
サイズ制限によってイメージをプルーニングするには、--prune-over-size-limit
フラグを使用します。この方法は、プロジェクトを定義されたイメージストレージ制限内に戻すために使用されます。
--prune-over-size-limit
フラグは、--keep-tag-revisions
フラグまたは --keep-younger-than
フラグと共に使用することができません。これを実行すると、この操作が許可されないことを示す情報が返されます。
この方法を使用してイメージをプルーニングするには、次の条件がすべて満たされている必要があります。
- このイメージは、現在定義されている最小サイズ制限を超えているプロジェクトの一部である。
- イメージは、合計サイズを削減するために、プルーナーによって削除候補として選択されている。
このイメージは現在、次のアクティブな API オブジェクトのいずれによっても参照されていない。
-
running
またはpending
状態の Pod。 - デプロイメント、レプリケーションコントローラー、レプリカセット、またはステートフルセット。
- ビルド、ビルド設定、ジョブ、または cron ジョブ。
-
この方法では、主なトリガーはプロジェクトのサイズですが、イメージがアクティブに使用されていないことを確認するための安全性チェックも実行されます。
13.6.4. イメージのプルーニング操作の実行 リンクのコピーリンクがクリップボードにコピーされました!
イメージのプルーニング操作を実行するには、次の手順に従います。
前提条件
- アクセストークンを使用して CLI にログインした。
-
system:image-pruner
以上のクラスターロール (例:cluster-admin
) を持っている。 - イメージレジストリーが公開されている。
- このドキュメントの「手動でイメージを削除する場合の考慮事項」セクションを確認した。
手順
オプション: 次のコマンドを入力して、プルーニングされるイメージをプレビューします。このコマンドは、削除されるイメージ、イメージストリーム、および Pod のリストを出力します。
--confirm
フラグを追加するまで何も削除されないことに注意してください。oc adm prune images <image_prune_option_one> <image_prune_option_two>
$ oc adm prune images <image_prune_option_one> <image_prune_option_two>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用可能なプルーニングオプションの詳細は、「手動イメージプルーニングコマンドのオプション」を参照してください。
- 出力をレビューして、削除されるイメージ、イメージストリーム、および Pod のリストを確認します。
クラスターに適切なオプションを指定して
oc adm prune images
コマンドを実行します。削除を確認するには、--confirm
フラグを追加します。以下に例を示します。oc adm prune images <image_prune_option_one> <image_prune_option_two> --confirm
$ oc adm prune images <image_prune_option_one> <image_prune_option_two> --confirm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.6.5. セキュアまたは非セキュアな接続の使用 リンクのコピーリンクがクリップボードにコピーされました!
セキュアな通信の使用は優先され、推奨される方法です。これは、必須の証明書検証と共に HTTPS 経由で実行されます。prune
コマンドは、可能な場合は常にセキュアな通信の使用を試行します。これを使用できない場合には、非セキュアな通信にフォールバックすることがあり、これには危険が伴います。この場合、証明書検証は省略されるか、単純な HTTP プロトコルが使用されます。
非セキュアな通信へのフォールバックは、--certificate-authority
が指定されていない場合、以下のケースで可能になります。
-
prune
コマンドが--force-insecure
オプションと共に実行される。 -
指定される
registry-url
の前にhttp://
スキームが付けられる。 -
指定される
registry-url
はローカルリンクアドレスまたはlocalhost
である。 -
現行ユーザーの設定が非セキュアな接続を許可する。これは、ユーザーが
--insecure-skip-tls-verify
を使用してログインするか、プロンプトが出される際に非セキュアな接続を選択することによって生じる可能性があります。
レジストリーのセキュリティーが、OpenShift Container Platform で使用されるものとは異なる認証局で保護される場合、これを --certificate-authority
フラグを使用して指定する必要があります。そうしない場合、prune
コマンドがエラーを出して失敗します。
13.6.6. イメージプルーニングの CLI オプション リンクのコピーリンクがクリップボードにコピーされました!
次の表では、oc adm prune images <image_prune_option>
コマンドで使用できるオプションについて説明します。
オプション | 説明 |
---|---|
|
レジストリーにプッシュされていないものの、プルスルー (pullthrough) でミラーリングされたイメージを組み込みます。これはデフォルトでオンに設定されます。プルーニングを統合レジストリーにプッシュされたイメージに制限するには、 |
| OpenShift Container Platform で管理されるレジストリーと通信する際に使用する認証局ファイルへのパスです。デフォルトは現行ユーザーの設定ファイルの認証局データに設定されます。これが指定されている場合、セキュアな通信が実行されます。 |
|
test-run を実行する代わりにプルーニングが実行されることを示します。これには、統合コンテナーイメージレジストリーへの有効なルートが必要になります。このコマンドがクラスターネットワーク外で実行される場合、ルートは |
| このオプションは注意して使用してください。HTTP 経由でホストされるか、無効な HTTPS 証明書を持つコンテナーレジストリーへの非セキュアな接続を許可します。 |
|
それぞれのイメージストリームについては、タグごとに最大 |
|
現在の時間との対比で |
|
同じプロジェクトに定義される最小の制限を超える各イメージをプルーニングします。このフラグは |
|
レジストリーと通信する際に使用するアドレスです。このコマンドは、管理されるイメージおよびイメージストリームから判別されるクラスター内の URL の使用を試行します。これに失敗する (レジストリーを解決できないか、これにアクセスできない) 場合、このフラグを使用して他の機能するルートを指定する必要があります。レジストリーのホスト名の前には、特定の接続プロトコルを実施する |
| 他のオプションで規定される条件と共に、このオプションは、OpenShift Container Platform イメージ API オブジェクトに対応するレジストリーのデータがプルーニングされるかどうかを制御します。デフォルトで、イメージのプルーニングは、イメージ API オブジェクトとレジストリーの対応するデータの両方を処理します。 このオプションは、イメージオブジェクトの数を減らすなどの目的で etcd の内容のみを削除することを検討していているか (ただしレジストリーのストレージのクリーンアップは検討していない場合)、レジストリーの適切なメンテナンス期間中にレジストリーのハードプルーニングによってこれを別途実行しようとする場合に役立ちます。 |
13.6.6.1. --prune-registry フラグに関する追加情報 リンクのコピーリンクがクリップボードにコピーされました!
--prune-registry=false
フラグを渡すことで、OpenShift Container Platform イメージ API オブジェクトの削除とレジストリー内のイメージデータの削除を分離できます。たとえば、次のコマンドは、レジストリーストレージはそのまま残し、API オブジェクトのみを削除します。
oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m --confirm --prune-registry=false
$ oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m --confirm --prune-registry=false
次に、レジストリーのハードプルーニングを実行して、関連するイメージデータを削除します。このアプローチでは、1 つのコマンドで両方を削除する場合と比較して、競合状態のが発生し得るタイミングウィンドウを短くできます。
ただし、タイミングウィンドウは完全になくなるわけではありません。たとえば、イメージがプルーニング対象として識別されていても、そのイメージを参照する Pod が作成されることがあります。プルーニング中に作成された API オブジェクトを追跡し、削除されたコンテンツを参照していないことを確認する必要があります。
--prune-registry
オプションを指定せずに、または --prune-registry=true
を指定してプルーニングを再実行しても、以前に --prune-registry=false
を指定してプルーニングされたイメージに関連付けられたレジストリーストレージは削除されません。これらのイメージは、レジストリーのハードプルーニングを実行することによってのみ、レジストリーストレージから削除できます。詳細は、「レジストリーのハードプルーニング」を参照してください。
13.6.7. イメージのプルーニングに関する問題 リンクのコピーリンクがクリップボードにコピーされました!
13.6.7.1. イメージがプルーニングされない リンクのコピーリンクがクリップボードにコピーされました!
イメージが蓄積し続け、prune
コマンドが予想よりも小規模な削除を実行する場合、プルーニング候補のイメージについて満たすべきイメージプルーティングの条件があることを確認します。
とくに削除する必要のあるイメージが、それぞれのタグ履歴において選択したタグリビジョンのしきい値よりも高い位置にあることを確認します。たとえば、sha256:abz
という名前の古く陳腐化したイメージがあるとします。イメージがタグ付けされている namespace で以下のコマンドを実行すると、イメージが myapp
という単一イメージストリームで 3 回タグ付けされていることに気づかれるでしょう。
oc get is -n <namespace> -o go-template='{{range $isi, $is := .items}}{{range $ti, $tag := $is.status.tags}}'\ '{{range $ii, $item := $tag.items}}{{if eq $item.image "sha256:<hash>"}}{{$is.metadata.name}}:{{$tag.tag}} at position {{$ii}} out of {{len $tag.items}}\n'\ '{{end}}{{end}}{{end}}{{end}}'
$ oc get is -n <namespace> -o go-template='{{range $isi, $is := .items}}{{range $ti, $tag := $is.status.tags}}'\
'{{range $ii, $item := $tag.items}}{{if eq $item.image "sha256:<hash>"}}{{$is.metadata.name}}:{{$tag.tag}} at position {{$ii}} out of {{len $tag.items}}\n'\
'{{end}}{{end}}{{end}}{{end}}'
出力例
myapp:v2 at position 4 out of 5 myapp:v2.1 at position 2 out of 2 myapp:v2.1-may-2016 at position 0 out of 1
myapp:v2 at position 4 out of 5
myapp:v2.1 at position 2 out of 2
myapp:v2.1-may-2016 at position 0 out of 1
デフォルトオプションが使用される場合、イメージは myapp:v2.1-may-2016
タグの履歴の 0
の位置にあるためプルーニングされません。イメージがプルーニングの対象とみなされるようにするには、管理者は以下を実行する必要があります。
oc adm prune images
コマンドで--keep-tag-revisions=0
を指定します。警告このアクションを実行すると、イメージが指定されたしきい値よりも新しいか、これよりも新しいオブジェクトによって参照されていない限り、すべてのタグが基礎となるイメージと共にすべての namespace から削除されます。
-
リビジョンのしきい値の下にあるすべての
istags
、つまりmyapp:v2.1
およびmyapp:v2.1-may-2016
を削除します。 -
同じ
istag
にプッシュする新規ビルドを実行するか、他のイメージをタグ付けしてイメージを履歴内でさらに移動させます。ただし、これは古いリリースタグの場合には常に適切な操作となる訳ではありません。
特定のイメージのビルド日時が名前の一部になっているタグは、その使用を避ける必要があります (イメージが未定義の期間保持される必要がある場合を除きます)。このようなタグは履歴内で 1 つのイメージのみに関連付けられる可能性があり、その場合にこれらをプルーニングできなくなります。
13.6.7.2. 非セキュアなレジストリーに対するセキュアな接続の使用 リンクのコピーリンクがクリップボードにコピーされました!
oc adm prune images
コマンドの出力で以下のようなメッセージが表示される場合、レジストリーのセキュリティーは保護されておらず、oc adm prune images
クライアントがセキュアな接続の使用を試行することを示しています。
error: error communicating with registry: Get https://172.30.30.30:5000/healthz: http: server gave HTTP response to HTTPS client
error: error communicating with registry: Get https://172.30.30.30:5000/healthz: http: server gave HTTP response to HTTPS client
-
推奨される解決法として、レジストリーのセキュリティーを保護することができます。そうしない場合は、
--force-insecure
をコマンドに追加して、クライアントに対して非セキュアな接続の使用を強制することができますが、これは推奨される方法ではありません。
13.6.7.3. セキュリティーが保護されたレジストリーに対する非セキュアな接続の使用 リンクのコピーリンクがクリップボードにコピーされました!
oc adm prune images
コマンドの出力に以下のエラーのいずれかが表示される場合、レジストリーのセキュリティー保護に使用されている認証局で署名された証明書が、接続の検証用に oc adm prune images
クライアントで使用されるものとは異なることを意味します。
error: error communicating with registry: Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02" error: error communicating with registry: [Get https://172.30.30.30:5000/healthz: x509: certificate signed by unknown authority, Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"]
error: error communicating with registry: Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
error: error communicating with registry: [Get https://172.30.30.30:5000/healthz: x509: certificate signed by unknown authority, Get http://172.30.30.30:5000/healthz: malformed HTTP response "\x15\x03\x01\x00\x02\x02"]
デフォルトでは、ユーザーの接続ファイルに保存されている認証局データが使用されます。これはマスター API との通信の場合も同様です。
--certificate-authority
オプションを使用してコンテナーイメージレジストリーサーバーに適切な認証局を指定します。
13.6.7.4. 正しくない認証局の使用 リンクのコピーリンクがクリップボードにコピーされました!
以下のエラーは、セキュリティーが保護されたコンテナーイメージレジストリーの証明書の署名に使用される認証局がクライアントで使用される認証局とは異なることを示しています。
error: error communicating with registry: Get https://172.30.30.30:5000/: x509: certificate signed by unknown authority
error: error communicating with registry: Get https://172.30.30.30:5000/: x509: certificate signed by unknown authority
フラグ --certificate-authority
を使用して適切な認証局を指定します。
回避策として、--force-insecure
フラグを代わりに追加することもできます。ただし、これは推奨される方法ではありません。