11.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/v1
      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> コマンドで使用できるオプションについて説明しています。

    表11.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 の内容のみを削除することを検討していているか (ただしレジストリーのストレージのクリーンアップは検討していない場合)、レジストリーの適切なメンテナンス期間中にレジストリーのハードプルーニングによってこれを別途実行しようとする場合に役立ちます。

11.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 を指定してプルーニングされたすべてのイメージは、レジストリーのハードプルーニングによってのみ削除できます。