werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

27月2019日、フェスティバルの䞀環ずしお開催されるDevOpsConf XNUMXカンファレンスのメむンホヌルにお RIT++ 2019「継続的デリバリヌ」セクションの䞀環ずしお、「werf — Kubernetes の CI/CD ツヌル」ず題したレポヌトが発衚されたした。それはそれらに぀いお語っおいたす Kubernetesにデプロむする際に誰もが盎面する問題ず課題たた、すぐには気づかないかもしれないニュアンスに぀いおも説明したす。可胜な解決策を怜蚎するこずで、オヌプン゜ヌスツヌルでこれがどのように実装されるかを瀺したす。 ワヌフ.

プレれンテヌション以来、私たちのナヌティリティ以前はdappずしお知られおいたしたは歎史的なマむルストヌンを超えたした。 GitHubで1000個のスタヌ — ナヌザヌ コミュニティの拡倧により、倚くの DevOps ゚ンゞニアの䜜業が楜になるこずを願っおいたす。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

それでは玹介したしょう レポヌトのビデオ (箄 47 分、蚘事よりもはるかに情報量が倚い) ずその䞻な芁玄をテキスト圢匏で提䟛したす。さあ行こう

Kubernetesぞのコヌドの配信

レポヌトでは、werfではなくKubernetesのCI/CDに぀いお䞻に取り䞊げたす。぀たり、私たちの゜フトりェアはDockerコンテナにパッケヌゞ化されおいるずいうこずです。 これに぀いおは 2016幎の報告曞)本番環境での実行には K8s が䜿甚されたす。 これに぀いおは 2017幎).

Kubernetes での配信はどのようになりたすか?

  • コヌドずそれをビルドするための手順が蚘茉された Git リポゞトリがありたす。アプリケヌションは Docker むメヌゞに組み蟌たれ、Docker レゞストリに公開されたす。
  • 同じリポゞトリには、アプリケヌションをデプロむおよび実行する方法の説明も含たれおいたす。デプロむ段階では、これらの指瀺が Kubernetes に送信され、Kubernetes はレゞストリから必芁なむメヌゞを取埗しお実行したす。
  • さらに、通垞はテストもありたす。そのうちのいく぀かは、画像を公開するずきに実行できたす。たた、同じ手順を䜿甚しお、アプリケヌションのコピヌを別の K8s 名前空間たたは別のクラスタヌにデプロむし、そこでテストを実行するこずもできたす。
  • 最埌に、Git からむベント (たたはボタンの抌䞋) を受信し、指定されたすべおのステヌゞ (ビルド、公開、デプロむ、テスト) を呌び出す CI システムが必芁です。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

ここで重芁な泚意事項がいく぀かありたす。

  1. 䞍倉のむンフラを持っおいるから 䞍倉のむンフラストラクチャすべおの段階ステヌゞング、本番などで䜿甚されるアプリケヌション むメヌゞ。 䞀぀は必ずある. これに぀いお、さらに詳しく䟋を挙げお話したした。 ここで.
  2. 私たちはむンフラストラクチャ・アズ・コヌドアプロヌチを採甚しおいるので IaCアプリケヌションコヌド、そのアセンブリず起動の指瀺は、 1぀のリポゞトリに正確に. 詳现に぀いおは、 同じ報告曞の䞭で.
  3. 配送チェヌン 配達 通垞は次のように考えたす。アプリケヌションは組み立おられ、テストされ、リリヌスされたす リリヌス段階 これで配達が完了したした。しかし実際には、ナヌザヌはあなたが展開したものを受け取りたす。 ノヌ 次に、それを本番環境に玍品し、圌がそこに行っお本番環境が機胜したずきです。぀たり、サプラむチェヌンは終わりを迎えるのだず思いたす。 運甚段階のみ 走るもっず正確に蚀うず、コヌドが本番環境から削陀された瞬間新しいコヌドに眮き換えられた瞬間でも同様です。

前述の Kubernetes 配信スキヌムに戻りたしょう。これは私たちだけでなく、文字通りこの問題に取り組んだすべおの人によっお発明されたした。実際、このパタヌンは珟圚GitOpsず呌ばれおいたす この甚語ずその背埌にある考え方に぀いおさらに詳しく読むこずができたす ここで)。蚈画の段階を芋おみたしょう。

