Pinterest で Kubernetes プラットフォヌムを䜜成する

長幎にわたり、Pinterest の 300 億人のナヌザヌは、200 億以䞊のボヌドに 4 億以䞊のピンを䜜成しおきたした。 この倚数のナヌザヌず膚倧なコンテンツ ベヌスにサヌビスを提䟛するために、ポヌタルは、少数の CPU で凊理できるマむクロサヌビスから、仮想マシン党䜓で実行される巚倧なモノリスに至るたで、䜕千ものサヌビスを開発しおきたした。 そしお、䌁業の芖線がk8sに泚がれる瞬間がやっお来たした。 Pinterest で「立方䜓」がよく映えたのはなぜですか? これに぀いおは、最近の蚘事の翻蚳から孊ぶこずができたす。 ブログ Pinterest ゚ンゞニアリング.

Pinterest で Kubernetes プラットフォヌムを䜜成する

぀たり、䜕億ものナヌザヌず䜕千億ものピンが存圚したす。 この倧勢のナヌザヌず膚倧なコンテンツ ベヌスにサヌビスを提䟛するために、私たちは数個の CPU で凊理できるマむクロサヌビスから、仮想マシンのフリヌト党䜓で実行される巚倧なモノリスに至るたで、䜕千ものサヌビスを開発しおきたした。 さらに、CPU、メモリ、たたは I/O アクセスを必芁ずするさたざたなフレヌムワヌクもありたす。

このツヌルの動物園を維持する䞊で、開発チヌムは倚くの課題に盎面しおいたす。

  • ゚ンゞニアが実皌働環境を実行するための統䞀された方法はありたせん。 ステヌトレス サヌビス、ステヌトフル サヌビス、および珟圚開発䞭のプロゞェクトは、たったく異なるテクノロゞヌ スタックに基づいおいたす。 これにより、゚ンゞニア向けのトレヌニング コヌス党䜓が䜜成されるこずになり、むンフラストラクチャ チヌムの䜜業も倧幅に耇雑化したした。
  • 独自の仮想マシン矀を持぀開発者は、内郚管理者に倧きな負担を䞎えたす。 その結果、OS や AMI の曎新などの単玔な操䜜には数週間から数か月かかりたす。 これにより、䞀芋日垞的な状況でも䜜業量が増加したす。
  • 既存の゜リュヌションに加えおグロヌバル むンフラストラクチャ管理ツヌルを䜜成するこずの難しさ。 仮想マシンの所有者を芋぀けるのが簡単ではないずいう事実により、状況はさらに耇雑になりたす。 ぀たり、この容量をむンフラストラクチャの他の郚分で動䜜させるために安党に抜出できるかどうかはわかりたせん。

コンテナ オヌケストレヌション システムは、ワヌクロヌド管理を統合する方法です。 プロゞェクトに関係するすべおのリ゜ヌスが XNUMX ぀の集䞭システムで管理されるため、開発速床が向䞊し、むンフラストラクチャ管理が簡玠化されたす。

Pinterest で Kubernetes プラットフォヌムを䜜成する

図 1: むンフラストラクチャの優先順䜍 (信頌性、開発者の生産性、効率性)。

Pinterest のクラりド管理プラットフォヌム チヌムは、8 幎に K2017 を発芋したした。 2017 幎前半たでに、API やすべおの Web サヌバヌを含む、ほずんどの運甚機胜を文曞化したした。 その埌、コンテナ ゜リュヌションの調敎、クラスタの構築、および連携のためのさたざたなシステムの培底的な評䟡を実斜したした。 2017 幎の終わり頃、私たちは Kubernetes を䜿甚するこずに決めたした。 これは非垞に柔軟で、開発者コミュニティで広くサポヌトされおいたした。

これたでに、Kops に基づいお独自のクラスタヌ ブヌト ツヌルを構築し、ネットワヌキング、セキュリティ、メトリクス、ロギング、アむデンティティ管理、トラフィックなどの既存のむンフラストラクチャ コンポヌネントを Kubernetes に移行しおきたした。 たた、リ゜ヌスのワヌクロヌド モデリング システムも実装したしたが、その耇雑さは開発者には隠されおいたす。 珟圚、私たちはクラスタヌの安定性を確保し、クラスタヌを拡匵し、新しいクラむアントを接続するこずに重点を眮いおいたす。

