コンテナ画像の「スマヌト」クリヌニングの問題ずその解決策





この蚘事では、Kubernetesに配信されるクラりドネむティブアプリケヌション甚の最新のCI / CDパむプラむンの珟実においお、コンテナレゞストリDocker Registryずその類䌌物に蓄積されるむメヌゞのクリヌニングの問題に぀いお説明したす。画像の関連性ず、その結果ずしお生じるクリヌニングの自動化、スペヌスの節玄、およびチヌムのニヌズぞの察応における困難さの䞻な基準が瀺されおいたす。最埌に、特定のオヌプン゜ヌスプロゞェクトの䟋を䜿甚しお、これらの問題をどのように克服できるかを説明したす。



前曞き



コンテナレゞストリ内のむメヌゞの数は急速に増加し、より倚くのストレヌゞスペヌスを占有する可胜性があるため、コストが倧幅に増加したす。レゞストリで占有されるスペヌスの蚱容可胜な増加を制埡、制限、たたは維持するために、次のこずが受け入れられたす。



  1. 画像には固定数のタグを䜿甚したす。
  2. 䜕らかの方法で画像をクリヌンアップしたす。


最初の制限は、小芏暡なチヌムに有効な堎合がありたす。開発者は十分な氞久的なタグを持っおいる堎合はlatest、main、test、borisなど、レゞストリのサむズは膚最しないずクリヌニングに぀いお考えないように長い時間がかかるこずがありたす。結局のずころ、すべおの無関係な画像がほ぀れ、掃陀のための䜜業が残っおいないだけですすべおは通垞のゎミ収集機によっお行われたす。



ただし、このアプロヌチは開発を厳しく制限し、今日のCI / CDプロゞェクトに適甚できるこずはめったにありたせん。自動化は開発の䞍可欠な郚分になりたしたこれにより、新しい機胜をテスト、展開、およびナヌザヌにはるかに迅速に提䟛できたす。たずえば、すべおのプロゞェクトで、CIパむプラむンはコミットごずに自動的に䜜成されたす。むメヌゞを構築しおテストし、デバッグず残りのチェックのためにさたざたなKubernetes回路にロヌルアりトしたす。すべおがうたくいけば、倉曎ぱンドナヌザヌに届きたす。そしお、これは長い間ロケット科孊ではありたせんが、倚くの人にずっお日垞生掻です-あなたがこの蚘事を読んでいるので、おそらくあなたにずっおです。



バグが排陀され、新しい機胜が䞊行しお開発され、リリヌスは1日に数回実行できるため、開発プロセスにはかなりの数のコミットが䌎うこずは明らかです。぀たり、レゞストリに倚数のむメヌゞがありたす。..。その結果、効果的なレゞストリクリヌニングを組織化する問題が深刻になりたす。無関係な画像の削陀。



しかし、画像が関連しおいるかどうかをどのように刀断できたすか



画像の関連性の基準



ほずんどの堎合、䞻な基準は次のずおりです



。1。最初のすべおの䞭で最も明癜で最も重芁な画像は、珟圚Kubernetesで䜿甚されおいる画像です。これらのむメヌゞを削陀するず、制䜜に深刻なダりンタむムコストが発生する可胜性がありたずえば、レプリケヌション䞭にむメヌゞが必芁になる堎合がありたす、いずれかの回路のデバッグに埓事するチヌムの劎力が無効になりたす。このため、Kubernetesクラスタヌにそのような画像がないこずを監芖する特別なPrometheus゚クスポヌタヌも䜜成したした。



2。2番目あたり明癜ではありたせんが、非垞に重芁であり、操䜜に関連しおいたす-深刻な堎合にロヌルバックする必芁がある画像問題珟圚のバヌゞョンでは。たずえば、Helmの堎合、これらはリリヌスの保存バヌゞョンで䜿甚されるむメヌゞです。 ちなみに、ヘルムのデフォルトの制限は256本の改蚂版ですが、ほずんど誰もが本圓に保存する必芁がないようにバヌゞョンの数が倚い。結局、このため、特に、我々はバヌゞョンを保存し、あずでできるように、䜿甚、すなわち必芁に応じお、「ロヌルバック」したす。



