現在位置: ホーム / ゲストブログ / [第6回]Linux/OSS エヴァンジェリスト古賀政純の ”旬”のオープンソースソフトウェア~Docker管理ソフトウェアのKubernetesの概要を理解する(後編)~

[第6回]Linux/OSS エヴァンジェリスト古賀政純の ”旬”のオープンソースソフトウェア~Docker管理ソフトウェアのKubernetesの概要を理解する(後編)~

今回のゲストブログは、日本ヒューレット・パッカードが公式に認定するオープンソース・Linuxテクノロジーエバンジェリストの古賀政純さんです。連載5回と第6回に分けて、『Docker管理ソフトウェアのKubernetesの概要を理解する』と題して、Docker環境の管理ツールとして注目を浴びるKubernetes(クーバネティス)を紹介しています。Kubernetesは、コンテナのオーケストレーションを行い、オンプレミスのベアメタル(物理サーバー)環境やハイパーバイザー型の仮想化環境で稼動するDockerコンテナの実行だけでなく、クラウド環境での稼動もサポートしています。後編では、Kubernetesの具体的なコンポーネントを説明します。あまり聞きなれない言葉や概念もあるのため、理解しづらいかもしれませんが、一つずつ見ていきましょう。(2016年1月27日)

Docker管理ソフトウェアのKubernetesの概要を理解する(後編)

クラスター、マスター、ノード

Kubernetesにおいて、「クラスター」という言葉がでてきます。クラスターというと、HAクラスターや、NoSQLクラスター、HPCクラスターなどを思い浮かべる方もいるかもしれませんが、Kubernetesにおいて、クラスターとは、コンテナが稼動する基盤のコンピューターのリソース(計算資源とも言います)の集まりを意味します。このクラスターは、おもに、マスターとノード(管理対象ノード)に分かれます。

 

 


マスターは、クラスター全体を管理するホストであり、ノードは、コンテナが稼動するホストです。Minionとも呼ばれます。このノードは、物理サーバーで稼動するDocker環境、または、ハイパーバイザー型の仮想化環境で稼動するDocker環境です。クラスターに所属するノードは、通常複数です。

複数ノードで稼動するDockerコンテナを効率よく管理するのが、Kubernetesの大きな役割となります。マスターにおける「kube-」ではじまるものは、Kubernetesで必要なサービスですが、etcdは、Kubernetes環境に限ったものではありません。

このetcdは、CoreOSプロジェクトにおいて開発が続けられている分散KVS(キーバリューストア)です。etcdは、その名のとおり、キーと値を対にしてデータを保持します。データの保持や読み出しは、HTTP経由で行うことができます。このetcdには、Kubernetesノードで稼動するflannelサービスが形成するオーバレイネットワークの情報(IPアドレスやサブネット情報など)を保持します。

flannelは、マルチホスト環境において、Dockerコンテナ同士が通信するネットワーク経路を提供します。いわゆるソフトウェア定義型ネットワークを実現するためのコンポーネントで、オーバレイネットワークを形成するノードで稼動している必要があります。flannelで提供されるネットワークは、既存のネットワークに新たに論理的なコンテナ専用のネットワークを作成します。

flannelオーバレイネットワークの情報は、Kubernetesのマスターで稼働する分散KVSのetcdに情報を保持しますので、Kubernetesの環境に限らず、etcdとflannelは、一般的にセットで利用されます。flannelオーバレイネットワークは、Kubernetesで自動的に作成されるわけではありませんので、etcdとflannelは、事前に、手動で構築しておく必要があります。

flannelのネットワーク構成としては、各ノードでサブネット(例:10.0.0.0/24など)を作成します、このサブネットは、普段使用するDockerコンテナ用の仮想ブリッジインタフェースdocker0とは異なるサブネットを割り当てる必要があります。このサブネットにおいて、仮想的なインタフェースflannel.1を使って、ノード間通信に利用します。VXLANにより、flannel.1上を流れる通信パケットは、カプセル化されて伝送されます。

guest-blog-20160105_2_1_KubernetesクラスタによるマルチホストDocker環境の管理 

図1. KubernetesクラスターによるマルチホストDocker環境の管理

 

Pods

管理対象のノード上で稼働する複数のアプリケーション(コンテナ)をひとまとめにしたものは、Pod(ポッド)と呼ばれます。Kubernetesの世界において、一般的に複数のコンテナが稼動するPodは、「蜜結合したコンテナやボリュームが集まったもの」と言えます。Kubernetesは、このPodという単位でアプリケーションの管理(コンテナの起動・停止等)を行います。

複数のコンテナで、単一の仮想IPアドレスを持つ場合などに、Podが利用されます。たとえば、ブログを提供するオープンソースのWordPressが稼動するコンテナとWebコンテンツを保持するデータベースソフトウェアのMariaDBコンテナを1つのPodに所属させ、そのPod単位で管理することが可能となります。

