Jun 23, 2025
Jun 24, 2025
N/A Views
MD

Tanzu Gemfire on Kubernetes 2.5をインストールしてKubernetes環境でGemFireクラスターを構築する手順を説明します。

目次

Tanzu GemFire on Kubernetes Docker Registryのアクセストークン取得

Broadcom Supportにログインして、Tanzu GemFireのページからDockerレジストリのトークンを取得します。

image
image

次のコマンドでregistry.packages.broadcom.comにログインします。認証情報を自分のものに置き換えてください。

BC_SUPPORT_USERNAME=your-email@example.com
BC_SUPPORT_PASSWORD=eyJ2ZX*************************************
docker login registry.packages.broadcom.com -u ${BC_SUPPORT_USERNAME} -p ${BC_SUPPORT_PASSWORD}
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

今回はコンテナイメージをPrivate Network上のSelf HostedなContainer Registryにリロケートして使用します。
リロケート先はPrivate Network上でないとEULAに違反する恐れがあるので気をつけてください。

Helm ChartとコンテナイメージをContainer Registryへリロケート

次のコマンドでContainer Registryにログインします。認証情報は自分のものに置き換えてください。

REGISTRY_HOSTNAME=my-private-registry.example.com
REGISTRY_USERNAME=your-username
REGISTRY_PASSWORD=your-password
docker login ${REGISTRY_HOSTNAME} -u ${REGISTRY_USERNAME} -p ${REGISTRY_PASSWORD}

リロケートにはimgpkgを使用します。imgpkgがインストールされていない場合は、公式ドキュメントを参照してインストールしてください。

imgpkg copy -i registry.packages.broadcom.com/tanzu-gemfire-for-kubernetes/gemfire-crd:2.5.0 --to-repo ${REGISTRY_HOSTNAME}/tanzu-gemfire-for-kubernetes/gemfire-crd
imgpkg copy -i registry.packages.broadcom.com/tanzu-gemfire-for-kubernetes/gemfire-operator:2.5.0 --to-repo ${REGISTRY_HOSTNAME}/tanzu-gemfire-for-kubernetes/gemfire-operator

リロケート後のHelm Chartにアクセスして設定可能なvaluesを確認します。

$ helm show values oci://${REGISTRY_HOSTNAME}/tanzu-gemfire-for-kubernetes/gemfire-operator --version 2.5.0
Pulled: my-private-registry.example.com/tanzu-gemfire-for-kubernetes/gemfire-operator:2.5.0
Digest: sha256:6e6553b72dd5a6237c967676d6c88614982cfd31aefd44a94ecef587c916967a
controllerImage: registry.packages.broadcom.com/tanzu-gemfire-for-kubernetes/gemfire-controller:2.5.0
certManagerNamespace: cert-manager

controllerImageも次のコマンドでregistry.packages.broadcom.comからmy-private-registry.example.comにリロケートします。

imgpkg copy -i registry.packages.broadcom.com/tanzu-gemfire-for-kubernetes/gemfire-controller:2.5.0 --to-repo ${REGISTRY_HOSTNAME}/tanzu-gemfire-for-kubernetes/gemfire-controller

Tanzu GemFire on Kubernetesのインストール

Tanzu GemFire for KubernetesのCRDとOperatorをインストールします。

まずはKubernetesの名前空間を作成し、Container RegistryのSecretを作成します。

kubectl create namespace gemfire-system
kubectl create secret docker-registry gemfire-registry-secret \
    --docker-server=${REGISTRY_HOSTNAME} \
    --docker-username=${REGISTRY_USERNAME} \
    --docker-password="${REGISTRY_PASSWORD}" \
    -n gemfire-system

次のコマンドでGemfire CRDをインストールします。

helm upgrade --install \
  -n gemfire-system \
  gemfire-crd \
  oci://${REGISTRY_HOSTNAME}/tanzu-gemfire-for-kubernetes/gemfire-crd \
  --version 2.5.0 \
  --set operatorReleaseName=gemfire-operator \
  --wait

次のコマンドでGemfire Operatorをインストールします。リロケート後のChartとコンテナイメージを指定します。

