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

Kontenaクラスタ上でアプリケーションを実行する

 以上でKontenaクラスタが完成したので、続いてはKontenaクラスタ上でのコンテナ実行について説明していこう。Kontenaでは実行されるコンテナを「サービス」と呼び、「kontena service」コマンドで管理できる。

 コンテナを実行する場合、まずサービスを作成し、続いてそれをデプロイする、という手順となる。サービスの作成は「kontena service create <サービス名> <コンテナイメージ名>」コマンドで行える。

 たとえば「httpd」というコンテナを実行したい場合、まず次のようにしてサービスを作成する。サービス名には任意のものが使用できるが、ここでは「httpd_test」とした。

$ kontena service create httpd_test httpd

 なお、公開するポートやリンク、環境変数、ボリュームなどの設定もサービスの作成時に行う。ここでは「docker run」コマンドで指定できるオプションとほぼ同一のものが利用できるが、詳しくは「kontena service create –help」コマンドなどで確認できるオンラインヘルプなどを参照してほしい。

 作成したサービスは、「kontena service ls」コマンドで確認できる。

$ kontena service ls
NAME                                                         INSTANCES  STATEFUL STATE      EXPOSED PORTS                                     
httpd_test                                                   0 / 1      no       initialized  

 続いて、「kontena serice deploy <サービス名>」コマンドで作成したコンテナのデプロイを行う。

$ kontena service deploy httpd_test

 デプロイ後に再度「kontena service ls」コマンドで確認すると、「INSTANCES」が「1/1」となり、「STATE」が「running」となっていることが分かる。

$ kontena service ls
NAME                                                         INSTANCES  STATEFUL STATE      EXPOSED PORTS                                     
httpd_test                                                   1 / 1      no       running 

 また、「kontena service show <サービス名>」でサービスの詳細情報を確認できる。たとえば下記の例では、「centos11」ノードでこのインスタンスが稼働していることが分かる。

$ kontena service show httpd_test
grid01/httpd_test:
  status: running
  image: httpd:latest
  stateful: no
  scaling: 1
  strategy: ha
  deploy_opts:
    min_health: 0.8
  dns: httpd_test.grid01.kontena.local
  net: bridge
  instances:
    httpd_test-1:
      rev: 2016-08-16 12:48:36 UTC
      node: centos11
      dns: httpd_test-1.grid01.kontena.local
      ip: 10.81.1.161
      public ip: ***.***.**.***
      status: running

 稼働中のコンテナを停止させるには、「kontena service stop <サービス名>」コマンドを使用する。

$ kontena service stop httpd_test

 また、サービスを削除するには「kontena service rm <サービス名>」コマンドを使用する。この際、本当に削除を行うかの確認が行われるので、確認して再度サービス名を入力する。また、「–force」オプション付きでコマンドを実行すると確認無しで削除が行われる。

$ kontena service rm httpd_test
Destructive command. To proceed, type "httpd_test" or re-run this command with --force option.
> httpd_test

複数のコンテナをまとめて管理する

 Kontenaでは、複数のコンテナをまとめた「アプリケーション」という単位でコンテナを管理する機能が用意されている。前回紹介した「Docker Compose」と同様、コンテナの起動オプションや設定などを記述したファイルを事前に用意しておくことで、それらコンテナをまとめて管理できるというものだ。

 この設定ファイルはDocker Composeの設定ファイルと互換性があり、すでにDocker Compose向けの設定ファイルがある場合、それらをほぼそのまま利用することができる。Kontenaクラスタ内でコンテナが分散実行されることを除いて、実現できる機能や使い勝手はDocker Composeとほぼ同じだ。Docker Composeの使い方や設定ファイルについては以前の記事で解説しているので、そちらも参照してほしい。

 アプリケーション単位でのコンテナ管理では、「kontena app」コマンドを使用する。設定ファイルを自動生成する「kontena app init」コマンドが用意されているので、まずは適当なディレクトリでこのコマンドを使って設定ファイルを作成すると良いだろう。

 以下では、Docker Compose記事で説明したMySQLとWordPressをデプロイする以下のような設定ファイル(docker-compose.ymlファイル)を元に、Kontenaクラスタでこれらのコンテナを稼働させる例を紹介する。

