ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

「コンテナ・ベース・オーケストレーション」を読んだ

はじめに

読んだ。

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

コンテナオーケストレーションツールであるKubernetesを今後使っていくにあたって、全体感が知れそうな雰囲気のある本だったので購入。

コンテナ/Dockerの復習からはじまるので、コンテナ含めて初学者が一気に追いつくのにも優しい本です。

著者がたくさんいて、コンテナオーケストレーションツールもKubernetesそのものについて、Kubernetes on Google Kubernetes Engine、Rancher、Kubernetes on IBM Cloud, Rancher,OpenShiftと多彩です。(なぜかOpenShiftのページ数が非常に多い)

現在デファクトであるKubernetesの説明が多数を占めるとはいえ、自分の好みの環境で動かせばいいと思います。私はGKEで動かしました。

では順に復習していきます。

第1章 コンテナ技術とオーケストレーションを取り巻く動向

この章ではコンテナ技術そのものよりまず、ソフトウェアをどのように利用してきたかを歴史的に振り返っていきます。ハードウェアリソースを所有し、その上でソフトウェアを使ってサービスを提供してきた時代から、インターネットを利用して、現在の多くのas a Serviceのように利用する形態に変わってきました。

仮想化技術が生まれ、ハードウェアリソースはServiceとして利用するようになり、同時にInfrastracture as a Codeの概念も広がりました。自動化、コードによる構成管理ができるようになりました。それでも環境差異を埋めるのが難しい状況は一部で残り、それを解決するのがDockerでした。

Dockerはポータビリティを重視し、開発/本番でも同様に動くことを意識しました。それがDockerHubというDocker Registryであり、加えてユーザーフレンドリーなインターフェースによって、従来からあったコンテナ技術が爆発的に広がりました。

コンテナはLinuxKernel技術の組み合わせです。namespaces / cgroupがその代表でしょう。

コンテナ実装はDockerだけでなく、以前はLXCがよく使われていました。コンテナ実装はCoreOS、rktなど様々なコンテナランタイムが生まれましたが、OCP(OpenContainerProject)が発足し、標準化されました。Dockerの内部で使っていたlibcontainerはrunCという名称に変更するとともに、OCPに寄贈しました。

OCPはOCI(Open Container Initiative)となり、ランタイム仕様やイメージ形式を策定しました。

また、コンテナオーケストレーションも様々な種類が存在しています。

2015年にCNCF(Cloud Native Computing Foundation)が発足しました。乱立するコンテナ/コンテナオーケストレーションを標準化し、Cloud Nativeと呼ばれるアプリケーションを支えるために標準化を推進する団体です。

クラウドベンダもCNCFに加盟し、Kubernetesをサポートする流れができている、という現在までの流れをまとめている章です。その通りかなと思います。

第2章 dockerコンテナの基礎とオーケストレーション

Build, Ship, RunのスローガンのDocker。Webアプリケーションのポータビリティを支え、簡単に、どこでもアプリケーションを実行できるようにしたDockerについて。

Dockerイメージについて。コンテナ作成時に必要となるファイル群の総称であり、読み込み専用(read-only)のテンプレート。イメージという言葉が仮想マシンイメージとどうしてもかぶって誤解されそうなところですね。仮想マシンイメージはLinuxカーネルやシスtメウライブラリを含む。

Dockerイメージの特徴、レイヤの概念。各レイヤはそのレイヤで新たに作成したファイルを持っていて、依存レイヤが見えるようになっている。UnionFSを使っている。

Dockerコンテナの実行とは何か?Dockerイメージに含まれるファイルを使って、Linuxコンテナ状態としてプロセスを起動すること。

あとはセットアップの方法が載っています。

あとはコンテナのリアフサイクルや、orchestration文脈でのDocker Compose。盛りだくさんとは言わないが、さわりを知っているひとには復習になるだろう。Docker Swarmは使ってないので読み飛ばし。

あとはプロジェクトについて。DockerはOCIにlibcontainerを寄贈、runCと改めました。

Docker Engine(dockerd) -> containerd(docker-containerd)->shim->runC->コンテナという関係性で動いてるんですね。

第3章 CaaS(Container as a Service)

CaaSという言葉ははじめて聞きましたが、コンテナ実行環境をサービスとして利用するわけで、つまるところAWS ECSのことかな?と思ったら、ビルド、デプロイ、ランを一連の流れで行うプラットフォームのことを指すそうです。as a Serviceじゃない気がするけど。。。本書ではMesos、Marathonが紹介されてます。サンプルをフォークして試してみました。

github.com

動作確認結果です。

github.com

リッチなGUIですし、コンテナの実行状態を確認できるのはいいなーと思いました。細かい機能までは見切れてないです。コンテナのWebインターフェースへlinkされてるのいいですね。