helm upgrade --install \
  -n gemfire-system \
  gemfire-operator \
  oci://${REGISTRY_HOSTNAME}/tanzu-gemfire-for-kubernetes/gemfire-operator \
  --version 2.5.0 \
  --set controllerImage=${REGISTRY_HOSTNAME}/tanzu-gemfire-for-kubernetes/gemfire-controller:2.5.0 \
  --set imagePullSecretName=gemfire-registry-secret \
  --wait

しばらくするとインストールが完了します。helm listでインストール状態を確認します。

$ helm list -n gemfire-system
NAME            	NAMESPACE     	REVISION	UPDATED                             	STATUS  	CHART                 	APP VERSION
gemfire-crd     	gemfire-system	1       	2025-06-20 11:55:13.47622 +0900 JST 	deployed	gemfire-crd-2.5.0     	2.5.0      
gemfire-operator	gemfire-system	1       	2025-06-20 11:56:56.713258 +0900 JST	deployed	gemfire-operator-2.5.0	2.5.0 

Podの状態を確認して、Operatorが正常に起動していることを確認します。

$ kubectl get pod -n gemfire-system 
NAME                                                 READY   STATUS    RESTARTS   AGE
gemfire-operator-controller-manager-c4d8dfd5-nx6p5   1/1     Running   0          2m42s

利用可能なカスタムリソースを確認します。

$ kubectl api-resources --api-group=gemfire.vmware.com 
NAME              SHORTNAMES   APIVERSION              NAMESPACED   KIND
gemfireclusters                gemfire.vmware.com/v1   true         GemFireCluster

GemFireClusterの作成

Gemfire Operatorを使ってdemo namespaceにGemFireClusterインスタンスを作成します。

GemFireのコンテナイメージは別途指定する必要があり、これも先と同様にmy-private-registry.example.comにリロケートしておきます。Operatorのバージョンと独立して、サポートされている最新のGemFireのコンテナイメージを使用することができます。
ここでは本稿執筆時点で最新のバージョンである10.1.3を使用します。

imgpkg copy -i registry.packages.broadcom.com/pivotal-gemfire/vmware-gemfire:10.1.3 --to-repo ${REGISTRY_HOSTNAME}/pivotal-gemfire/vmware-gemfire

次のコマンドでnamespaceとdocker pull secretを作成します。

kubectl create namespace demo
kubectl create secret docker-registry gemfire-registry-secret \
    --docker-server=${REGISTRY_HOSTNAME} \
    --docker-username=${REGISTRY_USERNAME} \
    --docker-password="${REGISTRY_PASSWORD}" \
    -n  demo

次のコマンドでGemFireClusterインスタンスを作成します。Locator 2台、Server 3台の構成にします。

cat <<EOF > /tmp/demo-gemfire.yaml
---
apiVersion: gemfire.vmware.com/v1
kind: GemFireCluster
metadata:
  name: demo
spec:
  image: ${REGISTRY_HOSTNAME}/pivotal-gemfire/vmware-gemfire:10.1.3
  imagePullSecrets:
  - name: gemfire-registry-secret
  persistentVolumeClaim:
    deleteOnShutdown: true
  locators:
    replicas: 2
  servers:
    replicas: 3
    resources:
      requests:
        memory: 4Gi
      limits:
        memory: 4Gi
---
EOF

kubectl apply -f /tmp/demo-gemfire.yaml -n demo

Note

spec.persistentVolumeClaim.deleteOnShutdowntrueに設定すると、GemFireClusterが削除されたときにPersistentVolumeClaimも削除されます。
デフォルトではfalseになっているので、GemFireClusterを削除してもPersistentVolumeClaimは残ります。プロダクションでは、念の為falseにしておくことが良いでしょう。

次のコマンドで、GemFireClusterの状態を確認します。

$ kubectl get gemfirecluster,sts,pod,pvc -n demo -owide
NAME                                     LOCATORS   SERVERS   CLUSTER IMAGE                                                           OPERATOR VERSION
gemfirecluster.gemfire.vmware.com/demo   2/2        3/3       my-private-registry.example.com/pivotal-gemfire/vmware-gemfire:10.1.3   2.5.0

