目的
Red Hat OpenShiftは生のKubernetesに比べてアプリケーションデプロイのための豊富なオプションが用意されています。私自身の学習と備忘を兼ねてさまざまなデプロイを試してみます。IBMによる買収を記念して?アプリケーションはWebSphere Libertyをランタイムとして使用します。
アプリケーションは何でもいいので下記サイトのSampleWebAppを使わせて頂きました。
https://www.middlewareinventory.com/blog/sample-web-application-war-file-download/
初級編 Dockerイメージを利用する
生Kubernetesから入った人なら一番わかりやすいやり方でしょう。コンテナレジストリにあるあらかじめビルドされたイメージを使ってデプロイします。
環境
OpenShiftクラスター | イメージレジストリ |
---|---|
IBM Cloud Red Hat OpenShift Cluster | IBM Cloud Container Registry |
イメージのビルドと登録
Dockerfileを準備します。
FROM icr.io/ibm/liberty:microProfile3
RUN wget --directory-prefix=/config/dropins https://github.com/AKSarav/SampleWebApp/raw/master/dist/SampleWebApp.war
イメージをビルドしてレジストリに登録します。
$ ns=${名前空間}
$ ibmcloud login
$ ibmcloud cr region-set ap-north
$ ibmcloud cr namespace-add ${ns}
$ ibmcloud cr build --tag jp.icr.io/${ns}/openshift-liberty .
無事登録されたことを確認します。
$ ibmcloud cr images | grep openshift-liberty
jp.icr.io/${ns}/openshift-liberty latest 31507da4964d ${ns} 1 minute ago 206 MB No Issues
OpenShiftプロジェクトの作成
OpenShiftのプロジェクトを作成します。合わせてContainer Registryからイメージをプルするための設定も行います。
$ project=${プロジェクト}
# プロジェクト作成
$ oc new-project ${project}
# Container RegistryのPullシークレットをプロジェクトにコピー
$ oc get secret default-jp-icr-io -n default -o yaml | sed "s/default/${project}/g" | oc create -n ${project} -f -
# Pullシークレットをdefaultサービスアカウントに設定
$ oc secrets add serviceaccount/default secrets/${project}-jp-icr-io --for=pull
# LibertyイメージのUSER 1001で実行を許可(注1)
$ oc patch scc nonroot -p 'priority: 5'
$ oc adm policy add-scc-to-user nonroot -z default
(注1)OpenShiftはデフォルトではイメージのUSER指定を使わないという特性があります。一方LibertyのイメージはUSER 1001で動作することを前提としているため、OpenShift上では正しく動作しないところがあります。回避する方法もあるのですが、今回はイメージのUSER指定を使うように設定を変更しています。このあたり、どうするのがベストなのか、IBMさん教えて欲しいところです。
イメージのインポート
コンテナレジストリのイメージをそのまま使ってデプロイもできますが、OpenShiftらしさを考えて、今回はイメージストリームを使います。
$ oc import-image openshift-liberty-docker --from jp.icr.io/${ns}/openshift-liberty --confirm
アプリケーションのデプロイ
それではアプリケーションをデプロイします。
$ oc new-app --name openshift-liberty-docker -i openshift-liberty-docker
そして公開します。
$ oc expose svc/openshift-liberty-docker
動作確認
# URLを確認
$ oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
openshift-liberty-docker openshift-liberty-docker-#####.#######-################################-####.jp-tok.containers.appdomain.cloud openshift-liberty-docker 9080-tcp None
# インターネット側からアクセスできることを確認
$ curl -s openshift-liberty-docker-#####.#######-################################-####.jp-tok.containers.appdomain.cloud/SampleWebApp/
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>SampleWebApp</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h2>Sample Web Application To Deploy and Test</h2>
<br>
<div> click <a href="SnoopServlet">Click to Invoke a SnoopServlet</a></div>
<br>
<br>
</body>
</html>
とりあえず動きましたね。次回以降もさまざまな方法を試してみたいと思います。