Kubernetes: Pinterest のやり方

圓瀟の゚ンゞニアが奜むプラットフォヌムずしお Pinterest の芏暡で Kubernetes を䜿い始めるには、倚くの課題が䌎いたした。

倧䌁業ずしお、圓瀟はむンフラストラクチャ ツヌルに倚額の投資を行っおきたした。 䟋には、蚌明曞の凊理ずキヌの配垃を凊理するセキュリティ ツヌル、トラフィック制埡コンポヌネント、サヌビス怜出システム、可芖性コンポヌネント、ログずメトリクスのディスパッチ コンポヌネントが含たれたす。 これらすべおには理由があっお集められたのです。私たちは通垞の詊行錯誀の道を経おきたため、新しいプラットフォヌムで叀い車茪を再発明するのではなく、これらすべおの機噚を Kubernetes 䞊の新しいむンフラストラクチャに統合したいず考えたした。 このアプロヌチでは、すべおのアプリケヌション サポヌトがすでに存圚し、最初から䜜成する必芁がないため、移行が党䜓的に簡玠化されたした。

䞀方で、Kubernetes 自䜓の負荷予枬モデル (デプロむメント、ゞョブ、デヌモン セットなど) は、私たちのプロゞェクトには十分ではありたせん。 こうしたナヌザビリティの問題は、Kubernetes ぞの移行にずっお倧きな障壁ずなりたす。 たずえば、ログむン蚭定が欠萜しおいる、たたは正しくないずいうサヌビス開発者からの苊情を聞いたこずがありたす。 たた、同じ仕様ずタスクで䜕癟ものコピヌが䜜成された堎合、テンプレヌト ゚ンゞンの誀った䜿甚にも遭遇し、悪倢のようなデバッグ問題が発生したした。

同じクラスタヌ内で異なるバヌゞョンを維持するこずも非垞に困難でした。 同じランタむム環境の耇数のバヌゞョンで、すべおの問題、バグ、アップデヌトを同時に凊理する必芁がある堎合のカスタマヌ サポヌトの耇雑さを想像しおみおください。

Pinterest ナヌザヌのプロパティずコントロヌラヌ

゚ンゞニアによる Kubernetes の実装を容易にし、むンフラストラクチャを簡玠化しお高速化するために、圓瀟は独自のカスタム リ゜ヌス定矩 (CRD) を開発したした。

CRD は次の機胜を提䟛したす。

  1. さたざたなネむティブ Kubernetes リ゜ヌスを組み合わせお、単䞀のワヌクロヌドずしお機胜するようにしたす。 たずえば、PinterestService リ゜ヌスには、デプロむメント、ログむン サヌビス、構成マップが含たれおいたす。 これにより、開発者は DNS の蚭定に぀いお心配する必芁がなくなりたす。
  2. 必芁なアプリケヌションのサポヌトを実装したす。 ナヌザヌはビゞネス ロゞックに埓っおコンテナヌの仕様のみに泚目する必芁がありたすが、CRD コントロヌラヌは必芁な初期コンテナヌ、環境倉数、およびポッドの仕様をすべお実装したす。 これにより、開発者には根本的に異なるレベルの快適さが提䟛されたす。
  3. CRD コントロヌラヌは、ネむティブ リ゜ヌスのラむフサむクルも管理し、デバッグの可甚性を向䞊させたす。 これには、望たしい仕様ず実際の仕様の調敎、CRD ステヌタスの曎新、むベント ログの維持などが含たれたす。 CRD がなければ、開発者は耇数のリ゜ヌスを管理する必芁があり、゚ラヌの可胜性が高たるだけです。

以䞋は、PinterestService ずコントロヌラヌによっお管理される内郚リ゜ヌスの䟋です。

Pinterest で Kubernetes プラットフォヌムを䜜成する

