私のウーバードライバーへKubernetesを説明する

先週、シカゴでKubecon 2023に参加しました。会議中にいくつかのブログを読み、101のチュートリアルに参加しましたが、まだ技術をよく理解していない状態でした。最悪だったのは会議の最終日、ホテルに戻るためにウーバーを注文したことです。ドライバーが「会議は何についてですか?」と聞いてきたので、「Kubernetesについてです」と答えましたが、話をしているうちに、私が何を言っているのか全く分からなかったことが明らかになりました。

3日間の会議で、ウーバードライバーに技術を説明できないというのは想像してみてください。顔をたたく自分。 ですから、自分を取り戻す試みとして、ウーバードライバーとの再想像した会話をここに記します。

私:想像してみてください。あなたが忙しいレストランのキッチンでシェフだと。あなたには、それぞれのシェフが食事の異なる部分を準備していて、一つのグループは前菜、もう一つは主菜、また別のグループはデザートを担当しています。これらのシェフをコーディネートして、食事をタイムリーに客に提供することがあなたの仕事です。頭に描けますか?

ドライバー:分かりました。

私:このシナリオで、料理長はKubernetesです。料理長がキッチンの異なるシェフを管理する必要があるように、Kubernetesはソフトウェアを実行するために必要な異なる部品を管理するのを手伝います。Kubernetesの公式定義は「コンテナ・オーケストレーションツール」ですが、「コンテナ」という言葉はここではかなり抽象的なので、「コンテナ」の代わりに「シェフ」と言い換えてみてください。そうするとKubernetesは「シェフのオーケストレーションツール」になります。そのようにして、Kubernetesという言葉を聞くたびに、キッチンのイメージを頭に描くことができます。

ドライバー:なるほど、今のところは理解できる。でも、これらのコンテナって何?ずっとシェフとして想像し続けるわけにもいかないよね。

私:うん、良い指摘だ。では、あなたのKubernetesキッチンの絵が頭に描けたとして、最小から最大までの異なるキッチンの役割がKubernetesの概念にどう対応するかを詳しく見ていきましょう。

コンテナ
このパズルの最小の部分はコンテナで、基本的にはどんなソフトウェアのことを指します。例えば、WebアプリケーションをホストするNode.jsのWebサーバーだったり、データを保存するためのMongoDBデータベースのコンテナだったりします (この文章はこのブログを読んでいるエンジニア向けで、ウーバードライバーには言いません 😛)。 キッチンで言えば、前菜としてスープとサラダを出すとしましょう。スープがあなたのコンテナです。サラダもそれ自体がコンテナになります。

今の定義は少し任意的にみえるかもしれませんが、次に説明するコンポーネントを文脈の中で説明するとより意味がわかるようになります。

ポッド
キッチンで言うと、ポッドはスープとサラダを入れる皿やトレイです。Kubernetesにおいて、ポッドは1つ以上のコンテナを持っているものです。これはポッド内のコンテナ同士が互いに通信することができるためです。

エンジニア向けに言うと、例えば私はポッドにWebサーバー用のコンテナとデータベース用のコンテナを持っているとします。それらはlocalhost上で互いに通信することができます。

キッチンに適した例えを持っているわけではありませんが、さもなければ人間びいきされたスープとサラダが話し合いを始めるSausage Partyのようなシーンを想像してください。ただし、前菜皿のスープとサラダは夕食用皿のステーキとポテトとは話せないことに注意してください。なぜなら彼らは異なる皿にいるからです(つまり、異なるポッドは同じネットワーク空間を共有しておらず、そのため互いに通信することはできません)。

マスターノード
キッチン全体を管理・監督する料理長です。これは先ほど話した「コンテナ・オーケストレーション」または「シェフ・オーケストレーション」の概念です。実際の例でこのマスターノードが行うオーケストレーション作業については以下の通りです:

スケーリングとは、CPUの利用状況に基づいて実行中のポッドの数を増減することです。忙しいキッチンでは、顧客の需要が高まった際にシェフたちは料理の提供を増やすために作業を拡大する必要があります。ちなみに、このビジュアライゼーションで注意してほしい点 - あなたは恐らくキッチンが新しいシェフを雇うことを想像していると思いますが、現在のシェフがクローンされるように想像してもらいたいです。スケーリングが起こると、基本的にポッドがコピーされています。

自動デプロイメントとは、アプリケーションの依存関係や実行指示をYAMLファイルに定義し、この設定に基づいてデプロイできるようにすることです。キッチンにおいては、このYAMLファイルが、料理の作り方をシェフに指示する書かれたレシピに相当し、料理を作る際の一貫性と効率性を確保するためのものです。

