原文はこちら。
https://blogs.oracle.com/weblogicserver/weblogic-server-on-kubernetes-data-volume-usage
Kubernetes上でのWebLogic Serverの動作検証の一環として、Kubernetes環境で実行されているWebLogic Server Pod間でファイルデータを共有するためのベストプラクティスを特定しました。このエントリでは、通常共有ストレージを活用して構成するWebLogic Serverのサービスとファイルをチェックし、ダウンロードして実行可能な完全なエンドツーエンドのサンプルを提供します。このサンプルはKubernetesがオーケストレーションするWebLogicドメイン用にマウントする共有ストレージを示します。
公式のKubernetesの定義[Kubernetes Volumes と Kubernetes Persistent Volumes and Claims]に基づき、PVはクラスタ内の管理者がプロビジョニングしたストレージの一部であり、PVCはユーザーによるストレージのリクエストです。したがって、PVおよびPVCは、ポッドの外部の独立したエンティティです。PodはKubernetesクラスタ内のPod間のファイル永続性およびファイル共有のためにPVおよびPVCを簡単に参照できます。
実行時に、Administration Serverを含むすべてのWebLogic Serverインスタンスは、マウントされたボリュームを介して同じドメインホームディレクトリを共有します。
(注意)この例は単一のマシンまたはノード上で稼働しますが、この方法は複数のマシン間でWebLogicドメインを実行する場合でも同様です。複数のマシンで実行する場合、各WebLogic Serverインスタンスは同じディレクトリを共有する必要があります。次に、ホストパスはこのディレクトリを参照できるため、ボリュームへのアクセスは、背後の共有ディレクトリによって制御されます。既に共有ディレクトリで設定済みの一連のマシンがあれば、この方法はNFSクライアントを設定するよりも簡単です(移植可能ではないかもしれませんが)。
このサンプルを実行するためには、以下の手順を全て実行する必要があります。
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また、このエントリでは、これらのデータボリュームへの永続化対象となりうるWebLogic Serverの成果物も示しています。
https://blogs.oracle.com/weblogicserver/docker-volumes-in-weblogic
https://orablogs-jp.blogspot.jp/2017/12/docker-volumes-in-weblogic.html
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 VolumesKubernetes上でWebLogic Serverを実行する場合、以下の理由で共有ストレージを処理するためにPVとPVCを使用することをお勧めします。
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
- 通常、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
- 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/ - 以下の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 - WebLogicドメインイメージをDockerfileとスクリプトに基づいてローカルでビルドする
$ cd wls-k8s-domain
$ docker build -t was-k8s-domain . - ユースケース2のため、以下のコマンドを入力してNFSサーバーと共有ディレクトリを準備します(この例ではマシン10.232.128.232を使用しています)。ユースケース1ではNFSではなくホストパスを使用するため、この手順は必要ありません。
デフォルトでは、WebLogicドメインwls-k8s-domainでは、WebLogic Serverインスタンスを含むPod内のすべてのプロセスが、ユーザーID 1000およびグループID 1000で実行されます。ユーザーID1000およびグループID1000に対し、NFSボリュームに対する読み取りおよび書き込みの許可を持たせるため、外部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
Use Case 1: Host Path Mapping at Individual Machine with a Kubernetes Volume
WebLogicドメインは、管理サーバーと複数の管理対象サーバーで構成され、それぞれが独自のPod内で稼働します。すべてのPodには、物理マシン上のフォルダに直接マウントされたボリュームがあります。ドメインホームは、管理サーバーポッドが最初に起動されたときに共有フォルダに作成されます。実行時に、Administration Serverを含むすべてのWebLogic Serverインスタンスは、マウントされたボリュームを介して同じドメインホームディレクトリを共有します。
(注意)この例は単一のマシンまたはノード上で稼働しますが、この方法は複数のマシン間でWebLogicドメインを実行する場合でも同様です。複数のマシンで実行する場合、各WebLogic Serverインスタンスは同じディレクトリを共有する必要があります。次に、ホストパスはこのディレクトリを参照できるため、ボリュームへのアクセスは、背後の共有ディレクトリによって制御されます。既に共有ディレクトリで設定済みの一連のマシンがあれば、この方法はNFSクライアントを設定するよりも簡単です(移植可能ではないかもしれませんが)。
このサンプルを実行するためには、以下の手順を全て実行する必要があります。
- 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 - 管理対象サーバー用の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 - 共有ボリュームを使って管理サーバー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によってマウントされたボリューム経由で同じドメインホームディレクトリを共有します。- このサンプルでは、ホスト10.232.128.232にNFSサーバーがあり、このサーバーの/scratch/nfsdataを、すべての外部ホストに対し読み取り/書き込み可能でエクスポート済みである
- 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" - PVCを準備し、pvc.yml を編集する
Kubernetesは、PVCに合ったPVを見つけてバインドします。apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wlserver-pvc-1
labels:
app: wls-server
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10GiLifecycle of a volume and claim
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#lifecycle-of-a-volume-and-claim - PVとPVCを作成する
PVC のステータスを確認し、PVにバインドされていることを確認する$ kubectl create -f pv.yml
$ kubectl create -f pvc.yml$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE
wlserver-pvc-1 Bound pv1 10Gi RWX manual 7s - 管理サーバー用の 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 - 管理対象サーバ用の 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 - NFS共有ボリュームを使用して管理サーバーおよび管理対象サーバーのPodを作成する。各WebLogic Serverインスタンスは、マウントされたドメインの場所から開始される。
$ kubectl create -f wls-admin.yml
$ kubectl create -f wls-stateful.yml