DockerずKubernetesに基づく最高のアヌキテクチャ-神話か珟実か

DockerずKubernetesの時代に゜フトりェア開発の䞖界はどのように倉わりたしたか これらのテクノロゞヌに基づいお、䞀床だけアヌキテクチャを構築するこずは可胜ですか すべおをコンテナに「詰め蟌む」ずきに、開発プロセスず統合プロセスを統合するこずは可胜ですか そのような決定の芁件は䜕ですか 圌らにはどんな制限がありたすか 圌らは単玔な開発者の生掻を簡玠化したすか、それずも難しくしたすか



これらの質問だけでなく、これらすべおに答える時が来たした 本文および元のむラストで


この蚘事では、実際の生掻から開発プロセスぞず円を描くように導き、アヌキテクチャを通しお、あなたを珟実の生掻に戻し、これらの各セクタヌで最も重芁な質問に答えたす。 たた、特定の実装を行うこずなく、可胜な゜リュヌションの䟋を瀺すだけで、アヌキテクチャの䞀郚ずなる倚くのコンポヌネントず原則の抂芁を説明したす。


蚘事のタむトルからの質問に぀いおの最終的な結論は、あなたを混乱させるだけでなく、他の読者を倧いに喜ばせるこずができたす-すべおはあなたの経隓、3぀の章からの次のストヌリヌをどのように認識するか、そしおおそらくこの日の気分に䟝存したす読んだ埌に質問


目次



実生掻から開発プロセスたで


https://hsto.org/webt/cq/tj/9q/cqtj9qdfa8wbrcf-d5si7bjxona.png


ほずんどの堎合、私がこれたで芋た、たたはむンストヌル/構成するこずを光栄に思っおいたすべおの開発プロセスは、実際には1぀の単玔な目暙です-アむデアの誕生から「戊闘」環境ぞの配信たでの時間を短瞮するこずケヌス定数、コヌドの品質の倀。


しかし、悪いアむデアや良いアむデアは絶察に重芁ではありたせん。 悪いアむデアは通垞、テストしお拒吊し、堎合によっおはすぐに厩壊するために加速されたす。 ここで重芁なのは、前のバヌゞョンぞのロヌルバックプロセスこの「クレむゞヌな」アむデアなしも、プロセスを自動化するロボットの肩にかかっおいるずいうこずです。


継続的な統合ず配信は、通垞、開発䞖界のラむフラむンのように芋えたす。 䜕が簡単に芋えるでしょうか アむデアを持っお、コヌドを持っお-行こう 1぀の倧きな「BUT」がなければ、すべおがうたくいきたす。 私の経隓が瀺すように、統合ず配信プロセスは、瀟内で䜿甚されおいるテクノロゞヌやビゞネスプロセスから切り離しお圢匏化するこずは非垞に困難です。


タスクは明らかに耇雑ですが、䞖界は絶えず玠晎らしいアむデアずテクノロゞヌを生み出し、私たちをたあ、個人的には...理想的で理想的なメカニズムに導きたす。 これに向けた次のステップは、DockerずKubernetesです。 抜象化のレベルずむデオロギヌ的アプロヌチは、タスクの80が実際に同じ方法で解決できるず蚀う暩利を䞎えおくれたす。


もちろん、20はどこにも行っおいたせん。 しかし、これはたさに、䜜業ず䜜成が興味深い分野であり、アヌキテクチャずプロセスの同じ日垞的な問題に察凊するこずではありたせん。 したがっお、「建築の枠組み」に䞀床集䞭するず、解決された問題の80に戻る必芁性をケヌスを損なうこずなく忘れるこずができたす。

これは䜕を意味し、Dockerは開発プロセスの問題をどのように解決したすか
簡単な開発プロセスを考えおみたしょう。ほずんどの堎合、これを十分に考慮するこずを提案したす。



任意のタスクの䞀連の段階から自動化する必芁があるものはすべお、それ自䜓に統合するこずができ、時間をかけお適切なアプロヌチで倉曎する必芁はありたせん。


開発者環境をむンストヌルする



すべおのプロゞェクトにdocker-compose.ymlを含める必芁がありたす。 開発者は、ロヌカルマシンでアプリケヌション/サヌビスを実行するためにどのように、䜕をする必芁があるかを考える必芁性から簡単に救いたす。 単玔なdocker-compose upを䜿甚するず、このアプリケヌションですべおの䟝存関係を有効にし、デヌタベヌスにフィクスチャを入力し、コンテナ内のロヌカルコヌドを接続し、オンザフラむでコンパむルするためにコヌドをスヌヌピングし、最終的に期埅されるポヌトに応答する必芁がありたす。


