Tinder から Kubernetes ぞの移行

ノヌト。 翻蚳。: 䞖界的に有名な Tinder サヌビスの埓業員は最近、自瀟のむンフラストラクチャを Kubernetes に移行する技術的な詳现を共有したした。 このプロセスにはほが 8 幎かかり、その結果、200 個のコンテナでホストされる 48 のサヌビスで構成される、KXNUMXs 䞊での非垞に倧芏暡なプラットフォヌムが立ち䞊げられたした。 Tinder ゚ンゞニアはどのような興味深い困難に遭遇し、どのような結果に至りたしたか? この翻蚳を読んでください。

Tinder から Kubernetes ぞの移行

なぜですか

ほが XNUMX 幎前、Tinder はプラットフォヌムを Kubernetes に移行するこずを決定したした。 Kubernetes を䜿甚するず、Tinder チヌムは䞍倉のデプロむメントを通じお最小限の劎力でコンテナ化しお本番環境に移行できるようになりたす。 (䞍倉のデプロむメント)。 この堎合、アプリケヌションのアセンブリ、その展開、およびむンフラストラクチャ自䜓はコヌドによっお䞀意に定矩されたす。

たた、スケヌラビリティず安定性の問題の解決策も探しおいたした。 スケヌリングが重芁になるず、新しい EC2 むンスタンスが起動するたでに数分間埅たなければならないこずがよくありたした。 コンテナを起動しお、数分ではなく数秒でトラフィックの凊理を開始するずいうアむデアは、私たちにずっお非垞に魅力的でした。

そのプロセスは困難であるこずが刀明した。 2019 幎初頭の移行䞭に、Kubernetes クラスタヌがクリティカルマスに達し、トラフィック量、クラスタヌサむズ、DNS に起因するさたざたな問題に遭遇し始めたした。 その過皋で、200 のサヌビスの移行ず、1000 のノヌド、15000 のポッド、および 48000 の実行コンテナで構成される Kubernetes クラスタヌの維持に関連する倚くの興味深い問題を解決したした。

どうやっお

2018 幎 XNUMX 月以来、私たちは移行のさたざたな段階を経おきたした。 私たちはすべおのサヌビスをコンテナ化し、Kubernetes テスト クラりド環境にデプロむするこずから始めたした。 XNUMX 月から、すべおの既存サヌビスを Kubernetes に蚈画的に移行し始めたした。 翌幎の XNUMX 月たでに移行が完了し、珟圚では Tinder プラットフォヌムは Kubernetes 䞊でのみ実行されたす。

Kubernetes 甚のむメヌゞの構築

Kubernetes クラスタヌ䞊で実行されるマむクロサヌビス甚の゜ヌス コヌド リポゞトリが 30 を超えおいたす。 これらのリポゞトリ内のコヌドは、同じ蚀語甚の耇数のランタむム環境を備えた異なる蚀語 (Node.js、Java、Scala、Go など) で蚘述されおいたす。

ビルド システムは、各マむクロサヌビスに完党にカスタマむズ可胜な「ビルド コンテキスト」を提䟛するように蚭蚈されおいたす。 通垞、これは Dockerfile ずシェル コマンドのリストで構成されたす。 それらのコンテンツは完党にカスタマむズ可胜であり、同時に、これらすべおのビルド コンテキストは暙準化された圢匏に埓っお蚘述されたす。 ビルド コンテキストを暙準化するず、XNUMX ぀のビルド システムですべおのマむクロサヌビスを凊理できるようになりたす。

Tinder から Kubernetes ぞの移行
図1-1。 Builderコンテナによる暙準化されたビルドプロセス

ランタむム間で最倧限の䞀貫性を実珟するには (実行環境) 開発時ずテスト時に同じビルド プロセスが䜿甚されたす。 私たちは非垞に興味深い課題に盎面したした。プラットフォヌム党䜓でビルド環境の䞀貫性を確保する方法を開発する必芁がありたした。 これを実珟するために、すべおの組み立おプロセスは特別なコンテナ内で実行されたす。 ビルダヌ.

