めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

OpenShift OriginによるDockerイメージ管理(5)〜複数コンテナの連携設定

はじめに

enakai00.hatenablog.com

上記の記事では、node.jsのアプリケーションイメージをS2Iでビルドしました。この時、バックエンドDBとして、テスト用の組み込みDBを使いましたが、ここでは、別コンテナで起動したMySQLを使用するように変更してみます。上記の記事の手順が完了した状態から、次のコマンドでデプロイ設定を削除して、アプリケーションを一旦停止しておきます。

# oc delete dc etherpad-lite

この時、サービスとルーティングは削除されない点に注意してください。これまで、デプロイ設定でコンテナを起動してから、サービスとルーティングを設定していましたが、実は、この順序は自由です。先にサービスとルーティングを定義しておいて、後から、デプロイ設定を投入してコンテナを起動も正しく動作するようになっています。特に、先にサービスを定義しておくと、他のコンテナからアクセスするための内部IPアドレスが先に確定できるというメリットがあります。

テンプレートの活用

MySQLのコンテナを用意するには、これまでと同様に一連の「イメージストリーム」「ビルド設定」「デプロイ設定」「サービス設定」を定義する必要がありますが、OpenShiftの環境では、「openshift」という名称のプロジェクト内において、典型的なアプリケーションの設定一式が「テンプレート」として登録されているので、これを利用することが可能です。テンプレートの一覧は次のコマンドで確認します。

# oc get -n openshift template
NAME                        DESCRIPTION                                                                        PARAMETERS        OBJECTS
cakephp-example             An example CakePHP application with no database                                    14 (8 blank)      5
cakephp-mysql-example       An example CakePHP application with a MySQL database                               14 (3 blank)      7
dancer-example              An example Dancer application with no database                                     7 (4 blank)       5
dancer-mysql-example        An example Dancer application with a MySQL database                                13 (4 blank)      7
django-example              An example Django application with no database                                     12 (9 blank)      5
django-psql-example         An example Django application with a PostgreSQL database                           12 (4 blank)      7
jenkins-ephemeral           Jenkins service, without persistent storage. WARNING: Any data stored will be...   2 (all set)       3
jenkins-persistent          Jenkins service, with persistent storage.                                          3 (all set)       4
logging-deployer-template   Template for deploying everything needed for aggregated logging. Requires clu...   19 (10 blank)     1
metrics-deployer-template   Template for deploying the required Metrics integration. Requires cluster-adm...   9 (1 blank)       1
mongodb-ephemeral           MongoDB database service, without persistent storage. WARNING: Any data store...   5 (3 generated)   2
mongodb-persistent          MongoDB database service, with persistent storage. Scaling to more than one r...   6 (3 generated)   3
mysql-ephemeral             MySQL database service, without persistent storage. WARNING: Any data stored...    4 (2 generated)   2
mysql-persistent            MySQL database service, with persistent storage. Scaling to more than one rep...   5 (2 generated)   3
nodejs-example              An example Node.js application with no database                                    11 (8 blank)      5
nodejs-mongodb-example      An example Node.js application with a MongoDB database                             11 (3 blank)      7
postgresql-ephemeral        PostgreSQL database service, without persistent storage. WARNING: Any data st...   4 (2 generated)   2
postgresql-persistent       PostgreSQL database service, with persistent storage. Scaling to more than on...   5 (2 generated)   3
rails-postgresql-example    An example Rails application with a PostgreSQL database                            15 (3 blank)      7

ここでは、「mysql-ephemeral」を利用することにします。次のコマンドで、テンプレート内の設定をまとめてYAMLファイルに書き出すことができます。

# oc process -o yaml openshift//mysql-ephemeral > mysql-ephemeral.yml

このファイルをエディターで開くと、各種設定がまとめて用意されていることが分かります。特にこのイメージは、コンテナ起動時の環境変数によって、自動的にDBの初期設定が行えるようになっています。「mysql-ephemeral.yml」の下記の部分に、MySQLにアクセスするユーザー、パスワード、そして、Etherpad-Liteで使用するDB名を書き込んで置きます。

          - name: MYSQL_USER
            value: epuser
          - name: MYSQL_PASSWORD
            value: eppassw0rd
          - name: MYSQL_DATABASE
            value: epdb

次のコマンドで設定を投入すると、MySQLのコンテナのデプロイが開始します。しばらく待つと、「mysql-1-*」という名称のPodが起動します。