新しいサヌビスの䜜成に぀いお話しおいる堎合、開発者は、開始方法、コミットする堎所、たたは遞択するフレヌムワヌクに぀いお質問しないでください。 これらはすべお、暙準の指瀺で事前に説明し、 frontend 、 backend 、 workerその他のタむプのさたざたなケヌスのサヌビステンプレヌトで指瀺する必芁がありたす。


自動テスト



「ブラックボックス」 埌でコンテナを呌び出す理由に぀いお知りたいのは、内郚のすべおが倧䞈倫ずいうこずだけです。 はいたたはいいえ。 1たたは0。コンテナ内で実行する必芁があるコマンドの数が限られおいる堎合、および䟝存関係を蚘述するdocker-compose.ymlを䜿甚するず、特に実装の詳现に入らずに簡単に自動化および統合できたす。


たずえば、 このように 


ここで、テストずは、ナニットだけでなく、機胜だけでなく、機胜、統合、コヌドスタむルのテストず耇補、叀い䟝存関係の確認、䜿甚されおいるパッケヌゞのラむセンスの砎損など、その他のテストを意味したす。 匷調点は、これらすべおをDockerむメヌゞ内にカプセル化する必芁があるずいう事実です。

配送システム



い぀どこで頭脳をむンストヌルするかは問題ではありたせん。 結果は、むンストヌルプロセスずたったく同じで、垞に同じである必芁がありたす。 ゚コシステム党䜓のどの郚分でも、どのgitリポゞトリからでも違いはありたせん。 ここでのdem等性は最も重芁な芁玠です。 蚭定する必芁があるのは、むンストヌルを制埡する倉数だけです。


この問題を解決するのに最も効果的ず思われるアルゎリズム


  1. すべおのDockerfileから画像を収集したすたずえば、 このように 
  2. メタプロゞェクトを䜿甚しお、 Kube APIを䜿甚しおこれらの画像をKubernetesに配信したす 。 通垞、配信を開始するには、いく぀かの入力パラメヌタヌが必芁です。
    • Kube API゚ンドポむント
    • 秘密のリ゜ヌス-通垞、異なるコンテキストロヌカル/ショヌルヌム/ステヌゞング/プロダクションによっお異なりたす
    • 蚈算甚のシステム名ずこれらのシステムのDockerむメヌゞタグ前の手順で取埗

すべおのシステムずサヌビスに察する単䞀のメタプロゞェクト゚コシステムの構造ず倉曎の配信方法を説明するプロゞェクトずしお、 このモゞュヌルでAnsible playbookを䜿甚しおKubeAPIず統合するこずを奜みたす。 ただし、掗緎された自動化には他の倚くのオプションがありたす-少し䜎めにしたしょう。 忘れおはならない唯䞀のこずは、アヌキテクチャを管理するための䞭倮集䞭型の方法です。 これにより、すべおのサヌビス/システムを䟿利か぀均䞀に管理し、同様の機胜を実行するテクノロゞヌやシステムから今埌の動物園の兆候を取り陀くのを止めるこずができたす。

通垞、環境のむンストヌルは次の堎所で必芁です。



統合ず配信の継続性



「ブラックボックス」-Dockerむメヌゞをテストする統䞀された方法があるため、このようなテストによっお埗られた結果により、 feature-branchブランチをgitリポゞトリのupstreamたたはmasterブランチに問題upstreamシヌムレスに統合できるこずを考慮する必芁がありたす。


このアプロヌチの唯䞀の障害は、統合ず配信を行う必芁がある順序です。 たた、リリヌスがない堎合、倚くの䞊列feature-branch備えた1぀のシステムで「競合状態」を防止する方法に぀いおの質問が急に発生しfeature-branch 。


次のプロセスは、競合モヌドがない堎合に開始する必芁がありたす。そうしないず、「競合状態」によっお䌑息が取れなくなりたす。


  1. feature-branchをupstreamにアップグレヌドしようずしおいたす git rebase/merge 
  2. Dockerfile-収集
  3. 収集されたすべおの画像のテスト
  4. 開始し、ステップ2からの画像を含む必芁なシステムの配信が完了するたで埅ちたす
  5. 前のステップが䞭断した堎合、たたは倖郚芁因により、゚コシステムを前の状態にロヌルバックした堎合
  6. upstream feature-branchをマヌゞし、リポゞトリに送信したす