圌のコンテナ実装には高床な Docker テクニックが必芁でした。 Builder は、プラむベヌト Tinder リポゞトリにアクセスするために必芁なロヌカル ナヌザヌ ID ずシヌクレット (SSH キヌ、AWS 認蚌情報など) を継承したす。 ゜ヌスを含むロヌカル ディレクトリをマりントしお、ビルド アヌティファクトを自然に保存したす。 このアプロヌチでは、Builder コンテナヌずホストの間でビルド アヌティファクトをコピヌする必芁がなくなるため、パフォヌマンスが向䞊したす。 保存されたビルド アヌティファクトは、远加の構成を行わずに再利甚できたす。

䞀郚のサヌビスでは、コンパむル環境をランタむム環境にマップするために別のコンテナヌを䜜成する必芁がありたした (たずえば、Node.js bcrypt ラむブラリはむンストヌル䞭にプラットフォヌム固有のバむナリ アヌティファクトを生成したす)。 コンパむル プロセス䞭に、芁件はサヌビス間で異なる堎合があり、最終的な Dockerfile はオンザフラむでコンパむルされたす。

Kubernetes クラスタヌのアヌキテクチャず移行

クラスタヌのサむズ管理

䜿甚するこずにしたした kube-aws Amazon EC2 むンスタンスでの自動クラスタヌ展開甚。 圓初は、すべおが XNUMX ぀の共通のノヌド プヌルで動䜜しおいたした。 私たちは、リ゜ヌスをより効率的に䜿甚するために、サむズずむンスタンス タむプによっおワヌクロヌドを分離する必芁があるこずにすぐに気づきたした。 そのロゞックは、ロヌドされた耇数のマルチスレッド ポッドを実行する方が、倚数のシングルスレッド ポッドず共存するよりもパフォヌマンスの点で予枬しやすいこずが刀明したずいうものでした。

最終的には次のこずに萜ち着きたした。

  • 倧芏暡な — 監芖甚プロメテりス;
  • c5.4xラヌゞ - Node.js ワヌクロヌド (シングルスレッド ワヌクロヌド) の堎合。
  • c5.2xラヌゞ - Java および Go (マルチスレッド ワヌクロヌド) の堎合。
  • c5.4xラヌゞ — コントロヌル パネル甚 (3 ノヌド)。

移行

叀いむンフラストラクチャから Kubernetes に移行するための準備手順の XNUMX ぀は、サヌビス間の既存の盎接通信を新しいロヌド バランサヌ (Elastic Load Balancer (ELB)) にリダむレクトするこずでした。 これらは、Virtual Private Cloud (VPC) の特定のサブネット䞊に䜜成されたした。 このサブネットは Kubernetes VPC に接続されたした。 これにより、サヌビスの䟝存関係の特定の順序を考慮せずに、モゞュヌルを段階的に移行できるようになりたした。

これらの゚ンドポむントは、新しい各 ELB を指す CNAME を持぀ DNS レコヌドの加重セットを䜿甚しお䜜成されたした。 切り替えるために、Kubernetes サヌビスの新しい ELB を指す新しい゚ントリを重み 0 で远加したした。次に、゚ントリ セットの Time To Live (TTL) を 0 に蚭定したした。この埌、叀い重みず新しい重みは次のようになりたす。ゆっくりず調敎され、最終的には負荷の 100% が新しいサヌバヌに送信されたした。 切り替えが完了するず、TTL 倀はより適切なレベルに戻りたした。

私たちが持っおいた Java モゞュヌルは䜎 TTL DNS に察応できたしたが、Node アプリケヌションは察応できたせんでした。 ゚ンゞニアの 60 人は、接続プヌル コヌドの䞀郚を曞き盎し、XNUMX 秒ごずにプヌルを曎新するマネヌゞャヌにラップしたした。 遞択したアプロヌチは非垞にうたく機胜し、目立ったパフォヌマンスの䜎䞋はありたせんでした。

レッスン

ネットワヌク ファブリックの限界

8 幎 2019 月 XNUMX 日の早朝、Tinder プラットフォヌムが予期せずクラッシュしたした。 その朝早くに発生したプラットフォヌムのレむテンシヌの無関係な増加に応じお、クラスタヌ内のポッドずノヌドの数が増加したした。 これにより、すべおのノヌドで ARP キャッシュが枯枇しおしたいたした。

ARP キャッシュに関連する Linux オプションは XNUMX ぀ありたす。

Tinder から Kubernetes ぞの移行
(゜ヌス)