NAME                            READY   AGE     CONTAINERS   IMAGES
statefulset.apps/demo-locator   2/2     5m32s   locator      my-private-registry.example.com/pivotal-gemfire/vmware-gemfire:10.1.3
statefulset.apps/demo-server    3/3     4m9s    server       my-private-registry.example.com/pivotal-gemfire/vmware-gemfire:10.1.3

NAME                 READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
pod/demo-locator-0   1/1     Running   0          5m32s   10.1.42.145    banana   <none>           <none>
pod/demo-locator-1   1/1     Running   0          5m32s   10.1.42.146    banana   <none>           <none>
pod/demo-server-0    1/1     Running   0          4m9s    10.1.42.147    banana   <none>           <none>
pod/demo-server-1    1/1     Running   0          4m9s    10.1.173.139   cherry   <none>           <none>
pod/demo-server-2    1/1     Running   0          4m9s    10.1.42.148    banana   <none>           <none>

NAME                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE     VOLUMEMODE
persistentvolumeclaim/data-demo-locator-0   Bound    pvc-50d09d5f-bcac-4e74-889f-372fa212c05c   2Gi        RWO            nfs-csi        <unset>                 5m32s   Filesystem
persistentvolumeclaim/data-demo-locator-1   Bound    pvc-cd7d814a-d5e4-455c-b890-d88713778e7b   2Gi        RWO            nfs-csi        <unset>                 5m32s   Filesystem
persistentvolumeclaim/data-demo-server-0    Bound    pvc-baa12461-2220-4142-96d6-820a78a4379a   4Gi        RWO            nfs-csi        <unset>                 4m9s    Filesystem
persistentvolumeclaim/data-demo-server-1    Bound    pvc-423de0c1-782b-442d-8aeb-55909b14e9ab   4Gi        RWO            nfs-csi        <unset>                 4m9s    Filesystem
persistentvolumeclaim/data-demo-server-2    Bound    pvc-90253b95-16f4-4569-adba-9b568daa256a   4Gi        RWO            nfs-csi        <unset>                 4m9s    Filesystem

GemFireクラスターへの接続と動作確認

次のコマンドでLocatorのPod内でbashを実行します。

kubectl -n demo exec -it demo-locator-0 -- bash

Tanzu Gemfire on Kubernetesで作成されるGemfireクラスターはデフォルトでTLSが有効になっています。/certsディレクトリにGemFireの証明書が作成されていることを確認します。

[root@demo-locator-0 data]# ls -l /certs
total 0
lrwxrwxrwx 1 root root 13 Jun 20 05:42 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root root 19 Jun 20 05:42 keystore.p12 -> ..data/keystore.p12
lrwxrwxrwx 1 root root 15 Jun 20 05:42 password -> ..data/password
lrwxrwxrwx 1 root root 14 Jun 20 05:42 tls.crt -> ..data/tls.crt
lrwxrwxrwx 1 root root 14 Jun 20 05:42 tls.key -> ..data/tls.key
lrwxrwxrwx 1 root root 21 Jun 20 05:42 truststore.p12 -> ..data/truststore.p12

証明書のTruststoreとKeystoreのパスワードは、/certs/passwordに保存されています。これを使ってgfshでGemFireに接続します。

[root@demo-locator-0 data]# echo $(cat /certs/password)
rpUt17JjuLLoxN7S9CzRZ8WbwYqMaDjINTZ9OxetAU4=

gfshを実行して、GemFireに接続します。

[root@demo-locator-0 data]# gfsh
/gemfire/bin/gfsh: line 36: tput: command not found
    _________________________     __
   / _____/ ______/ ______/ /____/ /
  / /  __/ /___  /_____  / _____  / 
 / /__/ / ____/  _____/ / /    / /  
/______/_/      /______/_/    /_/    10.1.3

Monitor and Manage Tanzu GemFire
gfsh>

connectコマンドを実行して、Locatorに接続します。ここでは、Locatorのホスト名とポート番号を指定します。--trust-store--key-storeオプションで証明書のパスを指定し、パスワードは先ほど確認したものを使用します。

