仕事䞭のDocker。 Badooでの䜿甚の様子1幎埌

アントン・トゥレツキヌ Badoo 


タヌントン・トゥレツキヌ

今日、私たちはそのような内郚キッチンにあなたを招埅したす。BadooはDockerが必芁かどうかを教えおくれたす。 あなたはそれを必芁ずするかどうかあなた自身のために結論を匕き出すこずを詊みるでしょう。 したがっお、この情報はすべお、そのようなものであるため、むンタヌネットでは入手できたせん。



レポヌトの䞭で、最も重芁なこずに぀いおお話したす。これは、タスクの実装をどこから開始するかに関するものです。 なぜあなたがそれをしおいるのか、なぜあなたはそれを取っおいるのかを決めなければなりたせんか

私たち自身は、これらの質問に答えたしたが、問題なく実装するこずはできたせんでした。 解決する問題の䞀郚。 䞻なものを特定したした。それらに぀いお、およびそれらにどのように察凊したかに぀いお説明したす。 最埌に、私たちの玠晎らしさ、さたざたな皮類の新しい自転車を愛するこず、それらを䜜る方法、芋るこず、発明するこずを宣䌝したす。 私はそれらをあなたに芋せたす、私は圌らに぀いおあなたに話したす、あなたはいく぀かの意芋を補いたす。 さあ、行こう



それが運甚サヌビスが必芁な理由であり、䞀般に、ある皮のビゞネスが必芁であり、特に管理者が必芁な理由です。



私たちの䞻芁なナニットはサヌビスです。 サヌビスが機胜しない堎合、なぜここに集たっおいるのですか 遠景では、サヌビスは次のようになりたす。 これは、ある皮のビゞネスロゞックを䜜成し、䜕かを取埗したいプログラマヌの知的財産です。 マシンにはいく぀かのネットワヌク蚭定の局があり、ディレクトリサヌビスに関連するものず関連しないものがいく぀かありたす。 䞀般に、これは、オペレヌションサヌビスがそれ自䜓ずシステムのチケット、たたはサヌビスが開発者からプロダクションにどのように転送されるかを瀺すも぀れを衚したす。 私たちの䞻なタスクは、1台の倧型で匷力なサヌバヌを甚意し、そこにいく぀かのサヌビスを詰め蟌む必芁があるずいうこずです。



すべおが玠晎らしく芋えたす。 過去数幎にわたっお、これに䌎う状況は決しお倉化しおいたせん。 私たちは䞡方ずも、も぀れ圢匏でサヌビスを展開し、展開したした。



問題は、マシンを凊理できず、䜕らかの理由でサヌビスを解決する必芁がある堎合です。マシンが察応できず、新しいハヌドりェアが到着したため、それを取埗しお移行したいだけです。 そしお、移行䞭に最初に取埗するこずは、たずえばDockerを䜿甚しない堎合、サヌビスをクリヌンなマシンにドラッグするこずです。クリヌンな新しいマシンではすべおが問題なく、玠晎らしい、ディレクトリがプルアップされたすが、1぀の問題... ChefやPuppetなどの構成管理システムを䜿甚しおいたすが、誰がそれらを展開しおいたすか そしお、誰がすべおを取り、すべおを取り戻すためにマニフェストを逆に曞くのですか ホヌルには3人しかいたせん。 したがっお、これを曞いおいないすべおの人は、あなたのサヌバヌに最終的にそこに䜏んでいるもののいく぀かの穎ず断片があり、これらの移行の頻床に応じお、サヌバヌが遅かれ早かれ成長するこずを知っおいるず思いたす䞀皮のゎミになりたす。 Dockerを䜿甚しお同じ移行を行った堎合、レンガを取り出しお別の堎所に配眮するず、叀いものは䜕も残されたせんでした。 いいね



したがっお、䞀般的に操䜜偎からDockerを怜蚎し始めた最初の理由は、オペレヌティングシステムからアプリケヌションを解き、ボヌルにたずめるタスクです。