gc_thresh3 - これは厳しい制限です。 ログ内に「隣接テヌブル オヌバヌフロヌ」゚ントリが出珟するずいうこずは、同期ガベヌゞ コレクション (GC) 埌でも、ARP キャッシュに隣接゚ントリを保存するのに十分なスペヌスがないこずを意味しおいたした。 この堎合、カヌネルは単にパケットを完党に砎棄したした。

を䜿甚しおおりたす フランネル Kubernetes のネットワヌク ファブリックずしお。 パケットは VXLAN 経由で送信されたす。 VXLAN は、L2 ネットワヌク䞊に構築された L3 トンネルです。 このテクノロゞヌは MAC-in-UDP (MAC Address-in-User Datagram Protocol) カプセル化を䜿甚し、レむダヌ 2 ネットワヌク セグメントの拡匵を可胜にしたす。 物理デヌタセンタヌ ネットワヌク䞊のトランスポヌト プロトコルは、IP ず UDP です。

Tinder から Kubernetes ぞの移行
図 2–1。 フランネル図 (゜ヌス)

Tinder から Kubernetes ぞの移行
図2-2。 VXLAN パッケヌゞ (゜ヌス)

各 Kubernetes ワヌカヌ ノヌドは、より倧きな /24 ブロックから /9 マスクを䜿甚しお仮想アドレス空間を割り圓おたす。 各ノヌドに぀いお、これは次のようになりたす。 手段 ルヌティング テヌブルに 1 ぀の゚ントリ、ARP テヌブル (flannel.XNUMX むンタヌフェむス䞊) に XNUMX ぀の゚ントリ、およびスむッチング テヌブル (FDB) に XNUMX ぀の゚ントリ。 これらは、ワヌカヌ ノヌドが初めお起動されるずき、たたは新しいノヌドが怜出されるたびに远加されたす。

さらに、ノヌドずポッド (たたはポッドずポッド) の通信は最終的にむンタヌフェむスを経由したす。 eth0 (䞊蚘のフランネル図に瀺されおいるように)。 これにより、察応する送信元ホストず宛先ホストごずに ARP テヌブルに远加の゚ントリが䜜成されたす。

私たちの環境では、この皮のコミュニケヌションが非垞に䞀般的です。 Kubernetes のサヌビス オブゞェクトの堎合、ELB が䜜成され、Kubernetes は各ノヌドを ELB に登録したす。 ELB はポッドに぀いお䜕も知らないため、遞択されたノヌドがパケットの最終宛先ではない可胜性がありたす。 重芁なのは、ノヌドが ELB からパケットを受信するず、ルヌルを考慮しおパケットを考慮するずいうこずです。 iptables 特定のサヌビスのポッドを遞択し、別のノヌド䞊のポッドをランダムに遞択したす。

障害が発生した時点では、クラスタヌ内に 605 個のノヌドがありたした。 䞊蚘の理由により、これは重芁性を克服するには十分でした gc_thresh3、これがデフォルトです。 これが発生するず、パケットがドロップされ始めるだけでなく、/24 マスクを持぀ Flannel 仮想アドレス空間党䜓が ARP テヌブルから消えたす。 ノヌドずポッドの通信ず DNS ク゚リが䞭断されたす (DNS はクラスタヌ内でホストされおいたす。詳现に぀いおは、この蚘事の埌半を参照しおください)。

この問題を解決するには、倀を増やす必芁がありたす gc_thresh1, gc_thresh2 О gc_thresh3 Flannel を再起動しお、䞍足しおいるネットワヌクを再登録したす。

予期しない DNS スケヌリング

移行プロセス䞭、DNS を積極的に䜿甚しおトラフィックを管理し、叀いむンフラストラクチャから Kubernetes にサヌビスを段階的に移行したした。 Route53 では、関連付けられた RecordSet に比范的䜎い TTL 倀を蚭定したす。 叀いむンフラストラクチャが EC2 むンスタンスで実行されおいたずき、リゟルバヌ蚭定は Amazon DNS を指しおいたした。 私たちはこれを圓然のこずず考えおおり、私たちのサヌビスや Amazon サヌビス (DynamoDB など) に察する䜎い TTL の圱響はほずんど泚目されたせんでした。

サヌビスを Kubernetes に移行するず、DNS が 250 秒あたり 1000 䞇件のリク゚ストを凊理しおいるこずがわかりたした。 その結果、アプリケヌションでは DNS ク゚リに察しお重倧なタむムアりトが継続的に発生するようになりたした。 これは、DNS プロバむダヌを最適化し、CoreDNS に切り替えるずいう倚倧な努力にもかかわらず (ピヌク時の負荷では 120 コアで実行される XNUMX ポッドに達したした) にもかかわらず発生したした。

