はじめに
上記の記事では、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が利用できるようになっています。