[WLS, Docker] WebLogic Server on Kubernetes Data Volume Usage

原文はこちら。
https://blogs.oracle.com/weblogicserver/weblogic-server-on-kubernetes-data-volume-usage

Kubernetes上でのWebLogic Serverの動作検証の一環として、Kubernetes環境で実行されているWebLogic Server Pod間でファイルデータを共有するためのベストプラクティスを特定しました。このエントリでは、通常共有ストレージを活用して構成するWebLogic Serverのサービスとファイルをチェックし、ダウンロードして実行可能な完全なエンドツーエンドのサンプルを提供します。このサンプルはKubernetesがオーケストレーションするWebLogicドメイン用にマウントする共有ストレージを示します。

WebLogic Server Persistence in Volumes

Kubernetes上でWebLogic Serverを実行する場合、データボリュームを使用する利点については、以下のエントリをご覧ください。
Docker Volumes in WebLogic
https://blogs.oracle.com/weblogicserver/docker-volumes-in-weblogic
https://orablogs-jp.blogspot.jp/2017/12/docker-volumes-in-weblogic.html
また、このエントリでは、これらのデータボリュームへの永続化対象となりうるWebLogic Serverの成果物も示しています。

Kubernetes Solutions

Kubernetes環境では、Podは一時的なものです。 データを保持するために、Kubernetesではボリューム抽象化、PersistentVolume(PV)API、PersistentVolumeClaim(PVC)APIリソースを提供します。

公式のKubernetesの定義[Kubernetes Volumes と Kubernetes Persistent Volumes and Claims]に基づき、PVはクラスタ内の管理者がプロビジョニングしたストレージの一部であり、PVCはユーザーによるストレージのリクエストです。したがって、PVおよびPVCは、ポッドの外部の独立したエンティティです。PodはKubernetesクラスタ内のPod間のファイル永続性およびファイル共有のためにPVおよびPVCを簡単に参照できます。
Kubernetes Volumes
https://kubernetes.io/docs/concepts/storage/volumes
Kubernetes Persistent Volumes and Claims
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#lifecycle-of-a-volume-and-claim
Kubernetes上でWebLogic Serverを実行する場合、以下の理由で共有ストレージを処理するためにPVとPVCを使用することをお勧めします。
  • 通常、WebLogic Serverインスタンスは、共有PVへのアクセスを必要とする複数のノード上のPodで実行されます。 WebLogic Serverインスタンスのライフサイクルは、単一のPodに限定されません。
  • PVとPVCはより多くの制御を提供できます。たとえば、同時読み取り/書き込み管理のアクセスモード、ボリュームプラグインが提供するマウントオプション、ストレージ容量要件、リソースの再利用ポリシーなどを指定できます。

Use Cases of Kubernetes Volumes for WebLogic Server

サンプルの詳細を確認したり、ローカルで実行したりするには、サンプルをダウンロードし、以下の手順に従ってください。

Software Versions

  • Host machine: Oracle Linux 7u3 UEK4 (x86-64)
  • Kubernetes v1.7.8
  • Docker 17.03 CE

Prepare Dependencies

  1. Dockerfileとスクリプトに基づいて、ローカルで oracle/weblogic:12.2.1.3-developer イメージをビルドする
    Oracle WebLogic Server on Docker
    https://github.com/oracle/docker-images/tree/master/OracleWebLogic/dockerfiles/12.2.1.3/
  2. 以下のURLからWebLogic Kubernetsドメインのサンプルソースコードをダウンロードし、ダウンロードしたソースコードをwls-k8s-domainという名前のローカルフォルダに配置する
    WebLogic Sample on Kubernetes with Shared Domain Home
    https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/wls-k8s-domain
  3. WebLogicドメインイメージをDockerfileとスクリプトに基づいてローカルでビルドする
    $ cd wls-k8s-domain
    $ docker build -t was-k8s-domain .
    
  4. ユースケース2のため、以下のコマンドを入力してNFSサーバーと共有ディレクトリを準備します(この例ではマシン10.232.128.232を使用しています)。ユースケース1ではNFSではなくホストパスを使用するため、この手順は必要ありません。
    # systemctl start rpcbind.service
    # systemctl start nfs.service
    # systemctl start nfslock.service
    $ mkdir -p /scratch/nfsdata
    $ chmod o+rw /scratch/nfadata
    # echo /scratch/nfsdata *(rw,fsid=root,no_root_squash,no_subtree_check) >> /etc/exports
    
    デフォルトでは、WebLogicドメインwls-k8s-domainでは、WebLogic Serverインスタンスを含むPod内のすべてのプロセスが、ユーザーID 1000およびグループID 1000で実行されます。ユーザーID1000およびグループID1000に対し、NFSボリュームに対する読み取りおよび書き込みの許可を持たせるため、外部NFS共有ディレクトリに適切なアクセス権を設定する必要があります。この例ではアクセス許可管理を簡素化のため、他のユーザーにも共有ディレクトリに対する読み取りと書き込みのアクセス許可を与えています。