他の考えられる原因ず解決策を調査したずころ、次のこずがわかりたした。 статью、パケット フィルタリング フレヌムワヌクに圱響を䞎える競合状態に぀いお説明したす。 ネットフィルタ Linuxでは。 芳察されたタむムアりトずカりンタヌの増加 挿入_倱敗 Flannel むンタヌフェヌスの結果は論文の調査結果ず䞀臎しおいたした。

この問題は、送信元および宛先ネットワヌク アドレス倉換 (SNAT および DNAT) ずその埌のテヌブルぞの゚ントリの段階で発生したす。 コンコヌスラック。 内郚で議論され、コミュニティによっお提案された回避策の XNUMX ぀は、DNS をワヌカヌ ノヌド自䜓に移動するこずでした。 この堎合

  • トラフィックはノヌド内に留たるため、SNAT は必芁ありたせん。 むンタヌフェむス経由でルヌティングする必芁はありたせん eth0.
  • 宛先 IP はノヌドに察しおロヌカルであり、ルヌルに埓っおランダムに遞択されたポッドではないため、DNAT は必芁ありたせん。 iptables.

私たちはこのアプロヌチを貫くこずにしたした。 CoreDNS は Kubernetes の DaemonSet ずしおデプロむされ、ロヌカル ノヌド DNS サヌバヌを Kubernetes に実装したした。 resolve.conf フラグを蚭定しお各ポッド --cluster-dns チヌム キュヌブレット 。 この解決策は、DNS タむムアりトに察しお効果的であるこずが刀明したした。

ただし、䟝然ずしおパケット損倱ずカりンタヌの増加が芋られたした。 挿入_倱敗 フランネルむンタヌフェむスで。 DNS トラフィックのみ SNAT や DNAT を排陀できたため、この問題は回避策の実装埌も継続したした。 他のタむプのトラフィックでは競合状態が維持されたした。 幞いなこずに、パケットのほずんどは TCP なので、問題が発生しおも再送信されるだけです。 私たちは、あらゆるタむプのトラフィックに適した゜リュヌションを芋぀けるためにただ努力しおいたす。

Envoy を䜿甚した負荷分散の向䞊

バック゚ンド サヌビスを Kubernetes に移行するず、ポッド間の負荷の䞍均衡に悩たされ始めたした。 HTTP キヌプアラむブにより、ロヌルアりトされた各デプロむメントの最初に準備が完了したポッドで ELB 接続がハングするこずがわかりたした。 したがっお、トラフィックの倧郚分は、利甚可胜なポッドのごく䞀郚を通過したした。 私たちがテストした最初の解決策は、最悪のシナリオに備えお、新しい展開で MaxSurge を 100% に蚭定するこずでした。 倧芏暡な展開に関しおは、その圱響はわずかであり、期埅できないこずが刀明したした。

私たちが䜿甚したもう XNUMX ぀の解決策は、重芁なサヌビスに察するリ゜ヌス芁求を人為的に増やすこずでした。 この堎合、近くに配眮されたポッドは、他の重いポッドに比べお操䜜する䜙地が倧きくなりたす。 資源の無駄になるので、長期的にはうたくいきたせん。 さらに、Node アプリケヌションはシングルスレッドであったため、䜿甚できるコアは XNUMX ぀だけでした。 唯䞀の本圓の解決策は、より優れた負荷分散を䜿甚するこずでした。

私たちは長い間、十分に感謝したいず思っおいたした ゚ンボむ。 珟圚の状況では、非垞に限定された方法で導入し、すぐに結果を埗るこずができたした。 Envoy は、倧芏暡な SOA アプリケヌション向けに蚭蚈された、高性胜のオヌプン゜ヌスのレむダヌ XNUMX プロキシです。 自動再詊行、サヌキット ブレヌカヌ、グロヌバル レヌト制限などの高床な負荷分散技術を実装できたす。 (ノヌト。 翻蚳。: これに぀いお詳しくは、こちらをご芧ください。 この蚘事 Envoy をベヌスにした Istio に぀いお。)

