入門Kubernetes 読んだ
最近、Kubernetes(k8s)盛り上がってますね。
KubernetesといえばMicroservice、というイメージでしたが、 意外と機械学習系のプロダクト開発と相性がいいのではないかと思うようになり、 しっかり勉強することにしました。
Kubernetes + 機械学習といえば、メルカリさんは MLOps として、すでにプロダクトに組み込んでいるそうですね。
学習データやパラメータに依存性がある機械学習システムって単に学習・推論コードをVersioningするだけでは不十分なので、まるっと コンテナで管理できる世界にできたらいいな、なんて妄想しています。
Oreilly「入門 Kubernetes」について
原書は「Kubernetes: Up and Running」
で、元々GoogleのKubernetesチームで働いていた方によるものです。 原書の発行が2017/09で、日本語版が2018/03なので、非常に早く翻訳版が出たように思います。感謝。
内容については、全般に渡りチュートリアルの形式をとっており、自分でKubernetesクラスタを作りながら学んでいく形式です。 ちなみにコードやコンテナイメージは https://github.com/kubernetes-up-and-running に公開されています。
構成
本書は以下のような構成になっています。
- 1章: Kubernetes入門
- なぜKubernetesを使うのか、利点など
- 2章: コンテナの作成と起動
- Dockerの説明。Dockerを知っている人なら読み飛ばせます
- 3章: Kubernetesクラスタのデプロイ
- 4章: よく使う kubectlコマンド
- ほぼすべての操作はkubectl経由で行うのでしっかり読んでおくとよいです。
- 5章~13章:
- 一通りKubernetesの機能の説明
- 14章: 実用的なアプリケーションのデプロイ
- さっと読んだだけ。実際のアプリケーションを例に設計の考え方が書かれています。
一通り読んでみて、Kubernetesの大まかな機能を把握できました。
チュートリアル形式なので、1からやっていけばKubernetesの何が良くて、どのように構成されているのか理解できます。
Kubernetes公式ドキュメントと併読するのがおすすめ
難点というか、チュートリアル形式であるため、どうしても個々の機能/用語の解説が簡素というか分かりづらい部分はありますね。 たとえば3章の段階でひとまずクラスタを作るのですが、ちょくちょくまだ説明されていない単語が出てきて困惑します。
また用語の説明もたまに分かりづらいものがあり、例えば4章の冒頭でNamespaceの説明があるのですが、
Kubernetes は、クラスタ内のオブジェクトを構造化するために、Namespaceを 使います。各 Namespace は、オブジェクトの集まりを入れるフォルダだと考えれば よいでしょう。
うーん、初学者には何がなんだかわかりませんでした。。
公式ドキュメントを見ると、
Kubernetes supports multiple virtual clusters backed by the same physical cluster. These virtual clusters are called namespaces.
(https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ ) とあり、1つの物理クラスタを仮想クラスタで分割するための仕組みであることがスッと理解できました。
その他でいうとVolumeとPersistentVolume(PV)が別々の章で説明されており、それぞれがお互いどう関係しているのか?PVはVolumeの一種なのか? よくわからず、公式ドキュメントで補完しました。
とはいえ、公式ドキュメントは最初から読むには体系化されすぎていて逆につらいと思うので、この本を読みつつ、詰まったら公式ドキュメントを参照する、というやり方が近道だと思います。
あと面白いのが、Raspberry Pi上でKubernetesクラスタを構築する方法が付録で解説されているところですね。 なぜRaspberry Pi上なんでしょう(笑) とはいえ、クラウドを使わなくとも低スペックのマシンでクラスタオペレーションが試せるのは自習としてとてもよいですね。
読んでみて、今後
機械学習系以外でも、最近βで発表されたGoogle Cloud ComposerなんかはマネージドAirflowなわけですが、 バックエンドはKubernetes(GKE)で動いているようです。
オートスケールや耐障害性なんかの特性はすべてKubernetesにおまかせしちゃって、 機能単位でコンテナクラスタにデプロイしてしまえば、いろんなコンポーネントの運用がかなり楽になりそうで、応用範囲めちゃ広いと思いました。
次は実際のシステム構築をやりつつ、もう少しベストプラクティス的な内容を見ていこうと思います。