Hello world, OpenShift v3

OpenShift v3 で Hello world するための簡易手順です。

OpenShiftをテストするには、vegrantやdockerイメージを使うことも可能ですが、今回はシンプルにローカルで稼働させます。テストしているのは、以下の環境です。Linux上でgo(v1.4以降)とdocker(v1.7以降)のインストールが必要になります。

- Fedora 21,22,23
- RHEL 7.1
- CentOS 7.1 (docker-1.7.1-108.el7.centos.x86_64/go1.4.2)
- Ubuntu 14.04 (docker 1.8.1/go1.4)

OpenShift v3 ローカル起動
---------------------

### 1. 事前準備

go1.4/docker1.7をインストールしてください。
使用するポートは以下になります。http サーバー(port:80)やetcdは停止しておいてください。また、dockerプロセスは予め停止しておいてください。

```
53, 80 443 4001 7001 8443
```

### 2. OpenShift (Origin) のソースコードを clone

```
cd /tmp
git clone https://github.com/openshift/origin.git
```

### 3. ローカルでサーバーを立ち上げるためのスクリプト(openshift-local-setup.sh)をダウンロードして実行

※注: スクリプトの実行はsudoかrootユーザーでお願いします。

```
wget https://raw.githubusercontent.com/nak3/openshift-local-setup/master/openshift-local-setup.sh
[root]# bash openshift-local-setup.sh
```

### 4. 別のターミナルウィンドウを開いて、3.の最後に出力されたコマンドをコピペして実行

例:```
$ export PATH="/tmp/origin/_output/local/go/bin/:$PATH"
$ alias oc="oc --config=/tmp/origin/openshift.local.config/master/admin.kubeconfig"
$ alias oadm="oadm --config=/tmp/origin/openshift.local.config/master/admin.kubeconfig"
$ source /tmp/origin/rel-eng/completions/bash/oc```

### 5. router と docker-registry の Running 状態を確認

```
$ oc get pod
NAME                      READY     STATUS       RESTARTS   AGE
docker-registry-1-0llac   1/1       Running      0          24m
router-1-qs783            1/1       Running      0          24m
```

Hello world, OpenShift v3
-------------

### 1. ログイン & プロジェクトの作成

~~~
$ oadm policy add-role-to-user admin testuser 
※注: 今回はテスト簡易化のために一般ユーザーにadmin権限を追加しています

$ oc login
Username: testuser
Authentication required for https://192.168.133.3: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>

$ oc new-project testproject
Now using project "testproject" on server "https://192.168.133.3:8443".
~~~

### 2. PHP アプリで Hello World 

まずは、PHP を例に作成してみます。

#### 2-1. アプリケーションの作成

~~~
$ oc new-app https://github.com/openshift/sti-php.git --context-dir=5.5/test/test-app -l app=php --strategy=source
imagestreams/sti-php
buildconfigs/sti-php
deploymentconfigs/sti-php
services/sti-php
Build "sti-php" created and started - you can run `oc status` to check the progress.
Service "sti-php" created at 172.30.36.155 with port mappings 8080.
~~~

#### 2-2. ビルドの確認

`$ oc get build` でRunningになってから確認してください。

~~~
$ oc build-logs sti-php-1
I0823 02:20:50.437783       1 builder.go:42] $BUILD env var is {"kind":"Build","apiVersion":"v1","metadata":

...

I0823 02:21:56.607111       1 sti.go:149] Pushing 172.30.107.232:5000/foo/sti-php:latest image ...
I0823 02:23:09.661091       1 sti.go:153] Successfully pushed 172.30.107.232:5000/foo/sti-php:latest
~~~

※注: この時、`Buffering to Disk` で最後のPushがスタックする場合、おそらく環境のリソース不足です。

#### 2-3. ローカルで Hello World

~~~
$ oc get pod
NAME               READY     STATUS       RESTARTS   AGE
sti-php-1-j7mez    1/1       Running      0          29s

$ oc get svc
NAME      CLUSTER_IP      EXTERNAL_IP   PORT(S)    SELECTOR                           AGE
sti-php   172.30.36.155   <none>        8080/TCP   app=php,deploymentconfig=sti-php   3m

$ curl 172.30.36.155:8080 (または、ブラウザでアクセス)
(PHP is working のメッセージ)
~~~

Hello Worldが出力されるかと思ったら、[ここにある](https://github.com/openshift/sti-php/tree/master/5.5/test/test-app)テストアプリがHello Worldではなく、phpinfo()を出力させるものでした。気にしないで進めます。

#### 2-4. 外部ホストから Hello World

※注: 今回は、`/etc/hosts`を使ってテストしていますが、本来は DNS サーバーを使います。

**OpenShift が稼働しているホスト上**

~~~
$ oc expose service sti-php --hostname=hello-php.example.com
NAME      HOST/PORT               PATH      SERVICE   LABELS    TLS TERMINATION
sti-php   hello-php.example.com             sti-php   app=php

$ hostname -i
192.168.122.3
~~~

**テスト用クライアントホスト上**

~~~
# echo "192.168.122.3  hello-php.example.com" >> /etc/hosts

# curl hello-php.example.com (または、ブラウザでアクセス)
(PHP is working)
~~~

## 3. 言語で Hello World

ほぼ全てHello Worldを出力させるサンプルではないですが気にしないでください・・・。 アプリケーション作成時に、`-l app=<ラベル名>` を設定しておけば、後から下のコマンドで一括削除が可能です。

アプリケーション削除方法:

~~~
oc delete all -l app=<ラベル名>
~~~

### 3-1. Python

以下、テスト方法は 2.PHP のテストと同じです。

~~~
oc new-app https://github.com/openshift/sti-python.git --context-dir=3.3/test/standalone-test-app -l app=python --strategy=source
~~~

### 3-2. Ruby

~~~
oc new-app https://github.com/openshift/sti-ruby.git --context-dir=2.0/test/puma-test-app -l app=ruby --strategy=source
~~~

### 3-3. Java EE (Wildfly)

~~~
oc new-app git://github.com/bparees/openshift-jee-sample -l app=wildfly --strategy=source
~~~

### 3-4. Nodejs

~~~
oc new-app https://github.com/openshift/sti-nodejs.git --context-dir=0.10/test/test-app/ -l app=nodejs --strategy=source
~~~

### 3-5. Perl

~~~
oc new-app https://github.com/openshift/sti-perl.git --context-dir=5.20/test/sample-test-app -l app=perl --strategy=source
~~~

今回は、コマンドラインからの手順でしたが、`https://<ホストIP>/8443` にアクセスすれば、`Add to project`からアプリケーションをデプロイすることも可能です。