多機能なコンテナクラスタ構築ツール「Kontena」 2ページ

CLIのインストール

 前述の通り、KontenaではKontena CLI(kontenaコマンド)というコマンドラインクライアントを使ってクラスタの管理を行う。Kontena CLIはKontena Serverとネットワーク経由で通信できるマシンであれば、どのマシンでもインストールが可能だ。通常は管理作業に使用するマシンにインストールするのが一般的だろう。

 なお、Kontena CLIはRubyで実装されており、実行にはRuby 2.0以降が必要となる。あらかじめyumやapt-getなどのパッケージマネージャでRubyおよびRuby向けパッケージマネージャであるgemをインストールしておこう。

 Kontena CLIのインストールは、以下のようにgemコマンドで行える。

# gem install --no-document kontena-cli

 インストールが完了したら、kontenaコマンドを実行できるか確認しておこう。なお、引数を指定せずにkontenaコマンドを実行すると簡単なヘルプが表示される。

$ kontena
Usage:
    kontena [OPTIONS] SUBCOMMAND [ARG] ...

Parameters:
    SUBCOMMAND                    subcommand
    [ARG] ...                     subcommand arguments

Subcommands:
    grid                          Grid specific commands
    app                           App specific commands
    service                       Service specific commands
    vault                         Vault specific commands
    node                          Node specific commands
    master                        Master specific commands
    vpn                           VPN specific commands
    registry                      Registry specific commands
    container                     Container specific commands
    etcd                          Etcd specific commands
    external-registry             External registry specific commands
    register                      Register Kontena Account
    login                         Login to Kontena Master
    logout                        Logout from Kontena Master
    whoami                        Shows current logged in user
    user                          User related commands
    version                       Show version

Options:
    -h, --help                    print help

 なお、今回検証に使用したKontena CLIのバージョンは0.14.7だ。これは「kontena version」コマンドで確認できる。

# kontena version
cli: 0.14.7

 続いて、「kontena register」コマンドを実行してKontena環境上で使用されるユーザーを作成しておく。ユーザーの作成にはメールアドレスとパスワードが必要だ。

# kontena register
Email: hylom@example.com
Password: **********
Password again: **********

Kontena Serverのインストール

 KontenaにはKontena Serverのインストールを行うためのいくつかのプラグインが用意されており、いくつかのクラウド環境においてはこれらを利用して容易にKontena Serverを作成できるのだが、今回はこれらを利用せずにKontena Serverをインストールする手順を紹介する。これらプラグインの利用についてはKontenaのドキュメントを参照して欲しい。また、Docker Composeを使って簡易的にKontena Serverをインストールする方法もドキュメントには掲載されているので、手軽に試したい場合はこちらを利用しても良いだろう。

 なお、今回Kontena Serverをインストールした環境はCentOS 7.2だが、サービスの起動にはsystemdを使用しているため、systemdが利用できる環境であればほかのLinuxディストリビューションでも同様の手順で利用できるはずだ。

 また、Kontena ServerおよびKontena Agentをインストールするホスト上にはDockerがインストールされている必要がある。そのほか、Kontena Serverで使用するサーバー証明書の用意も必要だ。

サーバー証明書の作成

 Kontenaでは、Kontena ServerとKontena CLI、Kontena Agent間の通信にデフォルトではHTTPSを利用する。そのため、HTTPSを利用するためのサーバー証明書が必要となる。今回は検証目的ということで、いわゆる自己署名証明書を作成して使用する。

 まず、opensslコマンドで適当な秘密鍵を作成する。今回はRSA方式で2048ビットの鍵を作成した。

$ openssl genrsa 2048 > kontena-server.key

 続いて、この鍵を使ってCSRファイルを作成する。この際、証明書を利用する組織の所在地や組織名の入力が必要となるので、適切なものを入力しておこう。