もちろん、複数ではなく、単一のコンテナのみを含むPodを作成し、管理することも可能です。Dockerにおいて、コンテナは、プライベートIPアドレスが割り当てられますが、KubernetesにおけるPodは、NATを利用することなく、ノードをまたいで、お互いが通信できます。

クラウド環境においては、ユーザーに提供するサービス用のネットワークをPodが提供でき、ポート番号等の変換などの、いわゆる「ブローカリング」も不要です。Pod内の複数のコンテナでは、名前空間が共有されます。複数のコンテナ間で共有されるものとしては、PID名前空間、UTS名前空間(ホスト名)、ネットワーク(IPアドレス、ポート番号等)名前空間、IPC名前空間があげられます。

 guest-blog-20160105_2_2_Pod

図2. Pod

 

Replication Controller

Podの複製を維持し、Podのライフサイクルを管理します。Podの複製(レプリカといいます)を作成し、コンテナで稼動するサービスの可用性を向上させることが可能です。たとえば、Webサービスを提供するNginxが稼動するPodを複数起動し、大量のトラフィックに耐えられるように、負荷分散させる場合に必要となります。

Replication Controllerは、現在の状態を監視するため、プロセス管理におけるスーパーバイザーのような役割を果たします。テンプレートからのPodの複製、自動回復など、Podに関する様々な制御を行います。Kubernetesのスケジューラは、起動するPodを自動的にノードに割り当てます。起動するPodの数は、いつでも変更することが可能です。

このため、負荷状況に応じて、自動的にスケールさせることも仕組みの上では可能です。さらに、Pod自体に障害が発生した場合には、新規にPodを自動的に起動させることも可能です。Podは、それ単体でも起動させることが可能ですが、Replication Controller経由で稼動させることも可能です。

ただし、Replication Controller経由せずに、Pod単体で直接稼動させた場合は、スケールさせることができませんので、注意が必要です。

Replication Controllerについては、以下のURLが参考になります。英語ですが、一読することをお勧めします。
http://kubernetes.io/v1.0/docs/user-guide/replication-controller.html

 

guest-blog-20160105_2_3_Replication ControllerによるPodの複製

図3. Replication ControllerによるPodの複製

guest-blog-20160105_2_4_Replication Controllerによる再スケジューリング

図4. Replication Controllerによる再スケジューリング


guest-blog-20160105_2_5_Replication ControllerによるPodのスケール

図5. Replication ControllerによるPodのスケール


Services

Serviceを定義すると、Podに対して、IPアドレスやポート番号が付与されます。これにより、そのPodが提供するサービスにユーザーが外部からアクセスすることができます。外部からユーザーがアクセス可能なIPアドレスは、サービス用のIPアドレス、または、パブリックIPアドレスと呼ばれます。

HAクラスターシステムにおいても、サービスに対して仮想的なIPアドレスを付与しますが、それと似たようなものを提供します。Kubernetesでは、複数のPodが同時に稼動する環境を想定していますが、この複数のPodをServiceとしてまとめることが可能です。

コンテナが稼動する各ホスト(ノード)において、Pod同士で通信を行うプライベートIPアドレスが付与されます。Pod間の通信は、各ノード上で稼動するproxyデーモン同士で行われます。

Serviceは、負荷分散の機能も持っています。Serviceが提供するIPアドレスに対して、外部からアクセスすると、ラウンドロビンで通信が行われます。通常、このラウンドロビンでの通信を行うには、Pod同士で通信を行うプライベートIPアドレスが所属するネットワーク上で行われます。パブリックIPアドレスは、サービスに複数付与することも可能です。

 guest-blog-20160105_2_6_KubernetesにおけるServiceの例

図6. KubernetesにおけるServiceの例

 

サービスにおける各コンポーネントを以下にまとめておきます。

–         サービスタイプ
○        IPアドレス
○        ポート番号
○        負荷分散

–         サービスディスカバリ:
○        DNS
○        環境変数

–         セッションアフィニティ

サービスタイプは、IPアドレス、ポート番号、そして負荷分散です。IPアドレスだけでなく、DNSによる名前解決や環境変数、セッションアフィニティと呼ばれるセッションの明示的な固定などもサービスに含まれます。

Labels

Kubernetesにおいては、Podやノードのことをオブジェクトといいますが、そのオブジェクトに対して、ラベル(識別のための文字列)を付与することができます。KubernetesのAPIサーバーが、このラベルを使ってオブジェクトを識別し、問い合わせを行います。

ラベルは、キーと値の対から構成されます。ラベルを駆使することで、処理対象となるノード、あるいは、Podを選択することができます。

guest-blog-20160105_2_7_Kubernetesにおけるラベル例

図7. Kubernetesにおけるラベル例
 

KubernetesにおけるGUI

Kubernetesでは、WebUIが提供されています。おもなWebUIとして、Kubernetesのノードのリソース利用状況や死活監視を行うダッシュボードが存在します。

Kubernetesでクラスターを構成したノードのCPU利用率、メモリ使用量、ファイルシステム使用量などをリアルタイムで閲覧することが可能です。