connect --locator=demo-locator-0.demo-locator.demo.svc.cluster.local[10334] --trust-store=/certs/truststore.p12 --trust-store-password=rpUt17JjuLLoxN7S9CzRZ8WbwYqMaDjINTZ9OxetAU4= --key-store=/certs/keystore.p12 --key-store-password=rpUt17JjuLLoxN7S9CzRZ8WbwYqMaDjINTZ9OxetAU4=

以下の項目に対して、プロンプト上で入力を求められますが、全てデフォルトでEnterを押して進めます。

key-store-type(default: JKS): 
trust-store-type(default: JKS): 
ssl-ciphers(default: any): 
ssl-protocols(default: any): 
ssl-enabled-components(default: all):

これでGemFireに接続できました。以下のようなメッセージが表示されます:

Connecting to Locator at [host=demo-locator-0.demo-locator.demo.svc.cluster.local, port=10334] ..
Connecting to Manager at [host=demo-locator-0.demo-locator.demo.svc.cluster.local, port=1099] ..
Successfully connected to: [host=demo-locator-0.demo-locator.demo.svc.cluster.local, port=1099]

You are connected to a cluster of version 10.1.3.

なお、Pod内からはconnect --url=https://demo-locator.demo.svc.cluster.local:7070/gemfire/v1 --skip-ssl-validationを実行しても接続できました。

list membersコマンドで、GemFireのメンバー(LocatorとServer)が正しく起動していることを確認します:

gfsh>list members
Member Count : 5

     Name      |                                  Id                                  |  Type   | Status
-------------- | -------------------------------------------------------------------- | ------- | ------
demo-locator-0 | demo-locator-0(demo-locator-0:1:locator)<ec><v0>:60681 [Coordinator] | Locator | Ready
demo-locator-1 | demo-locator-1(demo-locator-1:1:locator)<ec><v1>:54760               | Locator | Ready
demo-server-0  | demo-server-0(demo-server-0:1)<v2>:42292                             | Server  | Ready
demo-server-1  | demo-server-1(demo-server-1:1)<v3>:56073                             | Server  | Ready
demo-server-2  | demo-server-2(demo-server-2:1)<v2>:57696                             | Server  | Ready

PARTITION_PERSISTENTタイプのRegionを作成し、冗長度1(各データが2つのServerに保存される)を設定します。その後、テストデータを追加します:

create region --name=demo --type=PARTITION_PERSISTENT --redundant-copies=1

put --region=/demo --key=aaa --value=1
put --region=/demo --key=bbb --value=2
put --region=/demo --key=ccc --value=3
put --region=/demo --key=ddd --value=4
put --region=/demo --key=eee --value=5

データが正しく保存されているかをクエリで確認します:

gfsh>query --query="SELECT * FROM /demo"
Result : true
Limit  : 100
Rows   : 5

Result
------
3
5
2
1
4

外部のgfshからGemFireアクセス設定

Podの外からgfshでGemFireに接続するために、Locatorの管理APIを公開します。ここではContourのHTTPProxyを使用して、Upstream TLSの機能を使います。

Note