# oc create -f mysql-ephemeral.yml 
service "mysql" created
deploymentconfig "mysql" created

# oc get pod
NAME                    READY     STATUS      RESTARTS   AGE
mysql-1-d133d           1/1       Running     0          5m
nodejs-base-1-build     0/1       Completed   0          2h

また、このコンテナにアクセスするためのサービスは次のように定義されています。

# oc get service
NAME            CLUSTER_IP      EXTERNAL_IP   PORT(S)    SELECTOR                         AGE
etherpad-lite   172.30.14.201   <none>        9001/TCP   deploymentconfig=etherpad-lite   30m
mysql           172.30.86.51    <none>        3306/TCP   name=mysql                       12m

この例では、「172.30.86.51:3306」で、MySQLに接続可能です。ただし、IPアドレスを直指定する必要はありません。サービスが定義された状態で新たなコンテナを起動すると、サービスに対応する環境変数が自動設定されるようになっています。いまの場合は、たとえば、次のような環境変数が設定されます。

MYSQL_SERVICE_HOST=172.30.86.51
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_PORT_MYSQL=3306

そこで、アプリケーションの起動スクリプトにおいて、これらの環境変数から接続先のDBを設定するように作っておきます。ここでは、下記のブランチ「openshift_1.5.7_mysql」に、そのようなS2Iビルドスクリプトを用意しておきましたので、これを利用します。

enakai00/etherpad-lite(openshift_1.5.7_mysql)

まず、前回の記事で用意したビルド設定のスクリプトのおいて、source.git.refを「openshift_1.5.7_mysql」に修正します。

etherpad-lite_bc.yml

apiVersion: v1
kind: List
items:
- apiVersion: v1
  kind: ImageStream
  metadata:
    name: etherpad-lite
  
- apiVersion: v1
  kind: BuildConfig
  metadata:
    name: etherpad-lite
  spec:
    output:
      to:
        kind: ImageStreamTag
        name: etherpad-lite:latest
    source:
      git:
        uri: https://github.com/enakai00/etherpad-lite.git
        ref: openshift_1.5.7_mysql
      type: Git
    strategy:
      sourceStrategy:
        from:
          kind: ImageStreamTag
          name: nodejs-base:latest
      type: Source
    triggers:
    - imageChange: {}
      type: ImageChange

次のコマンドでビルド設定を入れ替えて、再度、ビルド処理を行ないます。

# oc replace -f etherpad-lite_bc.yml 
imagestream "etherpad-lite" replaced
buildconfig "etherpad-lite" replaced

# oc start-build etherpad-lite
etherpad-lite-2

# oc logs -f build/etherpad-lite-2
I0103 09:55:00.238940       1 sti.go:163] The value of ALLOWED_UIDS is [1-]
I0103 09:55:00.248894       1 docker.go:230] Pulling image 172.30.84.64:5000/project01/nodejs-base@sha256:ed8a1c57bee0ea10a4be3fc84bc4cd11fc87b28b3caa949e6af1bc76b5f02132
...

ビルドが完了してたら、再度、デプロイ設定を投入して、アプリケーションを起動します。

# oc create -f etherpad-lite_deploy.yml 
deploymentconfig "etherpad-lite" created
Error from server: services "etherpad-lite" already exists
Error from server: routes "etherpad-lite-route" already exists

サービスとルーティングの設定も同時に含むファイルを使っているので、エラーが出ていますが、デプロイ設定については、正しく設定されているので問題ありません。etherpad-liteのPodが起動するまでしばらく待ちます。

# oc get pod
NAME                    READY     STATUS      RESTARTS   AGE
etherpad-lite-1-8m5pk   1/1       Running     0          28s
etherpad-lite-1-build   0/1       Completed   0          1h
etherpad-lite-2-build   0/1       Completed   0          3m
mysql-1-d133d           1/1       Running     0          44m
nodejs-base-1-build     0/1       Completed   0          1h

http://eplite.project01.oso.example.com」にアクセスすると、Etherpadが利用できるようになっています。

GUIコンソールの利用

これまで、あえて、すべての作業をCLIから行ってきました。設定の投入や変更についてはCLIを用いた方が便利ですが、既存の設定の確認については、GUIを用いた方が便利な場合もあるでしょう。たとえば、次は、Podの一覧を表示した例になります。