数多く台頭しているDockerの運用管理に関する製品/サービスの特長、使い方を徹底解説する特集。今回は、グーグルが主導で開発しているOSSであるKubernetes、flannel、cAdvisorの概要や主な機能、環境構築方法、使い方について。
数多く台頭しているDockerの運用管理に関する製品/サービスの特長、使い方を徹底解説する本特集「Docker運用管理製品/サービス大全」。今回は、グーグルが主導で開発しているKubernetes、flannel、cAdvisorの概要と使い方を解説します。
内容は、2015年6月の記事執筆時のもので、対象ソフトウエアのバージョンは下記です。前回も触れましたが、それぞれの役割と共に記載しておきます。全てOSS(オープンソースソフトウエア)です。なお環境構築手順の紹介で扱うDocker自体のバージョンは1.6を使っています。
なお、次回紹介する「Google Container Engine(GKE)」はKubernetesの管理サービスです。
Kubernetesはグーグルが提供するDockerのコンテナー管理フレームワークです。Docker Engineが動作するホストを用意する必要があり、そのホストにKubernetesをインストールしてDockerのクラスター環境を構築します。
Kubernetesはデプロイメント、メンテナンス、アプリケーションのスケーリングの基本機能を提供します。内部的にはGo言語(golang)+シェルスクリプトでできているようです。
Kubernetesの構成概要を下に記します。
KubernetesはDocker、etcd、flannelと連携して複数ホスト間のコンテナーアプリケーション管理を実現します。
etcdは設定情報共有とサービス検出のための分散KVSです。Master(後述)の情報を永続化するために使用されます。MasterもMinion(後述)も、このetcdに接続されており、「watch」機能を利用して設定情報が全ノードに速やかに反映されます。Kubernetesはetcdをノード(Minion)の管理に使用して、flannelは各ホストのDockerホストのIPアドレス帯の管理に使用します。なおetcdは、Go言語で書かれています。
etcdを起動するとクライアント受付用のポート(-addr、default:4001)、etcd同士のコミュニケーション用のポート(-peer-addr、default:7001)の2種類を待ち受けます。
後述の「Kubernetesの作成手順(ホスト間連携)」ではMinionがMasterのetcdに接続します。
Kubernetesの構成を下記に整理します。
KubernetesではDockerコンテナーを「Pod」という単位でまとめています。ストレージやIPアドレスなど、複数のコンテナーで共有しなければならないリソースがあるときに、1つのPodで定義します。Pod内のコンテナーは必ず同じホストにデプロイされます。
MasterはKubernetesクラスターをコントロールするプロセス群です。コンテナー数が増えればMinionを増やせばよく、APIが忙しくなってきたらMasterを増やすイメージです。
なおKubernetesの機能では、Masterの多重化はできません。ただし、情報の保存場所であるetcdは複数のMasterからアクセス可能なので、あらかじめMasterのホストを複数作っておくことは可能です。
kube-apiserver、kube-schedulerで構成されており、Kubernetesの3つのオブジェクト(Pod、Service、ReplicationController)に対するRESTでの操作を受け付けてetcdに保存します。それと、Minionに対するPodのスケジューリングと、Podの情報(PodがどのMinionにいるか、どのポートをEXPOSEしているか)とService設定を同期します。
kubecfg/kubectlコマンドは、ここのRESTを実行するものです。
未スケジュールのPodをMinionに配置します。
Podの多重度を設定し継続的に監視調節します。自動でPodの数を削除したたり立ち上げたりして調節します。
etcdにあるReplicationControllerオブジェクトを監視(watch)して、変化があったらKubernetes APIを叩いてReplicationを発動させます。
Minionは、Dockerコンテナーが配置、実行されるWorkerノードです。Minionの中では、Docker、Kubelet、Kubernetes Proxyが動いています。
Minionをコントールするエージェントです。MasterのAPIサーバーから情報を受け取りcontainer manifest(コンテナーマニフェスト)に従いコンテナーを起動します。
Serviceで設定された通りに、TCPとUDPをPodに転送するためのネットワークプロキシです。
Podの通信のエンドポイントを既定します。ServiceはDocker空間のIPとポートを持っており、PodはServiceにアクセスすることでPod間の通信を可能にします。また、Serviceはロードバランサーの機能を持っており、リクエストをレプリケーションされているPodに振り分けます。
ただし、Serviceが持つIPはDockerのIP空間内のため外部(インターネットなど)からアクセスすることはできません。バージョン 1.0ではServiceが外部のIPからの受け口を持つことができるようになるようです。「NodePort」と「LoadBalancer」の2種類の機能が提供されます。
NodePortは、ホストのPortとリンクさせる方法です。Dockerのexpose設定と同じ振る舞いになります。LoadBalancerは外部のロードバランサーのIPアドレスを指定して、そこからの通信を受け取る設定になるようです。ただし、この場合は外部のロードバランサーが必須になります(Kubernetesでは、この外部のロードバランサーは提供しません)。
Serviceの実行環境としては、各ホストで動作しています。Masterを停止させた状態でMinionの動作を見てみたところ、MinionのPodは正常に動作していました。MinionのPodはService経由でデータを渡しているため、各MinionにServiceが存在します。
Copyright © ITmedia, Inc. All Rights Reserved.