10.6. イメージの手動プルーニング
プルーニングのカスタムリソースにより、イメージの自動プルーニングが有効になります。ただし、管理者は、使用年数やステータスまたは制限の超過によりシステムで不要となったイメージを手動でプルーニングすることができます。イメージを手動でプルーニングする方法は 2 つあります。
-
イメージのプルーニングをクラスター上で
Job
またはCronJob
として実行する。 -
oc adm prune images
コマンドを実行する。
前提条件
-
イメージをプルーニングするには、まずアクセストークンを使ってユーザーとして CLI にログインする必要があります。ユーザーにはクラスターロール
system:image-pruner
以上のロールがなければなりません (例:cluster-admin
)。 - イメージレジストリーを公開します。
手順
使用年数やステータスまたは制限の超過によりシステムで不要となったイメージを手動でプルーニングするには、以下の方法のいずれかを使用します。
以下の例のように、
pruner
サービスアカウントの YAML ファイルを作成して、イメージプルーニングをクラスター上でJob
またはCronJob
として実行します。$ oc create -f <filename>.yaml
出力例
kind: List apiVersion: v1 items: - apiVersion: v1 kind: ServiceAccount metadata: name: pruner namespace: openshift-image-registry - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: openshift-image-registry-pruner roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:image-pruner subjects: - kind: ServiceAccount name: pruner namespace: openshift-image-registry - apiVersion: batch/v1beta1 kind: CronJob metadata: name: image-pruner namespace: openshift-image-registry spec: schedule: "0 0 * * *" concurrencyPolicy: Forbid successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 3 jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - image: "quay.io/openshift/origin-cli:4.1" resources: requests: cpu: 1 memory: 1Gi terminationMessagePolicy: FallbackToLogsOnError command: - oc args: - adm - prune - images - --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt - --keep-tag-revisions=5 - --keep-younger-than=96h - --confirm=true name: image-pruner serviceAccountName: pruner
oc adm prune images [<options>]
コマンドを実行します。$ oc adm prune images [<options>]
--prune-registry=false
が使用されていない限り、イメージのプルーニングにより、統合レジストリーのデータが削除されます。--namespace
フラグの付いたイメージをプルーニングしてもイメージは削除されず、イメージストリームのみが削除されます。イメージは namespace を使用しないリソースです。そのため、プルーニングを特定の namespace に制限すると、現在の使用量を算出できなくなります。デフォルトで、統合レジストリーは Blob のメタデータをキャッシュしてストレージに対する要求数を減らし、要求の処理速度を高めます。プルーニングによって統合レジストリーのキャッシュが更新されることはありません。プルーニング後の依然としてプルーニングされた層を含むイメージは破損します。キャッシュにメタデータを持つプルーニングされた層はプッシュされないためです。そのため、プルーニング後にキャッシュをクリアするためにレジストリーを再デプロイする必要があります。
$ oc rollout restart deployment/image-registry -n openshift-image-registry
統合レジストリーが Redis キャッシュを使用する場合、データベースを手動でクリーンアップする必要があります。
プルーニング後にレジストリーを再デプロイすることがオプションでない場合は、キャッシュを永続的に無効にする必要があります。
oc adm prune images
操作ではレジストリーのルートが必要です。レジストリーのルートはデフォルトでは作成されません。Prune images CLI configuration options の表では、
oc adm prune images <options>
コマンドで使用できるオプションについて説明しています。表10.4 イメージのプルーニング用の CLI の設定オプション オプション 説明 --all
レジストリーにプッシュされていないものの、プルスルー (pullthrough) でミラーリングされたイメージを組み込みます。これはデフォルトでオンに設定されます。プルーニングを統合レジストリーにプッシュされたイメージに制限するには、
--all=false
を渡します。--certificate-authority
OpenShift Container Platform で管理されるレジストリーと通信する際に使用する認証局ファイルへのパスです。デフォルトは現行ユーザーの設定ファイルの認証局データに設定されます。これが指定されている場合、セキュアな通信が実行されます。
--confirm
test-run を実行する代わりにプルーニングが実行されることを示します。これには、統合コンテナーイメージレジストリーへの有効なルートが必要になります。このコマンドがクラスターネットワーク外で実行される場合、ルートは
--registry-url
を使用して指定される必要があります。--force-insecure
このオプションは注意して使用してください。HTTP 経由でホストされるか、または無効な HTTPS 証明書を持つコンテナーレジストリーへの非セキュアな接続を許可します。
--keep-tag-revisions=<N>
それぞれのイメージストリームについては、タグごとに最大
N
のイメージリビジョンを保持します (デフォルト:3
)。--keep-younger-than=<duration>
現在の時間との対比で
<duration>
より後の新しいイメージはプルーニングしません。または、現在の時間との対比で<duration>
より後の他のオブジェクトで参照されるイメージはプルーニングしません (デフォルト:60m
)。--prune-over-size-limit
同じプロジェクトに定義される最小の制限を超える各イメージをプルーニングします。このフラグは
--keep-tag-revisions
または--keep-younger-than
と共に使用することはできません。--registry-url
レジストリーと通信する際に使用するアドレスです。このコマンドは、管理されるイメージおよびイメージストリームから判別されるクラスター内の URL の使用を試行します。これに失敗する (レジストリーを解決できないか、これにアクセスできない) 場合、このフラグを使用して他の機能するルートを指定する必要があります。レジストリーのホスト名の前には、特定の接続プロトコルを実施する
https://
またはhttp://
を付けることができます。--prune-registry
他のオプションで規定される条件と共に、このオプションは、OpenShift Container Platform イメージ API オブジェクトに対応するレジストリーのデータがプルーニングされるかどうかを制御します。デフォルトで、イメージのプルーニングは、イメージ API オブジェクトとレジストリーの対応するデータの両方を処理します。
このオプションは、イメージオブジェクトの数を減らすなどの目的で etcd の内容のみを削除することを検討していているか (ただしレジストリーのストレージのクリーンアップは検討していない場合)、レジストリーの適切なメンテナーンス期間中にレジストリーのハードプルーニングによってこれを別途実行しようとする場合に役立ちます。
10.6.1. イメージのプルーニングの各種条件
手動でプルーニングされたイメージに条件を適用できます。
OpenShift Container Platform が管理するイメージ、またはアノテーション
openshift.io/image.managed
を持つイメージを削除するには、以下を実行します。少なくとも
--keep-younger-than
分前に作成され、現時点ではいずれによっても参照されていません。-
--keep-younger-than
分前よりも後に作成された Pod -
--keep-younger-than
分前よりも後に作成されたイメージストリーム - 実行中の Pod
- 保留中の Pod
- レプリケーションコントローラー
- デプロイメント
- デプロイメント設定
- レプリカセット
- ビルド設定
- ビルド
-
stream.status.tags[].items
の--keep-tag-revisions
の最新のアイテム
-
これは、同じプロジェクトで定義される最小の制限を超えており、現時点ではいずれにも参照されていません。
- 実行中の Pod
- 保留中の Pod
- レプリケーションコントローラー
- デプロイメント
- デプロイメント設定
- レプリカセット
- ビルド設定
- ビルド
- 外部レジストリーからのプルーニングはサポートされていません。
-
イメージがプルーニングされる際、イメージのすべての参照は
status.tags
にイメージの参照を持つすべてのイメージストリームから削除されます。 - イメージによって参照されなくなったイメージ層は削除されます。
--prune-over-size-limit
フラグは、 --keep-tag-revisions
フラグまたは --keep-younger-than
フラグと共に使用することができません。これを実行すると、この操作が許可されないことを示す情報が返されます。
--prune-registry=false
とその後にレジストリーのハードプルーニングを実行することで、OpenShift Container Platform イメージ API オブジェクトの削除とイメージデータのレジストリーからの削除を分離することができます。これにより、タイミングウィンドウが制限され、1 つのコマンドで両方をプルーニングする場合よりも安全に実行できるようになります。ただし、タイミングウィンドウを完全に取り除くことはできません。
たとえばプルーニングの実行時にプルーニング対象のイメージを特定する場合も、そのイメージを参照する Pod を引き続き作成することができます。また、プルーニングの操作時にイメージを参照している可能性のある API オブジェクトを追跡することもできます。これにより、削除されたコンテンツの参照に関連して発生する可能性のある問題を軽減できる可能性があります。
--prune-registry
オプションを指定しないか、または --prune-registry=true
を指定してプルーニングを再実行しても、--prune-registry=false
を指定して以前にプルーニングされたイメージの、イメージレジストリー内で関連付けられたストレージがプルーニングされる訳ではありません。--prune-registry=false
を指定してプルーニングされたすべてのイメージは、レジストリーのハードプルーニングによってのみ削除できます。