Payara 5.184 を Google Kubernetes Engine(GKE) から利用する

この CookBook では、Payara を GKE 上で実行しクラスタリングを構築する手順について紹介しています。
Payara 5.184 で Kubernetes Cluster Mode が追加されました。
PAYARA-2872 Kubernetes Cluster Mode

hazelcast-kubernetes を組み込むことで、機能が実現されています。
そのため、Payara 管理コンソール上からクラスタモードとして Kubernetes Cluster Mode を選択し、https://github.com/hazelcast/hazelcast-kubernetes#configuration に記載されている手順を実施することで、Kubernetes 上でクラスタリングを構築することができます。

この CookBook では以下の CookBook で作成した docker image を使用します。
Payara の Docker を作成する。

レシピ

  1. gcloud を設定します。
  2. docker image を作成します。
  3. クラスタを作成します。
  4. ClusterRoleBinding を作成します。
  5. Service を作成します。
  6. デプロイします。
  7. Payara の管理コンソールにアクセスし、Kubernetes Cluster Mode を設定します。
  8. クラスタリングを確認します。
  9. 後片付けをします。

1. gcloud を設定します。

https://console.cloud.google.com/ よりプロジェクト ID が my-project のプロジェクトを作成します。
プロジェクト ID は全世界でユニークである必要があるため、実際には別の名前を使用してください。この CookBook では my-project とします。
プロジェクトを作成後、以下のコマンドを実行します。

gcloud config set project my-project
gcloud config set compute/zone us-west1-c

gcloud コマンドのデフォルトのプロジェクトとゾーンを設定しています。

2. docker image を作成します。

Payara の Docker を作成する。 で作成した docker image を Google Container Registry(GCR) に push します。

docker tag mypayara gcr.io/my-project/mypayara:5.184
gcloud docker -- push gcr.io/my-project/mypayara:5.184

3. クラスタを作成します。

gcloud container clusters create payara-cluster --zone us-west1-c --num-nodes=2 --machine-type=n1-standard-1

ノード数 = 2, インスタンスタイプ = n1-standard-1 のクラスタを作成します。

以下のように表示されれば完了です。

