原文はこちら
https://blogs.oracle.com/weblogicserver/how-to-run-weblogic-clusters-on-the-oracle-cloud-infrastructure-container-engine-for-kubernetes
WebLogicクラスタを実行するためにKubernetes環境をセットアップするには様々な方法があります。Oracleは、本番モードもしくは開発モードのWebLogicクラスタを、オンプレミスもしくはクラウドでKubernetes上で実行したいお客様をサポートします。このエントリでは、Oracle Cloud Infrastructure (OCI) Container Engine for Kubernetesを使用してWebLogicクラスタを実行する手順について説明します。Kubernetesマネージドサービスは、基盤となるOracle Cloud Infrastructure(OCI)と完全に統合されているため、Kubernetesクラスタを簡単にプロビジョニングし、ロードバランサ、ボリューム、ネットワークファブリックなどの必要なサービスを簡単に提供できます。
Prerequisites:
- Dockerイメージ:
- WebLogic Server (weblogic-12.2.1.3:latest).
- WebLogic Kubernetes Operator (weblogic-operator:latest)
- Traefik Load Balancer (traefik:1.4.5)
- Dockerとkubectlのインストール、構成が完了しているワークステーション
- Oracle Container Engine for Kubernetes on OCI。OCIでKubernetesマネージドサービスをセットアップするには、以下のドキュメントに従う。
Overview of Container Engine for Kubernetes
https://docs.us-phoenix-1.oraclecloud.com/Content/ContEng/Concepts/contengoverview.htm
- OCI Container Engine for KubernetesノードにSSHでアクセスできること
- WebLogic Server、Operator、Load BalancerイメージをプッシュするためのOracle Cloud Infrastructure Registry
Overview of Registry
https://docs.us-phoenix-1.oraclecloud.com/Content/Registry/Concepts/registryoverview.htm
Prepare the WebLogic Kubernetes Operator environment
環境準備のために以下を実施する必要があります。
- OCI Container Engine for the Kubernetesクラスタへのアクセス確認ならびにRBACポリシーの設定
- NFSサーバの構成
- OCI Registry (OCIR) へのDockerイメージのアップロード
- OCIRにあるDockerイメージの名前を反映するため、構成YAMLファイルを編集
Test accessibility and set up the RBAC policy for the OKE cluster
OCI Container Engine for Kubernetesノードへのアクセス確認のため、以下のコマンドを実行します。
kubectl get nodes
以下のような出力でノードが表示されるはずです。
NAME STATUS ROLES AGE VERSION
129.146.109.106 Ready node 5h v1.9.4
129.146.22.123 Ready node 5h v1.9.4
129.146.66.11 Ready node 5h v1.9.4
Kubernetesクラスタへのアクセス権限を有するには、OCI Container Engine for Kubernetesクラスタの
cluster-adminとしてご利用のOCIアカウントを認可する必要があります。これにはOCID(OCIコンソールページのユーザー設定の下にあります)が必要です。例えば、OCIDが
ocid1.user.oc1..aaaaaaaac26kw7qvuij7i6fadabklqfb7svyuhpitedmguspv6ht67i5l32qの場合、コマンドは以下のようになります。
kubectl create clusterrolebinding my-cluster-admin-binding --clusterrole=cluster-admin --user=ocid1.user.oc1..aaaaaaaac26kw7qvuij7i6fadabklqfb7svyuhpitedmguspv6ht67i5l32q
Set up the NFS server
現在ご利用いただけるOCI Container Engine for Kubernetesのバージョンでは、ノード間で共有可能なアクセス権RWOnce(一人のみが書き込め、その他は読み取りのみ)のネットワークブロックストレージをサポートします。このとき、WebLogic Server Kubernetes Operatorで作成されたKubernetes上のWebLogicドメインでは、WebLogicドメインの構成を保存するために共有ファイルシステムが必要です。この共有ファイルシステムはノード全体の全てのPodからアクセスできる必要があります。回避策として、NFSサーバを一つのノードにインストールし、全ノード間でファイルシステムを共有する必要があります。
Note: WebLogic Server on OCI Container Engine for Kubernetes上でWebLogic Serverを実行する場合、NFS 3.0を使うことを現状推奨しています。動作確認の間、NFS 4.0を使うとWebLogicドメインのサーバが断続的に障害状態に陥ることがわかりました。服すのスレッドがNFS(デフォルトストア、診断ストア、Node Manager、ロギング、ドメインホーム)を使うため、ファイルストアにアクセスする際に問題があります。これらの問題はNFSのバージョンを3.0にすることで解消されます。
このデモでは、Kubernetesクラスタは以下のIPアドレスを持つノードを利用します。
Node1: 129.146.109.106
Node2: 129.146.22.123
Node3: 129.146.66.11
上記の場合、NFSサーバをNode 1(129.146.109.106)にインストールし、Node 2(129.146.22.123)、Node 3(129.146.22.123)をクライアントとして利用します。各ノードに対応するプライベートIPアドレスを調べるために、各ノードに以下のコマンドを使ってログインします。
ssh -i ~/.ssh/id_rsa opc@[Public IP of Node]
ip addr | grep ens3
~/.ssh/id_rsa はSSHで利用するRSA秘密鍵のパスです。
例えば、Node 1の場合以下のようになります。
ssh -i ~/.ssh/id_rsa opc@129.146.109.106
ip addr | grep ens3
各ノードのプライベートIPアドレスを調べた結果を纏めました。
Nodes: | Public IP | Private IP |
Node1 (NFS Server) | 129.146.109.106 | 10.0.11.3 |
Node2 | 129.146.22.123 | 10.0.11.1 |
Node3 | 129.146.66.11 | 10.0.11.2 |
SSHでNode 1にログインし、NFSをインストール、設定します。
/etc/exports ファイルを編集して、Node 2、Node 3の内部IPアドレスを追加しておきます。
/scratch 10.0.11.1(rw)
/scratch 10.0.11.2(rw)
- sudo su -
- yum install -y nfs-utils
- mkdir /scratch
- chown -R opc:opc /scratch
- systemctl restart nfs
- exit
SSHでNode 2にログインします。
ssh -i ~/.ssh/id_rsa opc@129.146.22.123
Node 1の内部IPを追加するために、 /etc/fstab を編集します。
10.0.11.3:/scratch /scratch nfs nfsvers=3 0 0
- sudo su -
- yum install -y nfs-utils
- mkdir /scratch
- mount /scratch
- exit
Node 3に対しても同様の手順を繰り返します。
ssh -i ~/.ssh/id_rsa opc@129.146.66.11
/etc/fstabを編集し、Node 1の内部IPを追加します。
10.0.11.3:/scratch /scratch nfs nfsvers=3 0 0
- sudo su -
- yum install -y nfs-utils
- mkdir /scratch
- mount /scratch
- exit
Upload the Docker images to the OCI Registry
WebLogic Server 12.2.1.3とWebLogic Kubernetes Operatorに必要なDockerイメージをビルドします。
WebLogic on Docker
https://github.com/oracle/docker-images/tree/master/OracleWebLogic/
Oracle Weblogic Server Kubernetes Operator
https://github.com/oracle/weblogic-kubernetes-operator
TraefikのDockerイメージはDocker HubリポジトリからPullします。以下はその例です。
docker login
docker pull traefik:1.4.5
Dockerイメージに以下のようにタグを付けます。
docker tag [Name Of Your Image For Operator] phx.ocir.io/weblogicondocker/weblogic-kubernetes-operator:latest
docker tag [Name Of Your Image For WebLogic Domain] phx.ocir.io/weblogicondocker/weblogic:12.2.1.3
docker tag traefik:1.4.5 phx.ocir.io/weblogicondocker/traefik:1.4.5
認証トークンを生成して
phx.ocir.ioOCIR Dockerリポジトリにログインします。
OCIダッシュボードにログインし、”User Settings"をクリックした上で、左側のメニューの”Auth Tokens"をクリックします。
生成されたパスワードを安全な場所に保存します。
OCIR Dockerレジストリに以下のコマンドを使ってログインします。
docker login phx.ocir.io
ユーザー名を尋ねてくるので、OCIテナント名/OCIユーザー名を指定します。
docker login phx.ocir.io
Username: weblogicondocker/myusername
Password:
Login Succeeded
Dockerレジストリシークレットを作成します。このシークレット名は小文字のアルファベットもしくは数字で構成されていなければなりません。
kubectl create secret docker-registry <secret_name> --docker-server=<region>.ocir.io --docker-username=<oci_tenancyname>/<oci_username>
--docker-password=<auth_token> --docker-email=example_email
例えば、PHX registry用に
ocisecretというDockerシークレットを作成する場合は以下の通りです。
kubectl create secret docker-registry ocisecret --docker-server=phx.ocir.io --docker-username=weblogicondocker/myusername --docker-password= _b5HiYcRzscbC48e1AZa --docker-email=myusername@oracle.com
DockerイメージをOCIRにPushします。
docker push phx.ocir.io/weblogicondocker/weblogic-kubernetes-operator:latest
docker push phx.ocir.io/weblogicondocker/weblogic:12.2.1.3
docker push phx.ocir.io/weblogicondocker/traefik:1.4.5
OCIコンソールにログインしてイメージを検証します。
- Log in to the OCI consoleにログインし、正しいリージョンを使っていることを確認する(例:us-phoenix-1)
- ContainersからRegistryを選択すると、イメージがRegistryのページで確認できるはず。
- イメージ名をクリックし、”Actions"を選択して”Public"に変更
Modify the configuration YAML files to reflect the Docker image names in the OCIR
最終ステップでは、入力ファイルのパラメータをカスタマイズし、WebLogic cluster、WebLogic OperatorのデプロイメントYAMLファイルを生成し、Traefikロードバランサを使ってイメージの変更とローカル構成を反映します。ここでは、事前に用意されているスクリプト(
reate-weblogic-operator.sh and
create-weblogic-domain.sh)を使います。
Gitを使い、WebLogic Kubernetes Operatorプロジェクトをダウンロードします。
git clone https://github.com/oracle/weblogic-kubernetes-operator.git
YAML入力ファイルを編集し、イメージ名を反映します。
cd $SRC/weblogic-kubernetes-operator/kubernetes
Change the
‘image’ フィールドを変更し、OCIRの対応するDockerリポジトリのイメージ名を指定します。
./internal/create-weblogic-domain-job-template.yaml: image: phx.ocir.io/weblogicondocker/weblogic:12.2.1.3
./internal/weblogic-domain-traefik-template.yaml: image: phx.ocir.io/weblogicondocker/traefik:1.4.5
./internal/domain-custom-resource-template.yaml: image: phx.ocir.io/weblogicondocker/weblogic:12.2.1.3
./create-weblogic-operator-inputs.yaml: weblogicOperatorImage: phx.ocir.io/weblogicondocker/weblogic-kubernetes-operator:latest
create-weblogic-operator-inputs.yaml と create-weblogic-domain-inputs.yaml のその他のパラメータを確認し、変更します。OperatorとWebLogicドメインのインストール手順にある全てのオプションや記述をチェックします。
WebLogic Kubernetes Operator Installation
https://github.com/oracle/weblogic-kubernetes-operator/blob/master/site/installation.md
Creating a WebLogic domain
https://github.com/oracle/weblogic-kubernetes-operator/blob/master/site/creating-domain.md
以下は create-weblogic-operator-inputs.yaml でこのデモ用にカスタマイズした値のリストです。
create-weblogic-operator-inputs.yaml
https://github.com/oracle/weblogic-kubernetes-operator/blob/master/kubernetes/create-weblogic-operator-inputs.yaml
targetNamespaces: domain1
weblogicOperatorImage: phx.ocir.io/weblogicondocker/weblogic-kubernetes-operator:latest
externalRestOption: SELF_SIGNED_CERT
externalSans: IP:129.146.109.106
以下は create-weblogic-domain-inputs.yaml でこのデモ用にカスタマイズした値のリストです。
create-weblogic-domain-inputs.yaml
https://github.com/oracle/weblogic-kubernetes-operator/blob/master/kubernetes/create-weblogic-domain-inputs.yaml
domainUID: domain1
t3PublicAddress: 0.0.0.0
exposeAdminNodePort: true
namespace: domain1
loadBalancer: TRAEFIK
exposeAdminT3Channel: true
weblogicDomainStoragePath: /scratch/external-domain-home/pv001
Note: 現時点では、OCI Container Engine for Kubernetes上でWebLogic Serverを動作させる場合、TraefikとApache HTTP Serverをロードバランサとして利用することを推奨しています。Voyager HAProxy Ingress ControllerはOKEでサポートしていないため、動作保証できません。
WebLogicドメインはパラメータ
weblogicDomainStoragePathで指定されたパスにマップされた永続ボリュームを使います。以下のコマンドで、永続ボリュームディレクトリをNode 1のNFSサーバに作成しましょう。
ssh -i ~/.ssh/id_rsa opc@129.146.109.106 "mkdir -m 777 -p /scratch/external-domain-home/pv001"
今回のデモドメインは名前空間 domain1 で動作するよう構成済みです。名前空間 domain1 を作成するには、以下のコマンドを実行します。
kubectl create namespace domain1
管理サーバへのアクセスのためのユーザー名とパスワードは、ドメイン稼働する名前空間と同一の名前空間のKubernetesシークレットに格納しておかねばなりません。ファイルへの資格証明を保存しないようにするため、スクリプトではシークレットを作成しません。Oracleは以下のコマンドをSSHで実行し、資格証明のセキュリティを保護するための適切な手段を講じることを推奨します。
シークレットを作成するには、以下のコマンドを発行します。
kubectl -n NAMESPACE create secret generic SECRET_NAME
--from-literal=username=ADMIN-USERNAME
--from-literal=password=ADMIN-PASSWORD
今回のデモでは、以下の値を使いました。
kubectl -n domain1 create secret generic domain1-weblogic-credentials --from-literal=username=weblogic --from-literal=password=welcome1
最後に、入力ファイルと出力ディレクトリを指定してcreateスクリプトを実行します。
./create-weblogic-operator.sh –i create-weblogic-operator-job-inputs.yaml -o /path/to/weblogic-operator-output-directory
これで、関連する全てのOperatorデプロイメントを作成し、それらを起動します。
以下のコマンドを実行してOperatorとPodの状態を確認します。
同じコマンドを実行してWebLogicドメインの作成を実施します。
./create-weblogic-domain.sh –i create-weblogic-domain-job-inputs.yaml -o /path/to/weblogic-domain-output-directory
WebLogicクラスタの状態を確認するには、以下のコマンドを実行します。
bash-4.2$ kubectl get pods -n domain1
ロードバランサが動作している様子を確認しましょう。そのために、WebLogic Server管理コンソールにログインし、testwebapp.warというアプリケーションをデプロイします。WebLogicドメイン用にカスタマイズした入力ファイルでは、AdminNodePortを公開するよう指定していました。ポート番号を確認するには、以下のコマンドを実行します。
Nodeの外部IPアドレスの一つを使い、管理コンソールにアクセスしましょう。今回の場合、 http://129.146.109.106:30701/console でアクセスします。WebLogic Server管理コンソールへのログインには、資格証明として
weblogic/welcome1を使います。
”デプロイメント”、”ロックして編集”をクリックして、testwebapp.warアプリケーションをアップロードします。
testwebapp.war
https://github.com/bhabermaas/kubernetes-projects/blob/master/apps/testwebapp.war
cluster-1をターゲットとして選択し、”終了”、”構成の解放"をクリックします。”制御”タブを選択し、"全てのリクエストを処理"をクリックします。これにより、デプロイメントの状態がアクティブに変わります。
KubernetesクラスタのIngress controllerとしてTraefikを使い、HTTPリクエストの負荷分散をデモしましょう。ロードバランサの
NodePort番号を確認するために、以下のコマンドを実行します。
Traefikロードバランサはポート番号30305で動作しています。testwebappアプリケーションにアクセスする場合(http://129.146.22.123:30305/testwebapp/)、常にアプリケーションは現在使われている管理対象サーバの情報を表示します。
同じURLで別の接続では、管理対象サーバ1の情報が表示されます。
Because the WebLogicクラスタを外界に公開し、ノードの外部IPアドレスを使ってアクセス可能になっているため、認可されたWebLogicユーザーはT3プロトコルを使って全ての利用可能なWebLogicリソースにWLSTコマンドを使ってアクセスできます。ファイアウォールがある場合、プロキシトンネルを使ってT3を実行する必要があります(T3 over HTTPを使い、WebLogic Serverでトンネリングを有効化し、T3ではなくHTTPプロトコルを使う)。詳細は以下のエントリをご覧ください。
T3 RMI Communication for WebLogic Server Running on Kubernetes
https://blogs.oracle.com/weblogicserver/t3-rmi-communication-for-weblogic-server-running-on-kubernetes
https://orablogs-jp.blogspot.com/2018/02/t3-rmi-communication-for-weblogic.html
企業ネットワークの外部にいる場合、T3を制限なく利用できます。
Summary
このエントリでは、Oracle Cloud Infrastructure上で動作するOCI Container Engine for Kubernetesを使い、WebLogicクラスタを構成するために必要な全手順と、WebLogicクラスタにデプロイされたWebアプリケーションの負荷分散をご紹介しました。OCI Container Engine for KubernetesでWebLogic Serverを実行すると、マネージドKubernetes環境でWebLogic Serverアプリケーションを活用し、WebLogic Serverアプリケーションを他のクラウド・アプリケーションと統合し、WebLogic Serverの使用法を発展させ、Kubernetesの使用を拡大できます。また、以下の内容について詳細を説明する一連のブログエントリも公開しています。
- Operatorの実行方法
- 1個以上のWebLogicドメインをKubernetesで立ち上げる方法
- WebLogic Diagnostics Framework(WLDF、WebLogic診断フレームワーク)もしくはPrometheusを使ってWebLogicクラスタを手動、もしくは自動でスケールする方法
- WebLogicクラスタにデプロイされたWebアプリケーションの負荷分散をOperatorで管理する方法
- OperatorログをElasticsearch、Logstash、Kibanaと連携して管理する方法
How to... WebLogic Server on Kubernetes
https://blogs.oracle.com/weblogicserver/how-to-weblogic-server-on-kuberneteshttps://orablogs-jp.blogspot.com/2018/01/how-to-weblogic-server-on-kubernetes.html