Use Case 1: Host Path Mapping at Individual Machine with a Kubernetes Volume

WebLogicドメインは、管理サーバーと複数の管理対象サーバーで構成され、それぞれが独自のPod内で稼働します。すべてのPodには、物理マシン上のフォルダに直接マウントされたボリュームがあります。ドメインホームは、管理サーバーポッドが最初に起動されたときに共有フォルダに作成されます。

実行時に、Administration Serverを含むすべてのWebLogic Serverインスタンスは、マウントされたボリュームを介して同じドメインホームディレクトリを共有します。

(注意)この例は単一のマシンまたはノード上で稼働しますが、この方法は複数のマシン間でWebLogicドメインを実行する場合でも同様です。複数のマシンで実行する場合、各WebLogic Serverインスタンスは同じディレクトリを共有する必要があります。次に、ホストパスはこのディレクトリを参照できるため、ボリュームへのアクセスは、背後の共有ディレクトリによって制御されます。既に共有ディレクトリで設定済みの一連のマシンがあれば、この方法はNFSクライアントを設定するよりも簡単です(移植可能ではないかもしれませんが)。

このサンプルを実行するためには、以下の手順を全て実行する必要があります。
  1. WebLogic管理サーバー用のymlファイルを準備する。ホストのフォルダ /scratch/data を管理サーバーのPod内のホストのフォルダ /u01/wlsdomain にマウントするようにwls-admin.yml を編集する。
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: admin-server
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: admin-server
        spec:
          containers:
          - name: admin-server
            image: wls-k8s-domain
            imagePullPolicy: Never
            command: ["sh"]
            args: ["/u01/oracle/startadmin.sh"]
            readinessProbe:
                httpGet:
                  path: /weblogic/ready
                  port: 8001
                initialDelaySeconds: 15
                timeoutSeconds: 5
            ports:
            - containerPort: 8001
    
            env:
            - name: WLUSER
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: username
            - name: WLPASSWORD
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: password
            volumeMounts:
              # name must match the volume name below
              - name: domain-home
                mountPath: "/u01/wlsdomain"
    
          volumes:
            - name: domain-home
              hostPath:
                path: /scratch/data
                type: Directory
    
  2. 管理対象サーバー用のymlファイルを準備する。ホストのフォルダ /scratch/data を管理対象サーバーのPod内のホストのフォルダ /u01/wlsdomain にマウントするようにwls-stateful.yml を編集する。
    >apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1
    kind: StatefulSet
    metadata:
      name: managed-server
    spec:
      serviceName: wls-subdomain
      replicas: 2
      template:
        metadata:
          name: ms
          labels:
            app: managed-server
        spec:
          subdomain: wls-subdomain
          containers:
          - name: managed-server
            image: wls-k8s-domain
            imagePullPolicy: Never
            command: ["sh"]
            args: ["/u01/oracle/startms.sh"]
            readinessProbe:
                httpGet:
                  path: /weblogic/ready
                  port: 8011
                initialDelaySeconds: 15
                timeoutSeconds: 5
            ports:
            - containerPort: 8011
            env:
            - name: JAVA_OPTIONS
              value: "-Dweblogic.StdoutDebugEnabled=true"
            - name: USER_MEM_ARGS
              value: "-Xms64m -Xmx256m "
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: DNS_DOMAIN_NAME
              value: "wls-subdomain"
            - name: WLUSER
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: username
            - name: WLPASSWORD
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: password
    
            volumeMounts:
              # name must match the volume name below
              - name: domain-home
                mountPath: "/u01/wlsdomain"
    
          volumes:
            - name: domain-home
              hostPath:
                path: /scratch/data
                type: Directory
    
  3. 共有ボリュームを使って管理サーバーPodと管理対象サーバーPodを作成する。これらのWebLogic Serverインスタンスはマウントされたドメインの場所から起動される。
    $ kubectl create -f wls-admin.yml
    $ kubectl create -f wls-stateful.yml
    

Use Case 2: NFS Sharing with Kubernetes PV and PVC