次の瞬間。 なぜなら 私たちはたったくプログラマヌではありたせんが、゚ンゞニアやメンテナンス䜜業員でありながら、リ゜ヌスに぀いおは垞にハヌドりェアに぀いお考えおいたす。 ぀たり 鉄は倧きな郚屋にある物理的な箱のようなもので、冷房があり、掃陀婊がそこに来ないこずを願っおいたす。



そしお以来 専甚のデヌタセンタヌに機噚を蚭眮し、ケヌゞをいく぀か取り倖しお、ある時点で機噚を倉曎する必芁があるず考え始めたす。 いく぀かの理由で-装備が新しくなり、パフォヌマンスのオりムやナニットの皮類が増えたした。遅かれ早かれ倉曎する必芁がありたす。



したがっお、キャパシティプランニングに関連する最初の問題は、むしろ問題ではなく、タスクでさえ、可胜な限り合理的にラック内のスペヌスを䜿甚する必芁があるずいうこずです。これは電気のコストであり、䜕よりもたずお金です。



最初の瞬間からの次の結論は、同じようにネットワヌク機噚のポヌトを可胜な限り䜿いたいずいうこずです。ネットワヌク機噚も単䞀であり、スペヌスを占有し、電力も消費するからです。



私たちはそれぞれ電気を節玄し、お金を節玄し、環境にずっお玠晎らしいものにしたずいう事実にスムヌズに近づいおいたす。 これは私たちにはあたり関係ありたせんが、ここには矎しくお玠晎らしいこのようなポゞティブなボヌナスがありたす。



しかし、より匷力なサヌバヌにサヌビスをバンドルするず蚀うず、「±」ず指定した次のアむテムを取埗したす-抜象化された、より倚くの機䌚、より䞀般的な障害点のような状況になりたす。 同じ物理マシン䞊に1぀のサヌビスが存圚する堎合、すべおが正垞であり、ほずんどの堎合、サヌバヌに障害が発生しおも損倱は少なくなりたす。 この堎合、これは哲孊的な質問です。叀い機噚を新しい機噚に亀換するこずを話しおいる堎合、新しい機噚は叀い機噚よりも䜎い確率で故障する可胜性が最も高いためです。 たた、倚くの人が、展開プロセスで発生する問題の数を聞いおいたす。 ぀たり 実際、統蚈によるず、この単䞀障害点を取埗するこずは、ある皮の曲線曲線よりも生産䞊の壮倧さではありたせん。



3番目のポむント、なぜDockerを怜蚎し始めたのか、それはわくわくする深刻な問題です。プログラマヌによっお曞かれた瞬間から、アプリケヌションに結び付けられるものを䜕も倉曎せずに、アプリケヌションを本番環境に展開するこずです。 Dockerを䜿甚する堎合、 最初に、ある皮のラむブラリ、パッケヌゞ、その他のものを䜿甚しお特定の環境にアプリケヌションを配眮したした。チヌムシティで条件付きでアセンブリプロセスで配眮したした。 その埌、同じ元の圢匏でQAテストプロセスに進み、その埌、ステヌゞング、開発を通じお、コンテナ内の完成したアプリケヌションを既に実皌働に移行できたす。 ぀たり この段階でいく぀かの倉曎を砎棄したす...アプリケヌションに問題があり、このアプリケヌションのさたざたな環境が開発䞭、ステヌゞング䞭、およびQAテスト䞭の堎合、䞀般にアプリケヌションに圱響するものを理解するこずは非垞に困難です。動䜜しない、぀たり ここでこの問題を100解決したした。



最埌に、私がアスタリスク付きのアむテムずしおマヌクしたのは、最初はDockerfileを芋たずき、10幎前に䜕らかの戻りがあったように思えたからです。 キャッシュではなく、理解できないキャッシュ、パペットがあるずきに䜕かを曞く必芁がありたす、なぜこれらのtxtファむルを曞くのですか しかし実際には、これに加えお、垞に隣人の蚭定を芋るず、その人が䜕をしお䜕をしたのか、圌が䜕を考えおいたのか、Dockerがどのように動䜜し、そのようなDockerファむルを芋るのかを知るこずができたす、レむダヌのオヌバヌラップ、䜕かの実行、キャッシュの䜿甚のプロセスを最適化するために、このファむルを倉曎できる堎合がありたす。 ぀たり 実際、Dockerfileは、アプリケヌションに関する垞に最新の優れたドキュメントです。

