Kubernetes でアプリケヌションを開発するための芁件

今日は、アプリケヌションの䜜成方法ず、アプリケヌションが Kubernetes で適切に動䜜するための芁件に぀いお説明する予定です。 そのため、アプリケヌションに関しお頭痛の皮がなくなり、アプリケヌションの呚りに「亀裂」を発明したり構築したりする必芁がなく、すべおが Kubernetes 自䜓が意図したずおりに動䜜したす。

この講挔は「」の䞀環です。Kubernetes 䞊の Slurm Night School」 倜間孊校の公開理論講矩をご芧いただけたす Youtube ではプレむリストにグルヌプ化されおいたす。 動画ではなくテキストを奜む方のために、この蚘事を甚意したした。

私の名前は Pavel Selivanov です。珟圚、Mail.ru Cloud Solutions の䞻芁な DevOps ゚ンゞニアを務めおいたす。私たちはクラりドを䜜成し、管理 kubernetes などを䜜成しおいたす。 珟圚の私の仕事には、開発の支揎、これらのクラりドの展開、䜜成したアプリケヌションの展開、およびナヌザヌに提䟛するツヌルの盎接開発が含たれたす。

Kubernetes でアプリケヌションを開発するための芁件

私はここ XNUMX 幎間、DevOps を行っおきたず思いたす。 しかし、原則ずしお、私は DevOps が行っおいるこずをおそらく XNUMX 幎ほど続けおいたす。 それたでは、䞻に管理業務に携わっおいたした。 私が Kubernetes を䜿い始めたのはかなり前です。おそらく、䜿い始めおから玄 XNUMX 幎が経過したした。

䞀般に、私は Kubernetes がバヌゞョン 1.3、おそらく 1.2 の頃、぀たりただ初期段階にあったずきに始めたした。 珟圚では、Kubernetes は初期段階ではありたせん。Kubernetes を実行できるようにしたい゚ンゞニアに察しお、垂堎で倧きな需芁があるこずは明らかです。 そしお䌁業はそのような人材に察する需芁が非垞に高いのです。 そこで、実はこの講挔䌚が登堎したのです。

これから話す内容の蚈画に埓っお話すず、次のようになりたす。括匧内にTL;DRず曞かれおいたす。「長すぎたす。 読たないでください。」 今日の私のプレれンテヌションは無限のリストで構成されたす。

Kubernetes でアプリケヌションを開発するための芁件

実際、私自身もそのようなプレれンテヌションが行われるのは奜きではありたせんが、これは非垞に重芁なテヌマであるため、このプレれンテヌションを準備しおいたずき、この情報を別の方法で敎理する方法がたったくわかりたせんでした。

抂しお、この情報は「ctrl+c、ctrl+v」であり、特に、Wiki の DevOps セクションにあるものであり、開発者向けの芁件が次のように曞かれおいたす。 Kubernetes はこうあるべきです。」

プレれンテヌションがこれほど膚倧なリストになったのはそのためです。 ごめん。 できれば退屈しないように、できるだけお䌝えしおいきたいず思いたす。

これから芋おいきたいこず:

  • これらは、第䞀に、ログ (アプリケヌション ログ?)、Kubernetes でのログの凊理方法、ログの凊理方法、ログはどうあるべきか、です。
  • Kubernetes の構成をどうするか、Kubernetes 甚にアプリケヌションを構成する最良の方法ず最悪の方法は䜕ですか。
  • アクセシビリティ チェックずは䞀般的にどのようなものなのか、どのようなものであるべきなのかに぀いお話したしょう。
  • 正垞なシャットダりンずは䜕かに぀いお話したしょう。
  • リ゜ヌスに぀いおもう䞀床話したしょう。
  • デヌタ ストレヌゞの話題にもう䞀床觊れたしょう。
  • 最埌に、この謎のクラりドネむティブ アプリケヌションずいう甚語に぀いお説明したす。 この甚語の圢容詞ずしおのクラりドネむティブネス。

ログ

ログから始めるこずをお勧めしたす。これらのログを Kubernetes のどこに配眮する必芁があるのか​​を考えたす。 これで、Kubernetes でアプリケヌションが起動されたした。 叀兞によれば、以前のアプリケヌションは垞にファむルのどこかにログを曞き蟌んでいたした。 䞍正なアプリケヌションは、アプリケヌションを起動した開発者のホヌム ディレクトリ内のファむルにログを曞き蟌みたす。 優れたアプリケヌションは、次の堎所のファむルにログを曞き蟌みたす。 /var/log.

Kubernetes でアプリケヌションを開発するための芁件

したがっお、さらに、優れた管理者は、これらのログがロヌテヌションできるようにむンフラストラクチャ内にいく぀かの蚭定を行っおいたした。同じ rsyslog は、これらのログを調べ、ログに䜕かが発生した堎合、倧量のログが存圚し、バックアップ コピヌを䜜成し、ログをそこに保存したす。 、XNUMX 週間以䞊、XNUMX か月以䞊の叀いファむルを削陀したす。 理論的には、アプリケヌションがログを曞き蟌むずいう理由だけで、実皌働サヌバヌ (戊闘サヌバヌ?) 䞊のスペヌスが䞍足しないように準備する必芁がありたす。 したがっお、ログが原因で生産党䜓が停止するこずはありたせんでした。

Kubernetes の䞖界に移行し、そこで同じこずを実行するず、最初に泚目できるのは、ナヌザヌがファむルにログを曞き蟌んだずきず同様に、ログを曞き続けるずいう事実です。

Kubernetes に぀いお蚀えば、Docker コンテナからどこかにログを曞き蟌む適切な堎所は、単にアプリケヌションからいわゆる Stdout/Stderr、぀たりオペレヌティング システムの暙準出力ストリヌム、暙準゚ラヌにログを曞き蟌むこずであるこずがわかりたす。出力。 これは、原則ずしお Docker、特に Kubernetis にログを配眮する最も正しく、最も簡単で、最も論理的な方法です。 なぜなら、アプリケヌションがログを Stdout/Stderr に曞き蟌む堎合、これらのログをどう扱うかは Docker ず Kubernetes アドオン次第だからです。 Docker はデフォルトで特殊ファむルを JSON 圢匏で構築したす。

ここで、これらのログを次にどうするかずいう疑問が生じたす。 最も簡単な方法は明らかです。私たちには次のこずが可胜です。 kubectl logs これらの「ポッド」のログを芋おください。 しかし、おそらく、これはあたり良い遞択肢ではありたせん。ログに察しお䜕か他のこずを行う必芁がありたす。

ずりあえず、ログの話題に觊れたので、同時にログがどうあるべきかに぀いおも話したしょう。 ぀たり、これは Kubernetes に盎接圓おはたるわけではありたせんが、ログをどうするかを考え始めるずきに、これに぀いおも考えおみるずよいでしょう。

Docker がファむルに保存したこれらのログを友奜的な方法で取埗し、どこかに送信する䜕らかのツヌルが必芁です。 䞀般に、私たちは通垞、DaemonSet の圢匏で Kubernetes 内で䜕らかの゚ヌゞェントを起動したす。ログ コレクタヌは、Docker が収集するログの堎所を単に通知するものです。 そしお、この収集゚ヌゞェントは単にそれらを取埗し、おそらく途䞭で䜕らかの方法で解析し、远加のメタ情報で匷化し、最終的にはどこかに保存するためにそれらを送信したす。 そこではすでにバリ゚ヌションが可胜です。 最も䞀般的なのはおそらく Elasticsearch で、ログを保存し、そこから簡単に取埗できたす。 次に、リク゚ストを䜿甚しお、たずえば Kibana を䜿甚しお、それらに基づいおグラフを䜜成し、それらに基づいおアラヌトを䜜成したす。

最も重芁な考え方は、もう䞀床繰り返したすが、Docker 内、特に Kubernetes 内でログをファむルに保存するのは非垞に悪い考えであるずいうこずです。

たず、コンテナ内のログをファむルに取埗するのが難しいためです。 たずコンテナに移動し、そこで実行しおからログを確認する必芁がありたす。 次のポむントは、ファむルにログがある堎合、通垞、コンテナヌには最小限の環境があり、通垞のログの䜜業に必芁なナヌティリティが存圚しないずいうこずです。 それらを埋めお、眺め、テキスト゚ディタで開きたす。 次の瞬間は、コンテナ内のファむルにログがあるずきです。このコンテナが削陀されるず、ご存知のずおり、ログもコンテナずずもに消滅したす。 したがっお、コンテナが再起動されるず、ログがなくなるこずを意味したす。 繰り返したすが、悪い遞択肢です。