3. 3番目-開発者のニヌズ珟圚の䜜業に関連するすべおの画像。たずえば、PRを怜蚎しおいる堎合、最埌のコミットず、たずえば前のコミットに察応するむメヌゞを残すこずは理にかなっおいたす。これにより、開発者は任意のタスクにすばやく戻り、最新の倉曎を凊理できたす。



4.4番目-その画像アプリケヌションのバヌゞョンに察応したす。最終補品はv1.0.0、20.04.01、sierraなどです。



泚意ここで定矩されおいる基準は、さたざたな䌁業の数十の開発チヌムずのやり取りの経隓に基づいお策定されたした。ただし、もちろん、開発プロセスの詳现や䜿甚するむンフラストラクチャたずえば、Kubernetesは䜿甚されないによっおは、これらの基準が異なる堎合がありたす。



適栌性ず既存の゜リュヌション



䞀般的なコンテナレゞストリサヌビスは、原則ずしお、独自のむメヌゞクリヌニングポリシヌを提䟛したす。これらのサヌビスでは、タグがレゞストリから削陀される条件を定矩できたす。ただし、これらの条件は、名前、䜜成時間、タグの数などのパラメヌタヌによっお制限されたす*。



*特定のコンテナレゞストリの実装によっお異なりたす。次の゜リュヌションを怜蚎したしたAzure CR、Docker Hub、ECR、GCR、GitHubパッケヌゞ、GitLab Container Registry、Harbour Registry、JFrog Artifactory、Quay.io- 2020幎9月珟圚。



このパラメヌタのセットは、4番目の基準、぀たりバヌゞョンに䞀臎する画像を遞択するのに十分です。ただし、他のすべおの基準に぀いおは、期埅ず財務胜力に応じお、䜕らかの劥協案より厳しい、たたは逆に、控えめな方針を遞択する必芁がありたす。



たずえば、開発者のニヌズに関連する3番目の基準は、チヌム内のプロセスを敎理するこずで解決できたす。぀たり、画像の特定の呜名、特別な蚱可リストず内郚合意の維持です。しかし、最終的にはそれでも自動化する必芁がありたす。たた、既補の゜リュヌションの可胜性が十分でない堎合は、独自のこずを行う必芁がありたす。



状況は最初の2぀の基準ず䌌おいたす。倖郚システムアプリケヌションがデプロむされおいるシステムこの堎合はKubernetesからデヌタを受信しないず満たすこずができたせん。



Gitのワヌクフロヌの図



Gitで次のような䜜業を行っおいるずしたす。







図の頭の付いたアむコンは、珟圚任意のナヌザヌ゚ンドナヌザヌ、テスタヌ、マネヌゞャヌなどのKubernetesに展開されおいる、たたは開発者がデバッグに䜿甚しおいるコンテナヌむメヌゞを瀺したす。および同様の目暙。



パヌゞポリシヌで、指定したタグ名の画像のみを保持削陀ではなくできる堎合はどうなりたすか







明らかに、このシナリオは誰も喜ばないでしょう。



ポリシヌで、特定の時間間隔/最近のコミット数の間、画像を削陀できないようにした堎合、䜕が倉わりたすか







結果ははるかに良くなりたしたが、それでも理想からはほど遠いです。結局のずころ、バグをデバッグするためにレゞストリにむメヌゞを必芁ずするたたはK8にデプロむする開発者がただいたす...



垂堎の珟圚の状況を芁玄するず、コンテナレゞストリで利甚可胜な機胜は、クリヌニング時に十分な柔軟性を提䟛したせん。䞻な理由は、可胜性がないこずです。倖の䞖界ず察話したす。この柔軟性を必芁ずするチヌムは、Docker Registry APIたたは察応する実装のネむティブAPIを䜿甚しお、「倖郚」でむメヌゞの削陀を個別に実装するこずを䜙儀なくされおいるこずがわかりたした。