それで、私たちは自分自身の質問に答えたした。なぜDockerが必芁なのですかこれを玹介しお、私たちは垞にこれらの手玙に戻っお芋おください私たちは決めたした、決めなかった、それは蚀及したせん、それは圓おはたりたせんか

さらに、Dockerを実装するプロセスから始たった興味深いポむント。 もちろん、問題が発生したした。 これらの問題のいく぀かは、Github Dockerなどで議論されたした。 䞀郚は解決し、䞀郚はただ把握しおいたせん。 圌らは私たちの隣に来るず思いたす。



最初の興味深い問題は、少なくずも䜕らかの圢でアプリケヌションのログをクリヌンアップするこずです。 私たちはタスクに盎面したした「syslogを䜜成し、プログラマは/ dev / logに曞き蟌みたいので、どこかに送信したり、凊理したりしたす。」



私たちは座っお考えたした2番目のサヌビスをコンテナに入れるにはどうすればよいですか 最初のアむデアは次のずおりです。1぀のコンテナ-その䞭で実行される1぀のサヌビス。 間違っおいたす。 ゞレンマが発生したす。 どうする



これは、ログを配信しおいないかどうかを尋ねられるため、各コンテナに抌し蟌む必芁がある+1サヌビスであるこずが刀明したした。 これは、䜕かをする必芁があるずいう怠を正圓化するサブパラグラフです。 そしお、い぀ものように昚日必芁なタスク。 すでにプログラマヌからログを収集する必芁がありたす。 これらのログを凊理する郚分は準備ができおいるので、必芁なのはそれだけです。 したがっお、最初に発明され、䜿甚を開始したのは、コンテナ内のdev / log゜ケットを取埗しおマッピングし、そこに曞き蟌みを開始したこずです。 かっこいい



私たちは決定し、同意し、展開し、うたくいきたした。 メッセヌゞが来おいたす。 最初の問題が発生するたで、ホストのsyslog config'iを倉曎しおリロヌドする必芁がありたした。 T.O. コンテナは叀い゜ケットを保持し続け、そこに䜕かを曞き蟌み、メッセヌゞはどこにも行かず、そこに残りたす。 どうする



この問題は良いケヌスです。これは、最初の段階にあった決定の最初のスケッチを忘れないこずを瀺唆しおいたす。 この堎合、「1぀のサヌビスが1぀のコンテナヌであるずいう考えで、コンテナヌ内にsyslogを䜜成しお、神に祝犏しおください」ずいう考えに戻る必芁がありたした。 そしお、1぀のサヌビスに぀いお物理的に私たちに話した人はいたせんでした。 syslogをコンテナにプッシュしたした。このsyslogの構成は倉曎されたせん。実際、珟圚のバヌゞョン以倖をサポヌトする必芁はありたせん。syslogでは、起動するマシンのロヌカルホストにヘルメットを送信し、 'このマシンは、ログずずもに䞭倮リポゞトリにデヌタを送信したす。



次の興味深い問題は、コンテナにディレクトリデバむスを远加したり、䜕らかの皮類のブロックデバむスを远加するために、比范的ディレクトリが必芁であるずいう事実に関するものです。 すべおがシンプルなように芋えたす。-vスむッチを指定、远加、すべおが機胜したす。 たた、圓瀟には、いく぀かのルヌプデバむスを䜿甚しおコヌドを配垃し、-o loopでマりントするずいう機胜がありたす。 抜象ブロックデバむスがあり、コンテナで起動し、このルヌプデバむスからディレクトリの䞋にあるデバむスをマップしたす。 すべおが正垞に機胜し、Dockerの特別な機胜により、すべおのディレクトリ、内郚でマップしようずするすべおのファむルは、マりントポむントのチェヌン党䜓に沿っお移動し、そのバヌゞョンで実行するために必芁なすべおのproc /マりントをドラッグしたすあなたが圌に蚀うず、すべおのproc / mountが䞀緒にドラッグしたす。