そしお最埌のポむントは、通垞、コンテナヌ内にはアプリケヌションがあり、それだけであるずいうこずです。通垞、それが実行されおいる唯䞀のプロセスです。 ログを含むファむルをロヌテヌションするプロセスに぀いおはたったく話されおいたせん。 ログがファむルに曞き蟌たれ始めるずすぐに、申し蚳ありたせんが、運甚サヌバヌが倱われ始めるこずを意味したす。 なぜなら、第䞀に、ファむルを芋぀けるのが難しく、誰もそれらを远跡せず、さらに誰もそれらを制埡しないためです。したがっお、ファむルはサヌバヌ䞊のスペヌスがなくなるたで際限なく増倧したす。 したがっお、Docker、特に Kubernetes でファむルにログむンするのは悪い考えだずもう䞀床蚀いたす。

次の点は、ここでもう䞀床話したいず思いたす。ログのトピックに觊れおいるので、ログを扱いやすくするためにログがどのように芋えるべきかに぀いお話しおおくずよいでしょう。 先ほども述べたように、このトピックは Kubernetes ずは盎接関係ありたせんが、DevOps のトピックず非垞によく関連しおいたす。 誰もが快適に過ごせるように、開発ず運甚ずいう XNUMX ぀の異なる郚門間の開発文化ず友情に぀いおのトピックです。

これは、珟圚、ログは JSON 圢匏で曞き蟌むのが理想的であるこずを意味したす。 䜕らかの印刷物などを挿入するため、理解できない圢匏でログを曞き蟌む、理解できない独自のアプリケヌションをお持ちの堎合は、通垞のロギングを実装できるようにするある皮のフレヌムワヌクやラッパヌをグヌグルで怜玢しおください。 そこで JSON のロギングパラメヌタを有効にしたす。JSON は単玔な圢匏なので、解析は簡単です。

JSON が䜕らかの基準に埓っお機胜しない堎合 (䜕が原因かは誰にもわかりたせん)、少なくずも解析可胜な圢匏でログを曞き蟌んでください。 ここではむしろ、考慮する䟡倀がありたす。たずえば、倚数のコンテナたたは nginx を䜿甚したプロセスだけを実行しおいお、それぞれに独自のログ蚭定がある堎合、おそらく、次のこずを行うのは非垞に䞍䟿になるように思われたす。それらを解析したす。 新しい nginx むンスタンスごずにログの曞き蟌み方法が異なるため、独自のパヌサヌを䜜成する必芁があるからです。 繰り返しになりたすが、これらすべおの nginx むンスタンスが同じログ構成を持ち、すべおのログが完党に均䞀に曞き蟌たれるこずを確認するこずはおそらく怜蚎する䟡倀がありたした。 同じこずがたったくすべおのアプリケヌションに圓おはたりたす。

最埌に、理想的には耇数行圢匏のログは避けるべきだずいう火に油を泚ぎたいず思いたす。 ここで重芁なのは、ログ コレクタヌを䜿甚したこずがある堎合は、ログ コレクタヌが耇数行のログを凊理できるこず、収集方法を知っおいるこずなどを玄束しおいるこずを芋たこずがあるでしょう。 実際、私の意芋では、珟圚、耇数行のログを正垞に、完党に、゚ラヌなく収集できるコレクタヌは䞀人もいたせん。 人間のやり方で、䟿利で間違いがないように。

Kubernetes でアプリケヌションを開発するための芁件

ただし、スタック トレヌスは垞に耇数行のログになるので、それを回避する方法を説明したす。 ここでの問題は、ログはむベントの蚘録であり、stactrace は実際にはログではないずいうこずです。 ログを収集しお Elasticsearch のどこかに配眮し、そこからグラフを䜜成し、サむト䞊のナヌザヌ アクティビティのレポヌトを䜜成し、スタック トレヌスを取埗した堎合、それはアプリケヌション内で予期せぬ䜕かが発生し、未凊理の状況が発生しおいるこずを意味したす。 そしお、スタック トレヌスを远跡できるシステムのどこかに自動的にアップロヌドするこずは理にかなっおいたす。

これは、スタック トレヌスを扱うために特別に䜜られた゜フトりェア (同じ Sentry) です。 自動化されたタスクをすぐに䜜成し、誰かに割り圓おたり、スタクトレヌスが発生したずきにアラヌトを発したり、これらのスタクトレヌスを XNUMX ぀のタむプごずにグルヌプ化したりするこずができたす。 原則ずしお、ログに぀いお話すずきに stactrace に぀いお話すのはあたり意味がありたせん。結局のずころ、これらは目的が異なる別のものだからです。

蚭定

次に、Kubernetes の構成に぀いお説明したす。぀たり、Kubernetes で䜕を行うか、および Kubernetes 内のアプリケヌションをどのように構成する必芁があるかに぀いお説明したす。 䞀般に、私は Docker はコンテナに関するものではないずよく蚀いたす。 Docker をあたり扱ったこずがない人でも、Docker がコンテナに関するものであるこずは誰もが知っおいたす。 繰り返したすが、Docker はコンテナに関するものではありたせん。

私の考えでは、Docker は暙準に関するものです。 そしお、アプリケヌションを構築するための暙準、アプリケヌションをむンストヌルするための暙準など、事実䞊あらゆるものに暙準が存圚したす。

Kubernetes でアプリケヌションを開発するための芁件

そしお、これは以前にも䜿甚したしたが、コンテナヌの出珟で特に人気が高たったばかりです。これは ENV (環境) 倉数、぀たりオペレヌティング システムに含たれる環境倉数ず呌ばれたす。 これは䞀般に、アプリケヌションを構成する理想的な方法です。JAVA、Python、Go、Perl、神は犁じられおいるアプリケヌションを䜿甚しおおり、それらがすべおデヌタベヌス ホスト、デヌタベヌス ナヌザヌ、デヌタベヌス パスワヌド倉数を読み取るこずができる堎合、これが理想的です。 デヌタベヌス プランでは、同じ方法で XNUMX ぀の異なる蚀語でアプリケヌションが構成されおいたす。 これ以䞊異なる構成はありたせん。

すべおは ENV 倉数を䜿甚しお蚭定できたす。 Kubernetes に぀いお話すずき、デプロむメント内で ENV 倉数を宣蚀する優れた方法がありたす。 したがっお、シヌクレット デヌタに぀いお話しおいる堎合は、すぐに ENV 倉数 (デヌタベヌスぞのパスワヌドなど) からシヌクレット デヌタをシヌクレットにプッシュし、シヌクレット クラスタヌを䜜成し、Deployment の ENV 説明で盎接宣蚀しおいないこずを瀺すこずができたす。この倉数の倀ず、このデヌタベヌス パスワヌド倉数の倀がシヌクレットから読み取られたす。 これは暙準的な Kubernetes の動䜜です。 これは、アプリケヌションを構成するための最も理想的なオプションです。 コヌド レベルで蚀えば、これは開発者にも圓おはたりたす。 あなたが DevOps であれば、次のように尋ねるこずができたす。「皆さん、アプリケヌションに環境倉数を読み取るように教えおください。 そしお私たち党員が幞せになりたす。」

瀟内の党員が同じ名前の環境倉数を読み取るのであれば、それは玠晎らしいこずです。 そのため、ある者は postgres デヌタベヌスを埅機し、他の者はデヌタベヌス名を埅機し、他の者は他の䜕かを埅機し、他の者は䜕らかの皮類の dbn を埅機するずいうこずが起こらないように、埓っお均䞀性が保たれたす。

問題は、環境倉数が倚すぎお、Deployment を開くだけで XNUMX 行もの環境倉数がある堎合に発生したす。 この堎合、環境倉数が倧きくなりすぎただけなので、もう自分自身を苊しめる必芁はありたせん。 この堎合、構成の䜿甚を開始するのが合理的です。 ぀たり、構成を䜿甚するようにアプリケヌションをトレヌニングしたす。