この例ではprojectcontoure namespaceに作成されたCertificatedefault-tls (Let's Encryptによるワイルドカード証明書)がTLSCertificateDelegationで公開されている前提です。環境に応じて適切な証明書設定を行ってください。

次のコマンドで、Locatorの管理APIを公開するためのServiceとHTTPProxyを作成します。

cat <<EOF > /tmp/demo-locator-management-api.yaml
apiVersion: v1
kind: Service
metadata:
  name: demo-locator-management-api
  namespace: demo
  annotations:
    projectcontour.io/upstream-protocol.tls: "7070"
spec:
  type: ClusterIP
  ports:
  - name: locator-management-api
    port: 7070
  selector:
    gemfire.vmware.com/app: demo-locator
---
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: demo-locator-management-api
  namespace: demo
spec:
  virtualhost:
    fqdn: demo-locator.lan.ik.am
    tls:
      secretName: projectcontour/default-tls
  routes:
  - services:
    - name: demo-locator-management-api
      port: 7070
      validation:
        caSecret: demo-cert
        subjectName: demo-locator.demo.svc.cluster.local
---
EOF

kubectl apply -f /tmp/demo-locator-management-api.yaml

これでPodの外からgfshを使って次のようにGemFireに接続できるようになります。

connect --url=https://demo-locator.lan.ik.am/gemfire/v1

JavaアプリケーションからGemFireに接続

こちらの記事と同様に、 https://github.com/making/demo-gemfire のサンプルアプリからGemfireに接続してみます。ソースコードはGithubを参照してください。

まずはgfshでRegionを作成します:

create region --name=Customers --type=PARTITION_PERSISTENT --redundant-copies=1

Tanzu Gemfire on Kubernetesでは自動的に次のdisk storeとpdxの設定が行われているので、追加設定なしてPARTITION_PERSISTENTタイプのRegionでPDXを使用することができます。

    <disk-store name="pdxmetadata">
        <disk-dirs>
            <disk-dir>/data/pdxmetadata</disk-dir>
        </disk-dirs>
    </disk-store>
    <pdx read-serialized="true" persistent="true" disk-store-name="pdxmetadata"/>

デモアプリをK8s上にデプロイするために、https://github.com/stakater/application の汎用的なHelm Chartを使用します。

helm repo add stakater https://stakater.github.io/stakater-charts

Helm用のvaluesファイルを作成します。envに設定する内容は次のドキュメントを参考にしました。

cat <<EOF > helm-values.yaml
---
applicationName: demo-gemfire
deployment:
  image:
    repository: ghcr.io/making/demo-gemfire
    tag: jvm
    pullPolicy: Always
  ports:
  - name: http
    containerPort: 8080
    protocol: TCP
  env:
    gemfire.locators:
      value: demo-locator-0.demo-locator.demo.svc.cluster.local:10334,demo-locator-1.demo-locator.demo.svc.cluster.local:10334
    gemfire.properties.ssl-enabled-components:
      value: all
    gemfire.properties.ssl-endpoint-identification-enabled:
      value: "true"
    gemfire.properties.ssl-keystore:
      value: /certs/truststore.p12
    gemfire.properties.ssl-keystore-password:
      valueFrom:
        secretKeyRef:
          name: demo-cert
          key: password
    gemfire.properties.ssl-truststore:
      value: /certs/keystore.p12
    gemfire.properties.ssl-truststore-password:
      valueFrom:
        secretKeyRef:
          name: demo-cert
          key: password
  volumeMounts:
    cert-volume:
      mountPath: /certs
  volumes:
    cert-volume:
      secret:
        secretName: demo-cert
  resources:
    limits:
      cpu:
      memory: 768Mi
    requests:
      cpu:
      memory: 768Mi
  livenessProbe:
    enabled: true
    httpGet:
      path: /actuator/health/liveness
      port: 8080
      scheme: HTTP
  readinessProbe:
    enabled: true
    httpGet:
      path: /actuator/health/readiness
      port: 8080
      scheme: HTTP
  containerSecurityContext:
    allowPrivilegeEscalation: false
    capabilities:
      drop:
      - ALL
    readOnlyRootFilesystem: false
    runAsNonRoot: true
    runAsUser: 1002
    seccompProfile:
      type: RuntimeDefault
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - podAffinityTerm:
          labelSelector:
            matchLabels:
              app.kubernetes.io/part-of: demo-gemfire
          topologyKey: kubernetes.io/hostname
        weight: 1
ingress:
  enabled: true
  annotations:
    projectcontour.io/tls-cert-namespace: projectcontour
  hosts:
  - host: demo-gemfire.lan.ik.am
    paths:
    - path: /
      pathType: Prefix
  tls:
  - hosts:
    - demo-gemfire.lan.ik.am
    secretName: default-tls
---
EOF

Note

このhelm-values.yamlを使って次のhelm templateコマンドで生成されるYAMLは https://gist.github.com/making/3d32b0ac35ece4ac7f3ef70f168e58f2 です。

helm template demo-gemfire stakater/application -n demo -f helm-values.yaml

次のコマンドでデプロイします:

helm upgrade --install demo-gemfire stakater/application -n demo -f helm-values.yaml --wait

Ingressに設定したドメイン(この例ではhttps://demo-gemfire.lan.ik.am)にアクセスすると、次の画面が表示されます:

image

適当に顧客情報を登録します。

image

image

UI上に登録した顧客情報が表示されます。gfshで確認しても、登録した顧客情報がRegionに保存されていることがわかります:

gfsh>query --query="SELECT * FROM /Customers"
Result : true
Limit  : 100
Rows   : 2

id | name
-- | -------------
2  | Ichiro Suzuki
1  | Taro Yamada

外部のJavaアプリからGemFireに接続

すでにgfshでGemFireに接続できることを確認していますが、外部のJavaアプリからも同様にGemFireに接続できます。
クラスタ外のJavaアプリからGemfireにアクセスするにはSNI Proxyを使用する必要があります。

こちらのドキュメントに説明されていますが、このGateway APIを使う方法は、Contourがすでにインストールされている環境では採用しづらいため、今回はContourのHTTPProxyのTLS Session Passthroughを使います。

なお、このドキュメントのコードに従って、デモアプリはSNI Proxy対応済みです。

既存のGemFireクラスターに対して、SNI Proxyを設定するための次のHTTPProxyを作成します。LocatorからアクセスすべきServerの情報がクラスタ内部のホスト名で返ってくるため、Locatorだけでなく、ServerのHTTPProxyをインスタンス単位で作成する必要があります。

cat <<EOF > /tmp/sni-proxy.yaml
---
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: demo-locator-0
  namespace: demo
spec:
  virtualhost:
    fqdn: demo-locator-0.demo-locator.demo.svc.cluster.local
    tls:
      passthrough: true
  tcpproxy:
    services:
    - name: demo-locator-0
      port: 10334
---
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: demo-locator-1
  namespace: demo
spec:
  virtualhost:
    fqdn: demo-locator-1.demo-locator.demo.svc.cluster.local
    tls:
      passthrough: true
  tcpproxy:
    services:
    - name: demo-locator-1
      port: 10334
---
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: demo-server-0
  namespace: demo
spec:
  virtualhost:
    fqdn: demo-server-0.demo-server.demo.svc.cluster.local
    tls:
      passthrough: true
  tcpproxy:
    services:
    - name: demo-server-0
      port: 40404
---
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: demo-server-1
  namespace: demo
spec:
  virtualhost:
    fqdn: demo-server-1.demo-server.demo.svc.cluster.local
    tls:
      passthrough: true
  tcpproxy:
    services:
    - name: demo-server-1
      port: 40404
---
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: demo-server-2
  namespace: demo
spec:
  virtualhost:
    fqdn: demo-server-2.demo-server.demo.svc.cluster.local
    tls:
      passthrough: true
  tcpproxy:
    services:
    - name: demo-server-2
      port: 40404
---
EOF

kubectl apply -f /tmp/sni-proxy.yaml

全てのHTTPProxyの状態がvalidになっていることを確認します。

$ kubectl get httpproxy -n demo
NAME                          FQDN                                                 TLS SECRET                   STATUS   STATUS DESCRIPTION
demo-locator-0                demo-locator-0.demo-locator.demo.svc.cluster.local                                valid    Valid HTTPProxy
demo-locator-1                demo-locator-1.demo-locator.demo.svc.cluster.local                                valid    Valid HTTPProxy
demo-locator-management-api   demo-locator.lan.ik.am                               projectcontour/default-tls   valid    Valid HTTPProxy
demo-server-0                 demo-server-0.demo-server.demo.svc.cluster.local                                  valid    Valid HTTPProxy
demo-server-1                 demo-server-1.demo-server.demo.svc.cluster.local                                  valid    Valid HTTPProxy
demo-server-2                 demo-server-2.demo-server.demo.svc.cluster.local                                  valid    Valid HTTPProxy

EnvoyのIPアドレスとポートを確認します。ここでは192.168.11.240および443です。JavaアプリからはこのIPアドレスとポートをSNI ProxyとしてGemFireに接続し、ホスト名はK8sクラスタ内と同じものを使用します。

$ kubectl get svc -n projectcontour 
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE
contour         ClusterIP      10.152.183.197   <none>           8001/TCP                     79m
contour-envoy   LoadBalancer   10.152.183.23    192.168.11.240   80:31496/TCP,443:31967/TCP   79m

クラスタ外のJavaアプリとしてghcr.io/making/demo-gemfire:jvmのコンテナイメージをDockerから使用します。
以下のコマンドでGemFireの証明書を取得し、アプリケーションの実行に必要なファイルを作成します。

mkdir certs
kubectl get secret -n demo demo-cert -o=template='{{index .data "password" | base64decode}}' > ./certs/password
kubectl get secret -n demo demo-cert -o=template='{{index .data "keystore.p12" | base64decode}}' > ./certs/keystore.p12
kubectl get secret -n demo demo-cert -o=template='{{index .data "truststore.p12" | base64decode}}' > ./certs/truststore.p12

次のプロパティを設定してアプリケーションを起動します。

export CERT_PASSWORD=$(cat ./certs/password)

docker run \
  --rm \
  --name demo-gemfire \
  --pull always \
  -p 8080:8080 \
  -v $(pwd)/certs:/certs \
  -e gemfire.locators=demo-locator-0.demo-locator.demo.svc.cluster.local:10334,demo-locator-1.demo-locator.demo.svc.cluster.local:10334 \
  -e gemfire.sni-proxy.host=192.168.11.240 \
  -e gemfire.sni-proxy.port=443 \
  -e gemfire.properties.ssl-enabled-components=all \
  -e gemfire.properties.ssl-endpoint-identification-enabled=true \
  -e gemfire.properties.ssl-keystore=/certs/keystore.p12 \
  -e gemfire.properties.ssl-keystore-password=${CERT_PASSWORD} \
  -e gemfire.properties.ssl-truststore=/certs/truststore.p12 \
  -e gemfire.properties.ssl-truststore-password=${CERT_PASSWORD} \
  ghcr.io/making/demo-gemfire:jvm

起動に少し時間がかかりましたが、アプリケーションが起動します。起動しない場合は、Contourの設定がおかしい可能性があります。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.5.3)

2025-06-24T03:30:18.821Z  INFO 1 --- [demo-gemfire] [           main] am.ik.demo.DemoGemfireApplication        : Starting DemoGemfireApplication v0.0.1.6bcdb85dc79968717e19d67d0de88335e9e5e9ef using Java 21.0.7 with PID 1 (/workspace/BOOT-INF/classes started by cnb in /workspace)
2025-06-24T03:30:18.822Z  INFO 1 --- [demo-gemfire] [           main] am.ik.demo.DemoGemfireApplication        : No active profile set, falling back to 1 default profile: "default"
2025-06-24T03:30:19.263Z  INFO 1 --- [demo-gemfire] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2025-06-24T03:30:19.268Z  INFO 1 --- [demo-gemfire] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-06-24T03:30:19.268Z  INFO 1 --- [demo-gemfire] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.42]
2025-06-24T03:30:19.278Z  INFO 1 --- [demo-gemfire] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-06-24T03:30:19.279Z  INFO 1 --- [demo-gemfire] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 434 ms
2025-06-24T03:30:19.525Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.l.internal.LoggingProviderLoader   : Using org.apache.geode.logging.internal.SimpleLoggingProvider for service org.apache.geode.logging.internal.spi.LoggingProvider
2025-06-24T03:30:19.554Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.internal.InternalDataSerializer    : initializing InternalDataSerializer with 4 services
2025-06-24T03:30:19.555Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.i.s.f.SanctionedSerializables      : loaded 43 sanctioned serializables from ManagementSanctionedSerializablesService
2025-06-24T03:30:19.558Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.i.s.f.SanctionedSerializables      : loaded 462 sanctioned serializables from CoreSanctionedSerializablesService
2025-06-24T03:30:19.559Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.i.s.f.SanctionedSerializables      : loaded 6 sanctioned serializables from SerializationSanctionedSerializablesService
2025-06-24T03:30:19.559Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.i.s.f.SanctionedSerializables      : loaded 0 sanctioned serializables from MembershipSanctionedSerializablesService
2025-06-24T03:30:19.571Z  INFO 1 --- [demo-gemfire] [           main] org.apache.geode                         : [ThreadsMonitor] New Monitor object and process were created.