さらに、問題の本質は、すべおの人にずっお、このルヌプデバむスをアンマりントしお、マシンに12-20-50がないようにするこず、そしお叀いコヌドを毎週必芁ずしないこずが明らかになるこずだず思いたす。 そしお、私たちはここで䜕を埗たすか 特定のプロセスがブロックデバむスを保持しおいる状態になりたすが、それをアンマりントするこずはできたせん。 これを行うには、コンテナに移動しお、そこにマりント解陀する必芁がありたす。 しかし、以来 「特暩なし」モヌドでコンテナを起動したすが、そこでホストシステムからumountを䜜成するこずはできたせん。



そしお、かなり興味深い問題が発生したす。これは、コンテナでのみ再起動できるこずを瀺唆しおいたす。 これは解決策ではありたせん。これは本圓に倧きな問題です。原則ずしお、解決策は技術的ではないかもしれたせんが、組織内での䜕らかの合意の圢です。



したがっお、最初に解決できる解決策は、基本的に機胜したす-特暩モヌドでコンテナヌを取埗しお実行するこずです。 したせん

2぀目のこずは、さたざたな郚門で、プログラマヌ、リリヌスチヌム、他の誰かず䞀緒に座っお考え、これらの動的なマりントポむントを配眮しないようにする方法を考えるこずです。



぀たり これは、座っお䜕ができるかを考える必芁がある堎合の1぀です。 この問題を解決するためのいく぀かの構造的な内郚合意ず倉曎。 ぀たり この堎合、技術的な立堎から問題に぀いお戊うこずは意味がありたせん。 Dockerコンテナヌの堎合、このような動的ルヌプデバむスの䜿甚を停止したした。



以䞋の興味深いレヌキは、nf_conntrackを䜿甚しおiptablesに接続されおいたす。 Dockerに぀いお読むず、Dockerは䜕を提䟛したすか 圌は、私たちは奜きなだけコンテナを起動でき、膚倧な数のポヌトを䜿甚でき、内郚のコンテナ間の接続を手配でき、䜕らかの分離ができるず蚀いたす。 もちろん、iptablesを䜿甚するず、起動時にコンテナで指定するのを忘れた堎合に芏定できるルヌルがありたす。 しかし、誰も1぀のこずに぀いお明確に語っおいたせん。この堎合、Linuxモゞュヌルnf_conntrackを䜿甚する矩務があり、それ自䜓は高速ではありたせん。



この問題を解決する方法は2぀ありたす。

最初の方法は、アプリケヌションがネットワヌクにあたりロヌドされおいない堎合、そのたたの状態を維持するこずです。 nf_conntrackテヌブルがオヌバヌフロヌする瞬間たで、すべおが正垞に機胜したす。 寿呜を延ばすために䜕ができたすか nf_conntrackテヌブルを拡倧したす。

さらに、これはそのような因果関係です-conntrackテヌブル自䜓を増やす堎合、接続のハッシュテヌブルを増やしお、Linuxカヌネルのデフォルトよりも倚くなるようにする必芁がありたす。

3番目の項目を芚えおおく䟡倀がありたす。デフォルトでは、Linuxでは玄10分ですべおの接続が確立され、すでに解決されおいたす。 実際、最新のサヌビスでは、30秒以䞊かかるず思いたす。 接続を䜜成した埌、䜕かが発生しなかった堎合は、サヌビスが䞍良であるか、単に接続が䞍芁です。 したがっお、10分は実際のオヌバヌクロックです。



このアプロヌチでは、実践が瀺しおいるように、座っお埅぀こずができたす。 しかし、遅かれ早かれ問題が発生し、確実に発生したす。 そしお、conntrackの動䜜が遅いため、䜕もしないほうが良いずいう事実により、ある時点で、これらの増加は単に助けにはなりたせん。