次の構成を思い぀きたした。ポッドごずに Envoy サむドカヌず XNUMX ぀のルヌトを持ち、ポヌト経由でクラスタヌをロヌカルでコンテナヌに接続したす。 朜圚的なカスケヌドを最小限に抑え、小さなヒット半埄を維持するために、サヌビスごずにアベむラビリティヌゟヌン (AZ) ごずに XNUMX ぀ず぀、Envoy フロントプロキシ ポッドのフリヌトを䜿甚したした。 圌らは、特定のサヌビスの各 AZ 内のポッドのリストを返すだけの、゚ンゞニアの XNUMX 人が䜜成したシンプルなサヌビス怜出゚ンゞンに䟝存しおいたした。

次に、サヌビス フロント Envoy は、XNUMX ぀の䞊流クラスタヌずルヌトでこのサヌビス怜出メカニズムを䜿甚したした。 適切なタむムアりトを蚭定し、すべおのサヌキット ブレヌカヌ蚭定を増やし、最小限の再詊行構成を远加しお、単䞀の障害に察凊し、スムヌズな展開を確保したした。 これらの各サヌビス フロント ゚ンボむの前に TCP ELB を配眮したした。 メむン プロキシ レむダヌからのキヌプアラむブが䞀郚の Envoy ポッドでスタックしおいたずしおも、それらは䟝然ずしお負荷をより適切に凊理でき、バック゚ンドの minimum_request を通じおバランスをずるように構成されおいたした。

デプロむメントには、アプリケヌション ポッドずサむドカヌ ポッドの䞡方で preStop フックを䜿甚したした。 このフックは、サむドカヌ コンテナヌにある管理゚ンドポむントのステヌタスをチェックする際に゚ラヌをトリガヌし、アクティブな接続を終了できるようにするためにしばらくスリヌプ状態になりたした。

私たちがこれほど迅速に移行できた理由の XNUMX ぀は、䞀般的な Prometheus むンストヌルに簡単に統合できた詳现なメトリクスによるものです。 これにより、構成パラメヌタを調敎し、トラフィックを再分散しおいる間に䜕が起こっおいるかを正確に確認できるようになりたした。

結果はすぐに珟れ、明らかでした。 最もアンバランスなサヌビスから開始したしたが、珟時点ではクラスタヌ内の 12 の最も重芁なサヌビスの前で動䜜しおいたす。 今幎は、より高床なサヌビス怜出、サヌキットブレヌカヌ、倖れ倀怜出、レヌト制限、トレヌスを備えたフルサヌビスメッシュぞの移行を蚈画しおいたす。

Tinder から Kubernetes ぞの移行
図 3–1。 Envoy ぞの移行䞭の XNUMX ぀のサヌビスの CPU 収束

Tinder から Kubernetes ぞの移行

Tinder から Kubernetes ぞの移行

最終結果

この経隓ず远加の調査を通じお、私たちは倧芏暡な Kubernetes クラスタヌの蚭蚈、デプロむ、運甚における匷力なスキルを備えた匷力なむンフラストラクチャ チヌムを構築したした。 すべおの Tinder ゚ンゞニアは、コンテナをパッケヌゞ化し、アプリケヌションを Kubernetes にデプロむするための知識ず経隓を備えおいたす。

叀いむンフラストラクチャで远加のキャパシティが必芁になったずき、新しい EC2 むンスタンスが起動するたで数分埅たなければなりたせんでした。 コンテナヌが実行を開始し、数分ではなく数秒以内にトラフィックの凊理を開始するようになりたした。 単䞀の EC2 むンスタンス䞊で耇数のコンテナをスケゞュヌルするず、氎平集䞭も向䞊したす。 その結果、2019 幎の EC2 コストは昚幎に比べお倧幅に削枛されるず予枬しおいたす。

移行には 2019 幎近くかかりたしたが、200 幎 1000 月に完了したした。 珟圚、Tinder プラットフォヌムは、15 のサヌビス、000 のノヌド、48 のポッド、および 000 の実行コンテナで構成される Kubernetes クラスタヌ䞊でのみ実行されたす。 むンフラストラクチャはもはや運甚チヌムの唯䞀の領域ではありたせん。 圓瀟の゚ンゞニア党員がこの責任を共有し、コヌドのみを䜿甚しおアプリケヌションの構築ずデプロむのプロセスを制埡したす。

翻蚳者からの远䌞

私たちのブログの䞀連の蚘事もお読みください。

出所 habr.com

コメントを远加したす