この例では、1つの管理サーバと複数の管理対象サーバインスタンスを持つWebLogic Serverクラスタがあり、各サーバは専用Podに格納されています。すべてのPodには、Podが到達可能な物理マシンにある中央のNFSサーバーにボリュームがマウントされています。管理サーバーPodが初めて起動されると、WebLogicドメインを共有NFSフォルダに作成します。実行時に、管理サーバーを含むすべてのWebLogic Serverインスタンスは、PVおよびPVCによってマウントされたボリューム経由で同じドメインホームディレクトリを共有します。
  1. このサンプルでは、ホスト10.232.128.232にNFSサーバーがあり、このサーバーの/scratch/nfsdataを、すべての外部ホストに対し読み取り/書き込み可能でエクスポート済みである
  2. PVを準備する。各WebLogic ServerインスタンスがNFS共有フォルダに読み取り/書き込みできるように pv.yml を編集する。
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: pv1
      labels:
        app: wls-domain
    spec:
      storageClassName: manual
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Recycle  # Retain, Recycle, Delete
      nfs:
        # Please use the correct NFS server host name or IP address
        server: 10.232.128.232
        path: "/scratch/nfsdata"
    
  3. PVCを準備し、pvc.yml を編集する
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: wlserver-pvc-1
      labels:
        app: wls-server
    spec:
      storageClassName: manual
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
    
    Kubernetesは、PVCに合ったPVを見つけてバインドします。
    Lifecycle of a volume and claim
    https://kubernetes.io/docs/concepts/storage/persistent-volumes/#lifecycle-of-a-volume-and-claim
  4. PVとPVCを作成する
    $ kubectl create -f pv.yml
    $ kubectl create -f pvc.yml
    
    PVC のステータスを確認し、PVにバインドされていることを確認する
    $ kubectl get pvc
    NAME            STATUS    VOLUME    CAPACITY   ACCESSMODES   STORAGECLASS   AGE
    wlserver-pvc-1  Bound     pv1       10Gi       RWX           manual         7s
    
  5. 管理サーバー用の yml ファイルを準備する。これはPVC wlserver-pvc-1 への参照を有する。NFS共有フォルダをWebLogic Server管理サーバーPodの/u01/wlsdomainにマウントするようにwls-admin.ymlを編集する。
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: admin-server
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: admin-server
        spec:
          containers:
          - name: admin-server
            image: wls-k8s-domain
            imagePullPolicy: Never
            command: ["sh"]
            args: ["/u01/oracle/startadmin.sh"]
            readinessProbe:
                httpGet:
                  path: /weblogic/ready
                  port: 8001
                initialDelaySeconds: 15
                timeoutSeconds: 5
            ports:
            - containerPort: 8001
    
            env:
            - name: WLUSER
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: username
            - name: WLPASSWORD
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: password
            volumeMounts:
              # name must match the volume name below
              - name: domain-home
                mountPath: "/u01/wlsdomain"
    
          volumes:
            - name: domain-home
              persistentVolumeClaim:
                claimName: wlserver-pvc-1
    
  6. 管理対象サーバ用の yml ファイルを準備する。このファイルはPVC wlserver-pvc-1への参照を有する。NFS共有フォルダを各管理対象サーバーPodの /u01/wlsdomain にマウントするようにwls-stateful.yml を編集する。
    apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1
    kind: StatefulSet
    metadata:
      name: managed-server
    spec:
      serviceName: wls-subdomain
      replicas: 2
      template:
        metadata:
          name: ms
          labels:
            app: managed-server
        spec:
          subdomain: wls-subdomain
          containers:
          - name: managed-server
            image: wls-k8s-domain
            imagePullPolicy: Never
            command: ["sh"]
            args: ["/u01/oracle/startms.sh"]
            readinessProbe:
                httpGet:
                  path: /weblogic/ready
                  port: 8011
                initialDelaySeconds: 15
                timeoutSeconds: 5
            ports:
            - containerPort: 8011
            env:
            - name: JAVA_OPTIONS
              value: "-Dweblogic.StdoutDebugEnabled=true"
            - name: USER_MEM_ARGS
              value: "-Xms64m -Xmx256m "
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: DNS_DOMAIN_NAME
              value: "wls-subdomain"
            - name: WLUSER
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: username
            - name: WLPASSWORD
              valueFrom:
                secretKeyRef:
                  name: wlsecret
                  key: password
    
            volumeMounts:
              - name: domain-home
                mountPath: "/u01/wlsdomain"
    
          volumes:
          - name: domain-home
            persistentVolumeClaim:
              claimName: wlserver-pvc-1
    
  7. NFS共有ボリュームを使用して管理サーバーおよび管理対象サーバーのPodを作成する。各WebLogic Serverインスタンスは、マウントされたドメインの場所から開始される。
    $ kubectl create -f wls-admin.yml
    $ kubectl create -f wls-stateful.yml

Summary

このエントリでは、Kubernetes環境でWebLogicドメインを実行する際のKubernetesデータボリュームの設定に関するベストプラクティスについて説明しています。Kubernetes Podは一時的なものゆえ、ログ、ストアなどのファイルだけでなく、ボリュームにWebLogicドメインを永続化することをお勧めします。Kubernetesは、永続的なボリュームと永続的なボリュームクレームを提供して、状態の外部化と重要なデータのボリュームへの永続化をを簡素化します。ここで2個のユースケースを提供します。その一つは、Kubernetesノードが稼働しているホストマシンにボリュームをマップする方法、もう一つはNFS共有ボリュームの使用方法をそれぞれ紹介しています。どちらのユースケースでも、すべてのWebLogic Serverインスタンスは、これらのボリュームにマップされているファイルにアクセスできる必要があります。

0 件のコメント:

コメントを投稿