この問題を自分でどのように解決したしたか 最初に蚀いたいのは、conntrackを䜿甚せず、実皌働環境やサヌビスでは䜿甚しないようにするこずです。 ネットワヌク亀換の量がはるかに少ないため、開発の䞀郚ずしお䜿甚し、ステヌゞングに䜿甚したす。

私が芋るこずを提案するものから-これは玠晎らしいWeaveプロゞェクトです。これにより、ネットワヌク機噚をバむパスしおネットワヌク盞互䜜甚を構築できたす。 これは、Dockerホスト間の゜フトりェア゜リュヌションです。 最も簡単な解決策は、Dockerの起動時に生成できるデフォルトブリッゞを䜿甚するこずです。 たた、組み蟌みのLinuxブリッゞコンフィギュレヌタヌを䜿甚するこずもできたす。 そしお、あなたが矎しいずもう少し柔軟性を望むなら、玠晎らしい冗談がありたす-Open vSwitch。 珟時点では、Dockerのプラグむンのリストには、Open vSwitchに察するコントロヌルがありたせん。これは、昚幎玄束した残念なこずです。



前に蚀ったように、すべおのコンテナを起動しおconntrackを削陀するずきに、ホストシステムからコンテナぞのネットワヌクデバむスの傟きを䜿甚するように、自分で決定したした。 これはそのような問題であり、考える䟡倀があるため、問題を解決しなかったスタンプは解決したした。 私たち自身、このように決めたした。誰かが違う方法で解決するかもしれたせん。



Dockerに盎面したほずんどの人が少なくずもいく぀かのビゞネスに盎面しおいた次の興味深い点は、ファむルを保存するためのストレヌゞドラむバヌの遞択でした。 誰もが長所を持っおいるため、誰もが短所を持っおいたす。 圌らが垂堎に参入しお提䟛したAuFSがありたすが、メむンラむンには入らず、決しお入らないでしょう。 論理デバむスを取り出しおマりントする、぀たりマりントするずきの問題に察するクヌルな解決策がありたす。 これは、デバむスマッパヌに加えお、ある皮の組み蟌みファむルシステム条件付きX3です。 このマりントを実行しおいたす-再マりント...これはすべお、䞀般的に、これらのレむダヌず論理デバむスの巚倧なチェヌンに成長したす。 BTRFSがありたす。これは、Dockerに必芁な機胜の半分が、ファむルシステムの固有の機胜ずしおデフォルトでサポヌトしたす。 そしお、いく぀かのプラグむン、クヌルなもの、実際にはそうではないものによっお実装される他のいく぀かのものがありたす。 ここで、私が䞀緒に仕事をしなければならなかった3぀のこずを曞き留めたした。



たた、BTRFSが匕き起こす可胜性のある問題も調べおください。 BTRFSでは、䜕らかの皮類のブロックデバむスを保持する必芁がありたす。これは、BTRFS䞊のDockerのルヌトディレクトリになりたす。 サヌバヌ䞊のすべおのパヌティションテヌブルにBTRFSがあるわけではないため、これにより、リセットを行うか、LWMを確認しおこのパヌティションを遞択する必芁がありたした。

第二に、BTRFSがディスクに盎接暹脂を䜜らず、ブロックデバむスに盎接曞き蟌みをせず、最初に独自のゞャヌナルを保持し、ゞャヌナルに情報を曞き蟌み、BTRFS自䜓の栞プロセスが開始されるずいう事実を隠した人はいたせんこの線は、ある皮の身䜓の動きを䜜り、どこかに䜕かを曞き留めたす。 実際には、私たちの枬定によるず、BTRFSを䜿甚した堎合のパフォヌマンスが刀明したした。 どこかに、10回目の襲撃でブロックデバむスがあり、それからどこかで半分に分割されたした-これがBTRFSが私たちに䞎えたものです。

監芖サヌビスにずっお非垞に緊急の問題である運甚郚門は、䞀般に、BTRFSで占有されおいるスペヌスの量、空きスペヌスの量をどのように理解するかです。 そしお、最倧の問題は、堎所があるように芋えるが、存圚しないように芋えるこずです。それはどこかになくなっおおり、メタ日付が膚らんでいお、いく぀かのファむルがあり、実行する必芁があるこずを理解しおいたすリバランス、そしおあなたはピヌクに近づいおおり、IOはすでに苊しんでおり、リバランスもしおいたす。 悲しみ。



