OpenShift v3 のJBoss Web Server (tomcat7)+MySQL テンプレートの使い方

Tomcat/MySQLのテンプレートを使う場合、少しだけ設定が必要だったのでメモ

やりたいこと

JBoss Web Server (tomcat7)/MySQLのテンプレートを使って簡単なアプリケーションのデプロイ。デプロイするアプリケーションはtomcatのサンプルアプリケーションを利用します。

利用するテンプレート

パラメータ

パラメータ名 備考
APPLICATION_HOSTNAME sample-extdbtest.apps.cloud 公開するときのFQDNを指定
GIT_URI https://github.com/apache/tomcat.git Tomcatのサンプルアプリ

アプリケーションの確認

http://sample-extdbtest.apps.cloud/examples/index.html にアクセスして、以下のページが表示されるはず。だった。。。

<title>Apache Tomcat Examples</title>
</head>
<body>
<p>
<h3>Apache Tomcat Examples</H3>
<p></p>
<ul>
<li><a href="servlets">Servlets examples</a></li>
<li><a href="jsp">JSP Examples</a></li>
<li><a href="websocket/index.xhtml">WebSocket (JSR356) Examples</a></li>
<li><a href="websocket-deprecated">WebSocket Examples using the deprecated
    Apache Tomcat proprietary API</a></li>
</ul>
</body></html>

発生した問題

build

サンプルアプリケーションのタグがmasterではなくtrunkだった。

これは、アプリケーション作成時に設定するパラメータGIT_REFtrunkに設定すれば良い。すでに作成済みのbuildConfigを直接編集してもOK。

  source:
    git:
      ref: trunk
      uri: https://github.com/apache/tomcat.git
    type: Git

編集後、build を実行。

oc start-build jws-app

deploy

ServiceAccount、Secretがない

deploy に失敗するので、oc get events でイベントログを確認したところ、Podの作成にjws-service-accountがないというエラー。 これを解決して、気を取り直して再デプロイするも、今度はVolumeをマウントするのにjws-app-secretがないというエラー。 jws-service-accountとjws-app-secretをhttps://github.com/jboss-openshift/application-templates/blob/master/secrets/jws-app-secret.jsonに使って作成。

oc create -f jws-app-secret.json

設定後、deploy を再実行。

oc deploy jws-app --latest

これで無事にアプリケーションがデプロイできました。

ビルドは一度だけ!

継続的デリバリを実現するための鉄則の一つに「バイナリのビルドは一度だけ!」というものがあります。しかし、ソースコードリポジトリに登録されているソースコードを正として、ビルドやデプロイを行うツールを利用している場合には、この鉄則の実現が難しくなります。

OpenShiftでは、ビルド済みの Docker Image をバージョン管理しているので、「ビルドは一度だけ!」を容易に実現可能です。

ということで、OpenShift v3その実現方法をご紹介します。

「ビルドは一度だけ!」を実現するためのOpenShiftの概念

ImageStream

OpenShiftにデプロイするアプリケーションのDockerイメージへの参照。SCMのブランチのようなイメージで利用可能。

ServiceAccount

OpenShift APIを利用する権限を持つオブジェクト。Podのビルドを実行するsystem:image-builder権限を持つbuilder、Podのデプロイをするsystem:deployer権限をもつdeployer、builder, deployer以外のすべての権限をもつdefaultがある。

手順

アプリケーションの作成

ビルドは一度だけを実現するために元となるプロジェクトとアプリケーションを作成します。

1. テスト用プロジェクト(hello)の作成

oc new-project hello

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

oc new-app https://github.com/akubicharm/php-hello-world.git

3.ルーティングの設定と確認

oc expose service php-hello-world --hostname=php-hello-world.hello.apps.cloud
curl php-hello-world.hello.apps.cloud

Hello World」と出力されれば OK です。

ビルド済みイメージをデプロイするプロジェクト(hello-prod)の作成

OpenShift v3.0.2.0 では、異なるプロジェクトのImageStreamを利用してアプリケーションがデプロイできるようになりました。

1. プロジェクトの作成

oc new-project prod-hello