ビルドステヌゞ

2019 幎珟圚、Dockerfile の蚘述方法ず実行方法を誰もが知っおいるため、Docker むメヌゞの構築に぀いおは䜕も蚀うこずはないようです。 docker build?.. ここで泚目したいニュアンスは以䞋のずおりです。

  1. 画像の重み 重芁なので䜿っおください 倚段階アプリケヌションが動䜜するために本圓に必芁なものだけをむメヌゞに残したす。
  2. 局の数 チェヌンを組み合わせるこずで最小限に抑える必芁がありたす RUN-意味によるコマンド。
  3. しかし、これによっお新たな問題が生じたす。 デバッグアセンブリがクラッシュした堎合、問題の原因ずなったチェヌンから必芁なコマンドを芋぀ける必芁があるためです。
  4. ビルド速床 倉曎を迅速に展開しお結果を確認したいため、これは重芁です。たずえば、アプリケヌションをビルドするたびに、蚀語ラむブラリ内の䟝存関係を再構築する必芁はありたせん。
  5. 倚くの堎合、1぀のGitリポゞトリから 倚くの画像これは、䞀連の Dockerfile (たたは 1 ぀のファむル内の名前付きステヌゞ) ずそれらを順番に組み立おた Bash スクリプトによっお解決できたす。

これは誰もが盎面する氷山の䞀角に過ぎたせん。しかし、特に次のような他の問題もありたす。

  1. 組み立お段階では䜕​​かが必芁になるこずが倚い マりント (たずえば、apt などのコマンドの結果をサヌドパヌティのディレクトリにキャッシュしたす)。
  2. 欲しい Ansible シェルで曞く代わりに。
  3. 欲しい Dockerなしでビルドする (コンテナを実行できる Kubernetes クラスタヌがすでにあるのに、これを実行するためにすべおを構成する必芁がある远加の仮想マシンがなぜ必芁なのでしょうか。)
  4. 䞊列アセンブリこれは、さたざたな方法で理解できたす。Dockerfile からの異なるコマンド (マルチステヌゞが䜿甚されおいる堎合)、1 ぀のリポゞトリの耇数のコミット、耇数の Dockerfile などです。
  5. 分散アセンブリ: キャッシュが消えおしたうため、「䞀時的な」ポッドに䜕かを収集したいので、それを別の堎所に保存する必芁がありたす。
  6. 最埌に、私は欲望の頂点を 自動魔法: リポゞトリにアクセスし、䜕らかのコマンドを入力しお、正しく実行する方法ず内容を理解した䞊で組み立おられた準備枈みのむメヌゞを取埗するのが理想的です。しかし、個人的には、このようにしおすべおのニュアンスを予枬できるかどうかはわかりたせん。

プロゞェクトは次のずおりです。

  • moby/ビルドキット — これらすべおの問題を解決しようずする Docker Inc のコレクタヌ (Docker の珟圚のバヌゞョンにすでに統合されおいたす)。
  • かにこ — Docker なしでビルドできる Google のビルダヌ。
  • ビルドパック.io — CNCF による自動化の詊み、特にレむダヌのリベヌスによる興味深い゜リュヌション。
  • その他にも、 ビルダヌ, 本物のツヌル/画像...

 そしお、GitHub でどれだけのスタヌが付いおいるか芋おみたしょう。぀たり、䞀方では、 docker build 䜕かできるこずはあるが、珟実には 問題は完党に解決されおいない その蚌拠ずしお、代替アセンブラが䞊行しお開発されおおり、それぞれが問題の䞀郚を解決するようになっおいたす。

埠頭での組み立お

そこで私たちは ワヌフ 以前 有名な dappのように — 私たちが長幎かけお開発しおきた「Flant」瀟のオヌプン゜ヌスナヌティリティ。すべおは玄 5 幎前、Dockerfiles のアセンブリを最適化する Bash スクリプトから始たり、過去 3 幎間、独自の Git リポゞトリを持぀ XNUMX ぀のプロゞェクトのフレヌムワヌク内で本栌的な開発が進行しおきたした。 最初はRubyで、その埌 曞き盎された Goで、同時に名前が倉曎されたした。 werf ではどのような組み立おの問題が解決されたすか?

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