version: '2'
services:
  my_mysql:
    image: mysql:5.7
    volumes:
      - /var/test/mysql:/var/lib/mysql
      - /var/test/mysql_conf.d:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: some_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress_password

  my_wordpress:
    image: wordpress:4.5-apache
    links:
      - my_mysql:mysql
    volumes:
      - /var/test/wp_plugins:/var/www/html/wp-content/plugins
    environment:
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress_password
      WORDPRESS_DB_NAME: wordpress

 まず、Docker Composeの設定ファイル(docker-compose.ymlファイル)が格納されているディレクトリ(ここでは「wordpress」ディレクトリで「kontena app init」コマンドを実行する。

$ kontena app init
Dockerfile not found. Do you want to create it? [Yn]: n ←Dockerfileを作成しないので「n」と入力
Found docker-compose.yml.
Creating kontena.yml
Your app is ready! Deploy with 'kontena app deploy'.

 「kontena app init」コマンドではコンテナイメージを作成するための「Dockerfile」ファイルと、「docker-compose.yml」ファイル、「kontena.yml」ファイルを作成できる。今回の場合Dockerfileファイルは不要なので、「Dockerfile not found. Do you want to create it?」という質問に対し「n」と入力して作成をキャンセルしている。また、docker-compose.ymlファイルは先に用意してあるので作成されず、これをベースにkontena.ymlファイルが作成される。

 作成されたkontena.ymlファイルは以下のようになる。

---
version: '2' ←kontena.ymlファイルフォーマットのバージョン
name: wordpress  ←プロジェクト名
services:  ←サービスの設定
  my_mysql: ←サービス名「my_mysql」について
    extends: ←「docker-compose.yml」ファイルの「my_mysql」設定を読み込む
      file: docker-compose.yml
      service: my_mysql
  my_wordpress: ←サービス名「my_wordpress」について
    extends: ←「docker-compose.yml」ファイルの「my_wordpress」設定を読み込む]
      file: docker-compose.yml
      service: my_wordpress

 kontena.ymlファイルの詳細についてはオンラインドキュメントのリファレンスページを参照して欲しいが、基本的にはDocker Composeのdocker-compose.ymlとほぼ同じだ。

Kontenaにおけるコンテナ間通信

 Kontenaでは前述したとおり、独自にVPNを構築することで異なるホスト上にあるコンテナ間の通信を可能にしている。さらにVPN内に独自のDNSサーバーが用意され、コンテナ間では「<サービス名>.kontena.local」もしくは「<サービス名>-<インスタンス番号>.kontena.local」というホスト名で各コンテナにアクセスできるように設定される。

 また、「kontena app」コマンドで作成されたサービスはサービス名として「<プロジェクト名>-<サービス名>」という名前が付けられる。今回の例では、プロジェクト名が「wordpress」、サービス名が「my_mysql」および「my_wordpress」なので、各コンテナは「wordpress-my_mysql.kontena.local」や「wordoress-my_wordpress.kontena.local」というホスト名でアクセスが可能だ。

 これを踏まえて、生成されたkontena.ymlファイルに下記の太字の部分を追記している。追加したのはWordPressサービスの設定で使用するデータベースのホスト名を指定する「WORDPRESS_DB_HOST」環境変数の設定だ。これにより、WordPressは「wordpress-my_mysql.kontena.local」というホストをデータベースとして使用するようになる(「${project}」の部分はプロジェクト名に置換される)。

---
version: '2'
name: wordpress
services:
  my_mysql:
    extends:
      file: docker-compose.yml
      service: my_mysql
  my_wordpress:
    extends:
      file: docker-compose.yml
      service: my_wordpress
    environment:
      WORDPRESS_DB_HOST: ${project}-my_mysql.kontena.local

アプリケーションのデプロイ

 設定ファイルを元にしたデプロイは、設定ファイルが格納されたディレクトリで「kontena app deploy」コマンドを実行することで行える。コマンドを引数無しで実行すると、次のようにkontena.ymlファイル内に記述されたサービスの作成とデプロイが実行される。

$ kontena app deploy
Not found any service with build option
creating my_mysql
creating my_wordpress
deploying my_mysql ... done
deploying my_wordpress ... done

 実行されているサービスは「kontena app ls」コマンドで確認できる。

$ kontena app ls
NAME                           IMAGE                                              INSTANCES       STATEFUL   STATE           PORTS
my_mysql                       mysql:5.7                                          1 / 1           no         running      
my_wordpress                   wordpress:4.5-apache                               1 / 1           no         running         0.0.0.0:80->80/tcp

 サービスの停止は「kontena app stop」コマンド、削除は「kontena app rm」コマンドで行える。

$ kontena app stop
stopping wordpress-my_mysql
stopping wordpress-my_wordpress
$ kontena app rm
Destructive command. Are you sure? (y/n) or re-run this command with --force option.
> y
deleting my_wordpress ... done
deleting my_mysql ... done

 「kontena app start」コマンドでは個別のサービスを指定することで、そのサービスだけを起動することも可能だ。

$ kontena app start my_mysql
starting wordpress-my_mysql

ロードバランサとスケーリング

 Kontenaでは、Kontenaクラスタで利用できるロードバランサイメージを公開しており、簡単な設定だけでロードバランサを使った負荷分散/冗長化を行えるようになっている。最後に、このロードバランサの使い方を紹介しておこう。

 ロードバランサを使用するには、kontena.ymlファイルにロードバランサコンテナの設定を追加し、ロードバランス対象となるコンテナで環境変数にロードバランスのための各種パラメータおよびリンク設定を追加すれば良い。

 たとえば先のWordPressおよびMySQLを使った構成の場合、kontena.ymlファイルは以下のようになる。