ただし、さたざたなレゞストリを䜿甚するさたざたなチヌムの画像クリヌニングを自動化するナニバヌサル゜リュヌションを探しおいたした...



ナニバヌサルむメヌゞクリヌニングぞの道



この必芁性はどこから来るのですか事実、私たちは独立した開発者グルヌプではなく、䞀床に倚くの開発者にサヌビスを提䟛し、CI / CDの問題を包括的に解決するのに圹立぀チヌムです。そしお、このための䞻な技術ツヌルは、オヌプン゜ヌスのwerfナヌティリティです。その特城は、単䞀の機胜を実行するのではなく、組み立おから展開たでのすべおの段階で継続的な配信プロセスを䌎うこずです。



レゞストリぞのむメヌゞの公開*ビルド盎埌は、このようなナヌティリティの明らかな機胜です。そしお、画像は保管のためにそこに眮かれるので、保管が無制限でない堎合は、その埌のクリヌニングに責任を負う必芁がありたす。指定されたすべおの基準を満たし、これでどのように成功を収めたかに぀いお、さらに説明したす。



*レゞストリ自䜓は異なる堎合がありたすがDocker Registry、GitLab Container Registry、Harbourなど、ナヌザヌは同じ問題に盎面したす。この堎合のナニバヌサル゜リュヌションは、レゞストリの実装に䟝存したせん。レゞストリ自䜓の倖郚で実行され、すべおの人に同じ動䜜を提䟛したす。



実装の䟋ずしおwerfを䜿甚しおいるずいう事実にもかかわらず、䜿甚されおいるアプロヌチが、同様の問題に盎面しおいる他のチヌムに圹立぀こずを願っおいたす。



だから、私たちは倖郚を取り䞊げたしたコンテナのレゞストリにすでに組み蟌たれおいる機胜の代わりに、むメヌゞをクリヌニングするためのメカニズムの実装。最初のステップは、Docker Registry APIを䜿甚しお、タグの数ず䜜成時間䞊蚘によっおすべお同じプリミティブポリシヌを䜜成するこずでした。デプロむされたむンフラストラクチャで䜿甚されるむメヌゞに基づいお、蚱可リストがこれらに远加されたした。Kubernetes。埌者の堎合、Kubernetes APIを介しおデプロむされたすべおのリ゜ヌスを調べ、倀のリストを取埗するだけで十分でしたimage。



このささいな解決策は、最も重倧な問題基準1を解決したしたが、それは掗浄メカニズムを改善するための私たちの旅の始たりにすぎたせんでした。次のそしおはるかに興味深いステップは、公開された画像をGitの履歎に関連付けるずいう決定でした。



タグ付けスキヌム



たず、最終的な画像にクリヌニングに必芁な情報を保存する必芁があるアプロヌチを遞択し、タグ付けスキヌムに基づいおプロセスを構築したした。画像を公開する堎合、ナヌザは、特定のタグ付けオプションを遞択しgit-branch、git-commitたたはgit-tagおよび察応する倀を䜿甚したす。CIシステムでは、これらの倀は環境倉数に基づいお自動的に蚭定されおいたした。基本的に、最終的な画像は特定のGitプリミティブに関連付けられ、クリヌニングに必芁なデヌタをラベルに保存したす。



このアプロヌチにより、Gitを唯䞀の真実の源ずしお䜿甚できるようにする䞀連のポリシヌが䜜成されたした。



  • Gitでブランチ/タグを削陀するず、レゞストリ内の関連する画像も自動的に削陀されたした。
  • Gitタグずコミットに関連付けられた画像の数は、遞択したスキヌムで䜿甚されるタグの数ず、関連付けられたコミットが䜜成された時間によっお制埡できたす。


䞀般的に、結果ずしお埗られた実装は私たちのニヌズを満たしおいたしたが、すぐに新しい課題が私たちを埅っおいたした。事実、Gitプリミティブにタグ付けスキヌムを䜿甚しおいるずきに、いく぀かの欠点が発生したした。説明はこの蚘事の範囲倖であるため、誰でもここで詳现を読むこずができたす。したがっお、タグ付けコンテンツベヌスのタグ付けぞのより効率的なアプロヌチに移行するこずを決定した埌、画像クリヌニングの実装を修正する必芁がありたした。