guest-blog-20160105_2_8_KubernetesのダッシュボードのWebUI

図8. KubernetesのダッシュボードのWebUI 

 

Kubernetesの導入手順

以下に、Kubernetesの導入手順の概要を示しておきます。この手順は、一般的なサーバーOSであるRHEL、CentOSやUbuntu Serverに対応したものですが、RHEL Atomic HostやCentOS Atomic Hostなどのコンテナ専用OSでは、etcd、flannel、kubernetesのRPMパッケージがすでにインストール済みになっていますので、インストールを省力化することができます。

CentOS Atomic Hostは、isoイメージを無料で入手でき、物理サーバーにインストールすることができます。また、Kubernetesに関連するパッケージがあらかじめインストールされていますので、必要なソフトウェアが何かを知ることができます。

ただし、etcd、flannel、Kubernetesの設定ファイルに記述するパラメータ等は、環境に合わせて編集する必要があります。

CentOS 7.x上におけるetcd、flannelを使ったオーバレイネットワーク、Kubernetesの本体、および、KubernetesのWebUIによる管理、Podの作成などの具体的な手順は、筆者が執筆しました「Docker 実践ガイド」に掲載していますので、ぜひ、KubernetesによるDockerコンテナの管理にチャレンジしてみてください。

CentOS Atomic Hostのisoイメージの入手先:
http://cloud.centos.org/centos/7/atomic/images/
(2016年1月7日現在は、CentOS-Atomic-Host-7.20151101-Installer.iso が最新版です)

Kubernetesの導入手順:

  • マスター用の物理サーバーの用意
  • 管理対象ノード用の物理サーバー群を用意
  • マスターに、etcdをインストール
  • 管理対象ノードにflannelをインストールし、オーバレイネットワークを作成
  • マスターと管理対象ノードにKubernetesをインストール、設定
  • Podの作成、Podを使ってコンテナを起動
  • Kubernetes管理GUIをインストール


以上で、Kubernetesの概要を紹介しました。

実際に、Kubernetes環境を構築し、Podの設定ファイルを記述し、コンテナを起動させてみないと、動作が理解できないかもしれませんが、概要を知っておけば、Kubernetesのドキュメントも理解しやすくなるかと思います。

Kubernetesは、現在も開発が続けられていますが、コンテナを知り尽くしたGoogle社の技術者が開発に携わっていることもあり、Dockerの管理ソフトウェアとして、大きな注目を浴びているものの一つです。

特に、コンテナ専用OSであるAtomic Hostには、Kubernetesが標準で搭載されていますので、今後、コンテナ専用OSの管理ツールの業界標準になる可能性もあります。

Kubernetesは、コンテナを効率よく管理するツールの一つですが、Kubernetes以外にも、非常に使い勝手の良いDocker向けの管理ソフトウェアがいくつも存在しますので、Docker環境においては、Kubernetesの導入で完結せず、管理ツールを比較検討することをお勧めします。

 

各種お問い合わせ

サイオスOSSよろず相談室(1)

問い合わせボタン

最新の情報
[第17回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ ハードウェアに搭載されている電源管理・電力管理機能とLinuxの関係 ~ 2017年07月19日
[第16回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ CPUの仮想化支援機能 ~ 2017年07月05日
[第15回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ Hyper-Threading ~ 2017年06月21日
わかっておきたいセキュリティ: 第5回 VirusTotal at Home/Work「Malice」 2017年05月10日
わかっておきたいセキュリティ: 第4回 IRMA (Incident Response Malware Analysis) 2017年03月29日
わかっておきたいセキュリティ: 第3回 マルウェア解析サンドボックス「Cuckoo」との連携 その2 2017年02月22日
[第14回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その4 2017年02月08日
[第13回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その3 2017年02月01日
[第12回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その2 2017年01月25日
[第11回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 システム要件において検討すべき点 その1 2017年01月18日
Python人材育成の支援を目的としたPythonエンジニア育成推進協会の活動とは? 2016年12月21日
わかっておきたいセキュリティ: 第2回 マルウェア解析サンドボックス「Cuckoo」との連携 2016年12月14日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第3回 オープンソースライセンスの使い方をわかっておきたい 2016年12月08日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第2回 色々なオープンソースライセンスをわかっておきたい 2016年11月30日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第1回 著作権とライセンスをわかっておきたい 2016年11月17日
わかっておきたいセキュリティ: 第1回 マルウェア解析サンドボックス「Cuckoo」 2016年11月02日
[第10回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ RHELを知る ~ 2016年10月26日
[第9回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ Ubuntu Serverを知る ~ 2016年10月19日
[第8回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』  Linuxサーバーシステム導入前の検討~ SUSEを知る ~ 2016年10月12日
[第7回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「初心者でもわかる、Linuxサーバーシステム活用者が知っておくべきポイント」(後編) 2016年08月09日
最新の情報 - もっと...