---
version: '2'
name: wordpress
services:
  internet_lb:
    image: kontena/lb:latest
    affinity:
      - node==centos12
    ports:
      - 80:80
  my_mysql:
    extends:
      file: docker-compose.yml
      service: my_mysql
  my_wordpress:
    extends:
      file: docker-compose.yml
      service: my_wordpress
    environment:
      WORDPRESS_DB_HOST: ${project}-my_mysql.kontena.local
    links:
      - internet_lb

 ここで太字の部分が新たに追加したものだ。追加した「internet_lb」がロードバランサとして実行されるサービスとなり、このサービスに対してリンクを行ったサービス(ここではmy_wordpressサービス)がロードバランシングされる対象のサービスとなる。また、「affinity:」設定で「- node==centos12」と指定することで、このロードバランサは「centos12」というノード上で実行されるようになる。

 なお、ロードバランサのデフォルト設定ではHTTPについてロードバランスを行うようになっているため、ここでは特に追加の設定はおこなっていない。HTTP以外のロードバランスを行う場合の設定についてはオンラインドキュメントを参照してほしい。

 この設定でコンテナをデプロイすると、ロードバランサ経由で指定したコンテナ(ここでは「my_wordpress」コンテナ)にアクセスが可能になる。

$ kontena app deploy
Not found any service with build option
creating internet_lb
creating my_mysql
creating my_wordpress
deploying internet_lb ... done
deploying my_mysql ... done

 正しくロードバランシングが行われているかを確認するため、my_wordpressコンテナの稼働数を増やし、実際にアクセスが振り分けられているかを確認してみよう。まず、「kontena app scale」コマンドで「my_wordpress」サービスのインスタンスを2に設定する。

$ kontena app scale my_wordpress 2

 この状態で「kontena app ls」コマンドを実行すると、「INSTANCES」の値が「2/2」になっていることが確認できる。

$ kontena app ls
NAME                           IMAGE                                              INSTANCES       STATEFUL   STATE           PORTS                                             
internet_lb                    kontena/lb:latest                                  1 / 1           no         running         0.0.0.0:80->80/tcp                                
my_mysql                       mysql:5.7                                          1 / 1           no         running                                                           
my_wordpress                   wordpress:4.5-apache                               2 / 2           no         running                                                           

 この状態で、centos12ノードにWebブラウザで数回アクセスした後、「kontena app logs my_wordpress」コマンドでmy_wordpressサービスのログを表示させると、「wordpress-my_wordpress-1」と「wordpress-my_wordpress-2:」の2つのコンテナに対しアクセスが振り分けられていることが分かる。

$ kontena app logs my_wordpress
  
  
2016-08-16T14:31:12.000Z wordpress-my_wordpress-1: 10.81.1.162 - - [16/Aug/2016:14:31:12 +0000] "GET / HTTP/1.1" 200 3839 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7"
2016-08-16T14:31:15.000Z wordpress-my_wordpress-2: 10.81.1.162 - - [16/Aug/2016:14:31:14 +0000] "GET / HTTP/1.1" 200 3839 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7"
2016-08-16T14:34:45.000Z wordpress-my_wordpress-1: 10.81.1.162 - - [16/Aug/2016:14:34:45 +0000] "GET / HTTP/1.1" 200 3839 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7"
2016-08-16T14:34:47.000Z wordpress-my_wordpress-2: 10.81.1.162 - - [16/Aug/2016:14:34:47 +0000] "GET / HTTP/1.1" 200 3839 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.7.7 (KHTML, like Gecko) Version/9.1.2 Safari/601.7.7"

多機能で使いやすいのが特徴、今後の発展にも期待

 Kontenaは2014年にスタートしたプロジェクトでまだ若いプロジェクトだが、現時点で十分に実用的な機能を提供している。また、すでに全世界で2万ノード以上のノードが使われており、開発も活発だ。

 近年ではDockerもクラスタ機能に注力しており、Docker 1.12では容易にDockerクラスタを構築できる「Swarmモード」が搭載された。これにより、Dockerだけでも複数のホスト上でコンテナを動作させ、それらを組み合わせてサービスを提供するような構成が可能である。とはいえ、提供されるクラスタ関連機能としてはまだ最低限であり、セットアップの容易さという点以外では、機能的にはまだKontenaやKuberneteには劣っている状況だ。

 また、KontenaはDockerの技術を使用しているものの、Docker以外のコンテナ実行環境などもサポートできる構造となっている。そのため、将来性についても今のところ不安はない。Dockerベースのコンテナクラスタ環境構築ツールは今後も厳しい競争が予想されるが、Kontenaは現時点でも十分に利用を検討できる環境になっていると言えるだろう。