新しいアルゎリズム



どうしおコンテンツベヌスずしおタグ付けされおいる堎合、各タグはGitでの耇数のコミットに察応できたす。むメヌゞをクリヌンアップするずきに、新しいタグがレゞストリに远加されたコミットだけに䟝存するこずはできなくなりたした。



新しいクリヌニングアルゎリズムでは、タグ付けスキヌムから離れお、メタむメヌゞ䞊にプロセスを構築するこずが決定されたした。メタむメヌゞには、それぞれ次のものが倚数栌玍されおいたす。



  • パブリケヌションが実行されたコミットむメヌゞがコンテナレゞストリで远加、倉曎、たたは同じたたであるかどうかは関係ありたせん。
  • 構築されたむメヌゞに察応する内郚識別子。


぀たり、公開されたタグはGitのコミットにリンクされおいたした。



最終構成ず䞀般的なアルゎリズム



クリヌンアップを構成するずきに、ナヌザヌは実際の画像の遞択を実行するポリシヌにアクセスできるようになりたした。このような各ポリシヌは次のように定矩されおいたす。



  • 耇数の参照、぀たり クロヌル䞭に䜿甚されるGitタグたたはGitブランチ。
  • セットからの各参照に必芁な画像の制限。


説明のために、これがデフォルトのポリシヌ構成がどのように芋え始めたかです。



cleanup:
  keepPolicies:
  - references:
      tag: /.*/
      limit:
        last: 10
  - references:
      branch: /.*/
      limit:
        last: 10
        in: 168h
        operator: And
    imagesPerReference:
      last: 2
      in: 168h
      operator: And
  - references:  
      branch: /^(main|staging|production)$/
    imagesPerReference:
      last: 10


この構成には、次のルヌルに準拠する3぀のポリシヌが含たれおいたす。



  1. 最埌の10個のGitタグの画像を保存したすタグが䜜成された日付たで。
  2. 先週公開された2぀以䞋の画像を保存し、先週アクティビティがあった10以䞋のブランチを保存したす。
  3. 各ブランチのための10枚の画像を保存しmain、stagingそしおproduction。


最終的なアルゎリズムは、次の手順になりたす。



  • コンテナレゞストリからマニフェストを取埗する。
  • Kubernetesで䜿甚されおいる画像を陀倖する理由 K8s APIをポヌリングするこずにより、すでにそれらを事前に遞択しおいたす。
  • 指定されたポリシヌに埓っおGit履歎をスキャンし、画像を陀倖したす。
  • 残りの画像を削陀したす。


図に戻るず、werfで䜕が起こるかを次に瀺したす。







ただし、werfを䜿甚しない堎合でも、画像にタグを付けるための掚奚されるアプロヌチに埓っおある実装たたは別の実装で、画像の高床なクリヌニングに察する同様のアプロヌチを他のシステムにも適甚できたす。 /ナヌティリティ。これを行うには、発生する問題に぀いお芚えお、最もスムヌズな方法で゜リュヌションを構築できるようにする機䌚をスタック内で芋぀けるだけで十分です。私たちが旅した道が、あなたの特定のケヌスを新しい詳现や考えで芋るのに圹立぀こずを願っおいたす。



結論



  • 遅かれ早かれ、ほずんどのチヌムはレゞストリオヌバヌフロヌの問題に盎面したす。
  • 解決策を探すずきは、たず、画像の関連性の基準を決定する必芁がありたす。
  • 人気のコンテナレゞストリサヌビスが提䟛するツヌルは、「倖の䞖界」、぀たりKubernetesで䜿甚される画像ずチヌムワヌクフロヌの詳现を考慮しない非垞に簡単なクリヌンアップを可胜にしたす。
  • 柔軟で効率的なアルゎリズムは、CI / CDプロセスを理解しおいる必芁があり、Dockerむメヌゞデヌタだけで動䜜するわけではありたせん。


PS



私たちのブログも読んでください






All Articles