良い子のためのKubernetesガイド

![page1 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/6c9f4564-4f8b-d7ef-5408-e197971e8416.jpeg)


## この記事について

Kubernetesの良さをたくさんの人に知って貰いたいと思い、
The Illustrated Children’s Guide to Kubernetes
https://www.cncf.io/phippy/
を日本語に翻訳してみました。

Kubernetesの主要サービスを絵本の物語を通して理解できる構成になっています。

Kubernetesでできることがザックリと分かって頂けると嬉しいです
かなり意訳している部分もあり、不適切な表現あった場合ご指摘頂けると助かります。

## まず初めに

![page1.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/c9348139-7ec5-1bdd-fbcd-332c041e82b2.jpeg)


ある日、オフィスで娘とこんなやりとりがありました。

娘「Kubernetesってなにー？」

父「Kubernetesは、Dockerコンテナ群をオーケストレーションするためのオープンソースのシステムだよ。クラスタリングされたコンピューター内のノード群のスケジューリング、ワークロードの動的管理、ユーザーが定義した状態の共有と管理などをLabelやPodといった概念によって論理的なグループを構成することで、管理や発見を容易に実現しているんだ」

娘「(ﾟДﾟ)ﾊｧ??????」

それでは良い子のためのKubernetesガイドの始まりです:clap:

## The Environment

![page3.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/cbecdf4d-5cb7-16cb-bec9-9fc2570ca9ef.jpeg)
むかーしむかし、あるところにフィッピーという名前のアプリケーションがいました。
フィッピーはとてもシンプルなアプリケーションでした。
PHPで書かれた、たった１ページだけのファイルです。
フィッピーはホスティングプロバイダーに住んでいて、周りには恐ろしいアプリケーション達がたくさんいました。
得体も知れず、仲良く出来そうにもありません。

フィッピーはいつの日か、自分自身の環境を手に入れたいと願っていました。
自分の家だと言えるようなwebサーバーを。。。

![diagram2.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/d2a9ea4a-9d45-fcf6-2376-67f39de18b81.jpeg)
アプリケーションには実行するための環境が必要です。
PHPアプリケーションの場合、webサーバー、読み取り可能なファイルシステム、そしてPHPエンジン自身が含まれるでしょう。

## The Containers
![page4.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/285ee16d-d2b5-1e90-40d0-601b424f4433.jpeg)
ある日、親切なクジラさんがやって来て言いました。
「小さなフィッピーはコンテナの中に住む方が幸せになれるよ！」
フィッピーは早速引越しました。
確かにコンテナはとても素敵でした。
ですが、それは大海原にリビングルームが浮いてるようなことでもあるのです。

![diagram3.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/b7771cfe-e592-913a-a07a-55567820f0f1.jpeg)
コンテナはアプリケーションにその環境と一緒に実行できる独立した環境を提供します。
しかしこれらの独立したコンテナは管理が必要で、外の世界との接続も必要になります。
他にも共有ファイルシステム、ネットワーキング、ロードバランシング、ディストリビューションなどやることが山のようにあるのです。
（Dockerコンテナはホスト間でのコンテナのやりとりは出来ますが、外部とのやりとりにはNATが必要だったりします。連携の管理が大変で、スケールしにくいところがあります。）

## Kubernetes
![page5.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/0621b5db-a9f1-69ea-43a1-cca6d1a53d79.jpeg)
クジラさんは肩をすくめました。
「ごめんね、おちびさん」と言って
海の中へと消えて行ってしまいました。。。

ですが、フィッピーはがっかりする間もありませんでした。
水平線の向こうから大きな船がやって来たのです。
船はたくさんのボートが紐で結ばれてできていましたが、とても大きな一隻の船に見えました。

「こんにちは！僕の名前はキャプテンクビィーだよ！」
賢いお爺さんキャプテンは言いました。

![diagram4.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/c7684132-9a21-e015-a95a-d8fbf0ae1d06.jpeg)
“Kubernetes” はギリシャ語で船の船長という意味があります。
"Cybernetic(人工頭脳の〜)"や"Gubernatorial(知事)"もKubernetesに由来しています。
Googleを筆頭に、Kubernetesプロジェクトは数千ものコンテナを本番環境で運用するための堅牢なプラットフォームの構築に重きを置いています。

## Kubernetes Uses Labels

![page6.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/f5040d49-31a7-ecef-b45e-48186ac8d122.jpeg)
「私はフィッピー」小さなアプリケーションは言いました。
「お近づきのしるしに、」と言って、キャプテンはフィッピーにネームタグをピタリ、と付けてあげました。

![diagram5.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/c4d253c2-3e82-6b48-71c6-1ae5d17795e6.jpeg)
Kubernetesでは"ネームタグ"のようなラベルを、識別のために使用することが出来ます。
また、それらのラベルに基づきクエリーを発行することも出来ます。
ラベルは変更可能で自由に使え、役割や安定性、その他の重要な特性などを表すことが出来ます。

## Pods
![page7.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/9cdfed70-d376-82b9-c9e8-0725500bfbf9.jpeg)
クビィー船長はフィッピーにコンテナを船内のポッド（Pod）に引っ越した方がいいかも知れないと提案しました。
フィッピーは喜んでコンテナを大きな船内のポッドの中に引っ越しました。
そこはまるで家のようでした。

![diagram6.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/4ee03ecc-3e45-13b2-92ce-24550c9a2b34.jpeg)
Kubernetesでは、Podは実行可能な作業単位を表します。
通常は、Pod内のコンテナは１つですが、密接に紐付いたコンテナ群がある場合、複数のコンテナを同じPod内で実行することも出来ます。
KubernetesはPodとネットワークの接続を行ったり、環境の停止も行えます。
（KubernetesではコンテナではなくPodが最小のデプロイ単位です。
Podはクジラの群という意味があるそうです。）