2. helloプロジェクトのポリシーの確認

oc describe policyBindings :default -n hello

system:image-pullers ロールに Service Account が設定されていません。

RoleBinding[system:image-pullers]:   
                    Role:           system:image-puller
                    Users:          <none>
                    Groups:         system:serviceaccounts:hello
                    ServiceAccounts:    <none>
                    Subjects:       <none>

3.prod-hello プロジェクトに権限の付与

oc policy add-role-to-user system:image-puller system:serviceaccount:prod-hello:default -n hello

prod-helloプロジェクトのdefaultサービスアカウントにimage-pullerロールが付与されました。これでprod-helloプロジェクトはアプリケーションのデプロイ時にhelloプロジェクトのImageStreamを利用することができるようになります。

RoleBinding[system:image-pullers]:   
                    Role:           system:image-puller
                    Users:          <none>
                    Groups:         system:serviceaccounts:hello
                    ServiceAccounts:prod-hello/default
                    Subjects:       <none>

ビルド済みイメージからのアプリケーションのデプロイ

1. テスト用プロジェクトからテンプレート作成

helloプロジェクトからアプリケーションのテンプレートを作成します。ビルドは行う必要がないので、buildConfigはエクスポート対象から除外し、deploymentConfig, service, route のみをエクスポートします。

oc export deploymentConfig,service,route -o yaml --as-template=php-hello-world > prod-php-hello-world.yaml

テンプレートの ImageStreamのタグとルーティングの設定を編集します。

perl -i -pe 's/name: php-hello-world:latest/name: php-hello-world:prod-hello/g' prod-php-hello-world.yaml
perl -i -pe 's/php-hello-world.hello.apps.cloud/php-hello-world.prod.apps.cloud/g' prod-php-hello-world.yaml

この段階ではhello-prodというタグの付いた php-hello-worldのImageStreamがまだないので、デプロイはされません。

2. プロダクション用プロジェクトへアプリケーションのデプロイ

oc project prod-hello
oc new-app -f prod-php-hello-world.yaml

3. ImageStream の確認

oc project hello
oc get imageStream
oc describe is php-hello-world
Name:           php-hello-world
Created:        28 minutes ago
Labels:         app=php-hello-world
Docker Pull Spec:   172.30.131.34:5000/hello/php-hello-world

Tag Spec        Created     PullSpec                                Image
latest  <pushed>    26 minutes ago  172.30.131.34:5000/hello/php-hello-world@sha256:a94f7113d501dea557c952886d099b59825ad14e2a3f25aa545fe0311aef7b4c    

4. タグ付け

oc tag hello/php-hello-world@sha256:a94f7113d501dea557c952886d099b59825ad14e2a3f25aa545fe0311aef7b4c prod-hello/php-hello-world:prod

5. デプロイ

oc deploy prod-php-helo-world --latest -n prod-hello

これで、hello プロジェクトで動作確認されたアプリケーションをprod-helloにデプロイすることができました。 この後は、以下の手順を繰り返すことで「ビルドは一度だけ!」を実現できるようになります。

  1. ソースコードの変更
  2. hello プロジェクトのビルド
  3. hello プロジェクトでのテスト
  4. 最新のイメージへのタグ付け

f:id:akubicharm:20150930022657p:plain

修正履歴

  • [2015/10/21] oc tag の第2引数を修正しました。他のプロジェクトで作成されたイメージを利用するには、[MyProjectName]/[Image Stream]:[tag] とする必要があります。

覚書 - Vagrant/VirtualBox On Mac での色々

環境

vagrant 1.7.4

Virtualbox 5.0.3

ゲストOSのネットワークアダプタは、NATとホストオンリーネットワーク

 

ホストOSの設定

ホストオンリーネットワークを利用するために、vboxnetX を作成。ゲストOSはIPを固定にするので、DHCPは無効

VirtualBox - ネットワークの設定

アダプター(例)

ゲストOSを 192.168.232.0/24 のネットワークに接続する場合

  • IPv4アドレス : 192.168.232.1
  • IPv4ネットマスク: 255.255.255.0

ゲストOSの設定

DNSの設定

NATは10.0.2.15 になっている。ホストOSをDNSサーバに見立てる場合は、ifcfg-ethxxx(NAT側のアダプタ)に

DNS1=10.0.2.3

を追加する。

こうすれば、ホストOSがどのネットワークに接続されているかを気にすることなく、名前解決が可能になる。

 

覚書 - コンテナの名前解決のトラブルシューティング

OpenShiftのビルド用コンテナからgithub.comなどが見えない場合

Docker 内で名前解決ができていない場合は、dockerデーモンのオプションで明示的にDNSサーバを指定すれば良い。

ex) --dns 8.8.8.8

Docker内で名前解決が行われない場合の対処法 - Qiita

 

デプロイ対象のテンプレートアプリケーションをDockerで動かす

docker run -it openshift3/nodejs-010-rhel7  /bin/sh

ここで、名前解決できるか確認すれば OK

覚書-OpenShift内部の使用リソースの除去(Pruning)

パッとわかりにくかったので、備忘録として。

OpenShiftには、不要になったリソースを除去するためのCLIのコマンドがあります。対象となるリソースは、builds, deploymentsとimagesです。

builds - Docker Build, S2I Build, Custom Buildを実行するために生成されるオブジェクト。ビルドの度に生成されるので、何度もビルドをしていると溜まっていきいます。

deployments - デプロイを実行するためにに生成されるオブジェクト。

images - ビルドの結果生成さ、OpenShift内部に保存されるDocker Image。

builds, deployments はマニュアルに記載の通り system:admin というシステムアカウントで実行すれば、除去することができます。

$ oadm prune builds
$ oadm prune deployments

ですが、images の除去はちょっと違います。

$ oadm prune images
error: You must use a client config with a token

OpenShiftのユーザとしてログインしてから実行する必要がありますが、ここで準備が必要になります。通常のユーザには、system:image-prunerの権限がありません。 まず、OpenShiftの管理者でユーザ(ここではjoe)に system:image-pruner の権限を付与します。

$ oadm policy add-cluster-role-to-user system:image-pruner joe
$ oc login --username joe
$ oadm prune images
Dry run enabled - no modifications will be made. Add --confirm to remove images

Deleting registry layer blobs ...
BLOB
sha256:ddf7338aedaa23ecb45fe7adc222ee367bf822a8fe576e1ef02566a75ba07c2d
sha256:51352e3baedfe18f25986f24992fd79b403885301477ba28d293bb9ea1b177d9
sha256:1986487abec7fd451a1247e4ff522103b37d3f184758fb701518e44d8ef619a8
sha256:162699bb928f7acb06ece7a699006cc71aa18c08045d7bcc7075381a36c2962d
sha256:ae823ba6c0be979b400879198a21b8c629a7933d1c24c166ff4f546a214063c5

Deleting images from OpenShift ...
IMAGE
sha256:4d3785ddc85f1c53105b54792a23ee4c4ccf6e27cf4f1dcb597094d8d182a345

詳細は、Administrator Guide[1]をご参照ください。

[1]https://access.redhat.com/documentation/en/openshift-enterprise/version-3.0/openshift-enterprise-30-administrator-guide#pruning-resources

RHEL7のIPアドレスの割り当てをDHCPから固定アドレスに変更する方法

すぐに忘れちゃうので、自分用にメモ

Networkscripts の変更

[/etc/sysconfig/network-scripts/ifcfg-eth0]

BOOTPROTO を dhcp から static に変更する
BOOTPROTO="static"

 

DNS設定を追加する
NETMASK="255.255.255.0"
GATEWAY="10.208.81.3"
IPADDR="10.208.81.237"
DNS1="10.208.81.237"
SEARCH="example.com"
DNS2="10.208.81.1"

 

 

FQDNの変更

[/etc/hosts] を編集する

[/etc/hostname]を編集する

hostnamectl コマンドでホスト名を設定する

 hostnamectl --static set-hostname  ose3b3-master

hostname, hostname -f コマンドで確認する

systemctl restart systemd-hostnamed

 

http://sharadchhetri.com/2014/09/27/set-hostname-fqdn-centos-7-rhel-7/

 

 

 

Openshift Origin v0.4.3のWebUI - クリックでアプリケーション作成

OpenShift Origin v0.4.3 をインストールしてみたら、「Create+」というボタンがついていました。何ができるのかなと試してみたところ、CLIではなくWebの管理画面からアプリケーションをデプロイすることができました。

Web画面で選択できるアプリケーションは、OpenShift に予め登録されたアプリケーションテンプレートです。

将来的にはWeb Hosting | OpenShift Hubからアプリケーションを入手して作成するということもできるようになるのでしょう。

今回は、アプリケーションテンプレートの登録方法とこの機能の利用方法を、OpenShift v3 beta (v0.4)を試す - akubicharm’s blog で作成した panda ユーザを使ってご紹介します。

ユーザとプロジェクト

ユーザの準備

[root@local] # useradd panda

プロジェクトの作成

管理コンソールでの指示に従って、プロジェクトの作成とポリシーの設定をします。

ユーザ panda
プロジェクト demo
[root]# openshift ex new-project demo --admin=panda
[root]# openshift ex policy add-role-to-user admin panda -n demo

テンプレート

ここではシンプルなアプリケーションを作成するテンプレート(akubicharm/openshift-v3-application · GitHubの hello-pod-temlate.json)を利用します。

テンプレートの登録

-f オプションでテンプレートを指定し、-n オプションでプロジェクトを指定します。

[root]# osc create -f hello-pod-template.json -n demo
templates/hello-pod-template
[root]# osc get template -n demo
NAME                 DESCRIPTION   PARAMETERS    OBJECTS
hello-pod-template                 0 (all set)   1

テンプレートは panda ユーザでも登録することが出来ます。 pandaユーザで demo プロジェクトでの操作ができるように osc login コマンドでログインします。ログイン時に -n オプションで demo プロジェクトを指定していますので、osc create 実行時は -n オプションは不要です。

[root]# su - panda
[panda]$ osc login -u panda -p panda -n demo
[panda]$ osc create -f hello-pod-template.json
テンプレートでの定義内容

テンプレートではアプリケーション作成時に指定可能なパラメータを定義しておくことも可能ですが、今回は単純なテンプレートなので、パラメータの定義はありません。

メタデータセクション この定義の名称などを定義します。
name": "hello-pod-template"
テンプレート定義セクション テンプレートの情報を定義します
"kind": "Template",
"apiVersion": "v1beta1",
"description": "Hello Pod Template",
アイテムズセクション 通常のアプリケーション定義。ポートのマッピングなどを定義します
"ports": [{
  "hostPort": 6061,
  "containerPort": 8080
}]

アプリケーションの作成

  1. ログイン
    panda/panda でログインします。

    f:id:akubicharm:20150416212910p:plain

  2. プロジェクトの選択
    「demo」プロジェクトを選択します。

    f:id:akubicharm:20150416213029p:plain

  3. 作成開始
    画面右上の「Create+」ボタンをクリックして、アプリケーションの作成を開始します。

    f:id:akubicharm:20150416212959p:plain

  4. テンプレートの選択
    「Browse all templates...」ボタンをクリックすると、テンプレート選択画面が表示されます(まだ、一つしかテンプレートを登録していないので寂しい…)。ここで「hello-pod-template」を選択すると、確認のダイアログが表示されます。ここで「Select template...」ボタンをクリックしてテンプレートの選択を確定します。

    f:id:akubicharm:20150416213141p:plain

  5. アプリケーションの作成
    画面下部の「Create」ボタンをクリックするとアプリケーションの作成が始まります。成功を示すポップアップが表示されたら完成です。

    f:id:akubicharm:20150416213441p:plain

    f:id:akubicharm:20150416213615p:plain

hello-openshift アプリケーションは、コンテナの8080ポートをローカルホストの6061ポートにマッピングしているのでhttp://localhost:6061にアクセスすると"Hello OpenShift!"と表示されます。

[root]# curl http://localhost:6061
Hello OpenShift!