WebLogic Server for OKE でWebLogicドメインを作ってみる

# WebLogic Server for OKE でWebLogicドメインを作ってみる

## はじめに

この記事はOracle Cloud Infrastructure (以下OCI) で提供されている、WebLogic Server for Oracle Container Engine for Kubernetes (以下WLS for OKE) のEnterprise Editionがプロビジョニングされた環境を前提にしています。WLS for OKEの概要やプロビジョニングの方法などについては[以前の記事](https://qiita.com/nari_gone/items/54ff3938aae669796d5e)もご参考ください。

この記事では、WLS for OKEがプロビジョニングされた環境でWebLogicドメインを作成する方法と接続の仕組みなどを中心に見ていきたいと思います。

----

## 新規WebLogicドメインの作成

今回は2つの管理対象サーバで構成されるWebLogicドメインをWLS for OKE上に作ってみます。WLS for OKEへのWebLogic環境の作成や更新はJenkinsコンソールからone stopで行えるようになっています。

まず最初に、踏み台ホストを経由するSOCKSプロキシを構成しておいてから

```
ssh -D <SOCKSプロキシ用のポート> -fCqN -i <SSH秘密鍵のパス> opc@<踏み台ホストのIP>
```

Jenkins コンソール `http://<プライベート・ロードバランサのIP>/jenkins`にアクセスし、初期アクセスの時に設定した管理ユーザとパスワードでログインします。
Jenkinsコンソールのダッシュボードから `create domain` のパイプラインを実行(▷のアイコン)します。

![00_jenkins_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/08f1d2ae-150b-665a-bf60-6a541c4a9ffa.png)

`create domain`のパイプラインのでは以下のような設定項目があります。

- WebLogic Server on Container Cluster
  WebLogicドメインの構成やWebLogicのバージョンなどを設定を行います

- Registry (OCIR) [オプション]
  OCIRにアクセスする追加のOCIRユーザを利用する場合のOCIRユーザやAuth Tokenなどを指定します。

- Container Cluster (OKE) Configuration
  WebLogicドメインをデプロイする先のWebLogic Node Poolの選択します。

- Load balancer Configuration
  WebLogic管理対象サーバ用にプロビジョニングするロードバランサを設定を行います。

- Identity Cloud Service (IDCS) Integration [オプション]

  WebLogic上のアプリケーションや管理サーバに対するアクセスの認証にOracle Identity Cloud Service (IDCS) によるOAuth認証を利用するための設定を行います。

今回はオプションのRegistry (OCIR) や Identity Cloud Service (IDCS) Integrationは利用せずに、最も単純な構成で試してみます。

----

### WebLogic Server on Container Cluster の設定

ここでは以下のようなパラメータを設定します。

| パラメータ              | 設定する内容                                                 |
| ----------------------- | ------------------------------------------------------------ |
| Domain_Name             | 作成するWebLogicドメインの名前。<br />ここでは`demo00`。     |
| WeLogic_Version         | 利用するWebLogicのバージョン。WebLogic 14.1.1の場合はJDKも選択。<br />ここでは `12.2.1.4` |
| Base_Image              | 使用するベース・イメージ。<br />ここでは選択せず (Select_Base_Imageのまま) プロビジョニング時に登録されたものを利用。 |
| Administration_Username | WebLogic管理ユーザの名前。<br />ここでは `weblogic`          |
| Administration_Password | WebLogic管理ユーザのパスワード。<br />ここでは`welcome1`     |
| Managed_Server_Count    | 作成する管理対象サーバの数。(最大9)<br />ここでは `2`        |
| Patch_Automatically     | 定期的な自動パッチを設定する場合にチェック。<br />ここでは「チェックしない」 |
| Cleanup_Domain_Resource | 以前に作成に失敗した同じドメインがある場合に削除する場合にチェック。<br />ここでは「チェックしない」 |

![01_jenkins_create_wls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/3d668742-773a-67fa-6c33-2806acb0a2b2.png)

----

### Container Cluster (OKE) Configurationの設定

今回はプロビジョニング時に作成された WebLogic Node Poolに作成しますので、以下のパラメータのみ設定します。

| パラメータ              | 設定する内容                                                 |
| ----------------------- | ------------------------------------------------------------ |
| WebLogic_Node_Pool_Type | 新しくWebLogic Node Poolを作るか、既存Poolを使うかを選択。<br />ここでは `Existing_Node_Pool`を選択。 |
| Existing_Node_Pool      | 利用するWebLogic Node Poolを選択。<br />ここでは `wls4oke-wls-np` (プロビジョニング時に作成されたもの) |

![02_jenkins_create_pool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/94534369-a73f-9b3d-7d61-42ef58e90034.png)

なお、新規にWebLogic Node Poolを作成する場合は、ノード・プールのサイズやComputeシェイプ、配置先のサブネットなどをここで指定します。

----

### Load balancer Configurationの設定

管理対象サーバにアクセスするためのロードバランサをプロビジョニング時に作成されたパブリック・サブネットに作成するために、以下のパラメータのみを設定します。

| パラメータ            | 設定する内容                                                 |
| --------------------- | ------------------------------------------------------------ |
| External_Lb_Shape_Min | 作成するフレキシブル・ロードバランサの最小の帯域。<br />ここでは `10`を指定。 |
| External_Lb_Shape_Max | 作成するフレキシブル・ロードバランサの最大の帯域。<br />ここでは `400`を指定。 |

上記以外のパラメータはロードバランサを他のサブネットに作成する際などに利用しますので、ここでは指定しません。

![03_jenkins_create_lb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/2aaf8112-b55f-1870-dabf-0afbbebffb78.png)

----

### create domainパイプラインのビルド

以上の項目を設定したら、ページ最後にある [ビルド] のボタンでビルドを開始します。以下のようにStage Viewが表示され、処理の進行に合わせて処理状況がアップデートされていきます。

![04_jenkins_create_build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/f569bad5-8856-0dea-14d4-1dddc8a48752.png)

![05_jenkins_create_precheck.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/a28d2e19-ef9c-218a-48b8-1a315cfa6791.png)

![06_jenkins_create_ingress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/50711055-456b-1060-4452-c7ebfc4eb52f.png)

![07_jenkins_create_domain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/0651d89c-d855-9522-4779-ae1406ea7eca.png)

しばらく時間がかかりますので(15分くらい)パイプラインが完了するまで待ちます。

以下のように `IDCS_CONFIGURATION`のまでの全てのステージが完了したらデプロイは完了です。

![08_jenkins_create_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/9a0f4413-16b9-2502-49b8-f7b0bb9174cb.png)

----

## 作成したドメインへのアクセス

まず、作成されたWebLogicドメインのWebLogic管理コンソールにアクセスしてみます。WebLogic管理コンソールには以下のURLにブラウザでアクセスします。

```
http://<プライベート・ロードバランサのIP>/<WebLogicドメイン名>/console
```

今回 `demo00` のドメインを作成したので、私の環境では以下のURLになります。

```
http://10.0.6.13/demo00/console
```

アクセスするとWebLogic管理コンソールのログイン画面が表示されるため、create domainのパイプライン実行時に指定した管理ユーザ `weblogic`と管理ユーザのパスワード `welcome1`でログインします。

![10_wls_console_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/49cb3e63-0dda-2e76-310b-81ba3ee3fdbc.png)

ログイン後に、左側の「ドメイン構成」のツリーから [demo00] ⇒ [環境] ⇒ [サーバー] を表示すると、

- 管理サーバ
- 動的クラスタ `doudemo00-cluster`に所属する最大9つの管理対象サーバ

が作成されており、そのうちの管理サーバと2つの管理対象サーバが起動されていることが分かります。

![11_wls_console_servers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/8cf78e72-ce4d-b345-d749-15c1e9a7828a.png)


作成されたWebLogicドメインに対しては以下ような経路が構成されます。
- 作成されたWebLogicドメインの管理サーバ
  Jenkinsコンソールと同じプライベート・ロードバランサからアクセス
- 作成されたWebLogicドメインの管理対象サーバ
  ドメイン作成の際に作成されるロードバランサからアクセス

![09_diagram_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/b42438c6-5592-92c7-a303-c69c779be622.png)

ドメイン作成後のロードバランサがどのように構成されているか、OCIコンソールから確認してみましょう。
![12_oci_console_lb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/5754f51e-cd64-1fb8-155c-2c74ee8530d4.png)

WebLogicドメインのプロビジョニングの結果、管理対象サーバへの経路となる新しいロードバランサが1番目に追加されているのが分かります。

## 作成されたドメインに対する経路
WebLogic管理コンソールへの経路が具体的にどのように設定されているか少し掘り下げてみましょう。

管理コンソールやWebLogicクラスタ(管理対象サーバ)への経路は、プライベート・ロードバランサやドメイン用に作成されたロードバランサからNginx Ingress Controllerにより下図のようにルート制御されています。
![19_diagram_network_route.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/2974f5f5-74f2-b834-786f-174bb2e6fcae.png)

Nginx Ingress Controllerの構成を確認するために、管理ホストにログインしてOKEのクラスタにアクセスしてみます。

管理ホストへのアクセスはPC上から以下のSSHコマンドでアクセスできます。

```
ssh -i <SSH秘密鍵のパス> -o ProxyCommand="ssh -W %h:%p –i <SSH秘密鍵のパス> opc@<踏み台ホストのパブリックIP>" opc@<管理ホストのIP>
```

私の環境では以下のようになります。

```
ssh -i ~/.ssh/mykey -o ProxyCommand="ssh -W %h:%p –i ~/.ssh/mykey opc@155.248.198.106" opc@10.0.2.9
```

管理ホストに接続したら、まずOKE内のnamespaceを確認してみます。

```
[opc@wls4oke-admin ~]$ kubectl get ns
NAME                   STATUS   AGE
default                Active   2d22h
demo00-ns              Active   81m
jenkins-ns             Active   2d22h
kube-node-lease        Active   2d22h
kube-public            Active   2d22h
kube-system            Active   2d22h
wls4oke-operator-ns    Active   2d22h
wlsoke-ingress-nginx   Active   2d22h
[opc@wls4oke-admin ~]$
```

いくつかの namespace が定義されていますが、Kubernetes標準のもの以外は以下のような用途です。

| namespace              | 用途                                                         |
| ---------------------- | ------------------------------------------------------------ |
| `<prefix>-operator-ns` | WebLogic Kubernetes Operatorがインストールされるnamespace。<br />`<prefix>` はWLS for OKEをプロビジョニングしたときに指定した Resource Name Prefix (ここでは`wls4oke`)。 |
| `wlsoke-ingress-nginx` | Nginx Ingress Controllerがインストールされるnamespace。      |
| `jenkins-ns`           | Jenkinsがインストールされるnamespace。                       |
| `<domain name>-ns`     | 作成されたWebLogicドメイン用のPodが稼働するnamespace         |

作成したWebLogicドメインに対する経路を制御する Ingress は `<domain name>-ns`の namespaceに作成されます。

```
[opc@wls4oke-admin ~]$ kubectl get ingress -n demo00-ns
NAME                       CLASS    HOSTS   ADDRESS   PORTS   AGE
wls-admin-ingress          <none>   *                 80      90m
wls-cluster-ingress        <none>   *                 80      90m
wls-console-help-ingress   <none>   *                 80      90m
[opc@wls4oke-admin ~]$
```

これらの Ingress はそれぞれ以下の用途で作成されています。

| Ingress                    | 用途                                                       |
| -------------------------- | ---------------------------------------------------------- |
| `wls-admin-ingress`        | `/<domain name>/console` で管理コンソールに転送            |
| `wls-console-help-ingress` | `/<domain name>/consolehelp`で管理コンソールのヘルプに転送 |
| `wls-cluster-ingress`      | WebLogicクラスタ(管理対象サーバ群) に転送                  |

`wls-admin-ingress` と `wls-cluster-ingress` の中身はそれぞれ以下のようになっています。(`wls-console-help-ingress`は`wls-admin-ingress`と同等のため割愛します)

```
[opc@wls4oke-admin ~]$ kubectl get ingress/wls-admin-ingres -n demo00-ns
Error from server (NotFound): ingresses.networking.k8s.io "wls-admin-ingres" not found
[opc@wls4oke-admin ~]$ kubectl get ingress/wls-admin-ingress -n demo00-ns -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    helm.sh/resource-policy: keep
    kubernetes.io/ingress.class: nginx
    meta.helm.sh/release-name: ingress-controller
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2023-02-26T07:13:53Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: wls-admin-ingress
  namespace: demo00-ns
  resourceVersion: "922287"
  uid: be13e2f9-f2b2-40db-9f7f-c35de7d46bd2
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: demo00-demo00-adminserver
            port:
              number: 7001
        path: /demo00/console
        pathType: Prefix
status:
  loadBalancer: {}
[opc@wls4oke-admin ~]$
```

```
[opc@wls4oke-admin ~]$ kubectl get ingress/wls-cluster-ingress -n demo00-ns -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    helm.sh/resource-policy: keep
    kubernetes.io/ingress.class: demo00-nginx-applications
    meta.helm.sh/release-name: ingress-controller
    meta.helm.sh/release-namespace: default
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_clear_input_headers "WL-Proxy-Client-IP" "WL-Proxy-SSL";
      more_set_input_headers "X-Forwarded-Proto: https";
      more_set_input_headers "WL-Proxy-SSL: true";
      more_set_input_headers "is_ssl:ssl";
    nginx.ingress.kubernetes.io/session-cookie-name: JSESSIONID
  creationTimestamp: "2023-02-26T07:13:53Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: wls-cluster-ingress
  namespace: demo00-ns
  resourceVersion: "922293"
  uid: 408bc823-29a9-49d2-bf4d-9312b2bb3292
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: demo00-cluster-demo00-cluster
            port:
              number: 8001
        path: /
        pathType: Prefix
status:
  loadBalancer: {}
[opc@wls4oke-admin ~]$
```

各ロードバランサに対応するIngress Controllerはそれぞれ以下のように構成されます。

```
[opc@wls4oke-admin ~]$ kubectl get service -n wlsoke-ingress-nginx
NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)         AGE
demo00-lb-external   LoadBalancer   10.96.22.173   192.9.239.194   443:30706/TCP   134m
wls4oke-internal     LoadBalancer   10.96.248.16   10.0.6.13       80:31736/TCP    2d22h
[opc@wls4oke-admin ~]$
```

IngressとIngress Controllerの関連付けは、Ingressのannotation `kubernetes.io/ingress.class` に指定されるクラスによって制御されています。

例えば、`wls-cluster-ingress` のIngressに対しては `kubernetes.io/ingress.class: demo00-nginx-applications`とIngress Classが定義されますが、この値が `demo00-lb-external` の Service に関連付けられたDeploymentでのコンテナの起動オプションで以下(最終行)のように指定される、という形です。

```
[opc@wls4oke-admin ~]$ kubectl get deployment/nginx-ingress-controller-demo00-external -n wlsoke-ingress-nginx -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  :
  :
    spec:
      containers:
      - args:
        - /nginx-ingress-controller
        - --configmap=$(POD_NAMESPACE)/nginx-configuration-external
        - --publish-service=wlsoke-ingress-nginx/demo00-lb-external
        - --annotations-prefix=nginx.ingress.kubernetes.io
        - --ingress-class=demo00-nginx-applications
```

ここまでで、おおまかな接続の構成の原理が理解いただけたのではないでしょうか。

## サンプルアプリケーションのデプロイ

さて、管理対象サーバへの経路のアクセスの確認も兼ねて、Jenkinsコンソールからサンプル・アプリケーションをデプロイしてみます。

同様にダッシュボードから `sample app`のパイプラインを実行します。

![13_jenkins_sampleapp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/ff3aab4f-2f21-8cac-b70d-f48d7320b05c.png)

`sample app`のパイプラインでは以下のパラメータが設定できます。今回はWebLogicドメインを選択して、失敗時のロールバックを指定してビルドします。

| パラメータ                    | 設定する内容                                                 |
| ----------------------------- | ------------------------------------------------------------ |
| Domain_Name                   | デプロイ先のWebLogicドメインを選択。<br />ここでは `demo00`を選択。 |
| Undeploy_Sample_App           | サンプル・アプリケーションをアンデプロイする際に指定。<br />ここでは「指定しない」。 |
| Rollback_On_Failure           | デプロイに失敗した場合に実行前の状態にロールバックする。<br />ここでは「チェックを入れる」。 |
| Registry_Username             | 追加のOCIRユーザで実行する場合のOCIRユーザを指定。<br />ここでは「指定しない」。 |
| Registry_Authentication_Token | 追加のOCIRユーザで実行する場合のOCIRユーザのAuth Tokenを指定。<br />ここでは「指定しない」。 |

![14_jenkins_sampleapp_build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/2e5c2cdd-632c-2ec2-1ab4-65873cf673fb.png)

ビルドを実行すると、ドメイン作成時と同様に処理が始まりますので完了するまでしばらく(10分強くらい)待ちます。

![15_jenkins_sampleapp_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/754fe63c-97eb-b46d-238c-ca5b3cdd94b7.png)

このパイプラインでは、既存のドメインで利用しているコンテナ・イメージに対してサンプル・アプリケーションをデプロイして追加したイメージを作成し、OCIRにコンテナ・イメージ追加した上でそのイメージを使ってドメインを再起動します。

パイプラインの実行完了後、WebLogic管理コンソールにアクセスして、[デプロイメント] を確認すると `sample-app`のアプリケーションがデプロイされていることが分かります。

![16_wls_console_deployment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/95284447-077d-9696-27c2-21bff53ad0ef.png)

アプリケーションに対するアクセスは、ドメイン毎に作成されたロードバランサになります(下図の赤枠)。

![17_oci_console_lb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/d398c93e-3d60-2d12-14d5-52feff9fa1eb.png)

作成されたロードバランサのIPを確認して以下のURLでアクセスします。

```
https://<ドメイン用のロードバランサのIP>/sample-app
```

私の環境の場合は以下になります。

```
https://192.9.239.194/sample-app
```

証明書が自己証明書のため証明書に関する警告が出ますが、警告を確認して表示してください。

![18_sample_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119132/72c192d0-2802-4a5f-27ef-8c55c5038b83.png)

SOCKSプロキシを設定したままの場合(特にChrome)でアクセスすると接続できないケースがありますので、SOCKSプロキシを設定していない別のブラウザなどで確認すると確実です。(私はEdgeで確認しました)

ここまでで一通りの動作確認はおしまいです。

----
## (おまけ) 各Jenkinsパイプラインの簡単な解説

せっかくなので今回利用していないものも含め、Jenkinsパイプラインについて用途などの概要を簡単にまとめておきます。

| パイプラインの名前         | 概要                                                         |
| -------------------------- | ------------------------------------------------------------ |
| `create domain`            | ベースイメージを指定してWebLogicドメインを作成               |
| `update domain`            | 既存のWebLogicドメインの設定変更(JavaEEリソース)やアプリケーションのデプロイ |
| `terminate domain`         | 作成済みのWebLogicと関連リソースを削除                       |
|                            |                                                              |
| `create base image`        | WebLogicのインストーラー、JDK、パッチなどからベースイメージを作成 |
| `rebase domain image`      | 既存のベースイメージを元にベースイメージを作成               |
| `opatch update`            | 既存のベースイメージにWebLogicやJDKのパッチを適用            |
| `automatic `patching       | スケジュールに従って既存のWebLogicドメインにパッチを適用     |
|                            |                                                              |
| `backup and deploy domain` | WebLogicドメインの作成や更新時に作成するWebLogicドメインのYAMLをバックアップ<br />※他のパイプラインから呼び出されるパイプライン、単体では使わない |
| `create wls nodepool`      | ドメイン作成時にWebLogic Node Poolを追加作成<br />※他のパイプラインから呼び出されるパイプライン、単体では使わない |
|                            |                                                              |
| `sample app`               | サンプルアプリケーションを既存のWebLogicドメインにデプロイ   |

いくつかのパイプラインは他のパイプラインから呼ばれる、子のパイプラインになっており呼び出し関係は概ね以下のようになっています。

```
+ sample app
  + backup and deploy domain
+ create domain
  + create wls nodepool
+ update domain
  + backup and deploy domain
+ terminate domain
+ create base image
+ rebase domain image
+ opatch update
  + backup and deploy domain
+ automatic patching
```

create domain でドメインを作成するときに新しくのWebLogic Node Poolを作成する場合は create wls nodepool パイプラインが使用されます。また、WebLogicドメインを作成したり変更するパイプラインでドメインのYAMLのバックアップに backup and deploy domain パイプラインが使用される、という関係になっています。

各パイプラインの具体的なパラメータは、実際にJenkinsコンソール上から確認してみてください。

## おわりに

今回はWLS for OKEの基本的な動作確認と初歩的な使い方として、ドメインの作成などのJenkinsコンソールの使い方を取り上げ、どのような仕組みでOKE内のWebLogic環境と接続するのか、という点を中心に解説してみました。

まずはWLS for OKEを触りながら内部の仕組みを理解いただく素材としてこの記事がお役に立てれば幸いです。