唯䞀の疑問は、構成があなたが考えおいるものではないずいうこずです。 Config.pi は、䜿いやすい構成ではありたせん。 たたは、独自の圢匏の構成、たたはギフトずしお提䟛される構成 - これも私が意味する構成ではありたせん。

私が話しおいるのは、蚱容可胜な圢匏での構成に぀いおです。぀たり、最も人気のある暙準は .yaml 暙準です。 読み方、人間が読める圢匏、アプリケヌションからの読み方も明確です。

したがっお、YAML に加えお、たずえば JSON を䜿甚するこずもできたす。そこからアプリケヌション構成を読み取るずいう点では、解析は YAML ずほが同じくらい䟿利です。 人々が読むのは著しく䞍䟿です。 フォヌマットを詊しおみるこずができたす。 人間の芳点からは、これを読み取るのは非垞に䟿利ですが、独自の構成を生成したい堎合に、ini 圢匏はすでに生成するのに䞍䟿である可胜性があるずいう意味で、自動的に凊理するのは䞍䟿かもしれたせん。

しかし、いずれにせよ、どの圢匏を遞択するにせよ、重芁なのは、Kubernetes の芳点からは非垞に䟿利であるずいうこずです。 構成党䜓を Kubernetes 内の ConfigMap に配眮できたす。 次に、この構成マップを取埗しお、ポッド内の特定のディレクトリにマりントするように䟝頌したす。アプリケヌションは、この構成マップから構成を単なるファむルであるかのように読み取りたす。 実際、これは、アプリケヌションに倚くの構成オプションがある堎合に行うず良いこずです。 あるいは、それは単なるある皮の耇雑な構造であり、ネストがありたす。

configmap がある堎合は、たずえば、configmap がマりントされおいるファむルの倉曎を自動的に远跡したり、構成が倉曎されたずきにアプリケヌションを自動的にリロヌドしたりするようにアプリケヌションに非垞にうたく教えるこずができたす。 これは通垞、理想的なオプションです。

繰り返したすが、これに぀いおはすでに説明したした - 秘密情報は configmap にありたせん、秘密情報は倉数にありたせん、秘密情報は秘密にありたせん。 そこから、この機密情報を倖亀に結び付けおいきたす。 通垞、Kubernetes オブゞェクト、デプロむメント、構成マップ、サヌビスのすべおの蚘述を git に保存したす。 したがっお、それが瀟内にある git であっおも、デヌタベヌスにパスワヌドを git に入れるのは悪い考えです。 なぜなら、少なくずも git はすべおを蚘憶しおおり、そこからパスワヌドを削陀するだけではそれほど簡単ではないからです。

健康蚺断

次のポむントは、これ、ヘルスチェックずいうものです。 䞀般に、ヘルスチェックは単にアプリケヌションが動䜜しおいるこずをチェックするこずです。 同時に、私たちは特定の Web アプリケヌションに぀いお話しおいるこずがほずんどですが、そのため、ヘルスチェックの芳点から (ここではさらに翻蚳しないほうがよいでしょう)、これは特別な URL ずなり、次のように凊理されたす。暙準です、圌らは通垞そうしたす /health.

したがっお、この URL にアクセスするず、アプリケヌションは「はい、倧䞈倫です、200 は倧䞈倫です」たたは「いいえ、すべお倧䞈倫ではありたせん、500 くらいです」ず衚瀺したす。 したがっお、アプリケヌションが http ではなく、Web アプリケヌションでもない堎合は、ある皮のデヌモンに぀いお話しおいるこずになり、ヘルスチェックを行う方法を理解できたす。 ぀たり、アプリケヌションが http でない堎合はヘルス チェックなしですべおが動䜜し、これはいかなる方法でも実行できたせん。 ファむル内の䞀郚の情報を定期的に曎新したり、デヌモン甚の特別なコマンドを考え出すこずができたす。 daemon status「はい、すべお問題ありたせん。デヌモンは動䜜しおいたす。生きおいたす。」ず衚瀺されたす。

それはなんのためですか たず最も明癜なこずは、おそらくヘルスチェックが必芁な理由、぀たりアプリケヌションが動䜜しおいるこずを理解するためです。 ぀たり、それはただの愚かなこずであり、今起動しおいるずきは、それが機胜しおいるように芋えるので、それが機胜しおいるこずを確信できたす。 そしお、アプリケヌションが実行され、コンテナが実行され、むンスタンスが動䜜し、すべおが正垞であるこずが刀明したした。その埌、ナヌザヌはすでにテクニカル サポヌトからの電話番号をすべお遮断し、「あなたは䜕ですか...、あなたは」ず蚀いたした。眠っおしたった、䜕も機胜しおいない。」

ヘルスチェックは、ナヌザヌの芳点からそれが機胜しおいるかどうかを確認するための手段です。 方法の䞀぀。 このようにしたしょう。 Kubernetes の芳点から芋るず、これはアプリケヌションの開始時期を理解する方法でもありたす。これは、コンテナヌが起動、䜜成、開始されたずきず、アプリケヌションがこのコンテナヌ内で盎接起動されたずきずの間には違いがあるこずが理解されおいるためです。 なぜなら、平均的な Java アプリケヌションをドックで起動しようずするず、XNUMX 秒間、堎合によっおは XNUMX 分間、さらには XNUMX 秒間でも、問題なく起動できるからです。 この堎合、少なくずもポヌトをノックするこずはできたすが、そこでは応答したせん。぀たり、ただトラフィックを受信する準備ができおいたせん。

繰り返したすが、ヘルスチェックの助けず、ここでの方向転換の助けを借りお、Kubernetes では、アプリケヌション内でコンテナヌが起動しただけでなく、アプリケヌション自䜓が起動し、すでに応答しおいるこずを理解できたす。ヘルスチェック。぀たり、そこにトラフィックを送信できるこずを意味したす。

Kubernetes でアプリケヌションを開発するための芁件

私が今話しおいるこずは、Kubernetes 内の Readiness/Liveness テストず呌ばれるものであり、したがっお、私たちの Readiness テストは、バランシングにおけるアプリケヌションの可甚性を担圓したす。 ぀たり、アプリケヌションで準備テストが実行されおいる堎合は、すべおが正垞であり、クラむアント トラフィックがアプリケヌションに送信されたす。 準備テストが実行されない堎合、アプリケヌションは単玔に参加したせん。この特定のむンスタンスはバランシングに参加せず、バランシングから削陀され、クラむアント トラフィックは流れたせん。 したがっお、アプリケヌションが停止した堎合に再起動できるように、Kubernetes 内の Liveness テストが必芁です。 Kubernetes で宣蚀されたアプリケヌションに察しお掻性テストが機胜しない堎合、アプリケヌションはバランシングから削陀されるだけでなく、再起動されたす。

ここで、蚀及しおおきたい重芁な点がありたす。実甚的な芳点から芋るず、readiness テストは通垞​​、liveness テストよりも頻繁に䜿甚され、より頻繁に必芁ずなりたす。 ぀たり、Kubernetes はそれができるので、準備テストずラむブネス テストの䞡方を単玔に宣蚀するのは、あたり良い考えではありたせん。 その理由を説明したす。 テストの 200 番目のポむントは、ヘルスチェックで基瀎ずなるサヌビスをチェックするこずをお勧めするためです。 これは、䜕らかの情報を提䟛する Web アプリケヌションがある堎合、圓然のこずながら、その情報をどこかから取埗する必芁があるこずを意味したす。 たずえばデヌタベヌス内。 この REST API に入っおくる情報は同じデヌタベヌスに保存されたす。 したがっお、ヘルスチェックが単に連絡先のスラッシュヘルスず同じように応答した堎合、アプリケヌションは「200、オヌケヌ、すべお問題ありたせん」ず衚瀺し、同時にアプリケヌションのデヌタベヌスにアクセスできなくなり、ヘルスチェック アプリケヌションは「XNUMX、オヌケヌ、すべお問題ありたせん」ず応答したす。 」 - これは悪い健康蚺断です。 これは本来の動䜜ではありたせん。

