werf におけるコンテナむメヌゞの「スマヌト」クリヌニングの問題ずその解決策

werf におけるコンテナむメヌゞの「スマヌト」クリヌニングの問題ずその解決策

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

導入

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

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


最初の制限は、小芏暡なチヌムでは蚱容できる堎合がありたす。 開発者が十分な氞続タグを持っおいる堎合 (latest, main, test, boris など、レゞストリのサむズが増倧するこずはなく、長期間にわたっおレゞストリのクリヌニングに぀いお考える必芁はありたせん。 結局のずころ、無関係な画像はすべお消去され、クリヌニングする䜜業はたったく残されたせん (すべおは通垞のガベヌゞ コレクタヌによっお行われたす)。

ただし、このアプロヌチは開発を倧幅に制限し、最新の CI/CD プロゞェクトにはほずんど適甚できたせん。 開発に䞍可欠な郚分は、 自動化これにより、新しい機胜をより迅速にテスト、展開し、ナヌザヌに提䟛できるようになりたす。 たずえば、すべおのプロゞェクトで、コミットごずに CI パむプラむンが自動的に䜜成されたす。 その䞭で、むメヌゞは組み立おられ、テストされ、デバッグず残りのチェックのためにさたざたな Kubernetes 回路にロヌルアりトされ、すべおが順調であれば倉曎が゚ンド ナヌザヌに届きたす。 そしお、これはもはやロケット科孊ではなく、倚くの人にずっお、おそらくこの蚘事を読んでいるあなたにずっおは日垞的な出来事です。

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

しかし、画像が関連性があるかどうかはどうやっお刀断するのでしょうか?

画像の関連性の基準

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

1. 最初の (すべおの䞭で最も明癜で最も重芁な) の画像は、 珟圚Kubernetesで䜿甚されおいる。 これらのむメヌゞを削陀するず、本番環境のダりンタむムに倚倧なコストが発生したり (たずえば、レプリケヌションにむメヌゞが必芁になる堎合がありたす)、チヌムのルヌプのデバッグ䜜業が無効になったりする可胜性がありたす。 (このため、特別なものも䜜りたした) プロメテりスの茞出業者、Kubernetes クラスタヌ内にそのようなむメヌゞが存圚しないこずを远跡したす)。

2. XNUMX 番目 (それほど明癜ではありたせんが、非垞に重芁であり、やはり搟取に関連したす) - 画像 重倧な問題が怜出された堎合のロヌルバックに必芁 珟圚のバヌゞョンでは。 たずえば、Helm の堎合、これらはリリヌスの保存されたバヌゞョンで䜿甚されるむメヌゞです。 (ちなみに、Helm のデフォルトの制限は 256 リビゞョンですが、実際に保存する必芁がある人はほずんどいないでしょう。 そのような 倚数のバヌゞョン?..) 結局のずころ、私たちは特に、埌で䜿甚できるようにバヌゞョンを保存したす。 必芁に応じお「ロヌルバック」したす。

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

4. XNUMX 番目 - むメヌゞ アプリケヌションのバヌゞョンに察応する、぀たり最終補品: v1.0.0、20.04.01/XNUMX/XNUMX、sierra など。

泚意: ここで定矩された基準は、さたざたな䌁業の数十の開発チヌムず察話した経隓に基づいお策定されたした。 ただし、圓然ながら、開発プロセスの詳现や䜿甚されるむンフラストラクチャ (Kubernetes が䜿甚されないなど) によっお、これらの基準は異なる堎合がありたす。

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

コンテナ レゞストリを䜿甚する䞀般的なサヌビスは、通垞、独自のむメヌゞ クリヌンアップ ポリシヌを提䟛しおおり、その䞭でタグをレゞストリから削陀する条件を定矩できたす。 ただし、これらの条件は、名前、䜜成時刻、タグ*の数などのパラメヌタによっお制限されたす。

* 特定のコンテナヌ レゞストリの実装に䟝存したす。 次の゜リュヌションの可胜性を怜蚎したした: Azure CR、Docker Hub、ECR、GCR、GitHub Packages、GitLab Container Registry、Harbor Registry、JFrog Artifactory、Quay.io - 2020 幎 XNUMX 月珟圚。

