はじめに
前回はWebLogicからアプリケーションの抽出を行ってみました。
抽出されたファイルは以下の通りになります
- アプリケーションそのもののアーカイブ
- モデルファイル(WebLogic構成のメタデータ)
- モデル内で利用する変数群をまとめたファイル
これらのファイルと、WebLogic Server for OKEを利用すると、簡単にWebLogicアプリケーションのコンテナ化を行うことができます。
WebLogic Server for OKEとは?
WebLogicのアプリケーションを簡単にコンテナ化して、k8s上で運用/管理ができるオファリングです。
Jenkinsによる多数のプリセットジョブを通じて運用するのが大きな特徴で、マネージドk8sクラスタのOKEの上で動作します。
新規アプリケーションのデプロイももちろん可能ですが、基本的には既存アプリケーションの移行が主な用途になります。
前提
WebLogic Server for OKEの最新バージョンを利用します。
この記事は以下のようなバージョンの構成を前提としています。
- WebLogic Server for OKE 23.1.1
- Oracle Linux 7.9
- WebLogic Server 12.2.1.4
- Kubernetes 1.24.1
また、WebLogic Server for OKEのプロビジョニングやドメインの作成に関しては完了しているものとします。
※プロビジョニング/ドメインの作成に関しては別の記事でまとめます。
基本的な流れ
- モデルファイルの編集
- WebLogic Server for OKE環境に各種ファイルをアップロード
-
UpdateDomain
ジョブの実行
モデルファイルの編集
まずはWebLogic構成のメタデータであるモデルファイルを編集します。
yaml内の<>
で囲っている部分は任意のものに適宜読み替えてください。
利用するモデルファイル
前回取得したsource.yaml
を編集します。
domainInfo:
AdminUserName: '@@PROP:AdminUserName@@'
AdminPassword: '@@PROP:AdminPassword@@'
topology:
### 中略 ###
resources:
JDBCSystemResource:
<データソース名>:
Target: <サーバ/クラスタ名>
JdbcResource:
### 中略 ###
appDeployments:
Application:
<アプリ名>:
SourcePath: wlsdeploy/applications/<WAR名>.war
ModuleType: war
Target: <サーバ/クラスタ名>
モデル内、一部フィールドの削除
domainInfo
フィールドとtopology
フィールドを削除します。
resources:
JDBCSystemResource:
<データソース名>:
Target: <サーバ/クラスタ名>
JdbcResource:
### 中略 ###
appDeployments:
Application:
<アプリ名>:
SourcePath: wlsdeploy/applications/<WAR名>.war
ModuleType: war
Target: <サーバ/クラスタ名>
Targetの編集
appDeployments
-> Application
-> アプリ名
-> Target
の値を'<ドメイン名>-cluster'
にします。
アンダースコアではなくてハイフンなので注意。
resources:
JDBCSystemResource:
<データソース名>:
Target: <サーバ/クラスタ名>
JdbcResource:
### 中略 ###
appDeployments:
Application:
<アプリ名>:
SourcePath: wlsdeploy/applications/<WAR名>.war
ModuleType: war
Target: '<ドメイン名>-cluster' #追加
JDBC接続情報の編集
Databaseの接続先に変更がある場合などはJDBC URLなどの変更が必要です。
今回はATPに接続してみようと思うので、ドキュメントを参考にして記述します。以下はJDBCDriverParams
フィールドのみを記載しています。
JDBCDriverParams:
DriverName: oracle.jdbc.OracleDriver
URL: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:url@@'
PasswordEncrypted: '@@SECRET:@@ENV:DOMAIN_UID@@-datasource-secret:password@@'
Properties:
user:
Value: '@@PROP:JDBC.***DB.user.Value@@' #変更
javax.net.ssl.keyStore:
Value: /u01/shared/atp_wallet/keystore.jks #変更
javax.net.ssl.keyStoreType:
Value: JKS
javax.net.ssl.keyStorePassword:
Value: '@@SECRET:@@ENV:DOMAIN_UID@@-keystore-secret:password@@'
javax.net.ssl.trustStore:
Value: /u01/shared/atp_wallet/truststore.jks #変更
javax.net.ssl.trustStoreType:
Value: JKS
javax.net.ssl.trustStorePassword:
Value: '@@SECRET:@@ENV:DOMAIN_UID@@-keystore-secret:password@@'
oracle.net.ssl_version:
Value: '1.2'
oracle.net.ssl_server_dn_match:
Value: true
oracle.net.tns_admin:
Value: /u01/shared/atp_wallet #変更
oracle.jdbc.fanEnabled:
Value: false
JDBC URLなどの値はSecretから取得します。
Walletのダウンロードと併せて、後ほどSecretの作成は行います。
source.properties
の編集
source.yaml
内に'@@PROP:JDBC.<データソース名>.user.Value@@'
といった表記があります。
この書き方は、DBのスキーマなどモデル内の変数を外に出して管理したい場合に有用です。
JDBC.<データソース名>.user.Value=DEMO
ここでは、DBのスキーマをDEMO
とした場合の例を記載しています。
AdminPassword=
など空のままのフィールドがある場合は、使わないので削除してしまっても構いません。
WebLogic Server for OKE環境に各種ファイルをアップロード
移行ファイル群をファイル・ストレージに配置
移行ファイル群(source.zip/source.yaml/source.properties)をAdmin hostの/u01/shared/
に配置します。
以下は一例ですが、SCPコマンドを利用する場合です。
$ scp -o ProxyCommand="ssh -W %h:%p opc@<Bastion_Instance_Public_IP>" \
source.* opc@<Admin_Instance_Private_IP>:/u01/shared/
<Bastion_Instance_Public_IP>
と<Admin_Instance_Private_IP>
はOCIの管理コンソールから確認ができます。
Computeインスタンスの一覧、もしくは
開発者サービス -> リソース・マネージャ -> ジョブ -> 対象のジョブ -> 出力 から確認が可能です。
WalletをWebLogic Server for OKEにダウンロード
AdminインスタンスにSSHログインします。<private_key>
はプロビジョニング時に指定したものを利用してください。
$ ssh -i <private_key> opc@<Admin_Instance_Private_IP> \
-o ProxyCommand="ssh -W %h:%p -i <private_key> opc@<Bastion_Instance_Public_IP>"
SSHでログインしたら、以下のコマンドを実行してください。<Walletパスワード>
は任意のもので構いません(後で利用します)。
$ python /u01/scripts/utils/download_atp_wallet.shutils/oci_api_utils.py <ATPのOCID>
<Walletパスワード> /u01/shared/atp_wallet
UpdateDomain
ジョブの実行
DB接続用Secretの作成
アプリケーションをデプロイする前に、DB接続のためのSecretを作成します。
以下のコマンドを実行します。
$ kubectl create secret generic <ドメイン名>-datasource-secret \
--from-literal=password=<DBパスワード> \
--from-literal=url=jdbc:oracle:thin:@<ATPの接続サービス名> \
-n <ドメイン名>-ns
<ATPの接続サービス名>
はdemodb_tp
のような表記になるはずです。
$ kubectl create secret generic <ドメイン名>-keystore-secret \
--from-literal=password=<Walletパスワード> \
-n <ドメイン名>-ns
JenkinsコンソールでUpdateDomain
の実行
コマンドラインツールを使用して、SOCKSを利用したダイナミックフォワードを行います。
これを行うことで、端末のブラウザからk8sクラスタ内のJenkinsコンソールにアクセスが可能になります。
$ ssh -D 1088 -i <SSH鍵> opc@<Bastion InstanceのパブリックIP>
SOCKSの利用には、ブラウザ単位でSOCKSの設定ができるFireFoxが非常に便利です。
設定 -> ネットワーク設定 -> 接続設定 で設定画面が開けるので、以下のように設定します。
SOCKSの設定を行ったFireFoxからJenkinsのコンソールにアクセスします。
URLはhttp:///<Internal LBのIP>/jenkins/
です。
<Internal LBのIP>
はOCIの管理コンソールから確認ができますし、kubectl
を使った確認も可能です。
<domain>-internal
のEXTERNAL-IP
がその値です。
$ kubectl get svc -n wlsoke-ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
<domain>-internal LoadBalancer **.**.***.** <ここの値> 80:*****/TCP 13d
<domain>-external LoadBalancer **.**.***.** ***.***.***.*** 443:*****/TCP 13d
ユーザ名: admin / パスワード: <ドメイン作成時に指定したパスワード> でログインします。
update domain
ジョブからパラメータ付きビルド
を選択します。
パラメータは以下のように入力し、「ビルド」ボタンをクリックします。
- Domain_Name : ドメイン名
- Archive_Source : Shared File System
- Archive_File_Location : /u01/shared/source.zip
- Domain_Model_Source : Shared File System
- Model_File_Location : /u01/shared/source.yaml
- Variable_Source : Shared File System
- Variable_File_Location : /u01/shared/source.properties
あとはビルドが完了するのを待ちましょう。
環境の確認
アプリケーションはExternal LBのExternal-IPを使ってアクセスができます。
https://<External-IP>/<context-root>
pod
WebLogicのpodが確認できます。例えばwke1
という名前のドメインを作っていると以下のようになります。
$ kubectl get pod -n wke1-ns
NAME READY STATUS RESTARTS AGE
wke1-wke1-adminserver 1/1 Running 0 15h
wke1-wke1-managed-server1 1/1 Running 0 15h
wke1-wke1-managed-server2 1/1 Running 0 15h
管理コンソール
http:///<Internal LBのIP>/<ドメイン名>/console
でWebLogicの管理コンソールにアクセスすることができます。
まとめ
今回はWebLogic Server for OKEを使って、Kubernetesなどをあまり意識せずにアプリケーションをコンテナ化することができました。
実際に、JenkinsのプリセットジョブではふんだんにWebLogic Kubernetes Toolkitが使われていますが、それらのツール群もあまり意識する必要がありません。
環境のセットアップ含め、WebLogicのコンテナ化を比較的簡単に実現ができますので、ご興味があればぜひやってみてください。
参考資料
https://docs.oracle.com/en/cloud/paas/weblogic-container/index.html
https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/view-workshop?wid=721