$ openssl req -new -key kontena-server.key > kontena-server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]: ←国名を入力。日本ならJP
State or Province Name (full name) []: ←州・県名を入力
Locality Name (eg, city) [Default City]: ←都市名を入力
Organization Name (eg, company) [Default Company Ltd]: ←組織名を入力
Organizational Unit Name (eg, section) []: ←部門名を入力
Common Name (eg, your name or your server's hostname) []: ←サーバーのホスト名を入力
Email Address []: ←担当者のメールアドレスを入力

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←何も入力せずにスキップ
An optional company name []: ←何も入力せずにスキップ

 続いて、鍵ファイルとCSRファイルを元にCRTファイルを作成する。

$ openssl x509 -days 365 -req -signkey kontena-server.key < kontena-server.csr > kontena-server.crt

 最後に、鍵ファイルとCRTファイルを1つのファイルにまとめたPEMファイルを作成する。このファイルが、Kontena Serverで使われる証明書ファイルとなる。

$ cat kontena-server.key kontena-server.crt > kontena-server.pem

設定ファイルの作成

 続いて、Konena Serverを稼動させるホスト上で設定ファイルを作成する。必要な設定ファイルは下記のとおりだ。

  • /etc/kontena/kontena-server.pem
  • /etc/kontena/kontena-server.env
  • /etc/kontena/kontena-haproxy.sh
  • /etc/systemd/system/kontena-server-haproxy.service
  • /etc/systemd/system/kontena-server-api.service
  • /etc/systemd/system/kontena-server-mongo.service

 /etc/kontenaディレクトリは通常は存在しないので、こちらは手動で作成しておく必要がある。

# mkdir /etc/kontena

 /etc/kontena/kontena-server.pemファイルは、先に述べた手順で作成したSSLサーバー証明書ファイルだ。また、kontena-server.envファイルはKontena Serverの各種設定を記述したファイルで、内容は下記のようになる。

KONTENA_VERSION=latest
KONTENA_VAULT_KEY=<ランダムな文字列>
KONTENA_VAULT_IV=<ランダムな文字列>
SSL_CERT="/etc/kontena/kontena-server.pem"

 ここで「KONTENA_VAULT_KEY」および「KONTENA_VAULT_IV」パラメータではランダムな文字列を設定しておく必要がある。ここで利用できるランダムな文字列は、たとえば次のようにして生成できる。

# cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1
3f9KZl8J6i0ozlOrrjaT1pm0qYUG2i12G7Bs5CDrC8mQTR8vvHw1kRaOMfDJskxS ←表示された文字列をコピー&ペーストする

 また、/etc/kontena/kontena-haproxy.shファイルの中身は以下のようになる。

#!/bin/sh

if [ -n "$SSL_CERT" ]; then
    SSL_CERT=$(awk 1 ORS='\\n' $SSL_CERT)
else
    SSL_CERT="**None**"
fi

/usr/bin/docker run --name=kontena-server-haproxy \
  --link kontena-server-api:kontena-server-api \
  -e SSL_CERT="$SSL_CERT" -e BACKEND_PORT=9292 \
  -p 80:80 -p 443:443 kontena/haproxy:latest

 このファイルには実行可能属性を付けておこう。

# chmod +x kontena-haproxy.sh

 /etc/systemd/system以下に配置する3つのファイルは、それぞれ下記のようになる。

リスト1 kontena-server-api.service
[Unit]
Description=kontena-server-api
After=network-online.target
After=docker.service
Description=Kontena Agent
Documentation=http://www.kontena.io/
Requires=network-online.target
Requires=docker.service

[Service]
Restart=always
RestartSec=5
EnvironmentFile=/etc/kontena/kontena-server.env
ExecStartPre=-/usr/bin/docker stop kontena-server-api
ExecStartPre=-/usr/bin/docker rm kontena-server-api
ExecStartPre=/usr/bin/docker pull kontena/server:${KONTENA_VERSION}
ExecStart=/usr/bin/docker run --name kontena-server-api \
          --link kontena-server-mongo:mongodb \
          -e MONGODB_URI=mongodb://mongodb:27017/kontena_server \
          -e VAULT_KEY=${KONTENA_VAULT_KEY} -e VAULT_IV=${KONTENA_VAULT_IV} \
          kontena/server:${KONTENA_VERSION}
リスト2 kontena-server-haproxy.service
[Unit]
Description=kontena-server-haproxy
After=network-online.target
After=docker.service
Description=Kontena Server HAProxy
Documentation=http://www.kontena.io/
Requires=network-online.target
Requires=docker.service

[Service]
Restart=always
RestartSec=5
EnvironmentFile=/etc/kontena/kontena-server.env
ExecStartPre=-/usr/bin/docker stop kontena-server-haproxy
ExecStartPre=-/usr/bin/docker rm kontena-server-haproxy
ExecStartPre=/usr/bin/docker pull kontena/haproxy:latest
ExecStart=/etc/kontena/kontena-haproxy.sh
リスト3 kontena-server-mongo.service
[Unit]
Description=kontena-server-mongo
After=network-online.target
After=docker.service
Description=Kontena Server MongoDB
Documentation=http://www.mongodb.org/
Requires=network-online.target
Requires=docker.service

[Service]
Restart=always
RestartSec=5
ExecStartPre=/usr/bin/docker pull mongo:3.0
ExecStartPre=-/usr/bin/docker create --name=kontena-server-mongo-data mongo:3.0
ExecStartPre=-/usr/bin/docker stop kontena-server-mongo
ExecStartPre=-/usr/bin/docker rm kontena-server-mongo
ExecStart=/usr/bin/docker run --name=kontena-server-mongo \
          --volumes-from=kontena-server-mongo-data \
          mongo:3.0 mongod --smallfiles

 これら設定ファイルを配置したら、systemdの設定をリロードしておく。

# systemctl daemon-reload

 なお、それぞれのサービスの起動順だが、まず最初にkontena-server-mongoサービスを起動し、続いてkontena-server-api、最後にkontena-server-haproxyという順番で起動する。

# systemctl start kontena-server-mongo
# systemctl start kontena-server-api
# systemctl start kontena-server-haproxy

 これらコマンドの実行後、systemctlコマンドでそれぞれのサービスが正しく起動しているかを確認しておこう。

# systemctl | grep kontena
  kontena-server-api.service                                                                             loaded    active running   Kontena Agent
  kontena-server-haproxy.service                                                                         loaded    active running   Kontena Server HAProxy
  kontena-server-mongo.service                                                                           loaded    active running   Kontena Server MongoDB

 前述のとおり各サービスはそれぞれDockerコンテナとして稼動しており、その状況は「docker ps」コマンドで確認できる。

# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                      NAMES
223a233c1fa2        kontena/haproxy:latest   "./run.sh"               2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   kontena-server-haproxy
87da7385c808        kontena/server:latest    "./run.sh"               2 minutes ago       Up 2 minutes        9292/tcp                                   kontena-server-api
1e436c80bdab        mongo:3.0                "/entrypoint.sh mongo"   2 minutes ago       Up 2 minutes        27017/tcp                                  kontena-server-mongo

 なお、kontena-server-mongoコンテナは各種データを格納するために「kontena-server-mongo-data」というコンテナを利用する。このコンテナは単純にデータを格納するためだけに確保されたコンテナで、実行はされない。kontena-server-haproxyやkontena-server-api、kontena-server-mongoコンテナを削除しても関連データは失われないが、このkontena-server-mongo-dataコンテナを削除してしまうとDockerクラスタに関するすべての設定が失われてしまうので注意してほしい。

 Kontena Serverが稼動したら、Kontena CLIをインストールしたホストからのログインを行ってみよう。ログインは「kontena login <Kontena Serverのホスト名もしくはIPアドレス>」コマンドで行える。たとえばKontena ServerのIPアドレスが「192.168.1.10」だった場合、以下のようになる。また、今回は自己署名証明書を利用しているため、SSL証明書の検証をスキップするよう「SSL_IGNORE_ERRORS」環境変数に「ture」を設定している。

$ export SSL_IGNORE_ERRORS=true
$ kontena login https://192.168.1.10
Email: hylom@example.com
Password: **********
 _               _
| | _____  _ __ | |_ ___ _ __   __ _
| |/ / _ \| '_ \| __/ _ \ '_ \ / _` |
|   < (_) | | | | ||  __/ | | | (_| |
|_|\_\___/|_| |_|\__\___|_| |_|\__,_|
-------------------------------------
Copyright (c)2016 Kontena, Inc.

Logged in as hylom@example.com
Welcome! See 'kontena --help' to get started.