どんな倱敗でも、どのステップでも、配信プロセスを䞭断し、開発者にタスクを返しお問題を解決する必芁がありたす。「合栌しない」テストであれ、ブランチのマヌゞの問題であれ。


同じレシピは、耇数のリポゞトリを操䜜できるこずを意味したす。 これを行うには、すべおのリポゞトリに察しおアルゎリズムステップの順序でプロセス党䜓を実行する必芁がありたす。各リポゞトリを個別に繰り返し反埩するのではなく、

さらに、Kubernetesを䜿甚するず、さたざたなABテストおよび問題分析のために曎新を郚分的に展開できたす。 これは、内郚手段ず、サヌビスアクセスポむントの分離および盎接的なアプリケヌションによっお実珟されたす。 問題ず可胜なロヌルバックを分析するために、コンポヌネントの新しいバヌゞョンず叀いバヌゞョンを適切な比率で垞にバランスさせるこずができたす。


ロヌルバックシステム


すべおの展開は可逆的である必芁がありたす-これは、アヌキテクチャフレヌムワヌクに提瀺される必須芁件です。 これには、倚くの明癜で埮劙ではないシステム開発が䌎いたす。


最も重芁なもののいく぀かを次に瀺したす。



Kubernetesクラスタヌの状態のロヌルバックは非垞に簡単です kubectl rollout undo deployment/some-deploymentずkubernetesは以前の「スナップショット」を埩元したすが、メタプロゞェクトにはこれに関する情報も含たれおいる必芁がありたす。 より耇雑な配信ロヌルバックアルゎリズムは非垞に掚奚されたせんが、必芁な堎合もありたす。

このメカニズムが開始される原因



情報セキュリティず監査


倖郚および内郚の脅嚁から゚コシステムの100のセキュリティを「䜜成」する個別のプロセスを遞択するこずは䞍可胜ですが、アヌキテクチャフレヌムワヌクは、各レベルおよびすべおのサブシステムで䌁業の暙準およびセキュリティポリシヌを考慮しお実装する必芁があるこずに泚意しおください。


次に、提案された゜リュヌションの3぀のレベルすべおをより詳现に怜蚎したす。モニタリングずアラヌトに぀いおも説明したす。これらは、暪断的であり、システムの敎合性の芳点から基本的な重芁性を持ちたす。

Kubernetesには、 アクセス暩 、 ネットワヌクポリシヌ 、 むベント監査、および情報セキュリティに関連するその他の匷力なツヌルを区切るための非垞に優れた組み蟌みメカニズムのセットがありたす 。 適切な忍耐力を䜿甚するず、単䞀の攻撃たたはデヌタリヌクが成功しお終了するのに耐え、防止できる優れた防埡境界線を構築できたす。


プロセスからアヌキテクチャヌたで


開発プロセスず構築しようずしおいる環境ずのこの緊密な関係は、あなたに安心を䞎えるべきではありたせん。 情報システムのアヌキテクチャに関する埓来の芁件柔軟性、スケヌラビリティ、可甚性、信頌性、脅嚁に察するセキュリティなど、開発プロセスおよび配信プロセスずの良奜な統合の芁求に加えお、このようなアヌキテクチャの䟡倀を高めたす。


開発プロセスず゚コシステムの密接な統合により、DevOps Dev elopment Op eration s などの抂念が長い間生たれおいたす。これは、むンフラストラクチャの完党な自動化ず最適化ぞの道のりの論理的なステップです。 ただし、適切に蚭蚈されたアヌキテクチャずプラットフォヌムの高品質のサブシステムを䜿甚するず、DevOpsタスクを最小限に抑える必芁がありたす。


マむクロサヌビスアヌキテクチャ


私は、サヌビス指向アヌキテクチャヌ SOA の利点の詳现、およびこれらのサヌビスがなぜマむクロである必芁があるのか​​に぀いお説明する必芁はないず考えおいたす 。 DockerずKubernetesを䜿甚するこずに決めた堎合、この䞖界では巚倧なモノリスになるこずは非垞に難しく、むデオロギヌ的に間違っおいるこずを理解するそしお受け入れる必芁がありたす。


単䞀のプロセスを実行し、氞続性で厳密に動䜜するように蚭蚈されたDockerは、DDDドメむン駆動開発の芳点から考えるこずを䜙儀なくされ、パッケヌゞ化されたコヌドをアクセス甚の発信ポヌトを持぀ブラックボックスずしお扱いたす。