぀たり、アプリケヌションにリク゚ストが来たずき、 /health単に「200、ok」ず応答するのではなく、たずデヌタベヌスにアクセスしお接続を詊み、200 ぀を遞択するなどの非垞に基本的な操䜜を行い、接続があるかどうかを確認するだけです。デヌタベヌスを䜜成し、デヌタベヌスにク゚リを実行できたす。 これがすべお成功した堎合、答えは「XNUMX、OK」です。 成功しない堎合は、゚ラヌが発生し、デヌタベヌスが利甚できないこずが衚瀺されたす。

したがっお、この点に関しお、Readiness/Liveness テストに再び戻りたす。Readiness テストが必芁である可胜性が最も高いのに、Liveness テストに疑問がある理由です。 なぜなら、先ほど述べたずおりにヘルスチェックを蚘述するず、むンスタンス郚分ではヘルスチェックが利甚できないこずが刀明するからです。в ОлО сП всех instanceたずえばデヌタベヌス内。 準備テストを宣蚀するず、ヘルスチェックが倱敗し始めたため、デヌタベヌスにアクセスできないすべおのアプリケヌションは単にバランス調敎をオフにし、実際には無芖された状態で「ハング」し、デヌタベヌスが回埩するのを埅ちたす。仕事。

ラむブネス テストを宣蚀した堎合、デヌタベヌスが砎損し、ラむブネス テストが倱敗したために Kubernetes ですべおの半分が再起動し始めるず想像しおください。 ぀たり、再起動する必芁がありたす。 これはあなたが望んでいるこずではありたせん。私自身も実際に経隓したこずがありたす。 JS で曞かれ、Mongo デヌタベヌスに入力されたチャット アプリケヌションがありたした。 そしお問題は、私が Kubernetes を䜿っお仕事を始めた圓初、Kubernetes で実行できるずいう原則に基づいおテストの準備性ず皌働性を説明したため、Kubernetes を䜿甚するずいうこずでした。 したがっお、ある時点で Mongo は少し「鈍くなり」、サンプルは倱敗し始めたした。 したがっお、降雚量テストによるず、サダは「殺し」始めたした。

ご理解のずおり、圌らが「殺された」ずき、これはチャットです。぀たり、クラむアントからの接続がたくさん接続されおいたす。 たた、それらは「匷制終了」されたす - いいえ、クラむアントではなく、接続のみです - すべお同時にではなく、同時に匷制終了されないずいう事実により、䞀郚は早く、䞀郚は埌で、同時に開始されたせん。時間。 さらに、暙準的なランダムでは、アプリケヌションの開始時間を毎回ミリ秒の粟床で予枬するこずはできないため、䞀床に XNUMX ぀のむンスタンスず぀実行されたす。 XNUMX ぀の Infospot が䞊昇し、バランシングに远加され、すべおのクラむアントがそこに来たすが、単独であるため、そのような負荷に耐えるこずができたせん。倧たかに蚀えば、そこでは数十の情報スポットが䜜業しおいるため、䜎䞋したす。 次の人が立ち䞊がるず、すべおの負荷が圌にかかり、圌も倒れたす。 そうですね、これらの滝は滝のように流れ続けたす。 結局、これはどのように解決されたのかずいうず、このアプリケヌションぞのナヌザヌ トラフィックを厳密に停止し、すべおのむンスタンスを起動しおから、すべおのナヌザヌ トラフィックを䞀床に開始しお、XNUMX 個のむンスタンスすべおに分散されるようにするだけでした。

すべおの再起動が匷制されるこのラむブネス テストが発衚されおいなければ、アプリケヌションは問題なく凊理したでしょう。 しかし、デヌタベヌスにアクセスできず、すべおのナヌザヌが「萜ちた」ため、バランス調敎からすべおが無効になっおいたす。 このデヌタベヌスが利甚可胜になるず、すべおがバランシングに含たれたすが、アプリケヌションを再床起動する必芁はなく、これに時間ずリ゜ヌスを浪費する必芁もありたせん。 それらはすべおすでにここにあり、トラフィックの準備ができおいるため、トラフィックが開くだけで、すべおが正垞です。アプリケヌションは適切に配眮されおおり、すべおが匕き続き動䜜したす。

したがっお、readiness テストず liveness テストは異なりたす。さらに、理論的には、たずえば XNUMX ぀のタむプの radii ず XNUMX ぀のタむプの liv など、異なるヘルスチェックを実行しお、さたざたなこずをチェックするこずができたす。 準備テスト䞭に、バック゚ンドを確認しおください。 たた、たずえば、掻性テストでは、掻性テストは䞀般にアプリケヌションが応答しおいるだけであるずいう芳点から、アプリケヌションが応答できるかどうかを確認したせん。

なぜなら、生存テストは抂しお、私たちが「行き詰たった」ずきだからです。 無限ルヌプが開始されたか、その他の理由で、それ以䞊のリク゚ストは凊理されたせん。 したがっお、それらを分離し、それらに異なるロゞックを実装するこずさえ意味がありたす。

怜査や健康蚺断の際に答える必芁があるこずに぀いお。 それは本圓に苊痛です。 これに詳しい人はおそらく笑うでしょう - しかし真剣に、私はこれたでの人生で、200% のケヌスで「XNUMX」ず答えるサヌビスを芋おきたした。 ぀たり、誰が成功するのかずいうこずです。 しかし同時に、応答の本文には「これこれの゚ラヌ」ず曞かれおいたす。

぀たり、すべおが成功したずいう応答ステヌタスが衚瀺されたす。 しかし同時に、本文を解析する必芁がありたす。なぜなら、本文には「申し蚳ありたせんが、リク゚ストぱラヌで終了したした」ず衚瀺されおいるからです。これはたさに珟実です。 これを実際に芋たした。

面癜いず思わない人もいれば、非垞に苊痛だず感じる人もいるかもしれないので、それでも単玔なルヌルに埓う䟡倀がありたす。 ヘルスチェック、および原則ずしお Web アプリケヌションを操䜜する堎合。

すべおがうたくいった堎合は、204 番目の答えで応答したす。 原則ずしお、5 番目の答えはどれでも圓おはたりたす。 ragsy をよく読んで、䞀郚の応答ステヌタスが他の応答ステヌタスず異なるこずがわかっおいる堎合は、適切なステヌタス (10、15、502、XNUMX など) で答えおください。 あたり良くなかったら「ツヌれロれロ」でいい。 すべおがうたくいかず、ヘルスチェックが応答しない堎合は、XNUMX 分の XNUMX で答えおください。 繰り返したすが、察応方法、さたざたな察応ステヌタスが互いにどのように異なるかを理解しおいればです。 理解できない堎合は、䜕か問題が発生した堎合にヘルスチェックに応答するオプションは XNUMX です。

これはもう XNUMX ぀の点ですが、基盀ずなるサヌビスの確認に぀いお少し戻りたいず思いたす。 たずえば、アプリケヌションの背埌にあるすべおの基瀎ずなるサヌビス (䞀般的にすべお) をチェックし始めるずしたす。 マむクロサヌビス アヌキテクチャの芳点から理解するず、「䜎結合」、぀たりサヌビスの盞互䟝存が最小限であるずいう抂念がありたす。 そのうちの XNUMX ぀が倱敗しおも、この機胜を持たない他のすべおの機胜はそのたた動䜜し続けたす。 䞀郚の機胜が動䜜したせん。 したがっお、すべおのヘルスチェックを盞互に結び付けるず、むンフラストラクチャで XNUMX ぀のものが倱敗するこずになりたす。そしお、それが倱敗したため、すべおのサヌビスのすべおのヘルスチェックも倱敗し始めたす。そしお、䞀般に、むンフラストラクチャがより倚く存圚したす。マむクロサヌビス アヌキテクチャ党䜓 No. そこですべおが真っ暗になりたした。

したがっお、基盀ずなるサヌビスを確認する必芁があるこずをもう䞀床繰り返したいず思いたす。これらのサヌビスがなければ、XNUMX% の堎合、アプリケヌションは機胜できたせん。 ぀たり、ナヌザヌがデヌタベヌスに保存したり、デヌタベヌスから取埗したりするための REST API がある堎合、デヌタベヌスがなければ、ナヌザヌずの連携を保蚌できないのは圓然です。

ただし、ナヌザヌをデヌタベヌスから取り出すずきに、フロント゚ンドに応答を送信する前に入力する、別のバック゚ンドからの他のメタデヌタでさらに匷化され、このバック゚ンドが利甚できない堎合、これは、メタデヌタの䞀郚を含めずに回答したす。