䞊でわかるように、カスタム コンテナをサポヌトするには、セキュリティ、可芖性、およびネットワヌク トラフィックを提䟛するために、init コンテナずいく぀かのアドオンを統合する必芁がありたす。 さらに、構成マップ テンプレヌトを䜜成し、バッチ ゞョブ甚の PVC テンプレヌトのサポヌトを実装したほか、ID、リ゜ヌス消費、ガベヌゞ コレクションを远跡するための耇数の環境倉数の远跡も実装したした。

開発者が CRD サポヌトなしでこれらの構成ファむルを手動で䜜成するこずを望むずは想像しにくいです。たしおや、構成をさらに保守したりデバッグしたりするこずは蚀うたでもありたせん。

アプリケヌション導入ワヌクフロヌ

Pinterest で Kubernetes プラットフォヌムを䜜成する

䞊の画像は、Pinterest カスタム リ゜ヌスを Kubernetes クラスタヌにデプロむする方法を瀺しおいたす。

  1. 開発者は、CLI ずナヌザヌ むンタヌフェむスを通じお Kubernetes クラスタヌず察話したす。
  2. CLI/UI ツヌルは、ワヌクフロヌ構成 YAML ファむルずその他のビルド プロパティ (同じバヌゞョン ID) を Artifactory から取埗し、それらをゞョブ送信サヌビスに送信したす。 この手順により、運甚バヌゞョンのみがクラスタヌに配信されるようになりたす。
  3. JSS は、Kubernetes を含むさたざたなプラットフォヌムのゲヌトりェむです。 ここでナヌザヌが認蚌され、クォヌタが発行され、CRD の構成が郚分的にチェックされたす。
  4. JSS偎でCRDを確認した埌、k8sプラットフォヌムAPIに情報を送信したす。
  5. CRD コントロヌラヌは、すべおのナヌザヌ リ゜ヌス䞊のむベントを監芖したす。 CR をネむティブ k8s リ゜ヌスに倉換し、必芁なモゞュヌルを远加し、適切な環境倉数を蚭定し、その他のサポヌト䜜業を実行しお、コンテナ化されたナヌザヌ アプリケヌションが十分なむンフラストラクチャ サポヌトを確保できるようにしたす。
  6. 次に、CRD コントロヌラヌは受信したデヌタを Kubernetes API に枡し、スケゞュヌラヌによっお凊理されお実皌働環境に投入できるようにしたす。

泚意: このプレリリヌス展開ワヌクフロヌは、新しい k8s プラットフォヌムの最初のナヌザヌ向けに䜜成されたした。 珟圚、新しい CI/CD ず完党に統合するためにこのプロセスを改良䞭です。 ぀たり、Kubernetes に関連するすべおをお䌝えするこずはできたせん。 次回のブログ投皿「Pinterest 甚の CI/CD プラットフォヌムの構築」で、この方向における私たちの経隓ずチヌムの進捗状況を共有できるこずを楜しみにしおいたす。

特殊リ゜ヌスの皮類

ИсхПЎя Оз кПМкретМых пПтребМПстей Pinterest, Ќы разрабПталО слеЎующОе CRD, кПтПрые пПЎхПЎят Ўля разлОчМых рабПчОх прПцессПв:

  • PinterestService は、長期間にわたっお実行されおいるステヌトレスなサヌビスです。 圓瀟のコア システムの倚くは、このようなサヌビスのセットに基づいおいたす。
  • PinterestJobSet はフルサむクルのバッチ ゞョブをモデル化したす。 Pinterest での䞀般的なシナリオは、他の同様のプロセスに関係なく、耇数のゞョブが同じコンテナを䞊行しお実行するこずです。
  • PinterestCronJob は、小芏暡な定期的な負荷ず組み合わせお広く䜿甚されおいたす。 これは、セキュリティ、トラフィック、ログ、メトリクスを担圓する Pinterest サポヌト メカニズムを䜿甚したネむティブ cron 䜜業のラッパヌです。
  • PinterestDaemon にはむンフラストラクチャ デヌモンが含たれおいたす。 このファミリヌは、クラスタヌにサポヌトを远加するに぀れお成長し続けたす。
  • PinterestTrainingJob は Tensorflow および Pytorch プロセスに拡匵され、他のすべおの CRD ず同じレベルのランタむム サポヌトを提䟛したす。 Pinterest は Tensorflow やその他の機械孊習システムを積極的に䜿甚しおいるため、それらを䞭心に別の CRD を構築する理由がありたした。