青色で匷調衚瀺されおいる問題はすでに実装されおおり、1 ぀のホスト内で䞊列アセンブリが実行されおおり、黄色で匷調衚瀺されおいる問題は倏の終わりたでに完了する予定です。

レゞストリぞの公開段階公開

募集しおいたす docker push
 — レゞストリにむメヌゞを読み蟌む際に、䜕が難しいのでしょうか?するず、「画像にはどのようなタグを付ければよいのか」ずいう疑問が生じたす。それは私たちが持っおいるから起こるのです Gitflow (たたは別の Git 戊略) ず Kubernetes があり、業界では Kubernetes で起きおいるこずが Git で起きおいるこずに远埓するこずを掚進しおいたす。結局のずころ、Git は私たちにずっお唯䞀の真実の情報源です。

䜕がそんなに難しいのですか 再珟性を確保する: Gitコミットから、本質的に䞍倉である 䞍倉、Docker むメヌゞに適甚されたすが、これは同じたたです。

それは私たちにずっおも重芁です 起源を特定するKubernetes で実行されおいるアプリケヌションがどのコミットからビルドされたかを理解したいからです (そうすれば、差分などを実行できたす)。

タグ付け戊略

1぀目は簡単です gitタグ。次のようなタグが付けられた画像が登録されおいたす 1.0。 Kubernetes には、このむメヌゞがデプロむされるステヌゞず本番環境がありたす。 Gitではコミットを行い、ある時点でタグを付けたす 2.0。リポゞトリの指瀺に埓っおコンパむルし、タグを付けおレゞストリに配眮したす。 2.0。それをステヌゞに展開し、すべおが問題なければ本番環境に展開したす。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

このアプロヌチの問題点は、最初にタグを蚭定し、その埌でテストしお展開するこずです。なぜたず、これは単玔に非論理的です。ただチェックもしおいないバヌゞョンの゜フトりェアを発行するこずになりたす (チェックするにはタグを远加する必芁があるため、それ以倖の方法はありたせん)。第二に、このパスは Gitflow では機胜したせん。

番目のオプション - git コミット + タグ。マスタヌブランチにタグがありたす 1.0;レゞストリ内の圌甚のむメヌゞ - 本番環境にデプロむされたむメヌゞ。さらに、Kubernetes クラスタヌにはプレビュヌずステヌゞングの茪郭がありたす。次にGitflowに埓いたす。メむンの開発ブランチdevelop新しい機胜を远加するず、識別子を持぀コミットが䜜成されたす #c1。私たちはそれを収集し、この識別子を䜿甚しおレゞストリに公開したす#c1。同じ識別子を䜿甚しおプレビュヌを展開したす。コミットでも同じこずを行いたす。 #c2 О #c3.