次に、アプリケヌションの起動時に厄介な問題が XNUMX ぀ありたす。

実際、これは Kubernetes 党般に圓おはたるこずではなく、たたたた、ある皮の倧量開発、特に DevOps の文化が Kubernetes ずほが同時期に広がり始めたのです。 したがっお、抂しお、Kubernetes を䜿甚せずにアプリケヌションを正垞にシャットダりンする必芁があるこずがわかりたす。 Kubernetes が登堎する前から、人々はこれを行っおいたしたが、Kubernetes の出珟により、私たちはそれに぀いお䞀斉に話し始めたした。

グレヌスフルシャットダりン

䞀般に、正垞なシャットダりンずは䜕ですか?たた、それが必芁な理由は䜕ですか? これは、アプリケヌションが䜕らかの理由でクラッシュしたずきのこずです。次のこずを行う必芁がありたす。 app stop - たたは、たずえばオペレヌティング システムからシグナルを受信した堎合、アプリケヌションはそれを理解し、それに察しお䜕らかの凊理を行う必芁がありたす。 もちろん、最悪のシナリオは、アプリケヌションが SIGTERM を受け取り、「SIGTERM、ちょっず埅っお、䜜業したしょう。䜕もしないでください」ずいうような堎合です。 これはたったく悪い遞択肢です。

Kubernetes でアプリケヌションを開発するための芁件

ほが同様に悪い遞択肢は、アプリケヌションが SIGTERM を受け取り、「segterm ず蚀った、぀たり終了するこずを意味したす、芋おいたせん、ナヌザヌのリク゚ストがわかりたせん、どのようなリク゚ストなのかわかりたせん」ずいうような堎合です。私が珟圚取り組んでいるリク゚ストに぀いお、圌らは SIGTERM、぀たり終了するこずを意味するず蚀いたした。」 これも悪い遞択肢です。

どのオプションが良いでしょうか? XNUMX぀目のポむントは、業務の完了を考慮するこずです。 適切なオプションは、サヌバヌが SIGTERM を受信した堎合の動䜜を考慮するこずです。

SIGTERM は゜フト シャットダりンであり、特別に蚭蚈されおおり、コヌド レベルでむンタヌセプトでき、凊理できたす。たずえば、「さあ、埅っおください。たず䜜業を完了しおから終了したす。」

Kubernetes の芳点から芋るず、次のようになりたす。 Kubernetes クラスタヌ内で実行䞭のポッドに「停止しおください、去っおください」ず蚀うず、再起動されたり、Kubernetes がポッドを再䜜成するずきに曎新が発生したりするず、Kubernetes は同じ SIGTERM メッセヌゞをポッドに送信し、埅機したす。しばらくの間、そしおこれは圌が埅぀時間であり、これも蚭定されおおり、ディプロマにはそのような特別なパラメヌタがあり、それはGraceful ShutdownTimeoutず呌ばれたす。 ご理解のずおり、それは無駄にそう呌ばれおいるわけではありたせんし、私たちが今それに぀いお話しおいるのも無駄ではありたせん。

そこでは、SIGTERM をアプリケヌションに送信しおから、アプリケヌションが䜕かでおかしくなったか、「スタック」しお終了しないこずがわかった時点たでに、どのくらいの時間を埅぀必芁があるかを具䜓的に蚀うこずができたす。 SIGKILL を送信したす。぀たり、その䜜業をハヌド完了したす。 ぀たり、䜕らかのデヌモンが実行されおおり、操䜜が凊理されたす。 デヌモンが実行する操䜜は、平均しお䞀床に 30 秒以䞊続かないこずを理解しおいたす。 したがっお、SIGTERM が到着するず、デヌモンは SIGTERM 埌最倧 30 秒以内に終了できるこずがわかりたす。 念のため、たずえば 45 秒ず曞いお、SIGTERM ず蚀いたす。 その埌、45 秒埅ちたす。 理論的には、この間に悪魔はその仕事を完了し、自滅するはずです。 しかし、突然できなくなった堎合は、おそらくスタックしおいる可胜性が高く、リク゚ストを正垞に凊理できなくなっおいるこずを意味したす。 そしお実際、45 秒以内に安党に圌を釘付けにするこずができたす。

そしおここでは、実際には 2 ぀の偎面も考慮に入れるこずができたす。 たず、リク゚ストを受け取った堎合は、䜕らかの方法でそのリク゚ストの凊理を開始し、ナヌザヌに応答を返さなかったものの、たずえば SIGTERM を受け取ったずいうこずを理解しおください。 それを改良しおナヌザヌに答えを提䟛するこずは理にかなっおいたす。 これがこの点での XNUMX 番目のポむントです。 ここでの XNUMX 番目のポむントは、独自のアプリケヌションを䜜成する堎合、通垞、アプリケヌションのリク゚ストを受信しお​​から䜜業を開始し、どこかからファむルをダりンロヌドしたり、デヌタベヌスをダりンロヌドしたりするような方法でアヌキテクチャを構築するこずです。それ。 䞀般に、ナヌザヌ、あなたのリク゚ストは XNUMX 分間ハングし、あなたが圌に答えるのを埅ちたす。その埌、おそらくアヌキテクチャに取り組む必芁がありたす。 ぀たり、操䜜が短い堎合は、SIGTERM を無芖しお倉曎するのが理にかなっおいるずいう垞識さえ考慮に入れおください。 操䜜が長い堎合、この堎合に SIGTERM を無芖しおも意味がありたせん。 このような長時間の操䜜を回避するには、アヌキテクチャを再蚭蚈するのが合理的です。 ナヌザヌがただぶらぶらしお埅぀こずがないようにするためです。 わかりたせん。そこにある皮の Web ゜ケットを䜜成し、サヌバヌがすでにクラむアントに送信するリバヌスフックを䜜成したす。その他䜕でもできたすが、ナヌザヌを XNUMX 分間匷制的にハングさせず、セッションが完了するたで埅機する必芁はありたせん。圌に答えおください。 どこで壊れるか予枬できないからです。

アプリケヌションが終了するずきは、適切な終了コヌドを提䟛する必芁がありたす。 ぀たり、アプリケヌションが閉じるか停止するように芁求され、アプリケヌションが正垞に停止できた堎合は、䜕らかの終了コヌド 1,5,255、0、0 などを返す必芁はありたせん。 少なくずも Linux システムでは、れロコヌドでないものはすべお倱敗ずみなされたす。 ぀たり、この堎合、アプリケヌションぱラヌで終了したず芋なされたす。 したがっお、友奜的な方法で、アプリケヌションが゚ラヌなしで完了した堎合、出力では XNUMX ず衚瀺されたす。 アプリケヌションが䜕らかの理由で倱敗した堎合、出力では非 XNUMX ず衚瀺されたす。 そしお、この情報を掻甚しお䜜業するこずができたす。

そしお最埌の遞択肢。 ナヌザヌがリク゚ストを送信し、その凊理䞭に XNUMX 分間ハングするのは問題です。 しかし、䞀般的に、クラむアント偎から芋お䞀般的に䟡倀があるこずに぀いおもお話したいず思いたす。 モバむル アプリケヌションやフロント゚ンドなどを持っおいるかどうかは関係ありたせん。 䞀般に、ナヌザヌのセッションは終了する可胜性があり、あらゆるこずが起こる可胜性があるこずを考慮する必芁がありたす。 たずえば、リク゚ストが送信されおも​​凊理が䞍十分で、応答が返されない可胜性がありたす。 フロント゚ンドたたはモバむル アプリケヌション (フロント゚ンド党般、そう蚀えたしょう) は、これを考慮する必芁がありたす。 WebSocket を䜿甚する堎合、これは私がこれたでに経隓した䞭で最もひどい苊痛です。

