ビルドは一度だけ!
継続的デリバリを実現するための鉄則の一つに「バイナリのビルドは一度だけ!」というものがあります。しかし、ソースコードリポジトリに登録されているソースコードを正として、ビルドやデプロイを行うツールを利用している場合には、この鉄則の実現が難しくなります。
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/
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 }] |
アプリケーションの作成
- ログイン
panda/panda でログインします。
- プロジェクトの選択
「demo」プロジェクトを選択します。
- 作成開始
画面右上の「Create+」ボタンをクリックして、アプリケーションの作成を開始します。
- テンプレートの選択
「Browse all templates...」ボタンをクリックすると、テンプレート選択画面が表示されます(まだ、一つしかテンプレートを登録していないので寂しい…)。ここで「hello-pod-template」を選択すると、確認のダイアログが表示されます。ここで「Select template...」ボタンをクリックしてテンプレートの選択を確定します。
- アプリケーションの作成
画面下部の「Create」ボタンをクリックするとアプリケーションの作成が始まります。成功を示すポップアップが表示されたら完成です。
hello-openshift アプリケーションは、コンテナの8080ポートをローカルホストの6061ポートにマッピングしているのでhttp://localhost:6061にアクセスすると"Hello OpenShift!"と表示されます。
[root]# curl http://localhost:6061 Hello OpenShift!
OpenShift v3 beta (v0.4)を試す
暫くアップデートしていなかったので、最新版はどうかなということで試してみました。
#日々、こまごまと変化しており、4/12にcloneしたソースコードとすでに変わってます。。。
環境構築
仮想OS の起動
Release v0.4.3 のソースコードアーカイブでは hack/build-go.sh がうまく行かなかったので、素直に git clone で最新のソースコードを取得すること方が良さそうです。
手順は以下の通りです。
(1) git clone https://github.com/openshift/origin.git
(2) cd <ローカルのクローンしたディレクトリ>
(3) vagrant up で、仮想OS の起動
(5) cd /data/src/github.com/openshift/origin; hack/build-go.sh
※/data/src/github.com/openshift/origin にホストOSのクローンしたディレクトリがマウントされています。
(6) sudo systemctl start openshift
インストールの詳細はOpenShift v3 beta1 を試す - akubicharm’s blog を見てください。(ただし、GUI モードだとちゃんと動作しないので、GUIパッケージのインストールと有効化はやらないでください)
動作確認
systemd の状態を確認すると、以下のようにpublic-master=https://10.0.2.15:8443 とNATのアドレスの 8443 ポートで管理コンソールが動作するようになっています。
[root@openshiftdev etc]# systemctl status openshift
● openshift.service - OpenShift
Loaded: loaded (/usr/lib/systemd/system/openshift.service; disabled)
Active: active (running) since Sun 2015-04-12 14:58:16 UTC; 45min ago
Docs: https://github.com/openshift/origin
Main PID: 18782 (openshift)
CGroup: /system.slice/openshift.service
├─18782 /data/src/github.com/openshift/origin/_output/local/go/bin/openshift start --public-master=https://10.0.2.15:8443
└─18822 journalctl -f
8443ポートはポートフォワーディングの設定がされているので、ホストOS のブラウザかで https://localhost:8443/console へアクセスすると、管理コンソールらしき画面が表示されます。
しかし、、、。ログイン画面は public-master で指定された URL にフォワードされるので NAT のアドレスになっていると、ホストOSのブラウザからはアクセスできません。
そこで、/usr/lib/systemd/system/openshift.service の起動オプションを次のように変更します。
[Unit] Description=OpenShift After=docker.service Requires=docker.service Documentation=https://github.com/openshift/origin [Service] Type=simple EnvironmentFile=-/etc/profile.d/openshift.sh #ExecStart=/data/src/github.com/openshift/origin/_output/local/go/bin/openshift start --public-master=https://10.0.2.15:8443 ExecStart=/data/src/github.com/openshift/origin/_output/local/go/bin/openshift start --public-master=https://localhost:8443 [Install] WantedBy=multi-user.target
OpenShift を再起動します。
systemctl restart openshift
管理コンソールへのログイン
これで、ホストOSのブラウザで管理コンソールが表示されました。
admin/admin でログインでログインすることができます。
管理コマンドの利用
プロジェクトを作成しアプリケーションをデプロイする前に、環境変数を変更します。KUBERNETES_MASTER=http://localhost:8080
となっていますが、https://localhost:8443 で起動するようになっていますので、OpenShift v3 beta1 を試す - akubicharm’s blog と同様に環境変数を変更します。
export KUBECONFIG=/openshift.local.certificates/admin/.kubeconfig export KUBERNETES_MASTER=https://localhost:8443 export CURL_CA_BUNDLE=/openshift.local.certificates/admin/root.crt export CERT_DIR=/openshift.local.certificates/master
これで osc コマンドが使えるようになりました。osc status で確認すると次のように出力されます。
[root@openshiftdev ~]# osc status
In project default
service kubernetes (172.30.0.2:443 -> 443)
service kubernetes-ro (172.30.0.1:80 -> 80)
To see more information about a service or deployment config, use 'osc describe service <name>' or 'osc describe dc <name>'.
You can use 'osc get pods,svc,dc,bc,builds' to see lists of each of the types described above.
ローカルの Docker Registoryの作成
/data/src/github.com/openshift/origin/examples/sample-app/pullimages.shで Docker Image をダウンロード
[root@openshiftdev sample-app]# openshift ex registry --create --credentials=/openshift.local.certificates/openshift-registry/.kubeconfig --images=openshift/docker-registry:latest
services/docker-registry
deploymentConfigs/docker-registry
[root@openshiftdev sample-app]# osc get services
NAME LABELS SELECTOR IP PORT(S)
docker-registry docker-registry=default docker-registry=default 172.30.96.26 5000/TCP
kubernetes component=apiserver,provider=kubernetes <none> 172.30.0.2 443/TCP
kubernetes-ro component=apiserver,provider=kubernetes <none> 172.30.0.1 80/TCP
確認は example/sample-app/README.md ではcurl `osc get service docker-registry --template="{{ .portalIP }}:{{ .port }}"`と書いてありますが、ポート番号の表記方法が異なるため、この方法では確認ができません。
[root@openshiftdev ~]# osc get services | grep registry
docker-registry docker-registry=default docker-registry=default 172.30.136.235 5000/TCP
[root@openshiftdev ~]# curl 172.30.136.235:5000
"docker-registry server (dev) (v0.9.0)"
プロジェクトの作成
[root@openshiftdev sample-app]# openshift ex new-project test --display-name="OpenShift 3 Sample" --description="This is an example project to demonstrate OpenShift v3" --admin=panda
[root@openshiftdev ~]# osc login -u panda -p panda
Login successful.
Using project "test"
[root@openshiftdev ~]# osc project test
Now using project "test" on server "https://10.0.2.15:8443"