Dockerを管理するKubernetesの基本的な動作や仕組みとは? Kubernetesを触ってみた。第20回 PaaS勉強会
Kubernetesは、数十から数百といったコンテナからなるアプリケーションのデプロイや管理、死活管理といった運用を支える機能を備えています。主な機能や仕組みを紹介します。
コンテナ型仮想化のDockerを管理するフレームワークとして、Googleがオープンソースとして公開したKubernetesが急速に注目を集めています。KubernetesのプロジェクトにはDocker本体はもちろん、マイクロソフトやレッドハット、IBM、VMwareなどが参加を表明しており、事実上の標準になりそうな勢いです。
Kubernetesはどのような機能を持ち、仕組みはどうなっているのか。有志により都内で開催された「第20回 PaaS勉強会」の草間一人氏のセッション「Kubernetesを触ってみた」の内容をダイジェストで紹介します。
Kubernetesを触ってみた
NTTコミュニケーションズという会社で、Cloudn PaaSというCloud Foundryを使ったクラウドサービスの開発リーダーをしていま草間です。よろしくおねがいします。
タイトルの「Kubernetesを触ってみた」の通り、Kubernetesを使い込んだり実戦投入しているわけではありませんが、触ってみてこんなでした、というのと仕組みなどを調べたので、発表して共有したいなと思っています。
最近Googleが、うちは仮想マシン使ってないから、全部コンテナで動いてるからと言ってましたし、Facebookも仮想化は効率悪いよねと言っていて、僕たちは「まじで?」と反応するわけです。
じゃあ仮想マシンを使わずにどうやってクラウドをやるかというと、コンテナというのがあって、その中でも昨年から流行し始めたのがDockerです。
Dockerが注目されたのは、コンテナでオーバーヘッドが小さいとか一瞬で立ち上がるといった特長の他に、差分ディスクイメージをシェアできたり、自分でさらに付け加えるとか、とても使いやすい。

それからインフラのコード化。Dockerファイルを書けばその通りに構築される。こういうことでコンテナの技術が身近になったと。
Kubernetesの基本的な動作とは
じゃあDockerを使っていこう、というときにつまずくのが運用です。
コンテナを試しに立ち上げる程度ならdocker runコマンドを叩けば上がります。しかし何十何百というコンテナを立ち上げるとすると、どうやってホストにコンテナを配置するのか、稼働しているコンテナをどうやって管理するのか、死活管理はどうするのか、といったことを考えなくてはいけません。
そこでどうするのかというと、Dockerを管理するためのKubernetesという仕組みが発表されましたよと。

Kubernetesのドキュメントによると、Kubernetesはコンテナ化されたアプリケーションのデプロイやメンテナンスを実現し、またスケールさせる仕組みを備えている、ということです。
まずはKubernetesのデモを見てもらいましょう。
Google Compute EngineのうえでKubernetesの環境を構築しました。kubernetes-masterがいて、kubernetes-minionが4つ。見て分かると思いますが、マスターが管理して、それ以外がDockerが動くノードにあたるものです。

/cluster/kubecfg.shというのがkubernetesでいちばんよく使うコマンドです。-pで8080:80でポートフォワードして、runというコマンドをつけて、そのあとはDocker Hubのリポジトリを示していて、1は起動するコンテナの数、helloworldはアプリケーションの名前です。

これを実行すると、おっとエラーになりました。already_existsって言われたので、さっき試して実行したものが残ってましたね。ま、実行したと思ってください。
Webブラウザから8080ポートにアクセスしてみると、Hello Worldが立ち上がってますね。

これがKubernetesの基本的なデモです。
複雑な構成をJSONファイルで設定
先ほどはコマンドラインから、アプリケーションを取得するDocker Hubのリポジトリやポートの指定などを行いましたが、JSONファイルで設定しておくこともできます。
ここではキーバリューストアのRedisのDockerイメージを取得して6379ポートで走らせて、redis-masterというラベルを付けて、といった指定をしています。
これはredis-masterのJSONファイルで、ほかにもredis-slave用、フロントエンド用のPHPアプリケーションのJSONファイルなどがあって、それぞれをさっきのkubercfg.shに-cオプションでファイル名を渡すと実行できます。

実際に実行させると時間がかかるので、ここでは実行されたと思って、あらかじめ用意していた環境を見てください。Webブラウザからアクセスできるようになっています。

これはPHPとRedisで構成されているデモアプリの「Guestbook」です。コメントを書き込むとRedisに保存されると。
フロントエンドのコンテナは3つ、Redisのマスターが1つ、Redisのスレーブが2つ、という構成をKubernetesで作りました。

Kubernetesの仕組みを知るための4つのキーワード
Kubernetesの仕組みを知るために4つの言葉を理解してください。

「Pod」というのはコンテナの集まりです。今回のデモでは1Podで1コンテナしかあげていませんが、Podには複数のコンテナをまとめられます。
Pod内のコンテナは必ず同じホストにデプロイされます。ストレージやIPアドレスなど、複数のコンテナで共有しなければならないリソースがあるときに、1つのPodとして定義しておくと同一ホスト上でまとめられるわけです。
「Label」は、イメージするとおりPodにラベルを付けることができます。文字列なら何でもいいので、ProductionとかDevelopmentとかStagingとか、FrontendとかBackendとか。コンテナには複数ラベルが付けられるので、Production、Backendといったラベルを1つのコンテナに付けて分かりやすくできます。
「Replication Controllers」は何かというと、Podのテンプレートから指定された数のレプリカを作成して維持する仕組みです。起動中のPodの監視をしていて何らかの原因でPodが減ったり増えたりしたら、元の数に戻すようにしてくれます。
今回のデモでは、3つのフロントエンド、2つのRedisスレーブなどはこれで管理されています。
「Service」は、L3で動くプロキシみたいなものです。今回のデモでは、2つのRedisスレーブはポート6379で立ち上がっているので、その手前にRedis Slave Serviceをポート10000で立ち上げて、ここにフロントエンドからアクセスするとRedisスレーブに配分されるという動作になっています。負荷分散に便利、という感じです。

KubernetesはPaaSではない
さて、KubernetesはPaaSなのかと言えば、そうではありません。例えばこのコンテナはどのユーザーのものかといったユーザー管理の仕組みやログ収集の仕組みもないですし。だからKubernetesはPaaSではなく、あくまでもスケジューラです、という位置づけにいまのところはなっているようです。
いまKubernetesのような仕組みを下図にあるようないろんなところが提供しようとしています。ただし点線から右側はKubernetesに協力していきますと表明しています。

会場から質問 PHPからRedisにつなぐところはどう設定しているの?
いい質問で、実際にコードを見せます。これがPHPのコードなのですが、環境変数で渡しています。Dockerのコンテナのリンクという機能を使われた方は分かると思いますが、これはその仕組みを使っているらしいです。

草間氏は本セッションの続きとして、ブログで「Kubernetesの中身を追おう その1」を書いています。
あわせて読みたい
マイクロソフト、クラウドのプロセッサをAMDからXeonへ切り替えか。従来より60%高速なプロセッサとSSDを搭載した新インスタンス「D-Series」が利用可能に
≪前の記事
クラウド市場で過去最大規模の買収。欧SAPがSaaS大手のコンカーを買収、クラウドサービスを強化