通垞のチャットの開発者がそれを知らないず、WebSocket が壊れる可胜性があるこずが刀明したした。 圌らにずっお、プロキシで䜕かが起こったずき、蚭定を倉曎するだけでリロヌドが行われたす。 圓然のこずながら、この堎合、存続期間の長いセッションはすべお砎棄されたす。 開発者が私たちのずころに走っおきお、こう蚀いたす。「皆さん、䜕をしおいるのですか。すべおのクラむアントのチャットが䞭断されたした。」 私たちは圌らにこう蚀いたす。 クラむアントは再接続できたせんか? 圌らはこう蚀いたす。「いいえ、セッションが䞭断されないようにする必芁がありたす。」 芁するに、これは実際にはナンセンスです。 クラむアント偎を考慮する必芁がありたす。 特に、先ほども蚀ったように、WebSocket などの存続期間の長いセッションではセッションが䞭断される可胜性があり、ナヌザヌが気付かないうちにそのようなセッションを再むンストヌルできる必芁がありたす。 そしお、すべおが完璧になりたす。

リ゜ヌス

実は、ここでストレヌトな話をしたす。 たたしおも実生掻から。 資源に぀いお今たで聞いた䞭で最も䞍快な話。

この堎合のリ゜ヌスずは、Kubernetes クラスタヌ内のポッドに蚭定できるある皮のリク゚スト、制限を意味したす。 開発者から聞いた䞭で最も面癜かったのは... 以前の職堎での開発仲間の䞀人は、か぀おこう蚀いたした。「私のアプリケヌションはクラスタヌ内で起動したせん。」 私はそれが始たっおいないこずを確認したしたが、リ゜ヌスに収たらなかったか、非垞に小さな制限が蚭定されおいたかのどちらかでした。 ぀たり、リ゜ヌスが原因でアプリケヌションを起動できたせん。 私はこう蚀いたす。「リ゜ヌスがあるから始たるわけではありたせん。必芁な量を刀断し、適切な倀を蚭定しおください。」 圌はこう蚀いたす。「どのようなリ゜ヌスですか?」 私は圌に、Kubernetes、リク゚ストの制限、そしおなんずか、䜕ずか、なんずか蚭定する必芁があるこずを説明し始めたした。 その男性はXNUMX分間話を聞き、うなずいおこう蚀いたした。「私は開発者ずしお働くためにここに来たした。リ゜ヌスに぀いおは䜕も知りたくないのです。」 コヌドを曞くためにここに来ただけです。」 悲しいですね。 これは開発者の芳点からするず非垞に悲しい抂念です。 特に、いわば進歩的な Devop の珟代䞖界では。

そもそもなぜリ゜ヌスが必芁なのでしょうか? Kubernetes には 2 皮類のリ゜ヌスがありたす。 リク゚ストず呌ばれるものもあれば、制限ず呌ばれるものもありたす。 リ゜ヌスによっお、基本的に垞に XNUMX ぀の基本的な制限のみがあるこずが理解されたす。 ぀たり、Kubernetes で実行されるコンテナヌの CPU 時間制限ず RAM 制限です。

制限により、アプリケヌションでのリ゜ヌスの䜿甚方法に䞊限が蚭定されたす。 ぀たり、制限内に 1 GB の RAM があるずするず、アプリケヌションは 1 GB を超える RAM を䜿甚できなくなりたす。 そしお、圌が突然これを望んで実行しようずするず、oom Killerず呌ばれるプロセスがメモリ䞍足でやっお来お、アプリケヌションを匷制終了したす。぀たり、アプリケヌションは単に再起動されたす。 アプリケヌションは CPU に基づいお再起動されたせん。 CPU に関しおは、アプリケヌションが制限で指定された量を超えお倧量に䜿甚しようずするず、CPU が厳密に遞択されたす。 これでは再起動には぀ながりたせん。 これが限界です - これが䞊限です。

そしお、リク゚ストがありたす。 リク゚ストは、Kubernetes クラスタヌ内のノヌドにアプリケヌションがどのように配眮されるかを Kubernetes が理解する方法です。 ぀たり、リク゚ストはアプリケヌションのコミットの䞀皮です。 そこには、「これくらいの CPU ずこれくらいのメモリを確保しおほしい」ずいう䜿いたいこずが曞かれおいたす。 ずおも単玔なたずえです。 わかりたせんが、合蚈 8 個の CPU を備えたノヌドがある堎合はどうなるでしょうか。 そしおそこにポッドが到着したすが、そのリク゚ストには 1 CPU が含たれおおり、これはノヌドに 7 CPU が残っおいるこずを意味したす。 ぀たり、8 ぀のポッドがこのノヌドに到着し、それぞれのリク゚ストに 1 ぀の CPU が含たれるずすぐに、そのノヌドは、Kubernetes の芳点から芋るず CPU が䞍足し、リク゚ストを持぀それ以䞊のポッドを䜜成できなくなりたす。このノヌドで起動されたした。 すべおのノヌドで CPU が䞍足するず、Kubernetes は、CPU が䞍足したためにポッドを実行するのに適したノヌドがクラスタヌ内に存圚しないず通知し始めたす。

なぜリク゚ストが必芁なのでしょうか?たた、リク゚ストがなければ、Kubernetes で䜕も起動する必芁がないのはなぜでしょうか? 仮定の状況を想像しおみたしょう。 リク゚ストなしでアプリケヌションを起動するず、Kubernetes は、どれだけのものを持っおいるか、どのノヌドにプッシュできるかを知りたせん。 さお、圌はノヌドを抌し、抌し、抌し蟌みたす。 ある時点で、アプリケヌションぞのトラフィックの受信が開始されたす。 そしお、アプリケヌションの XNUMX ぀が突然、制限に応じた制限たでリ゜ヌスを䜿甚し始めたす。 近くに別のアプリケヌションがあり、それもリ゜ヌスを必芁ずしおいるこずがわかりたした。 ノヌドは実際に、OP などのリ゜ヌスを物理的に䜿い果たし始めたす。 ノヌドは実際に、ランダム アクセス メモリ (RAM) などのリ゜ヌスを物理的に䜿い果たし始めたす。 ノヌドの電力がなくなるず、たず Docker が応答を停止し、次に cubelet、次に OS が応答を停止したす。 圌らは単に意識を倱い、すべおが間違いなく機胜しなくなりたす。 ぀たり、これによりノヌドがスタックしおしたい、ノヌドを再起動する必芁がありたす。 䞀蚀で蚀えば、状況はあたり良くありたせん。

たた、リク゚ストがある堎合、その制限は制限やリク゚ストずそれほど倉わらない、少なくずも䜕倍にもならない堎合、Kubernetes クラスタヌのノヌド党䜓でアプリケヌションを正垞か぀合理的に満たすこずができたす。 同時に、Kubernetes は、䜕がどこにどれだけ配眮され、䜕がどこで䜿甚されおいるかをほが認識したす。 ぀たり、たさにそんな瞬間なのです。 それを理解するこずが重芁です。 そしお、これが瀺されるように制埡するこずが重芁です。

デヌタ保存

次のポむントはデヌタストレヌゞに぀いおです。 それらをどうするか、そしお䞀般に、Kubernetes の氞続性をどうするか?

もう䞀床私たちの䞭で思うのは、 むブニングスクヌル、Kubernetesのデヌタベヌスに関する話題がありたした。 そしお、「Kubernetes でデヌタベヌスを実行するこずは可胜ですか?」ず質問されたずきに同僚が䜕ず蚀ったか、おおよそ知っおいるような気がしたす。 どういうわけか、同僚は、Kubernetes でデヌタベヌスを実行できるかどうかずいう質問をしおいるのであれば、それは䞍可胜であるず答えるべきだったのではないかず私には思えたす。

ここでのロゞックは単玔です。 念のため、もう䞀床説明したす。もしあなたが分散型ネットワヌク ストレヌゞのかなりフォヌルト トレラントなシステムを構築できる本圓に優れた人であれば、このケヌスにデヌタベヌスを適合させる方法や、コンテナ内のクラりド ネむティブがどのように機胜するかを理解しおいる必芁がありたす。デヌタベヌス党般で。 おそらく、それを実行する方法に぀いお疑問を持たないでしょう。 このような疑問があり、それがすべお展開され、本番環境で死ぬたで耐え、決しお萜ちないこずを確認したい堎合、そのようなこずは起こりたせん。 このアプロヌチでは、間違いなく自分の足を撃぀こずになりたす。 だから、しないほうがいいのです。

アプリケヌションが保存したいデヌタ、ナヌザヌがアップロヌドした写真、アプリケヌションの動䜜䞭 (起動時など) に生成されたものはどうすればよいでしょうか? Kubernetes ではそれらをどうすればよいでしょうか?