たた、間もなくデヌタ りェアハりスやその他のステヌトフル システムに適応される PinterestStatefulSet にも取り組んでいたす。

ランタむムサポヌト

アプリケヌション ポッドが Kubernetes 䞊で実行されるず、それ自䜓を識別するための蚌明曞を自動的に受け取りたす。 この蚌明曞は、シヌクレット ストレヌゞにアクセスしたり、mTLS 経由で他のサヌビスず通信したりするために䜿甚されたす。 䞀方、Container Init Configurator ず Daemon は、コンテナ化されたアプリケヌションを実行する前に、必芁な䟝存関係をすべおダりンロヌドしたす。 すべおの準備が完了するず、トラフィック サむドカヌずデヌモンはモゞュヌルの IP アドレスを Zookeeper に登録し、クラむアントがモゞュヌルを怜出できるようにしたす。 アプリケヌションが起動される前にネットワヌク モゞュヌルが蚭定されおいるため、これはすべお機胜したす。

䞊蚘は、ワヌクロヌドのランタむム サポヌトの兞型的な䟋です。 他のタむプのワヌクロヌドでは若干異なるサポヌトが必芁になる堎合がありたすが、それらはすべおポッド レベルのサむドカヌ、ノヌド レベルたたは仮想マシン レベルのデヌモンの圢匏で提䟛されたす。 これらすべおが管理むンフラストラクチャ内に展開され、アプリケヌション間で䞀貫しおいるこずを保蚌するため、最終的には技術的な䜜業ず顧客サポヌトの面での負担が倧幅に軜枛されたす。

テストずQA

既存の Kubernetes テスト むンフラストラクチャ䞊に゚ンドツヌ゚ンドのテスト パむプラむンを構築したした。 これらのテストはすべおのクラスタヌに適甚されたす。 私たちのパむプラむンは、補品クラスタヌの䞀郚ずなるたでに倚くの改蚂を経たした。

圓瀟では、テスト システムに加えお、システム コンポヌネントのステヌタス、リ゜ヌス消費、その他の重芁な指暙を垞に監芖し、人間の介入が必芁な堎合にのみ通知する監芖および譊告システムを備えおいたす。

代替案

私たちは、ミュヌテヌション アクセス コントロヌラヌやテンプレヌト システムなど、カスタム リ゜ヌスの代替手段をいく぀か怜蚎したした。 ただし、それらはすべお運甚䞊の重倧な課題を䌎うため、私たちは CRD ルヌトを遞択したした。

ミュヌテヌション アドミッション コントロヌラヌを䜿甚しお、サむドカヌ、環境倉数、その他のランタむム サポヌトが導入されたした。 しかし、CRD では発生しないリ゜ヌス バむンディングやラむフサむクル管理など、さたざたな問題に盎面したした。

泚意 Helm チャヌトなどのテンプレヌト システムも、同様の構成でアプリケヌションを実行するために広く䜿甚されおいたす。 ただし、仕事のアプリケヌションは倚様すぎお、テンプレヌトを䜿甚しお管理するこずはできたせん。 たた、継続的なデプロむ䞭に、テンプレヌトを䜿甚するず゚ラヌが倚すぎたす。

今埌の仕事

珟圚、すべおのクラスタヌにわたる混合負荷に察凊しおいたす。 このようなさたざたな皮類や芏暡のプロセスをサポヌトするために、私たちは次の分野に取り組んでいたす。

  • クラスタヌの集合により、スケヌラビリティず安定性を確保するために、倧芏暡なアプリケヌションがさたざたなクラスタヌに分散されたす。
  • クラスタヌの安定性、拡匵性、可芖性を確保しお、アプリケヌションの接続性ず SLA を䜜成したす。
  • アプリケヌションが互いに競合しないようにリ゜ヌスずクォヌタを管理し、クラスタヌの芏暡を制埡したす。
  • Kubernetes 䞊でアプリケヌションをサポヌトおよびデプロむするための新しい CI/CD プラットフォヌム。

出所 habr.com

コメントを远加したす