必須の゚コシステムコンポヌネントず゜リュヌション


可甚性ず信頌性を向䞊させたシステムの蚭蚈の実践から、マむクロサヌビスの運甚に実際に必芁ないく぀かのコンポヌネントを遞び出したす。


すべおのコンポヌネントずその説明は、Kubernetes環境のコンテキストアプロヌチずアヌキテクチャの芳点から重芁ですで以䞋に瀺されおいるずいう事実にもかかわらず、このリストを他のプラットフォヌムのチェックリストずしお参照できたす。


私のように以䞋で説明するサヌビスサヌビスを通垞のKubernetesサヌビスずしお管理する方が良いずいう結論に達した堎合、掚奚事項は、別個のクラスタヌたたはこのための「実動」ずは異なるクラスタヌを持぀こずです。 たずえば、「ステヌゞング」クラスタヌを䜿甚できたす。これにより、「戊闘」環境は安定しおいたせんが、むメヌゞ、コヌド、たたは監芖の゜ヌスが必芁な状況から保護できたす。 ぀たり、この方法で「鶏ず卵」の問題を解決したす

アむデンティティサヌビス



通垞は、アクセス、サヌバヌぞのアクセス、仮想マシン、アプリケヌション、オフィスのメヌルなどから始たりたす。 最倧芏暡の䌁業プラットフォヌムIBM、Google、Microsoftなどのクラむアントであるたたはなりたい堎合、これらのベンダヌの適切なサヌビスによっおこの問題が解決される可胜性が高いです。 しかし、これがあなたのやり方ではなく、自分だけの゜リュヌションを自分で管理し、できれば予算内で手頃な䟡栌にしたい堎合はどうでしょうか


このリストは、必芁なオプションを決定し、むンストヌルずメンテナンスの人件費を理解するのに圹立ちたす。 この遞択は、䌚瀟のセキュリティポリシヌず無条件に䞀貫し、情報セキュリティサヌビスによっお承認される必芁がありたす。


自動サヌバヌプロビゞョニング



Kubernetesが必芁ずする物理マシン/クラりドVMdocker、kubelet、kubeプロキシ、etcdクラスタヌのコンポヌネント数は非垞に少ないにもかかわらず、新しいマシンの远加ずクラスタヌ管理を自動化する必芁がありたす。 これを簡単か぀簡単に行う方法のいく぀かのオプション



䞊蚘の提案リストから-システムの配信のセクションでは、埌者のオプション Kubernetesずの統合甚の小さなモゞュヌルを䜿甚を奜むこずに泚意しおください。䞀般に、あらゆる皮類の自動化を実行したす。 ただし、たずえばKubernetes甚の Teraformずそのモゞュヌルの䜿甚を劚げるものはありたせん。 KOPSは「ベアメタル」の䜜業には完党に適甚できたせんが、私の意芋では、AWS / GCEを䜿甚するのに最適なツヌルです。

Gitリポゞトリずタスクトラッカヌ



開発者やその他の関連する圹割の完党な仕事のために、コラボレヌション、コヌドストレヌゞの議論のための堎所が必芁であるず蚀う必芁はありたせん。 これに最適なサヌビスに぀いおの質問に答えるのは難しいですが、トラッカヌトラッカヌは、叀兞的には無料のredmineたたは有料のJiraず無料の叀い孊校のgerritたたは有料のbitbucketです


共同䌁業䜜業のための最も䞀貫性のある、しかし商甚の2぀のスタック、 AtlassianずJetbrainsに泚意する䟡倀がありたす。 それらの1぀を完党に䜿甚するこずも、゜リュヌション内のさたざたなコンポヌネントを組み合わせるこずができたす。

トラッカヌずリポゞトリを䜿甚しお最倧の効果を埗るには、これら2぀の゚ンティティを機胜させお統合するための戊略に留意する必芁がありたす。 そのため、たずえば、コヌドず関連タスクの敎合性を確保するためのいく぀かのヒントもちろん、戊略を遞択できたす



Dockerレゞストリ



Docker管理機胜は、サヌビスの保存ず配信にずっお非垞に重芁であるため、個別に識別する必芁がありたす。 これに加えお、そのようなシステムは、ナヌザヌ、グルヌプ、およびアクセスの操䜜をサポヌトし、叀い䞍芁なむメヌゞを削陀し、GUIず安らかなAPIを提䟛する必芁がありたす。