## ReplicaSets
![page8.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/e4e5f2d2-4736-744a-2482-eedcfb82d547.jpeg)
フィッピーにはちょっと変わった趣味がありました。
遺伝子学や羊がとても大好きだったのです。
フィッピーは船長にこんなことを頼んでみました。
「もしも自分自身のクローンが作れたら、、、欲しい時に、、、何回でも、、、」

「あー、、、、、簡単なことだよ！」と言って船長はフィッピーにレプリカセット（ReplicaSets）の説明をしてあげました。

![diagram7.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/21de655e-c608-85a7-2c55-73e5637b027f.jpeg)
ReplicaSetsは任意の数のPodを管理します。
ReplicaSetsには何度でも複製可能なPodテンプレートが含まれ、
スケールアップ、スケールダウン、継続的デプロイ、監視などのPodのライフサイクルを管理することが出来ます。
（この物語では登場しませんが、KubernetesにはReplicaSetsを管理するためのDeploymentという機能が存在します。具体的にはDeploymentはReplicaSetsのバージョンを管理することが出来ます。これによって簡単に環境のロールバックが出来たりします。）

## Services
![page9.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/37584395-819d-d99e-1571-798595d60bb9.jpeg)
来る日も来る日もフィッピーはPodの中で自身のレプリカ達と幸せな日々をおくりました。
ですが、例えどんなに自分自身のコピーが沢山いたとしても、自分自身しかいない集団は大したものではありません。
クビィー船長は微笑みながら言いました。「いいものがあるよ。」

クビィー船長が言い終わらないうちに、フィッピーのレプリケーションコントローラーと他の部屋を繋ぐ通路が現れました。
クビィー船長は大きな声で笑いながら、「フィッピーのクローンが出入りしてもこの通路は無くならないから君は他のPodを探しに行くことができるし、他のPodからも君を見つけることができるよ」と言いました。


![diagram8.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/bda59624-2a0e-64a9-b4ec-977bdd7578e0.jpeg)
Serviceは、そのアプリケーションがどんなサービスを提供してるか他のKubernetes環境（ポッドやレプリケーションコントローラを含む）に教えることが出来ます。
Podが行ったり来たりしても、サービスのIPアドレスとポート番号は同じままです。
そして他のアプリケーションはservice discoveryを通してそのサービスを探すことが出来ます。
（名前でアクセスできるエンドポイントです。Kubernetesは同時に沢山のサービスを提供することが可能ですが、特定のサービスを見つけるのが大変です。それを解決するのがこのServiceという機能です。）

## Volumes
![page10.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/29fc076b-ee68-5ded-2047-6ec3655c1743.jpeg)
Servicesのおかげで、フィッピーは船内を探検し始めました。
まもなくしてフィッピーはゴールディに出会い、二人は友達になりました。
ある日、ゴールディは特別なことをしました。
ゴールディがフィッピーにプレゼントをあげたのです。ですがフィッピーはそれを見て悲しくなり泣き出してしまいました。


「どうしてそんなに悲しんでいるの？」とゴールディはフィッピーに尋ねました。
「プレゼントはとっても嬉しいんだけど、保管しておく場所がないの」と泣きながらフィッピーは答えました。
ですがゴールディはこんな時にどうしたらいいのか知っていたのです。
「どうしてボリューム（Volume）に保存しておかないの？」

![diagram9.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/c1511ec0-bf63-f139-5bec-a15deccbbbb1.jpeg)
Volumeはコンテナがアクセス出来て情報を保存しておくことができる場所を提供します。
アプリケーションからは、Volumeはローカルファイルシステムの一部の様に見えますが、
ローカルストレージ、Ceph、Gluster、Elastic Block Storage、などのバックエンドストレージサービスの支援もしています。

## Namespaces
![page11.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/feb8d49c-6a0a-9f94-f27d-e47465def21d.jpeg)
フィッピーはクビィー船長の船での人生にとても満足し、仲間達と楽しく暮らしていました。
（ゴールディのクローン達も同じ様に大切でした。）
ですが、恐ろしかったホスティングプロバイダーでの日々を思い返してみると、
あの時の様に少しだけのプライバシーなら持てるのではないだろうかと思いました。
「フィッピーに必要なのこと」とクビィー船長は言いながら「それはネームスペースだ」と続けました。

![diagram10.jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/2aff8cf6-e10b-0af4-8e80-00026bf3e3e5.jpeg)
ネームスペースはKubernetes内の環境をグルーピングするための機能です。
Services、pods、replication controllers、volumesはネームスペース内で簡単に連携することが出来ますが、しかし、ネームスペースはクラスタの他の部分からある程度の分離させることが出来ます。

## End
![page12 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/243614/9a109c9a-9532-0ce8-ec40-2b84f6b7599e.jpeg)
フィッピーは新しい仲間達やクビィー船長と共に大海原を航海しました。
フィッピーは大冒険をたくさんしましたが、一番大切なことは、フィッピーは安心できる場所を見つけた。という事です。

めでたしーめでたしー:clap:

## 最後に、、、

有益な情報を日々twitterで発信しています！
もしよろしければ見て下さい！！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">256人彼女が欲しい</p>&mdash; ぐしゃ@ フリーランスクラウドエンジニア (@gusya_the_fool) <a href="https://twitter.com/gusya_the_fool/status/1246020146440720385?ref_src=twsrc%5Etfw">April 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
## 追記

絵本だけでの説明だと不足しているので、わたくしなりの解説を入れてみました。。。
かっこで括ってあるやつがそうです。