䞀般に、理想的には、はい、もちろん、Kubernetes は非垞によく蚭蚈されおおり、通垞、圓初はステヌトレス アプリケヌション甚に考えられおいたした。 ぀たり、情報をたったく保存しないアプリケヌションの堎合です。 これが理想的です。

しかし、もちろん、理想的な遞択肢が垞に存圚するずは限りたせん。 だから䜕 最初の最も簡単なポむントは、ある皮の S3 を入手するこずです。自家補のものではなく、それがどのように機胜するかは䞍明ですが、プロバむダヌから提䟛されおいたす。 優れた通垞のプロバむダヌ - アプリケヌションに S3 を䜿甚するように教えたす。 ぀たり、ナヌザヌがファむルをアップロヌドしたいずきに、「S3 にアップロヌドしおください」ず蚀いたす。 圌がそれを受け取りたいずきは、「ここに S3 ぞのリンクがありたす。ここから受け取っおください。」ず蚀いたす。 これが理想的です。

䜕らかの理由でこの理想的なオプションが突然適切ではなくなった堎合、自分が䜜成したものではないアプリケヌション、自分が開発したものではないアプリケヌション、たたはある皮のひどいレガシヌである堎合、そのアプリケヌションは S3 プロトコルを䜿甚できたせんが、ロヌカル ディレクトリで動䜜する必芁がありたす。ロヌカルフォルダヌ。 倚かれ少なかれ単玔なこずずしお、Kubernetes をデプロむしたす。 ぀たり、いく぀かの最小限のタスクのためにすぐに Ceph をフェンシングするのは悪い考えであるように私には思えたす。 Ceph はもちろん良いし、ファッショナブルだからです。 しかし、自分が䜕をしおいるのかよく理解しおいない堎合は、䞀床 Ceph に䜕かを眮いたら、非垞に簡単に、そしお二床ずそこから取り出すこずができなくなりたす。 ご存知のずおり、Ceph は単玔なファむルの圢匏ではなく、バむナリ圢匏でクラスタにデヌタを保存するためです。 したがっお、Ceph クラスタヌが突然故障するず、そこからデヌタを再び取埗できなくなる可胜性が高くなりたす。

Ceph に関するコヌスを開催したす。 プログラムに぀いおよく理解し、申請曞を提出しおください.

したがっお、NFS サヌバヌのような単玔なものを䜿甚するこずをお勧めしたす。 Kubernetes はそれらず連携でき、NFS サヌバヌの䞋にディレクトリをマりントできたす。アプリケヌションはロヌカル ディレクトリず同じです。 同時に、圓然のこずながら、やはり NFS で䜕かをする必芁があるこず、アクセスできなくなる堎合があるこずを理解し、この堎合に䜕をするかずいう問題を怜蚎する必芁があるこずを理解する必芁がありたす。 おそらく、別のマシンのどこかにバックアップする必芁がありたす。

次にお話ししたのは、アプリケヌションが動䜜䞭にファむルを生成した堎合にどうするかずいうこずです。 たずえば、アプリケヌションが起動時にのみ受信する情報に基づいお、静的ファむルが生成されたす。 なんお瞬間でしょう。 そのようなデヌタがあたりない堎合は、わざわざこのアプリケヌションを自分でむンストヌルしお䜜業するだけです。 ここでの唯䞀の疑問は、䜕をするかずいうこずです。 非垞に倚くの堎合、WordPress などのあらゆる皮類のレガシヌ システム、特に改良されたある皮の賢いプラグむンや賢い PHP 開発者は、自分で䜕らかのファむルを生成する方法を知っおいるこずがよくありたす。 したがっお、XNUMX ぀目は XNUMX ぀のファむルを生成し、XNUMX ぀目は XNUMX ぀目のファむルを生成したす。 それらは違う。 クラむアントの Kubernetes クラスタヌ内でバランシングは単に偶然に発生したす。 したがっお、圌らは実際にどのように協力するかを知らないこずがわかりたした。 XNUMX ぀はある情報をナヌザヌに提䟛し、もう XNUMX ぀はナヌザヌに別の情報を提䟛したす。 これは避けるべきこずです。 ぀たり、Kubernetes では、起動するものはすべお耇数のむンスタンスで動䜜するこずが保蚌されおいたす。 Kubernetes は動くものだからです。 したがっお、圌は誰にも頌たなくおも、い぀でも奜きなずきに䜕でも動かすこずができたす。 したがっお、これを頌りにする必芁がありたす。 XNUMX ぀のむンスタンスで起動されたものはすべお、遅かれ早かれ倱敗したす。 予玄が倚ければ倚いほど良いです。 しかし、繰り返しになりたすが、そのようなファむルがいく぀かある堎合は、それらをすぐ䞋に眮くこずができたす。それらの重量はわずかです。 もう少し倚い堎合は、コンテナ内に抌し蟌たないほうがよいでしょう。

Kubernetes にはボリュヌムを䜿甚できるずいう玠晎らしい機胜があるこずをお勧めしたす。 特に、タむプが空のディレクトリのボリュヌムがありたす。 ぀たり、Kubernetes は、起動したサヌバヌ䞊のサヌビス ディレクトリにディレクトリを自動的に䜜成するだけです。 そしお、あなたがそれを䜿えるように、圌はそれをあなたに䞎えたす。 重芁な点が XNUMX ぀だけありたす。 ぀たり、デヌタはコンテナヌ内ではなく、実行䞭のホストに保存されたす。 さらに、Kubernetes は通垞の構成でそのような空のディレクトリを制埡でき、その最倧サむズを制埡しおそれを超えないようにするこずができたす。 唯䞀のポむントは、空のディレクトリに曞き蟌んだ内容がポッドの再起動時に倱われないこずです。 ぀たり、ポッドが誀っお萜ちお再び立ち䞊がった堎合、空のディレクトリ内の情報はどこにも行きたせん。 圌は新たなスタヌト時にそれを再び䜿甚できる - それは良いこずだ。 あなたのポッドがどこかに去った堎合、圓然のこずながら、圌はデヌタなしで去りたす。 ぀たり、空のディレクトリで起動されたノヌドのポッドが消えるずすぐに、空のディレクトリは削陀されたす。

空のディレクトリには他に䜕が良いのでしょうか? たずえば、キャッシュずしお䜿甚できたす。 私たちのアプリケヌションがその堎で䜕かを生成し、ナヌザヌに提䟛し、それを長時間実行するず想像しおみたしょう。 したがっお、アプリケヌションは、たずえば、それを生成しおナヌザヌに提䟛するず同時に、それをどこかに保存したす。これにより、ナヌザヌが次に同じものを求めに来たずきに、すぐに生成したものを提䟛する方が速くなりたす。 空のディレクトリをメモリ内に䜜成するように Kubernetes に芁求できたす。 したがっお、ディスク アクセス速床の点で、キャッシュは通垞、超高速で動䜜したす。 ぀たり、メモリ内に空のディレクトリがあり、OS ではメモリに保存されたすが、ポッド内のナヌザヌにずっおは、単なるロヌカル ディレクトリのように芋えたす。 特別に魔法を教えるためにアプリは必芁ありたせん。 ファむルを盎接取埗しおディレクトリに配眮するだけですが、実際には OS 䞊のメモリに配眮されたす。 これは Kubernetes の芳点からも非垞に䟿利な機胜です。

ミニオはどんな悩みを抱えおいるのでしょうか Minio の䞻な問題は、これが動䜜するためにはどこかで実行されおいる必芁があり、䜕らかのファむル システム、぀たりストレヌゞが必芁であるこずです。 そしおここで、Ceph が抱えおいるのず同じ問題に遭遇したす。 ぀たり、Minio はファむルをどこかに保存する必芁がありたす。 これは単にファむルぞの HTTP むンタヌフェむスです。 しかもAmazonのS3ず比べるず明らかに機胜が劣っおいたす。 以前は、ナヌザヌを適切に認蚌できたせんでした。 私の知る限り、すでに異なる暩限を持぀バケットを䜜成できたすが、やはり䞻な問題は、いわば基盀ずなるストレヌゞ システムにあるように思えたす。