クラりド゜リュヌション hub.docker.comなど ず、Kubernetesクラスタヌ自䜓の内郚にもむンストヌルできるプラむベヌトサヌビスの䞡方を䜿甚できたす。 これに察するかなり興味深いサヌビスは、Docker Registryの䌁業゜リュヌションずしお䜍眮付けられおいるVmware Harborです。 最悪の堎合、耇雑なシステムを実際に必芁ずせず、単に画像を保存したい堎合は、通垞のDocker Registryで察応できたす。


CI / CDサヌビスおよびサヌビス提䟛システム



以前に説明したすべおのコンポヌネントgitリポゞトリ、タスクトラッカヌ、Ansible Playbookを䜿甚したメタプロゞェクト、倖郚䟝存関係は、個別に䞀時停止しお存圚するこずはできたせん。 この真空は、継続的な統合および配信サヌビスによっお満たされる必芁がありたす。


CI-継続的むンテグレヌション-継続的むンテグレヌション
CD-継続的デリバリヌ-継続的デリバリヌ

サヌビスは非垞にシンプルで、システムの配信たたは構成の方法に関連するロゞックを持たないものでなければなりたせん。 CI / CDサヌビスは、倖界からのむベントgitリポゞトリの倉曎、タスクトラッカヌのタスク移行に応答し、メタプロゞェクトで説明されおいるアクションを起動するだけです。 これは、すべおのリポゞトリのコントロヌルポむントであり、それらを管理するツヌルでもありたすブランチのマヌゞ、 upstream/masterからの曎新。


歎史的には、Jetbrains- TeamCityの非垞に匷力であるず同時に非垞にシンプルなツヌルを䜿甚するこずに慣れおいたすが、たずえば無料のJenkinsを䜿甚するこずに決めた堎合、問題は発生したせん。

䞊蚘に基づいお、実際、このスキヌム党䜓では、統合サヌビスが開始する必芁がある䞻なプロセスは4぀だけであり、1぀の補助的なプロセスしかありたせん。



ログ収集および凊理システム



Dockerコンテナがログを䜿甚できるようにする唯䞀の方法は、このコンテナ自䜓で実行されおいるルヌトプロセスのSTDOUTたたはSTDERRにログを曞き蟌むこずです。 実際、サヌビス開発者にずっお、このデヌタで次に䜕が起こるかは問題ではありたせん。䞻なこずは、必芁なずきに、できれば過去の予枬可胜な時点たで利甚できるこずです。 これらの期埅を満たすためのすべおの責任は、Kubernetesず゚コシステムをサポヌトする人々にかかっおいたす。


公匏ドキュメントでは、ログを操䜜するための基本的で䞀般的に悪くない戊略の説明を芋぀けるこずができたす。これは、膚倧な量のテキストデヌタを集玄しお保存するための適切なサヌビスを遞択するのに圹立ちたす。


, fluentd , , Elasticsearch . , , , .


Elasticsearch , Docker .

Tracing



, "" " , ?!". , , , -, — , .


Opentracing Zipkin . , , , .


, "Trace Id" , , .., , .



Prometheus - Kubernetes " " . Kubernetes , .


, , , , . ( ) ( "staging" ). "-" .

, , , :



, , email, SMS .


OpsGenie c alertmanager - Prometheus.


OpsGenie , , , . . , /: — Infra+Devops, — Devops, — .

API Single Sign-on



, , (, "Identity ", - ), , , API . , "Identity ", .


, . , . "" , HTTP .


API , - — . : UI , - . ( ), , UI . UI ( TTL) ( TTL)

, API :



(Event Bus) (Enterprise Integration/Service Bus)



, -, . , , . , , - .


, : RabbitMQ , Kafka , ActiveMQ . , CAP - .

, , , " ", , "Dumb pipe — Smart Consumer" , .


"Enterprise Integration/Service Bus" , - . , :



, Apache ServiceMix , .

Stateful



Docker, Kubernetes, , . , "" - 
 , "" "", , , Docker .


, , Kubernetes .


, Stateful , "":





, , . , , — " ". : Docker , rpm , , python/go/js/php .


. , , " private dependency mirror for ... "




, , . : (1-5 ), — (5-10 ), — (10-20 ), .


, - , , , , , , .


, , . , . .


, . — , , .. , , , ( ), , " ", , !


" ?"

— , - , , !



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


All Articles