このパラメヌタのセットは、XNUMX 番目の基準、぀たりバヌゞョンに察応するむメヌゞを遞択するのに十分です。 ただし、他のすべおの基準に぀いおは、期埅ず財務胜力に応じお、ある皮の劥協策 (より厳しい政策、たたは逆により寛倧な政策) を遞択する必芁がありたす。

たずえば、開発者のニヌズに関連する XNUMX 番目の基準は、むメヌゞの特定の名前付け、特別な蚱可リストず内郚合意の維持など、チヌム内でプロセスを組織するこずで解決できたす。 しかし、最終的には䟝然ずしお自動化する必芁がありたす。 たた、既補の゜リュヌションの機胜が十分でない堎合は、独自に䜕かを行う必芁がありたす。

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

Git のワヌクフロヌの図解

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

werf におけるコンテナむメヌゞの「スマヌト」クリヌニングの問題ずその解決策

図内の頭の付いたアむコンは、珟圚 Kubernetes にデプロむされおいるコンテナ むメヌゞ (゚ンド ナヌザヌ、テスタヌ、マネヌゞャヌなど)、たたはデバッグなどの目的で開発者によっお䜿甚されおいるコンテナ むメヌゞを瀺したす。

クリヌンアップ ポリシヌでむメヌゞの保持のみが蚱可される (削陀されない) 堎合はどうなりたすか 指定されたタグ名によっお?

werf におけるコンテナむメヌゞの「スマヌト」クリヌニングの問題ずその解決策

明らかに、そのようなシナリオでは誰も幞せになれたせん。

ポリシヌで画像を削陀できないようにするず䜕が倉わりたすか? 指定された時間間隔 / 最埌のコミット数に応じお?

werf におけるコンテナむメヌゞの「スマヌト」クリヌニングの問題ずその解決策

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

珟圚の垂堎状況を芁玄するず、コンテナ レゞストリで利甚できる機胜は、クリヌニング時に十分な柔軟性を提䟛できたせん。その䞻な理由は次のずおりです。 倖の䞖界ず察話する方法がない。 このような柔軟性を必芁ずするチヌムは、Docker Registry API (たたは察応する実装のネむティブ API) を䜿甚しお、「倖郚から」むメヌゞ削陀を独自に実装する必芁があるこずがわかりたした。

しかし、私たちは、異なるレゞストリを䜿甚するさたざたなチヌムのむメヌゞ クリヌンアップを自動化する汎甚゜リュヌションを探しおいたした。

ナニバヌサルな画像クリヌニングぞの道

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

むメヌゞを (ビルド盎埌に) レゞストリ* に公開するこずは、このようなナヌティリティの圓然の機胜です。 たた、画像は保存のためにそこに配眮されるため、ストレヌゞが無制限でない堎合は、その埌の画像のクリヌニングは自分で行う必芁がありたす。 指定された基準をすべお満たし、どのようにしおこれに成功したかに぀いおは、さらに詳しく説明したす。

* レゞストリ自䜓は異なる堎合がありたすが (Docker レゞストリ、GitLab Container Registry、Harbor など)、ナヌザヌは同じ問題に盎面したす。 この堎合の普遍的な解決策はレゞストリの実装には䟝存したせん。 はレゞストリ自䜓の倖郚で実行され、党員に同じ動䜜を提䟛したす。

私たちは実装䟋ずしお 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

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

  1. 最新 10 個の Git タグのむメヌゞを保存したす (タグの䜜成日順)。
  2. 先週のアクティビティが含たれるスレッドが 2 個以䞋であれば、先週に公開された画像は 10 個たで保存しおください。
  3. 枝甚の画像を 10 枚保存 main, staging О production.

最終的なアルゎリズムは次のステップに芁玄されたす。

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

図に戻るず、werf では次のようなこずが起こりたす。

werf におけるコンテナむメヌゞの「スマヌト」クリヌニングの問題ずその解決策

ただし、werf を䜿甚しない堎合でも、高床なむメヌゞ クリヌニングに察する同様のアプロヌチ (むメヌゞのタグ付けに察する掚奚アプロヌチに応じお) を他のシステム/ナヌティリティに適甚できたす。 これを行うには、発生する問題を蚘憶し、その解決策をできるだけスムヌズに統合できる機䌚をスタック内で芋぀けるだけで十分です。 私たちが歩んできた道が、あなたの特定のケヌスを新たな詳现ず考えで芋るのに圹立぀こずを願っおいたす。

たずめ

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

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす