OpenShift上のコンテナから外部のDBを参照する
外部のMySQLを準備する
簡単に試すため MySQLのコンテナを利用します。
MySQLの実行
sudo docker pull docker.io/mysql sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
3306ポートの開放
sudo iptables -A OUTPUT -p tcp --dport 3306 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
テーブル作成
MySQLのコンテナに入って、データベースとテーブルを作成します。
docker exec -it <CONTAINER_ID> bash mysql -u root -p Enter password: mysql ←mysqlと入力。パスワードなので表示はされない create database mydb; create table hello ( msg varchar(255) ); insert into hello(msg) values('hello opensihft');
これで、データベースは準備完了です。
アプリケーション作成
MySQLを利用するPHPのアプリケーション作成
ここでは、helloテーブルを参照するように変更したdemoブランチを指定します。
oc new-project extdbtest oc new-app https://github.com/akubicharm/hello-php.git#demo
ルーティングの設定
アプリケーションにFQDNでアクセスするために、ルーティングの設定をします。
oc expose service hello-php --hostname=hello-php.extdbtest.apps.cloud
curl hello-php.extdbtest.apps.cloud
コマンドを実行しても、DBにアクセスできないので警告が表示されます。
これで、外部のDBを参照するアプリケーションは準備完了です。
外部のDBを利用する設定
外部のDBを利用するために、サービスとエンドポイントを定義します。
サービス定義
hello-phpアプリケーションから参照するためのhello-php-mysql-serviceサービスを定義します。 ここでmetadataで指定するnameの値がhello-php-mysql-serviceであることが重要です。index.phpからDBサーバ指定する環境変数と合わせておく必要があります。
サービスのホスト名は、[サービス名を大文字にした文字列]_SERVICE_HOST という命名規則になっています。
- index.phpの抜粋
$mysqli = new mysqli(getenv("HELLO_PHP_MYSQL_SERVICE_HOST"), getenv("MYSQL_USER"), getenv("MYSQL_PASSWORD"), getenv("MYSQL_DATABASE"));
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "hello-php-mysql" }, "spec": { "ports": [ { "name": "mysql", "protocol": "TCP", "port": 3306, "targetPort": 3306, "nodePort": 0 } ] }, "selector": {} }
サービスを作成します。
oc create -f hello-php-mysql-service.json
エンドポイント定義
hello-php-mysql-serviceサービスのエンドポイント(DBサーバ)を定義します。 subsetsで、DBサーバのIPアドレス、ポート番号を指定します。subsets->portsで定義しているname(ここでは、mysql)は、サービスのspecで定義したnameに合わせます。
{ "kind": "Endpoints", "apiVersion": "v1", "metadata": { "name": "hello-php-mysql" }, "subsets": [ { "addresses": [ { "IP": "192.168.232.101" } ], "ports": [ { "port": 3306, "name": "mysql" } ] } ] }
エンドポイントを作成します。
oc create -f hello-php-mysql-endpoint.json
デプロイメントコンフィグの抽出
deploymentConfig(dc)をJSON形式で抽出します。
oc export dc hello-php -o json > hello-php-dc.json
デプロイメントコンフィグの定義
保存したhello-php-dc.jsonを編集し、hello-phpアプリケーションから利用する環境変数名を定義します(65〜78行目)。実際の値はoc env
コマンドで定義します。
- 編集したデプロイメントコンフィグの抜粋
55 "containers": [ 56 { 57 "name": "hello-php", 58 "image": "172.30.131.34:5000/extdbtest/hello-php@sha256:bb766f1c8fc7aab47fce0ce9bccb24e1a18fb692e4c8ddd33c40c994c0587e00", 59 "ports": [ 60 { 61 "containerPort": 8080, 62 "protocol": "TCP" 63 } 64 ], 65 "env": [ 66 { 67 "name": "MYSQL_USER", 68 "value": "${MYSQL_USER}" 69 }, 70 { 71 "name": "MYSQL_PASSWORD", 72 "value": "${MYSQL_PASSWORD}" 73 }, 74 { 75 "name": "MYSQL_DATABASE", 76 "value": "${MYSQL_DATABASE}" 77 } 78 ], 79 "resources": {}, 80 "terminationMessagePath": "/dev/termination-log", 81 "imagePullPolicy": "Always" 82 } 83 ],
デプロイメントコンフィグの更新
デプロイメントコンフィグを更新します。更新するとLATEST VERSIONが1つインクリメントされます。
oc replace --force -f hello-php-dc.json
環境変数の設定
まず、環境変数が設定されていないことを確認します。
oc env dc/hello-php --list
を実行すると、以下のように出力されます。
# deploymentconfigs hello-php, container hello-php MYSQL_USER=${MYSQL_USER} MYSQL_PASSWORD=${MYSQL_PASSWORD} MYSQL_DATABASE=${MYSQL_DATABASE}
oc env
コマンドで環境変数を設定します。
oc env dc hello-php -e MYSQL_USER=root -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=mydb
再度oc env dc/hello-php --list
を実行すると、環境変数が設定されていることを確認できます。
# deploymentconfigs hello-php, container hello-php MYSQL_USER=root MYSQL_PASSWORD=mysql MYSQL_DATABASE=mydb
アプリケーションの確認
curl hello-php.extdbtest.apps.cloud
コマンドを実行すると、以下のように表示されます。
<h1>Hello External DB</h1>array(1) { ["msg"]=> string(15) "hello opensihft" }
設定の詳細はOpenShift v3 Developer GuideChapter 9. Integrating External Services - Red Hat Customer Portalをみてください。
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_REF
をtrunk
に設定すれば良い。すでに作成済みの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にデプロイすることができました。 この後は、以下の手順を繰り返すことで「ビルドは一度だけ!」を実現できるようになります。
- ソースコードの変更
- hello プロジェクトのビルド
- hello プロジェクトでのテスト
- 最新のイメージへのタグ付け
修正履歴
- [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 のネットワークに接続する場合
ゲスト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]をご参照ください。
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/