ロードバランシングとは、ネットワークトラフィックを異なるポッドに振り分けることです。キッチンでは、ロードバランシングが異なるシェフにタスクを割り当てることを意味します。たとえば、デザートステーションのボブがアイスクリームをすくうリクエストであふれていたら、料理長はボブをクローンして、ボブ2.0にボブ1.0からいくつかのアイスクリームの注文を引き受けてもらいます。

また重要な点として:各ワーカーノードには「kubelet」と呼ばれるものがあります。キッチンシナリオでは、「kubelet」はそれぞれのテーブルにいるシェフに相当します。シェフには多くの仕事があり、食事のトレイの準備が正しくできているかを確認したり、材料の準備を手伝ったり、くずを片付けるなどがあります。同様に、「kubelet」はポッド内のコンテナが実行されているかを確認したり、必要な依存関係がインストールされているなどポッドの初期化を手伝ったり、ゴミを回収するなどの役割を果たします。

エンジニアへの追加情報:KubeletはGo言語で書かれたオープンソースの実行可能バイナリ(つまり、CPUが直接実行できる機械コードの命令を含むファイル)です。

ここで一旦止めて、今までに説明したすべてを理解していれば、Kubernetesの基本的なアーキテクチャを理解しているといえます!もうキッチンのイメージに頼りたくない場合、下の図にキッチンの絵をすべて取り除き、Kubernetesの用語だけで置き換えてみました。

ドライバー:実際、これ全部すごく理解しやすいです。Kubernetesが何かはわかるけど、それがどう有用なのかはまだわからないね。つまり、それを持つ意味や学ぶ意味って何?

私:そうですね、パズルの最後の部分は、どのようにKubernetesが使われているかを理解することです。人々はどのようにKubernetesと対話するのか?Kubernetesは技術の世界でどのように役立っているのか?もう一度キッチンの例えに戻って、さらにいくつかの概念を説明しましょう。

  • レストランやフランチャイズのオーナーは、アプリやサービスを構築しているソフトウェア開発者に相当します。マクドナルドでは、フランチャイズのオーナー(名はフランシス・コカドゥードゥーとしましょう)は、各マクドナルドの店舗がどのくらいのお金を稼いでいるかの情報が欲しくて、必要に応じて従業員を解雇・雇用したいです。これを行うために、フランシス・コカドゥードゥーは電話を手に取り、料理長に情報を求めたり命令を出したりするかもしれません。Kubernetesでは、ソフトウェアエンジニアは実際に電話を手に取ってKubernetesクラスタと対話することはできませんが、「マスターノード」には呼び出すことができるAPIサーバがあり、これによってすべてのタスクにアクセスすることができます。例えば、すべてのポッド、ノード、サービスを理解し、健康とメトリクスの情報を理解し、リソースを削除したり作成したりする能力がエンジニアにはあります。

  • レストランで食事をしている顧客は、アプリやサービスのユーザーに相当します。マクドナルドのキッチンが私にビッグマックを提供するのと同じように、SpotifyのKubernetesクラスタは、Webブラウザからたくさんの音楽を聞くサービスを私に提供しています。

この新しい情報を図に取り入れて、下に示しました。あなたがGoogleで「Kubernetesのアーキテクチャ」を検索した時に見る図にとても似ています。

そしてもちろん、基本的なKubernetesのメンタルモデルを形成する上で重要ではないと感じたいくつかの抽象化を私は意図的に説明から省略しました。もっと詳しく知りたいと思ったら、ご自由に調べてください。私自身さらに詳しく調べるにつれて、役立ちそうなリソースへのリンクをこのブログに追加していくかもしれません。

ウーバードライバーとの会話を通じて技術を説明するという語り口を選んだのは、Kubernetesを万人に理解しやすく、アプローチしやすいものにしようとする試みでした。

読んでくれてありがとう!私の書き込み(または私のひどい絵)を改善するための_建設的な_フィードバックがあれば、コメントに残してください。

私と同僚の写真を楽しんでください。#Kubecon 2023に参加したときのです。ちなみに、私が働いている製品を宣伝するためにそこにいました。

興味があればチェックしてみてください。それは古いターミナル(コマンドライン)体験を現代的にアップデートしたもので、あなたをより良い開発者にします。詳細は https://www.warp.dev/ で学ぶことができます。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/therubberduckiee/explaining-kubernetes-to-my-uber-driver-4f60