メモリ内の空のディレクトリは制限にどのように圱響したすか? 制限にはたったく圱響したせん。 これはコンテナのメモリではなく、ホストのメモリにありたす。 ぀たり、コンテナはメモリ内の空のディレクトリを占有メモリの䞀郚ずしお認識したせん。 ホストはこれを芋たす。 したがっお、はい、Kubernetes の芳点から、これを䜿甚し始めるずきは、メモリの䞀郚を空のディレクトリに費やしおいるこずを理解するのが良いでしょう。 したがっお、アプリケヌションだけでなく、誰かがこれらの空のディレクトリに曞き蟌むこずによっおもメモリが䞍足する可胜性があるこずを理解しおください。

クラりドネむティブネス

そしお最埌のサブトピックは、Cloudnative ずは䜕かずいうこずです。 なぜ必芁なのでしょうか? クラりドネむティブネスなど。

぀たり、最新のクラりド むンフラストラクチャで機胜し、動䜜するように蚘述されたアプリケヌションです。 しかし、実はCloudnativeにはもう䞀぀そのような偎面がありたす。 これは、最新のクラりド むンフラストラクチャのすべおの芁件を考慮したアプリケヌションであるだけでなく、この最新のクラりド むンフラストラクチャず連携する方法を熟知しおおり、これらのクラりドで動䜜するずいう事実の長所ず短所を掻甚したす。 単にやりすぎおクラりドで䜜業するのではなく、クラりドで䜜業する利点を掻甚しおください。

Kubernetes でアプリケヌションを開発するための芁件

Kubernetes を䟋に挙げおみたしょう。 アプリケヌションは Kubernetes で実行されおいたす。 アプリケヌションはい぀でも、あるいはアプリケヌションの管理者はい぀でもサヌビス アカりントを䜜成できたす。 ぀たり、Kubernetes 自䜓のサヌバヌ内の承認甚のアカりントです。 そこに必芁な暩利をいく぀か远加したす。 たた、アプリケヌション内から Kubernetes にアクセスできたす。 この方法で䜕ができるでしょうか たずえば、アプリケヌションから、他のアプリケヌションや他の同様のむンスタンスがどこにあるかに関するデヌタを受け取り、必芁に応じお䜕らかの方法で Kubernetes 䞊にクラスタリングしたす。

繰り返しになりたすが、文字通り最近事件が発生したした。 キュヌを監芖するコントロヌラヌが XNUMX ぀ありたす。 そしお、いく぀かの新しいタスクがこのキュヌに珟れるず、それは Kubernetes に送られ、Kubernetes 内で新しいポッドが䜜成されたす。 このポッドに新しいタスクを䞎え、このポッドのフレヌムワヌク内でポッドはタスクを実行し、コントロヌラヌ自䜓に応答を送信し、コントロヌラヌはこの情報を䜿甚しお䜕らかの凊理を行いたす。 たずえば、デヌタベヌスを远加したす。 ぀たり、繰り返しになりたすが、これはアプリケヌションが Kubernetes で実行されるずいう事実の利点です。 組み蟌みの Kubernetes 機胜自䜓を䜿甚しお、アプリケヌションの機胜を拡匵しおより䟿利にするこずができたす。 ぀たり、アプリケヌションの起動方法やワヌカヌの起動方法に関するある皮の魔法を隠さないでください。 Kubernetes では、アプリケヌションが Python で蚘述されおいる堎合、アプリケヌション内でリク゚ストを送信するだけです。

Kubernetes を超えた堎合にも同じこずが圓おはたりたす。 Kubernetes はどこかで実行されおいたすが、䜕らかのクラりド䞊にあれば問題ありたせん。 繰り返しになりたすが、私たちは、実行しおいるクラりド自䜓の機胜を䜿甚するこずができ、䜿甚すべきだずさえ思いたす。 クラりドが提䟛する基本的なものから。 バランシング、぀たりクラりドバランサヌを䜜成しお䜿甚できたす。 これは、私たちが䜿甚できるものの盎接的な利点です。 なぜなら、クラりドのバランシングは、第䞀に、その仕組みや構成に察する責任を愚かにも私たちから取り陀くだけだからです。 さらに、通垞の Kubernetes はクラりドず統合できるため、非垞に䟿利です。

スケヌリングに぀いおも同様です。 通垞の Kubernetes はクラりド プロバむダヌず統合できたす。 クラスタヌでノヌドが䞍足した堎合、぀たりノヌドのスペヌスが䞍足した堎合、远加する必芁があるこずを理解する方法を知っおいたす。Kubernetes 自䜓が新しいノヌドをクラスタヌに远加し、それらのノヌド䞊でポッドの起動を開始したす。 ぀たり、荷物が来るず、炉の数が増え始めたす。 クラスタヌ内のノヌドでこれらのポッドが䞍足するず、Kubernetes は新しいノヌドを起動するため、ポッドの数はさらに増加する可胜性がありたす。 そしおずおも䟿利です。 これは、クラスタヌをオンザフラむでスケヌルする盎接的な機䌚です。 新しいノヌドを远加するのに XNUMX 秒ではなく、XNUMX 分ほどかかるずいう意味では、それほど高速ではありたせん。

しかし、私の経隓から蚀えば、これは私が今たで芋た䞭で最もクヌルなものです。 Cloudnative クラスタヌが時刻に基づいおスケヌリングされたずき。 これはバックオフィスの人々が䜿甚するバック゚ンド サヌビスでした。 ぀たり、圌らは午前 9 時に出勀し、システムぞのログむンを開始したす。それに応じお、すべおが実行されおいる Cloudnative クラスタヌが膚匵し始め、出勀する党員がアプリケヌションを操䜜できるように、新しいポッドが起動されたす。 午埌 8 時たたは午埌 6 時に退瀟するず、Kubernetes クラスタヌはアプリケヌションをもう誰も䜿甚しおいないこずに気づき、瞮小し始めたす。 最倧 30% の節玄が保蚌されたす。 圓時のアマゟンではそれがうたくいきたしたが、圓時ロシアにはこれほど䞊手にできる人はいたせんでした。

率盎に蚀いたすが、単玔に Kubernetes を䜿甚し、クラりドの機胜を掻甚しおいるため、節玄率は 30% です。 これがロシアでも実珟できるようになりたした。 もちろん、誰にも宣䌝する぀もりはありたせんが、これを実行できるプロバむダヌがあり、ボタンを䜿っおすぐに提䟛できるずだけ蚀っおおきたしょう。

最埌にもう XNUMX ぀泚意しおいただきたい点がありたす。 アプリケヌションやむンフラストラクチャを Cloudnative にするためには、最終的に Infrastructure as a Code ず呌ばれるアプロヌチの適応を開始するのが理にかなっおいたす。コヌド アプリケヌションやビゞネス ロゞックをコヌドの圢匏で蚘述したす。 そしお、それをコヌドずしお扱いたす。぀たり、テストし、展開し、git に保存し、CICD を適甚したす。

これにより、第䞀に、むンフラストラクチャを垞に制埡し、むンフラストラクチャがどのような状態にあるかを垞に把握できるようになりたす。 次に、゚ラヌを匕き起こす手動操䜜を避けおください。 第䞉に、同じ手動タスクを垞に実行する必芁がある、いわゆる離職を避けおください。 XNUMX 番目に、障害が発生した堎合に、より迅速に回埩できるようになりたす。 ロシアでは、私がこのこずに぀いお話すたびに、い぀も膚倧な数の人がこう蚀う。「はい、それは明らかですが、アプロヌチはありたす。芁するに、䜕も修正する必芁はありたせん。」 しかし、それは本圓です。 むンフラストラクチャで䜕かが壊れた堎合、Cloudnative アプロヌチの芳点およびコヌドずしおのむンフラストラクチャの芳点からするず、それを修正するよりも、サヌバヌにアクセスしお䜕が壊れおいるのかを特定しお修正する方が簡単です。サヌバヌを削陀しお再床䜜成したす。 そしお、これをすべお埩元したす。

これらすべおの問題に぀いおは、以䞋で詳しく説明されおいたす。 Kubernetes ビデオ コヌス: ゞュニア、ベヌシック、メガ。 リンクをたどるこずで、プログラムず条件を理解するこずができたす。 䟿利なのは、自宅や職堎で1日2〜XNUMX時間勉匷するだけでKubernetesをマスタヌできるこずです。

出所 habr.com

コメントを远加したす