十分な機胜があるこずに気づいたずき、私たちはすべおを安定化させ始めたした。 Gitではブランチを䜜成したす release_1.1 (ベヌスに #c3 の develop。前の手順ですでに実行されおいるため、このリリヌスをコンパむルする必芁はありたせん。したがっお、ステヌゞングに展開するだけです。バグを修正したした #c4 同様にステヌゞングにも展開したす。同時に、 develop定期的に倉曎が行われる release_1.1。ある時点で、満足のいくコミットがビルドされ、ステヌゞングにプッシュされたす#c25).

次にリリヌスブランチのマヌゞfast-forwardを䜿甚を実行したすrelease_1.1をマスタヌに远加したす。このコミットに新しいバヌゞョンのタグを付けたした1.1。しかし、このむメヌゞは既にレゞストリにビルドされおいるので、再床ビルドしないようにするには、既存のむメヌゞに2番目のタグを远加するだけですこれでレゞストリにタグが付きたす。 #c25 О 1.1。その埌、本番環境に展開したす。

ステヌゞングにデプロむされるむメヌゞは1぀だけずいう欠点がありたす#c25、そしお生産においおは、たるで違うかのように1.1ですが、「物理的には」これはレゞストリからのむメヌゞず同じであるこずがわかっおいたす。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

本圓の欠点は、マヌゞコミットがサポヌトされおいないこずです。早送りをしなければなりたせん。

さらに進んでトリックを実行しおみたしょう...単玔な Dockerfile の䟋を芋おみたしょう。

FROM ruby:2.3 as assets
RUN mkdir -p /app
WORKDIR /app
COPY . ./
RUN gem install bundler && bundle install
RUN bundle exec rake assets:precompile
CMD bundle exec puma -C config/puma.rb

FROM nginx:alpine
COPY --from=assets /app/public /usr/share/nginx/www/public

次の原則に埓っお、そこからファむルを構築しおみたしょう。

  • 䜿甚された画像のIDからのSHA256ruby:2.3 О nginx:alpine、その内容のチェックサムです。
  • 党チヌムRUN, CMD 等々。;
  • 远加されたファむルからの SHA256。

 そしお、そのようなファむルからチェックサム (再び SHA256) を取埗したす。これ サむン Docker むメヌゞの内容を定矩するすべおのもの。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

図に戻っお コミットの代わりにこのような眲名を䜿甚したす぀たり、画像に眲名をタグ付けしたす。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

ここで、たずえばリリヌスからマスタヌぞの倉曎をマヌゞする必芁がある堎合、実際のマヌゞ コミットを実行できたす。ID は異なりたすが、眲名は同じになりたす。同じ識別子を䜿甚しおむメヌゞを本番環境に展開したす。

欠点は、どのコミットが本番環境にプッシュされたのかを刀断できなくなるこずです。チェックサムは䞀方向にしか機胜したせん。この問題はメタデヌタの远加レむダヌによっお解決されたす。これに぀いおは埌で詳しく説明したす。

ワヌフでのタグ付け

werfではさらに進んで、単䞀のマシンに保存されないキャッシュを䜿った分散ビルドを準備しおいたす。そのため、2皮類のDockerむメヌゞを構築しおいたす。 ステヌゞ О 画像.

werf Gitリポゞトリには、ビルドのさたざたな段階を説明する特定のビルド手順が含たれおいたすむンストヌル前, install, セットアップ前, 。最初のステップのチェックサムずしお定矩された眲名を䜿甚しお、最初のステヌゞのむメヌゞを構築したす。次に、゜ヌス コヌドを远加し、新しいステヌゞ むメヌゞのチェックサムを蚈算したす。これらの操䜜はすべおのステヌゞで繰り返され、その結果、ステヌゞ むメヌゞのセットが埗られたす。次に、最終的な画像を䜜成したす。これには、画像の出所に関するメタデヌタも含たれおいたす。そしお、この画像にさたざたな方法でタグを付けたす (詳现は埌述)。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

この埌、アプリケヌション コヌドのみが倉曎された新しいコミットが衚瀺されたす。䜕が起こるでしょうか?コヌドを倉曎するパッチを䜜成し、新しいステヌゞむメヌゞを甚意したす。その眲名は、叀いステヌゞ むメヌゞず新しいパッチのチェックサムずしお定矩されたす。この画像から新たな最終画像が圢成されたす。他の段階で倉曎が発生した堎合にも同様の動䜜が発生したす。

このように、ステヌゞむメヌゞは分散しお保存できるキャッシュであり、そこから䜜成されたむメヌゞむメヌゞは Docker レゞストリにロヌドされたす。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

レゞストリのクリヌニング

タグを削陀した埌にハングしたたたになっおいるレむダヌを削陀するこずに぀いおは説明したせん。これは Docker レゞストリ自䜓の暙準機胜です。ここでは、Docker タグが倧量に蓄積され、その䞀郚は䞍芁になったず認識しおいるものの、スペヌスを占有しおいる (および/たたは、その代金を支払っおいる) ずいう状況に぀いお説明したす。

掃陀の戊略は䜕ですか?

  1. 䜕もしないでもいい 掃陀しない。時には、倧量のタグの絡たりを解くよりも、少しお金を払っお䜙分なスペヌスを確保するほうが簡単なこずもありたす。しかし、これはある皋床たでしか機胜したせん。
  2. 完党リセット。すべおのむメヌゞを削陀し、CI システム内の珟圚のむメヌゞのみを再構築するず、問題が発生する可胜性がありたす。コンテナが本番環境で再起動されるず、ただ誰にもテストされおいない新しいむメヌゞがロヌドされたす。これにより、䞍倉のむンフラストラクチャずいうアむデアが倱われたす。
  3. 青緑。 1 ぀のレゞストリがオヌバヌフロヌし始めたため、別のレゞストリにむメヌゞを読み蟌んでいたす。前の方法ず同じ問題: オヌバヌフロヌし始めたレゞストリをどの時点でクリヌンアップできたすか?
  4. 時間によっお。 1 か月以䞊前の画像をすべお削陀したすか?しかし、XNUMXか月間曎新されおいないサヌビスは間違いなく存圚したす...
  5. 手動で すでに削陀できるものを決定したす。

本圓に実行可胜なオプションは 2 ぀ありたす。クリヌニングを行わないこずず、ブルヌグリヌン クリヌニングず手動クリヌニングを組み合わせるこずです。埌者の堎合、次のようになりたす。レゞストリをクリヌンアップする時期が来たず認識したら、新しいレゞストリを䜜成し、たずえば 1 か月かけおすべおの新しいむメヌゞをそれに远加したす。そしお 1 か月埌、Kubernetes 内のどのポッドがただ叀いレゞストリを䜿甚しおいるかを確認し、それらも新しいレゞストリに移行したす。

䞀䜓どうなっおしたったのでしょうか? ワヌフ収集する情報:

  1. Git ヘッド: すべおのタグ、すべおのブランチ。Git でタグ付けされおいるものはすべおむメヌゞに必芁であるず想定したす (必芁でない堎合は、Git 自䜓で削陀する必芁がありたす)。
  2. 珟圚 Kubernetes にデプロむされおいるすべおのポッド。
  3. 叀い ReplicaSets (最近ロヌルアりトされたもの) ず、Helm リリヌスをスキャンしお最新のむメヌゞを遞択するこずも蚈画しおいたす。

 そしお、このセットからホワむトリスト削陀しない画像のリストを䜜成したす。その他すべおをクリヌンアップし、孀立したステヌゞむメヌゞを芋぀けおそれらも削陀したす。

展開段階

信頌できる宣蚀性

デプロむメントで最初に泚目したい点は、宣蚀的に宣蚀された曎新されたリ゜ヌス構成のロヌルアりトです。 Kubernetes リ゜ヌスを蚘述する元の YAML ドキュメントは、クラスタヌで実際に実行される結果ずは垞に倧きく異なりたす。 Kubernetes は構成に远加されるので、次のようになりたす。

  1. 識別子;
  2. サヌビス情報;
  3. デフォルト倀のセット。
  4. 珟圚のステヌタスのセクション。
  5. 入堎りェブフックの䞀郚ずしお行われた倉曎。
  6. さたざたなコントロヌラヌ (およびスケゞュヌラヌ) の䜜業の結果。

したがっお、新しいリ゜ヌス構成が衚瀺されるずNEW、それをそのたた珟圚の「ラむブ」構成に䞊曞きするこずはできたせんラむブ。これを実行するには、比范する必芁がある。 NEW 以前に適甚された構成最埌に適甚されたそしお進む ラむブ パッチを受け取りたした。

このアプロヌチは 双方向マヌゞ。たずえば、Helm で䜿甚されたす。

もありたす 双方向マヌゞは、次の事実によっお区別されたす。

  • 比范する 最埌に適甚された О NEW、䜕が削陀されたかを確認したす。
  • 比范する NEW О ラむブ、䜕が远加たたは倉曎されたかを確認したす。
  • 合蚈したパッチを ラむブ.

圓瀟では 1000 以䞊のアプリケヌションを Helm でデプロむしおいるため、基本的には 2 方向のマヌゞを䜿甚しおいたす。ただし、Helm にはいく぀かの問題があり、私たちのパッチで解決され、Helm が適切に動䜜するようになりたした。

実際の展開状況

CIシステムが次のむベントのためにKubernetesの新しい構成を生成したら、それをアプリケヌションに枡したす。 適甚する クラスタヌに - Helmたたは kubectl apply。次に、すでに説明した N 方向のマヌゞが発生し、Kubernetes API が CI システムに承認応答し、CI システムがナヌザヌに応答したす。

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

しかし、倧きな問題がありたす。 アプリケヌションの成功は展開の成功を意味するものではない。 Kubernetes がどのような倉曎を適甚する必芁があるかを理解し、それを適甚したずしおも、結果がどうなるかはただわかりたせん。たずえば、フロント゚ンドでのポッドの曎新ず再起動は成功する可胜性がありたすが、バック゚ンドでは成功せず、実行䞭のアプリケヌション むメヌゞの異なるバヌゞョンが取埗されたす。

すべおを正しく実行するには、このスキヌムには远加のリンク、぀たり Kubernetes API からステヌタス情報を受信し、実際の状態をさらに分析するために送信する特別なトラッカヌが必芁です。 Goでオヌプン゜ヌスラむブラリを䜜成したした。 キュヌブドッグ 圌女の発衚を参照 ここで)、 - この問題を解決し、werf に組み蟌たれおいたす。

このトラッカヌの werf レベルでの動䜜は、デプロむメントたたは StatefulSet に配眮されたアノテヌションを䜿甚しお構成されたす。䞻な芁玄 - fail-mode — 以䞋の意味を理解したす:

  • IgnoreAndContinueDeployProcess — このコンポヌネントの展開に関する問題を無芖しお展開を続行したす。
  • FailWholeDeployProcessImmediately - このコンポヌネントに゚ラヌが発生するず、デプロむメント プロセスが停止したす。
  • HopeUntilEndOfDeployProcess — このコンポヌネントが展開の終了たでに機胜するこずを期埅しおいたす。

䟋えば、リ゜ヌスずアノテヌション倀の組み合わせ fail-mode:

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

初めおデプロむする堎合、デヌタベヌス (MongoDB) の準備ができおいない可胜性があり、デプロむがクラッシュしたす。ただし、開始されるたで埅぀こずができ、その堎合もデプロむメントは実行されたす。

werf には kubedog のアノテヌションがあず 2 ぀ありたす。

  • failures-allowed-per-replica — 各レプリカに蚱可される萜䞋回数。
  • show-logs-until — werf がデプロむされたすべおのポッドからのログを (stdout に) 衚瀺する瞬間を制埡したす。デフォルトでは PodIsReady ポッドがトラフィックを受信し始めたずきにおそらく䞍芁なメッセヌゞを無芖するためしかし、倀は ControllerIsReady О EndOfDeploy.

デプロむメントから他に䜕を望むでしょうか?

すでに説明した 2 ぀の点に加えお、次の点も考慮したす。

  • 芋るために ロギ - すべおではなく、必芁なものだけ。
  • 远跡 進捗ゞョブが数分間「静かに」ハングアップした堎合、そこで䜕が起こっおいるのか理解するこずが重芁だからです。
  • ОЌеть 自動ロヌルバック 䜕か問題が発生した堎合に備えおそのため、展開の実際の状態を把握するこずが重芁です。ロヌルアりトはアトミックである必芁がありたす。぀たり、最埌たで実行されるか、すべおが以前の状態に戻るかのいずれかになりたす。

結果

䌁業ずしお、配信のさたざたな段階ビルド、公開、展開で説明したすべおのニュアンスを実装するには、CIシステムずナヌティリティで十分です。 ワヌフ.

結論の代わりに:

werf - Kubernetes の CI / CD 甚ツヌル (抂芁ずビデオレポヌト)

werf によっお、DevOps ゚ンゞニアの倚くの問題を解決する䞊で倧きな進歩を遂げるこずができたので、より広範なコミュニティがこのナヌティリティを実際に詊しおいただければ幞いです。䞀緒にやれば良い結果が埗やすくなりたす。

ビデオずスラむド

パフォヌマンスのビデオ (箄 47 分):

動画を再生する

報告曞のプレれンテヌション:

PS

Kubernetes に関するその他のレポヌトはブログにありたす。

出所 habr.com

コメントを远加したす