2025-06-24T03:30:19.582Z  INFO 1 --- [demo-gemfire] [    StatSampler] o.a.g.i.statistics.StatArchiveHandler    : Disabling statistic archival.
2025-06-24T03:30:19.616Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.internal.cache.GemFireCacheImpl    : Running in client mode
2025-06-24T03:30:19.635Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.internal.cache.GemFireCacheImpl    : Initialized cache service org.apache.geode.cache.query.internal.QueryConfigurationServiceImpl
2025-06-24T03:30:59.827Z  INFO 1 --- [demo-gemfire] [           main] i.n.f.FileWatchingX509ExtendedKeyManager : Initialized KeyManager for /certs/keystore.p12
2025-06-24T03:30:59.829Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.i.n.filewatch.PollingFileWatcher   : Started watching /certs/keystore.p12
2025-06-24T03:30:59.831Z  INFO 1 --- [demo-gemfire] [           main] n.f.FileWatchingX509ExtendedTrustManager : Initialized TrustManager for /certs/truststore.p12
2025-06-24T03:30:59.831Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.i.n.filewatch.PollingFileWatcher   : Started watching /certs/truststore.p12
2025-06-24T03:30:59.839Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.c.c.i.AutoConnectionSourceImpl     : AutoConnectionSource UpdateLocatorListTask started with interval=10000 ms.
2025-06-24T03:30:59.842Z  INFO 1 --- [demo-gemfire] [           main] o.a.g.cache.client.internal.PoolImpl     : Pool DEFAULT started with multiuser-authentication=false
2025-06-24T03:31:00.098Z  INFO 1 --- [demo-gemfire] [Timer-DEFAULT-2] o.a.g.c.c.i.AutoConnectionSourceImpl     : online locators was 0 and is now 2
2025-06-24T03:31:10.156Z  INFO 1 --- [demo-gemfire] [Timer-DEFAULT-4] org.apache.geode                         : Updating membership port.  Port changed from 0 to 43084.  ID is now 1b9f0b56148a(1:loner):0:2f93fc9f
2025-06-24T03:31:39.983Z  INFO 1 --- [demo-gemfire] [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [META-INF/resources/index.html]
2025-06-24T03:31:40.120Z  INFO 1 --- [demo-gemfire] [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint beneath base path '/actuator'
2025-06-24T03:31:40.157Z  INFO 1 --- [demo-gemfire] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2025-06-24T03:31:40.164Z  INFO 1 --- [demo-gemfire] [           main] am.ik.demo.DemoGemfireApplication        : Started DemoGemfireApplication in 81.507 seconds (process running for 81.635)

アプリケーションが起動したら、ブラウザでhttp://localhost:8080にアクセスします。Gemfire上の既存のデータが表示されるはずです。

image

データの追加ももちろんできます。

image

K8sクラスタの外からもGemFireに接続できることが確認できました。

クリーンアップ

アプリケーションを削除します。

helm delete -n demo demo-gemfire --wait

GemFireClusterを削除します。

kubectl delete -f /tmp/demo-gemfire.yaml -n demo
kubectl delete -f /tmp/demo-locator-management-api.yaml -n demo

GemFire OperatorとCRDを削除します。

helm delete -n gemfire-system gemfire-operator --wait
helm delete -n gemfire-system gemfire-crd --wait

Tanzu GemFire on Kubernetesのインストールと、Javaアプリケーションからの接続までの一連の流れを紹介しました。GemFire Operatorを使用することで、Kubernetes上でのGemFireクラスターの管理が容易になり、アプリケーション開発者はGemFireの機能を簡単に利用できるようになります。
デフォルトでTLSが有効になっているため、セキュリティも強化されて、プロダクションで使う場合に安心です。

Found a mistake? Update the entry.
Share this article: