Ubuntu Weekly Recipe

第469回 AWS上に魔獣「Kubernetes」を10分で召喚する魔法

この記事を読むのに必要な時間:およそ 12 分

皆さんはGWを楽しんでいますか。せっかくの長期休暇をぐったりウィークとして無為に過ごしたりしていませんか。もちろん体を休めることは重要ですが,あまり休めすぎると後悔という名のリバウンドが待っていますよ。

そこで今回のRecipeでは,GWが終わったあとに「がんばった私」とエクスキューズできるよう,Kubernetesを簡単に構築できる方法を紹介します。これで連休明けには「いやぁ連休中はKubernetesを触っていてさぁ」と言えますよ!

コンテナを「いい感じ」に調整してくれるKubernetes

Kubernetesはコンテナのオーケストレーションツールです。具体的にはDockerコンテナに対して,次のような機能を提供します。

  • 複数のホストに複数のコンテナをデプロイするためのインフラストラクチャー
  • コンテナが提供するサービスのスケーリング・ロードバランシング
  • インスタンスのレプリケーション
  • コンテナ間のネットワーク管理
  • ロギング・モニタリング
  • 上記の機能を利用するためのAPIや鍵の管理

Dockerは単にコンテナ内部でソフトウェアを実行するツールです。Dockerそのものには上記のような「複数のコンテナを連携させる機能」はありません。もちろんDockerfileやソフトウェアをうまく作りこむことで同じようなことを実現できますが,それらはあくまでDockerの外の仕事です※1)⁠

※1
UbuntuでDockerを活用する方法は第458回を参照してください。

Dockerコンテナを純粋なアプリコンテナとして使った場合,どうしても複数のアプリ(インスタンス・サービス)を連携させたくなることがよくあります。シンプルなサービスであっても,たとえばフロントエンドとデータベースを別々のインスタンスにしたいこともあるでしょう。サービスの構成が複雑になればなるほど,インスタンスの起動手順やDockerfile,Dockerイメージの管理も複雑になっていきます。インスタンス間を連携させるとなると,IPアドレスやホスト名の管理を行わなくてはならないかもしれません。さらにはサービスの可用性をあげるために,同じサービスを複数のホストにレプリケーションしたい場合もあります。

複数のコンテナを管理するツールにDocker Composeがあります。Docker Composeは複数のコンテナの設定や関係をひとつのファイルにまとめて記述できるため,コンテナ同士が連携することでひとつのサービスを提供するようなソフトウェアにとっては非常に便利なツールです。さらに従来はdockerコマンドにオプションとして渡していたような情報も設定ファイルとして記述できるため,マルチコンテナではない環境でも有用です。ただし複数のホストにデプロイするとなると,ひと手間必要になります。

とどのつまりKubernetesは,複数のコンテナを複数のマシンに「いい感じ」に配置・管理できるツールなのです※2)⁠

※2
今ならDocker Swarmという選択肢もあります。Swarmが実現しようとしていることは,基本的な部分はKubernetesとほぼ同じです。

Kubernetes環境を「召喚」する

Kubernetes環境を用意すれば,マルチホストでDockerコンテナを管理できるようになります。

つまり管理対象の複数のホストに,Kubernetes環境を「デプロイ」する必要があります。Kubernetes本体だけではなく,Dockerなどのコンテナ管理システムも必要です。用途によってはコンテナ間のネットワーク管理としてFlannelやホスト間の情報を保存する分散型キーバリューストアとしてetcdなどを用意しなくてはならないかもしれません。つまり「めんどくさい」のです。

単にKubernetesの仕組みを勉強したいだけであればMinikubeを使うという手があります。Minikubeは単一ホスト上にKVMやVirtualBoxなどを用いて複数の仮想ホストを作成し,それらの仮想ホストを用いてKubernetes環境を構築します。よってMinikubeを動かすためにはそこそこのスペックのマシンが必要です。当然のことながらプロダクションの用途に使うことは想定していません。

そこで今回はより簡単に複数のホストにKubernetesを構築する方法としてconjure-upを使うことにしましょう。⁠conjure-up」呪文spellを唱えることで,人智の及ばない魔獣複雑怪奇なソフトウェアスタック現し世サーバー喚び出すconjure up術式です。召喚には代償・贄が必要になることもあります。conjure-upだと大抵は「インスタンス料金」とか「電気代」という形で,召喚者の財布の中身が消失するようです。

conjure-upはホストを管理するバックエンドとしてJujuを使います。つまりホストの準備や個々のソフトウェアのデプロイそのものはJujuやその設定スクリプト群であるCharmが担います。conjure-upのSpellには,Juju環境を構築したあと,Charmを呼び出す前,デプロイが完了したあとのそれぞれについて行うべき作業を記述するのです。あとはconjure-upを呼び出すときにホストの数やホストを構築する対象(AWSやAzureを使うのか,ローカルのLXDを使うのか,MAASを使うのか)などを設定することで,フレキシブルに複雑なソフトウェアスタックをコマンド一発で構築できます。

簡単に言ってしまえば第341回で紹介したOpenStack Installerを,OpenStack以外の構築にも利用できるようにしたツールです。

conjure-upのインストールと実行

conjure-upを利用するためには,あらかじめ次のような環境を用意しておく必要があります。

  • snapが動く環境(この記事ではUbuntu 16.04 LTSを使用しています)
  • Kubernetesを構築する環境

後者については,AWSやAzure,GCPといったパブリッククラウドに加えて,LXDやMAASといったローカル環境をサポートしています。この記事ではAWSを使う前提で説明しますが,他のサービスを使う場合はサービスごとのアクセスキーを,ローカルに構築する場合はLXDやMAASをインストールした環境を用意しておいてください※3)⁠ローカルにKubernetesを構築する場合は,16GBのRAMや250GB程度のストレージが必要なようです。AWSの場合,m3.mediumインスタンスを10個ほど作ります。

※3
LXDは少なくとも2.9以降が必要になります。またLXDを使う場合,パッケージ版とsnap版のLXDをともにインストールした環境だと動作しません。どちらか一方をあらかじめアンインストールしておいてください。

conjure-upそのものはsnapパッケージとして提供されています。よってUbuntuでも,その他のディストリビューションでも同じ手順でインストールできます。Ubuntu 16.04 LTSなら最初からsnapシステムがインストールされているので,次のコマンドを実行するだけです。

$ sudo snap install conjure-up --classic
conjure-up 2.1.5 from 'canonical' installed

conjure-upにはJujuのコマンドも同梱されています。このためJujuを別途インストールする必要なく,Juju環境を構築可能です。conjure-upを用いた召喚は,次のコマンドを呼び出すだけです。

$ conjure-up

以降はCUIから呪文を唱えることになります※4)⁠

※4
公式のドキュメント「Summon a Spell」と書いてあるので……。

図1 conjure-upは独自のCUIツールキットを使用している

画像

conjure-upは独自のCUIツールキットを使っています。このため画面上の文字列のコピーアンドペースト操作が若干特殊です。まず文字列をコピーする場合は,Shiftキーを押しながらマウスで選択してください。選択することでクリップボードにその文字列がコピーされます。クリップボード上の文字列をペーストするには「Shift + Insert」キーを押します。

また,端末のサイズは「132x43」以上を推奨しています。GNOME端末を使っている場合は,メニューの「端末」から端末サイズを変更しておきましょう。ノートPCなどは縦43が足りない場合もあるかもしれませんが,多少は132x43を下回っても問題なく動きますので安心してください。

なおプロキシ環境の場合はconjure-upコマンドに--http-proxyオプションなどを渡すことで対応できます。詳細は--helpオプションで確認してください。ちなみにプロキシ環境内部からAWSなどプロキシの外に構築する場合は,コマンドオプションなどだけではケアできないようです。そのような場合は,sshuttleなどで外への経路を確保した上でconjure-upを実行したほうがいいでしょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入