過去1〜2幎にわたるBTRFSの利点のうち、これが正垞に機胜し、少なくずも予想どおりDockerで機胜した唯䞀のストレヌゞドラむバヌです。 圌らは問題を解決したようで、BTRFSが私たちの遞択です。 私たちはSSDを賌入し、私たちは生き、神は圌にパフォヌマンスを祝犏し、それを理解したす。



そしおここでは、少し前に新しいストレヌゞドラむバヌであるOverlayFSに泚目したした。 今埌、その実装に取り​​組んでおり、既にテスト段階を通過しおおり、いく぀かのテストを受けおおり、テストは非垞に優れおいるず蚀いたす。

灰色のFSずオヌバヌレむの赀を塗り぀ぶしたたたにしおいるのはなぜですか バヌゞョン3.18以降、別の名前でカヌネルに入り、単にオヌバヌレむずいうモゞュヌルの名前でカヌネルに入りたした。 カヌネルに組み蟌たれたOverlayFSモゞュヌルが長い間行っおきたこずを誰もが知っおいたすか 私も知りたせん オヌバヌレむに関する新しいスラむドはありたせん。先週、文字通り準備ができおいた情報を蚀いたす。 テストによるず、䜜業の速床、EX4に基づくOverlayFSを䜿甚した応答時間、Dockerからのオヌバヌヘッドの割合は、゚ラヌの範囲内で最倧3-5でした。 , . , – 3.18, , .. , .

Overlay FS BTRFS , , -. BTRFS, , . BTRFS, .. , , , , , , – , . , , , , , . Overlay . , performance / , ? , , DF. , , . かっこいい。 ぀たり , , ! , , , .



, . , , . , , .. cmd, , - ?

, – Entrypoint, - .., , - Docker cmd .



なぜなら , , entrypoint – . - . , , S6, . , init- Docker-. , , , , .. , . , - . . , , .

-, -, , – From Dockerfile. . , . -, - – Docker. , , , - . ぀たり , , . - , , . ぀たり .

, , . Docker 1.6, -. docker.exec, -, -, . , , exec , , , -, .. , - - , find - , , cut . , Docker inspect', name-space , exec', url', , , . 1.7, 1.8, garbage collector, , exec', . , , , , .



, - , -, , Docker, , , . , , , - .



, - . , , , .



? , , - , , , . ? - - , zypper - , - update' , , , , . , , . , - , , , .



, , , application production, , , RPM- , , . - , , .. ぀たり , , .



- , , Dockerfile , . . , puppet. docker_build.



? . Dockerfile' . / , . , , . Registry, , , - , , . , , , .



. - JIRA , , , . . , , «», . , puppet' - config', rebuild. ぀たり , , , , config', . , ( ) , , , success registry, .



Docker , , . , docker , - . , .. , - Graphite, .



? Docker CLI , docker stats, CPU . SAR . SAR' . - docker , Graphite. . ? . , - FS, . Graphite. , , , , Docker , Zabbix'.



, . , , , , . , , , CPU.



.




, , .



CPU.



, – , , , , . , , - , . , baDocker, .






. ぀たり Summary , , , , , , .



, , . , , .



, - , - , , « shell » 



, , , .



, , .. – : «, , ».



– , Docker, , , , , , . , , , – , , .

連絡先


» a.turetsky@corp.badoo.com
» twitter
» Badoo

— HighLoad++ . 2016 — HighLoad++ , 7 8 .

HighLoad++ 2016 DevOps, docker', :


たた、これらの資料の䞀郚は、高負荷システムHighLoadの開発に関するオンラむントレヌニングコヌスで䜿甚されたすガむドは、特別に遞択された文字、蚘事、資料、ビデオのチェヌンです。私たちの教科曞にはすでに30以䞊のナニヌクな資料がありたす。接続しおください

Source: https://habr.com/ru/post/J311830/


All Articles