17.04リリース記念オフラインミーティング17.05皆さんはGWを楽しんでいますか。長期休暇をぐったりウィークとして無為に過ごしたりしていませんか。体を休めることは重要ですが、あまり休めすぎると後悔という名のリバウンドが待っていますよ。そこで今回のRecipeでは、GWが終わったあとに「がんばった私」とエクスキューズできるよう、Kubernetesを簡単に構築できる方法を紹介します。これで連休明けには「いやぁ連休中はKubernetesを触っていてさぁ」と言えますよ!コンテナを「いい感じ」に調整してくれるKubernetes「Kubernetes」はコンテナのオーケストレーションツールです。具体的にはDockerコンテナに対して、次のような機能を提供します。複数のホストに複数のコンテナをデプロイするためのインフラストラクチャーコンテナが提供するサービスのスケーリング・ロードバランシングインスタンスのレプリケーションコンテナ間のネットワーク管理ロギング・モニタリング上記の機能を利用するためのAPIや鍵の管理Dockerは単にコンテナ内部でソフトウェアを実行するツールです。Dockerそのものには上記のような「複数のコンテナを連携させる機能」はありません。Dockerfileやソフトウェアをうまく作りこむことで同じようなことを実現できますが、それらはあくまでDockerの外の仕事です[1]⁠。[1]UbuntuでDockerを活用する方法は第458回を参照してください。Dockerコンテナを純粋なアプリコンテナとして使った場合、どうしても複数のアプリ(インスタンス・サービス)を連携させたくなることがよくあります。シンプルなサービスであっても、たとえばフロントエンドとデータベースを別々のインスタンスにしたいこともあるでしょう。サービスの構成が複雑になればなるほど、インスタンスの起動手順やDockerfile、Dockerイメージの管理も複雑になっていきます。インスタンス間を連携させるとなると、IPアドレスやホスト名の管理を行わなくてはならないかもしれません。サービスの可用性をあげるために、同じサービスを複数のホストにレプリケーションしたい場合もあります。Composeがあります。Composeは複数のコンテナの設定や関係をひとつのファイルにまとめて記述できるため、コンテナ同士が連携することでひとつのサービスを提供するようなソフトウェアにとっては非常に便利なツールです。従来はdockerコマンドにオプションとして渡していたような情報も設定ファイルとして記述できるため、マルチコンテナではない環境でも有用です。複数のホストにデプロイするとなると、ひと手間必要になります。とどのつまりKubernetesは、複数のコンテナを複数のマシンに「いい感じ」に配置・管理できるツールなのです[2]⁠。Swarm」という選択肢もあります。Swarmが実現しようとしていることは、基本的な部分はKubernetesとほぼ同じです。Kubernetes環境を「召喚」するKubernetes環境を用意すれば、マルチホストでDockerコンテナを管理できるようになります。管理対象の複数のホストに、Kubernetes環境を「デプロイ」する必要があります。Kubernetes本体だけではなく、Dockerなどのコンテナ管理システムも必要です。用途によってはコンテナ間のネットワーク管理としてFlannelやホスト間の情報を保存する分散型キーバリューストアとしてetcdなどを用意しなくてはならないかもしれません。「めんどくさい」のです。Kubernetesの仕組みを勉強したいだけであればMinikubeを使うという手があります。Minikubeは単一ホスト上にKVMやVirtualBoxなどを用いて複数の仮想ホストを作成し、それらの仮想ホストを用いてKubernetes環境を構築します。よってMinikubeを動かすためにはそこそこのスペックのマシンが必要です。当然のことながらプロダクションの用途に使うことは想定していません。そこで今回はより簡単に複数のホストにKubernetesを構築する方法としてconjure-upを使うことにしましょう。召喚には代償・贄が必要になることもあります。conjure-upだと大抵は「インスタンス料金」とか「電気代」という形で、召喚者の財布の中身が消失するようです。conjure-upはホストを管理するバックエンドとしてJujuを使います。ホストの準備や個々のソフトウェアのデプロイそのものはJujuやその設定スクリプト群であるCharmが担います。conjure-upのSpellには、Juju環境を構築したあと、Charmを呼び出す前、デプロイが完了したあとのそれぞれについて行うべき作業を記述するのです。あとはconjure-upを呼び出すときにホストの数やホストを構築する対象(AWSやAzureを使うのか、ローカルのLXDを使うのか、MAASを使うのか)などを設定することで、フレキシブルに複雑なソフトウェアスタックをコマンド一発で構築できます。Installerを、OpenStack以外の構築にも利用できるようにしたツールです。conjure-upのインストールと実行conjure-upを利用するためには、あらかじめ次のような環境を用意しておく必要があります。後者については、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でも、その他のディストリビューションでも同じ手順でインストールできます。LTSなら最初からsnapシステムがインストールされているので、次のコマンドを実行するだけです。installedconjure-upにはJujuのコマンドも同梱されています。このためJujuを別途インストールする必要なく、Juju環境を構築可能です。conjure-upを用いた召喚は、次のコマンドを呼び出すだけです。conjure-up以降はCUIから呪文を唱えることになります[4]⁠。Spell」と書いてあるので......。conjure-upは独自のCUIツールキットを使用しているconjure-upは独自のCUIツールキットを使っています。このため画面上の文字列のコピーアンドペースト操作が若干特殊です。文字列をコピーする場合は、Shiftキーを押しながらマウスで選択してください。選択することでクリップボードにその文字列がコピーされます。Insert」キーを押します。端末のサイズは「132x43」以上を推奨しています。GNOME端末を使っている場合は、メニューの「端末」から端末サイズを変更しておきましょう。ノートPCなどは縦43が足りない場合もあるかもしれませんが、多少は132x43を下回っても問題なく動きますので安心してください。プロキシ環境の場合はconjure-upコマンドに「--http-proxy」オプションなどを渡すことで対応できます。詳細は「--help」オプションで確認してください。ちなみにプロキシ環境内部からAWSなどプロキシの外に構築する場合は、コマンドオプションなどだけではケアできないようです。そのような場合は、sshuttleなどで外への経路を確保した上でconjure-upを実行したほうがいいでしょう。Kubernetes」を選択します。ここにあるリストがいわゆる「Spell」と呼ばれるもので、個々のSpellはYAMLファイルとスクリプトの集合体です。自作のSpellを使って、召喚魔法を唱えることも可能です。Kubernetes」はJujuを用いてKubernetesの環境を構築するためのキットです。このキットを使うと、以下のような環境をワンタッチで構築できます。DashboardクラウドモニタリングツールとしてHeapsterEasyRSA自己署名証明書の認証局Etcd信頼性を高めるために3ノード構築ノードの数などは構築時や構築後に調整可能です。実際にKubernetesを構築していきましょう。Jujuコントローラーの選択ホストマシンの構築にはJujuを使います。Jujuを使用するためにはどこかにJujuコントローラーが必要です。bootstrap」を用いてAWSだったりローカルのコンテナ内部にコントローラーを構築することが一般的でした。Service)」を立ち上げました。パブリックベータというステータスではあるものの、このサービスを使えばコントローラー部分はCanonicalのサービスを利用できるため構築時間を短縮できます。当然のことながら、Jujuコントローラー以外は別のホストが必要です。Controller」を選択します。クラウドサービスの選択Spellを展開する先のクラウドサービスを選択します。「⁠localhost」だとLXDを使ってすべてのインスタンスをローカルのコンテナに構築しますし、「⁠MAAS」だとMAASとして構築済みの環境を使います。性能があるホストマシンであれば、インスタンス代がかからないlocalhostも選択肢になるでしょう。Minikubeとどこまで違うのかという点は一考の余地があります。今回は「aws」を選択しますが、「⁠azure」や「google」と比べて手順にそれほど違いはありません。アクセスキーの入力Jujuがクラウドサービス上にインスタンスを立ち上げられるよう、アクセスキーを指定してください。AWSだったらIAMでJuju用のアカウントを作ってしまうのが良いでしょう。Insert」を押します。Applications」にフォーカスを合わせてエンターを押すと、それぞれのインスタンスを作成します。必要であれば「Configure」からインスタンスの数を調整してください。Charm)の設定が行えます。ちなみにAWSのインスタンスサイズの変更やアベイラビリティゾーンの指定はできません。自動的にm3.medium/us-east-1が選択されます。しても変更したい場合は、ヘッドレスモードを使いましょう。kubectlパッケージのダウンロード最終的にデプロイが完了すると、Kubernetesを操作するkubectlコマンドがインストールされます。ちなみにkubectlコマンドはsnapパッケージとして提供されるので、conjure-upを実行していない環境でもインストール可能です。構築した環境の確認まずは構築した環境を確認してみましょう。Jujuを使って、各インスタンスの状況を表示してみます。subordinate「Machine」がインスタンスに該当します。9個のインスタンスが立ち上がっていますが、これとは別にcontrollerモデルのほうにJujuコントローラーのインスタンスがいるため、全部で10個のインスタンスがいます。address」の部分は、ここではマスクしていますが実際にはインスタンスのアドレスが表示されています。「Unit」を見ると、Kubernetesのワーカーノードやetcdは3つ存在することがわかります。次にkubectlコマンドを使ってみましょう[5]⁠。[5]kubectlは「~/.kube/config」にAPIサーバーや認証情報を記録しています。ところがconjure-upで構築したときは認証情報が「~/.kube/config.(Jujuのコントローラー名)」に保存されました。その場合は、ファイルを「~/.kube.config」に変更するとkubectlを使えます。「~/bin/kubectl.(Jujuのコントローラー名)」を実行するという手もあります。Dashboardが有効化されています。よって、上記の「kubernetes-dashboard」にアクセスするとDashboardが表示されます。proxy」でトンネルを構築して初めてアクセスできるはずなのですが、なぜか特に認証の必要なくアクセスできるようです。不安な場合は、次のコマンドでDashboard機能を無効化してしまいましょう。enable-dashboard-addons=falseKubernetesではコンテナを動かすためのホストを「Node⁠」⁠、関連性の強いコンテナの集合を「Pod⁠」⁠、Podによって提供されるサービスを「Service」と呼んでいます。get」コマンドで確認できます。Controllerが3つ動いていますね。Kubernetesでコンテナを立ち上げるKubernetes上にコンテナを立ち上げる場合も、kubectlコマンドを使います。コンテナを立ち上げる方法はいくつか存在しますが、ここでは既存のYAMLファイル(Pod)を利用することにしましょう。KubernetesのソースコードのexamplesディレクトリにはPodのサンプルがいくつも存在します。ここではシンプルな「Guestbook」をデプロイしましょう。Guestbookはその名の通り、サイトを訪れた人がコメントを残すサービスです。コメントのデータベースとしてRedisを、フロントエンドにはPHPを使用しています。Redisのマスターに1つとスレーブに2つ、フロントエンドに1つの計4つのコンテナが立ち上がります。createコマンドに、Podを渡すだけです。Guestbookには個々のサービスごとのPodとは別に、4つのコンテナをひとつにまとめたYAMLファイルもあります。今回はこちらを指定しましょう。createdステータスを確認すると、PodやServiceがそれぞれ作られていることがわかります。12sただしこのままだと外部からGuestbookサービスにアクセスできません。ワーカーノードが動いているインスタンスの80番ポートをAWSが塞いでいますし、GuestbookのfrontendサービスもKubernetesのローカルなIPアドレスしか持っていないからです。そこで以下の対応を行う必要があります。Jujuのコマンド経由でAWSのインスタンスのポートを開けるワーカーノードへのアクセスをfrontendサービスに転送するその前に、ワーカーノードが動いているインスタンスにログインして、curlコマンドでfrontendサービスが動いているか確認してみましょう。Jujuで立ち上げたインスタンスへは、JujuのコマンドでSSHログインできます。statusで表示されたUnit名を指定するだけです。servicesコマンドのfrontendサービスのIPアドレスへとアクセスすれば、Guestbookが動いていることがわかります。Jujuのコマンド経由でAWSのインスタンスのポートを開けるAWSのインスタンスのポートは、Jujuのコマンドで開けられます。kubernetes-workerもちろんGCPやAzureであっても同様です。Jujuが各種パブリッククラウドのAPIを使用してうまくやってくれます。statusで表示されているアプリケーション名です。複数のインスタンスにスケールしている場合は、すべてのインスタンスに対して設定を反映します。開くポートは、Unitsの「Ports」フィールドに記載されています。公開状態のアプリケーションはNotesフィールドに「exposed」と表示されます。exposed(後略)ワーカーノードへのアクセスをfrontendサービスに転送するワーカーノードのポートをあけたら今度は、ワーカーノードへのアクセスをルーティングします。Controllerが構築されています。これを使うことにしましょう。Controllerでは、ルーティング設定をYAMLとして記述した上で、kubectlコマンドに渡します。「gbook.example.com」にアクセスした場合にGuestbookに転送したい場合は、次のような設定ファイル「guestbook-ingress.yaml」を作ります。Controllerの場合は、Nginxが前段に存在するため、この設定がそのままNginxのプロキシ設定として変換され保存されるわけです。11sさらにDNSなどの設定で、「⁠gbook.example.com」のAレコードにワーカーノードのIPアドレスを指定しておきましょう。address」がそれに該当します。この状態でウェブブラウザーで「gbook.example.com」にアクセスすれば、Guestbookが表示されることでしょう。sshを使うとコンテナが動いているホスト(ワーカーノード)にログインできます。このホスト上ではDockerが動いていますので、dockerコマンドを使ってコンテナにログインしたり、情報を表示することが可能です。execを使うと、手作業でワーカーノードにログインしなくても直接コンテナの中にログインできます。/bin/bashPodが複数のコンテナから形成される場合は「-c」オプションでコンテナを指定してください。省略すると最初のコンテナが使われます。bash以外のコマンドを指定すれば、それが実行されます。logsコマンドを使いましょう。Pod名kubectlには、公式のドキュメントにコマンドチートシートがあります。このドキュメントで概要を掴むと良いでしょう。delete」で削除できます。Service名」などの指定方法も可能です。不要になったIngress設定も同様に削除しておきましょう。guestbook-ingress.yaml他のホストでJuju/KubernetesをコントロールするにはJujuやKubernetesのAPIにアクセスするための認証情報は、conjure-upを実行したホストのローカルディレクトリに保存されます。conjure-upを実行した環境とは別のホストでkubectlを実行したい場合もあるかもしれません。認証情報をバックアップする手段もありますが、いちばんお手軽なのは「~/.local/share/juju/」をそのままコピーしてしまうことです。このディレクトリにはAWSのアクセスキーなども保存されていますので、コピーするにしても扱いには十分注意してください。Jujuの認証情報をコピーした先でKubernetesの認証情報を復元するには、まずjujuコマンドをインストールします。これについても素直にconjure-upパッケージをインストールする方法がいちばん簡単でしょう。ついでにkubectlもインストールしておきましょう。--classicあとはKubernetesの認証情報を、マスターノードから取得するだけです。cluster-infoちなみに別のホストでkubectlを実行するだけであれば、「⁠~/.kube/config」をコピーすれば十分です。GUI」と呼ばれるウェブブラウザーベースの管理ツールも存在します。2.0から本体に組み込まれるようになりました。標準では無効化されていますが、次のコマンドを実行することで有効化されます。(パスワード)アドレスや認証情報が表示されますので、それに従ってアクセスしましょう。インスタンスのスケールをマウスで行いたい場合に便利です。GUIの使い方については第307回も参照してください。17.04リリース記念オフラインミーティング17.05を開催します。Topicsをはじめとした様々な場所でニュースになっているように、Ubuntuは17.04から17.10の間でルックアンドフィールが大きく変わる予定です。会場ではUnityを懐かしんだり、GNOMEについて想いを馳せたり、愚痴ったりと、Ubuntuに関する「お気持ち」を参加者の皆さんと共有できたらと思います。ちなみにセミナーの発表者も絶賛募集中です。詳細はATNDの「セミナーについて」を参照してください。innovation(西新宿三井ビルディング23F)ATNDhttps://atnd.org/events/87453今回の会場は西新宿です。いつもの六本木ではありません。いつもの会場に行ってしまう人が一定数以上いそうですが、くれぐれもご注意ください。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します⁠。個別にライセンスが設定されている記事等はそのライセンスに従います。