CaaSの課題としては1クラスタあたりのサイジング、ヘルスチェック、サービスディスカバリ、コネクション数上限、通信トラフィック制御があげられています。これらをクリアしているのがKubernetes、ってつながりになりそうですね。

第4章 Kubernetesによるコンテナオーケストレーション概要

KubernetesはCNCFの最初のプロジェクトなんですね。まぁ、まさにCloud Nativeなアプリケーションのプラットフォームだからか。。。

Kubernetesに関連する以下のプロジェクトの概要は押さえておきたい。

  • パッケージ管理:Helm
  • モニタリング:Prometheus
  • ログコレクタ:Fluentd
  • 分散KVS:etcd
  • コンテナランタイム:containerd、CRI-O
  • サービスメッシュ:Istio、Linkerd、Conduit
  • リソース定義作成支援:Kompose、ksonnet、Kedge

KubernetesのMasterとnodeの役割や、上に乗るコンテナの障害発生時の動き、用語解説。このあたりの用語の整理は「入門Kubernetes」の読書後のブログにまとめようと思う。

入門 Kubernetes

入門 Kubernetes

未だによくわかってないところで、podは生き死にをともにするコンテナの集まりで、1コンテナ1プロセス原則をまもりつつも、localhostで通信できる共同体としての集まりをpodにしている。どういうケースでそれは推奨されるのかが、loggingだったり、サービスメッシュのistioだったり(サイドカーパターン?)ぐらいしか聞いたことがない。

各リソース(オブジェクト?)の記述方法が公式ではちょっとわかりにくいかも?ということで以下のサイトが紹介されてました確かによさそう!全部一通り動かしておきたい。

kubernetesbyexample.com

この章で紹介されてるのを見て「覚える概念多すぎだろ!」と思いました;あとで整理します。。。

章の後半ではminikubeを使ってサンプルアプリケーションを動かす例があります。minikubeも使いましたし、macにはいれてますけど、個人的には最初からGKE等のクラウドを使ってマルチクラスタでやったほうがいいと思いました。GKEは初回だったら1年間、3万円分無料のクレジットがついてきます。本2冊分軽く動かして壊すぐらいなら数百円程度です。

このへんを動かしながら、なんとなく各概念をふわーっとつかめます。実際にwebアプリケーションが動くのは嬉しいですね。

第5章 GKE(Google Kubernetes Engine)

というわけでKubernetesをGKEで動かす例。GKEを使うと得られる恩恵、マスタの管理不要だったり、ノードの増減が可能だったり、リージョナルにノードを配備できたりですね。ローカルでクラスタ作ろうと思うと結構ハマりどころがあったりするんですが、簡単です。ノードのバージョンを自動アップグレードしてくれるのも嬉しい。こればっかりはお金払ってもマネージドを使ったほうがいいと僕は思います。

Kubernetesそのものの説明は4章で行ったので、ここではGKE、無料トライアルのやり方が説明されてます。これを見ながら僕も登録しました。デプロイメントのバージョンアップも軽く行います。この章はGKE + Kubernetesをやるのによかったので、概念をささっとつかみたいひとは、前半部分をさらっと読みつつ、5章でGKEを使ってkubernetesを動かし始めて、そのあと4章で概念を学ぶ。という使い方をすればいいと思いました。

第6章 Rancher

Rancher、軽く動かそうか悩んだのですが、1系と2系で混沌としてそうな時期だったので今回は見送りました。実際数あるコンテナオーケストレーションツールではKibernetes以外だとRancherには注目しています。コミュニティも盛り上がってますし、Kubernetesをオンプレで使うならRancherが良さそうだなーという印象はあります。

2系が安定してからまた試すかもしれません。

第7章 Kubernetes on IBM Cloud Container Service

IBM Cloud上でのKubernetes。Kubernetesそのものの説明は前の章であったので、IBM Cloudを直近では使わないこともありぱらぱらめくって読み飛ばし。

第8、9章 OpenShift

OpenShiftも直近では使わなさそうなので軽くぱらぱら見つつ読み飛ばしました。基本的にはKiubernetesをRedHatがサポートする感じですね。

おわりに

ひととおり章ごとに振り返ってみました。ちょっと誤字があった(2件翔泳社に報告してみた)のと、著者が違うので1冊の本というまとまりはあまり感じられません。ただ、現在コンテナオーケストレーションはKubernetesが強いとはいえ、他のプラットフォームも扱っていること、DockerやCNCFの歴史から丁寧に解説していて、最近のコンテナ界隈の勢いに全然ついていけないが、急に仕事で使うことになった!というひとにはベストの1冊だと思います。(僕も似たようなものですが)

途中でも書きましたが、Kubernetesメインにささっとキャッチしたいというひとは、1章〜3章をささっと読んで、5章でGKEでお試し、そのあと4章でKubernetesの概念を覚えつつ試して、6章以降は興味がある章だけ読んでおくor必要になったら読む、という感じにすればいいと思います。そして入門KubernetesへGoですね。