UZABASE Tech Blog

株式会社ユーザベースの技術チームブログです。 主に週次の持ち回りLTやセミナー・イベント情報について書きます。

Dockerコンテナを管理するならKubernetes

f:id:uzabase:20150212193607p:plain

SPEEDA開発チームの山岸です。

最近注目を集めているDockerですが、ユーザベースでも一部のチームで開発に役立てています。そのDockerのコンテナを管理するための「Kubernetes」というオープンソースのフレームワークがあります。
今回は社内のLTの内容を基に、Kubernetesについて簡単にご紹介したいと思います。

Kubernetes とはなにか?

KubernetesとはGoogleがオープンソースで公開した、Dockerコンテナのオーケストレーション及び管理するためのフレームワークです。
Googleがこれまでサービスをコンテナで運用してきた経験を元に作られており、様々なベンダーが支持を表明しています。
Google Compute Engine、Microsoft Azure、Vagrant、CoreOSなどの様々な環境で使うことができます。

なぜ Kubernetes か?

Dockerによって、以下のメリットがもたらされるようになりました。

・信頼性の高いデプロイ
・ポータビリティ
・より簡単な構築と管理

これにより、1つのアプリケーションコンポーネントの再配置が容易に行えるようになりました。

しかし、実際の運用では複数のアプリケーションコンポーネントを連携させて、一つのサービスとして提供する必要性が出てきます。特にマイクロサービス的なサービスの構築にはこのようなアプローチが重要となります。

コンテナ同士の連携を行うためには、以下のような解決しなければならない問題が出てきます。

・コンテナ間の通信をどのように行うのか?
・ホストが異なる場合のコンテナ間の通信をどのように行うのか?
・通信先のコンテナが障害により落ちた場合にどう対応するのか?
・各コンテナへのアクセスをどう分配するのか?

f:id:uzabase:20150212195621p:plain

こういった問題は、コンテナをクラスタとして統合し、管理することでうまく解決できます。
それを行ってくれるのが、Kubernetesです。

Kubernetes でできること

Kubernetesでできることは大きく分けて3つあります。
それぞれ簡単にご紹介します。

①コンテナを簡単に展開できる

まずはじめに、KubernetesはKubernetes Masterという全体を管理するためのサービスをまとめたノードと、 それによって管理されるコンテナをまとめたminionというノードがあります。

Kubernetesでは、minion上にグループ化したコンテナをPodという単位で構築、管理します。
このPodにより、密結合したコンテナの集合を扱いやすくなります。
重要な点として、そのコンテナの集合は必ず同一ホスト上に存在しています。そして、同じマシンリソースを共有しています。

YAMLまたはJSONフォーマットでPodの定義を設定ファイルで保存し、Kubernetes Master上のAPIに対してコマンドを実行することでPodを作成、構築することができます。

また、Labelをコンテナに付けて管理することができます。

f:id:uzabase:20150210032530p:plain

このLabelにより、コンテナを種類ごとに分類することでコンテナのグループを抽象化して、デプロイするコンテナを管理しやすくできます。

②コンテナの状態をチェックできる

Replication Controllerにより指定された数だけPodのReplicaを作成できます。
また、Replication Controllerはコンテナを死活監視し、障害により落ちた場合に自動起動します。
この仕組みにより常に指定した数のコンテナが保たれるようになり、Podの並列数を管理することができます。

f:id:uzabase:20150210033023p:plain

③コンテナへのアクセスを分配できる

Servicesにより、設定したPodにアクセスをラウンドロビンで分配することができます。
これは複数のコンテナで構成されるロードバランサのようなものです。
これによりサービスを使う側は特定のIPやポートのみ知っていればよく、コンテナの存在を意識させないようにできます。

どのように実現しているか

上記のようなことをどのように実現しているかKubernetesの全体像を示しつつご説明します。

f:id:uzabase:20150211091900p:plain

Kubernetesの中心にはetcdという分散Key-Valueストアがおり、各ノード上のサービスがetcdの設定を常に監視しています。
何か変更が生じた場合には、etcdに対してその内容を書き込みます。そうすると協調して処理を行わなければならない別のノードのサービスがその内容を元に処理を行うといった具合です。
例えば、Replication Controllerにおけるコンテナの並列数の管理も、この仕組みの上に成り立っています。

詳しい内容は、KubernetesのGithubのKubernetes Design Overviewにまとまっております。

まとめ

Googleが長年社内で培ってきたコンテナ運用の経験が活かされていると感じます。
似たようなことを行えるフレームワークも存在しますが、まだどれも若いステージにいる状況だと思います。
しかし、今後はDockerなどのコンテナ技術を中心としたサービスの構築が伸びていくと思うので、こういったフレームワークには将来性を感じます。

ユーザベースでは、新しい技術に興味を持ち、共により良いシステムを作っていける仲間を募集しています。 興味を持った方は是非、Wantedlyをご覧ください。