Creating cluster payara-cluster in us-west1-c...done.
Created [https://container.googleapis.com/v1/projects/my-project/zones/us-west1-c/clusters/payara-cluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-west1-c/payara-cluster?project=my-project
kubeconfig entry generated for payara-cluster.
NAME            LOCATION    MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
payara-cluster  us-west1-c  1.9.7-gke.11    104.196.250.15  n1-standard-1  1.9.7-gke.11  2          RUNNING

4. ClusterRoleBinding を作成します。

rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: default-cluster
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
kubectl apply -f rbac.yaml

以下のように表示されれば完了です。

clusterrolebinding.rbac.authorization.k8s.io "default-cluster" created

5. Service を作成します。

payara-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: payara
  labels:
    app: payara
spec:
  type: LoadBalancer
  sessionAffinity: ClientIP
  ports:
    - name: das
      port: 4848
      targetPort: 4848
      protocol: TCP
    - name: server-instance
      port: 28080
      targetPort: 28080
      protocol: TCP
    - name: hazelcast1
      port: 4900
    - name: hazelcast2
      port: 5900
  selector:
    app: payara

payara-service.yaml で指定した metadata/name = payara がサービス名です。
そのため、Payara を実行後、管理コンソールで Kubernetes Cluster Mode の Kubernetes Service Name に「Payara」を指定します。

この CookBook では、Payara を 2 つ起動します。
それぞれの Payara(Payara 1, Payara 2) にアクセスするためのサービスを以下で作成します。

payara-service1.yaml
apiVersion: v1
kind: Service
metadata:
  name: payara1
  labels:
    app: payara
spec:
  type: LoadBalancer
  sessionAffinity: ClientIP
  ports:
    - name: das
      port: 4848
      targetPort: 4848
      protocol: TCP
  selector:
    statefulset.kubernetes.io/pod-name: payara-0

statefulset.kubernetes.io/pod-name = payara-0 としているため、Payara 1 へアクセスするサービスになります。

payara-service2.yaml
apiVersion: v1
kind: Service
metadata:
  name: payara2
  labels:
    app: payara
spec:
  type: LoadBalancer
  sessionAffinity: ClientIP
  ports:
    - name: das
      port: 4848
      targetPort: 4848
      protocol: TCP
  selector:
    statefulset.kubernetes.io/pod-name: payara-1

statefulset.kubernetes.io/pod-name = payara-1 としているため、Payara 2 へアクセスするサービスになります。

kubectl apply -f payara-servide.yaml
kubectl apply -f payara-servide1.yaml
kubectl apply -f payara-servide2.yaml

以下のように表示されれば完了です。

service "payara" created
service "payara1" created
service "payara2" created

以下のコマンドでサービスの一覧を表示できます。

$ kubectl get service
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                        AGE
kubernetes   ClusterIP      10.55.240.1     <none>          443/TCP                                                        9m
payara       LoadBalancer   10.55.244.106   35.230.94.189   4848:31743/TCP,28080:30663/TCP,4900:30914/TCP,5900:32381/TCP   5m
payara1      LoadBalancer   10.55.254.61    35.247.46.80    4848:31080/TCP                                                 5m
payara2      LoadBalancer   10.55.241.3     35.247.26.231   4848:31337/TCP

6. デプロイします。

payara-statefulset.yaml
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: payara
  labels:
    app: payara
spec:
  serviceName: payara
  replicas: 2
  selector:
    matchLabels:
      app: payara
  template:
    metadata:
      labels:
        app: payara
    spec:
      containers:
      - name: payara
        image: gcr.io/my-project/mypayara:5.184
        imagePullPolicy: Always
        resources:
          requests:
            # g1-small
            # cpu: 100m
            # memory: 300Mi
            # n1-standard-1
            # cpu: 150m
            # memory: 1500Mi
            # n1-standard-2
            # cpu: 700m
            # memory: 3000Mi
            cpu: 150m
            memory: 1500Mi
        ports:
        - containerPort: 4848
          name: das
        - containerPort: 28080
          name: server-instance
        - containerPort: 4900
          name: hazelcast1
        - containerPort: 5900
          name: hazelcast2

spec/replicas = 2 としているため、2 つの Payara を実行します。
spec/template/spec/containers/resources/requests はクラスタ作成時に指定したインスタンスタイプに応じて適宜設定します。

kubectl apply -f payara-statefulset.yaml

以下のように表示されれば完了です。

statefulset.apps "payara" created

以下のコマンドでポッドの一覧を表示できます。

$ kubectl get pods -o=wide
NAME       READY     STATUS    RESTARTS   AGE       IP          NODE
payara-0   1/1       Running   0          2m        10.52.0.8   gke-payara-cluster-default-pool-ca5616fd-q89q
payara-1   1/1       Running   0          1m        10.52.1.8   gke-payara-cluster-default-pool-ca5616fd-k646

STATUS が Running にならない場合、以下のコマンドでログを表示しエラーを確認できます。

kubectl logs payara-0
kubectl logs payara-1

また以下のコマンドで bash を起動し、各種コマンドを実行できます。デバッグ時にご利用ください。

kubectl exec -it payara-0 -- /bin/bash
kubectl exec -it payara-1 -- /bin/bash

7. Payara の管理コンソールにアクセスし、Kubernetes Cluster Mode を設定します。

以下のコマンドでエンドポイント IP を確認します。

$ kubectl get service
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                        AGE
kubernetes   ClusterIP      10.55.240.1     <none>          443/TCP                                                        32m
payara       LoadBalancer   10.55.244.106   35.230.94.189   4848:31743/TCP,28080:30663/TCP,4900:30914/TCP,5900:32381/TCP   28m
payara1      LoadBalancer   10.55.254.61    35.247.46.80    4848:31080/TCP                                                 27m
payara2      LoadBalancer   10.55.241.3     35.247.26.231   4848:31337/TCP

NAMEが「payara1」の「EXTERNAL-IP」が「35.247.46.80」
NAMEが「payara2」の「EXTERNAL-IP」が「35.247.26.231」
であるため、https://35.247.46.80:4848/ で Payara 1 の管理コンソール, https://35.247.26.231:4848/ で Payara 2 の管理コンソールにアクセスできます。
ユーザ/パスワードは admin/password に設定されています。

https://35.247.46.80:4848/ から Payara 1 の管理コンソールを表示し、[Domain] - [DataGrid] の [Configuration] タブを表示し、[Restart Data Grid] をチェックします。

以下のように設定します。

設定項目 設定値
Data Grid Discovery Mode kubernetes
kubernetes default
Kubernetes Service Name payara

https://35.247.26.231:4848/ から Payara 2 の管理コンソールを表示し、同様に設定します。

8. クラスタリングを確認します。

[Domain] - [DataGrid] の [Data Grid Instances] タブを表示し、クラスタリングが構築できていることを確認します。

9. 後片付けをします。

以下のコマンドでポッド、サービス、クラスタを削除します。

kubectl delete statefulset payara
kubectl delete service payara2
kubectl delete service payara1
kubectl delete service payara
gcloud container clusters delete payara-cluster

また、https://console.cloud.google.com/

  • [Kubernetes Engine] - [クラスタ]
  • [ネットワーク サービス] - [負荷分散]

を表示し、データが残っている場合削除します。


push した docker image が不要な場合、

  • [Storage] - [ブラウザ]

を表示し、バケットを削除します。

まとめ

このように、Payara 5.184 以降では Kubernetes 環境で簡単に Payara のクラスタリングを構築できます。
是非ご活用ください。