前回OpenShift Origin v3の最新版の環境を構築したので、アプリケーションを動作させてみます。慣れるとある程度複雑な構成のアプリケーションもコピペ感覚でボコボコ生やすことができて面白いですよ。
OpenShiftのクライアントコマンドであるocのバイナリさえあればOpenShiftへのアクセスできます。通常はこのocコマンドを配布してリモートからOpenShiftを操作するのですが、今回はVagrant環境上でそのまま利用します。ocコマンドにはMacOSX, Windows, Linux版があるのでどのOSでも動作します。
Vagrant環境ではocコマンドが利用する設定ファイルパスを示す環境変数$KUBECONFIGがadminのものに設定されているので、まずはunsetしてまっさらな状態にします。それから、一般ユーザとしてログインします。
$ cd
$ unset KUBECONFIG
$ oc login
Server [https://localhost:8443]:
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): y
Username: nekop
Authentication required for https://localhost:8443 (openshift)
Password:
Login successful.
You don't have any projects. You can try to create a new project, by running
$ oc new-project <projectname>
ユーザ名は何でも構いません。All-in-one環境ではAllowポリシーというザル認証モジュールが設定されているので、どのユーザにどのようなパスワードを入力しても認証が通ります。パスワードが空の場合ははじかれます。
次にプロジェクトを作成します。ここもユニーク値であれば何でも構いません。
oc new-project nekop
次にアプリケーションを作成します。まずはオフィシャルで提供されているSTIビルド (Source to image build, ソースコードからDocker imageをビルドするやつ) のテンプレートで作成します。
oc new-app -f https://raw.githubusercontent.com/openshift/origin/master/examples/sample-app/application-template-stibuild.json
このテンプレートで指定されているアプリケーションのソースコードは https://github.com/openshift/ruby-hello-world で、データベースアクセスを行うRubyのsinatraアプリケーションです。アプリケーション自体は、データベースの接続情報を環境変数から取得する、という点以外はごく一般的なsinatraアプリケーションです。.stiというOpenShift特有のディレクトリがあって説明ドキュメントやデフォルト設定が置いてありますが、これは無くても変わりません。
テンプレートというのは複雑な構成をひとまとめにできる設定です。このテンプレートにはデータベースの設定などが入っているので長くなっています。もちろん、テンプレートを利用しなくてもコマンドをいくつか発行することで同じ構成をマニュアルで作成できるので、見通しをよくするためにテンプレートを利用せずシェルスクリプトにするという方法もあります。
oc new-appを実行すると、必要なDocker imageのpullや、アプリケーションのDocker imageのビルドなどが行われるので、コーヒーを淹れましょう。ビルドの状況の確認にはoc get build, oc build-logs <build name>, oc get eventなどを利用します。
ビルドが完了したら、frontendサービスにアクセス可能になっているはずです。
$ oc get service NAME LABELS SELECTOR IP(S) PORT(S) database template=application-template-stibuild name=database 172.30.247.13 5434/TCP frontend template=application-template-stibuild name=frontend 172.30.90.201 5432/TCP $ curl 172.30.90.201:5432 (長いので省略)
今回はDockerのサービスIPに直接アクセスできる環境でテストしていますが、本来は外部から通常のブラウザでURLアクセスを行えるようにします。このあたりはDNSの設定などが入ってくるので今回のAll-in-oneセットアップでは対象外です。
oc new-appには、github上の通常のアプリケーションのclone URLを指定することもできますし、通常のアプリケーションではなくDockerfileのあるソースツリーも指定できます。また、docker pullのpullspec形式も指定でき、既存のDocker imageをそのままOpenShift上で動作させることもできます。
oc new-app https://github.com/nekop/hello-sinatra # sinatraのhello world oc new-app oc new-app https://github.com/openshift/centos7-wordpress # Dockerfile oc new-app openshift/jenkins-16-centos7 # Docker image pull
どれもビルドが終わればcurlで問題なくアクセスできるはずです。
ocコマンドさえあれば、リモートからOpenShift上のノードのどこかにあるDockerコンテナにexecを発行して操作することもできます。
oc get pod oc exec -it -p <pod-name> bash # sshのようなリモートシェル感覚な接続 pod> ls
一般的なPaaSっぽい機能でいくと、oc scale rc frontend-1 --replicas=8のようにレプリカ増やしてコンテナ分散配置してスケールアウトができます。また、podやDockerコンテナ内のpid=1のプロセスが死んだりしても、検知して勝手に再起動して障害復旧してくれます。ローリングアップデートがサポートされているので、無停止リリースもできます。もちろんロールバックも。
OpenShiftにはアプリケーションの構成を確認するためのWebコンソールが付属しています。Vagrantではポートフォワード設定がされるので、 https://localhost:8443/console/ でアクセスできます。

とりあえず今回はここまで。