fbpx

Kubernetes(GKE)上にNeo4jをデプロイする #Neo4j #Kubernetes

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本稿はKubernetes上にNeo4jをデプロイする方法を公式ドキュメントの手順に沿って試したのでその記録です。

Kubernetesで構築するメリット

Kubernetes上にデプロイすることで、スケーリングやオートスケーリングが容易にでき、オートヒーリング機能によって可用性を高めることができます。

環境

Kubernetes環境はGKEを使用しました。
ドキュメントにはGKEの他にAWS、Azure、Docker desktopでの手順も載っています。

Neo4j Helmチャートリポジトリ追加

GCPコンソールにログインし、Cloud Shellを起動します。

Neo4j Helmチャートリポジトリを追加します。

$ helm repo add neo4j https://helm.neo4j.com/neo4j
"neo4j" has been added to your repositories

リポジトリを更新します。

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "neo4j" chart repository
Update Complete. ⎈Happy Helming!⎈

Neo4j Helmチャートを確認します。
今回はスタンドアローンなので一番下のチャートneo4j/neo4j-standaloneを使います。

$ helm search repo neo4j/
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
neo4j/neo4j-cluster-core                4.4.8           4.4.8           Neo4j is the world's leading graph database
neo4j/neo4j-cluster-headless-service    4.4.8           -               Neo4j is the world's leading graph database
neo4j/neo4j-cluster-loadbalancer        4.4.8           -               Neo4j is the world's leading graph database
neo4j/neo4j-cluster-read-replica        4.4.8           4.4.8           Neo4j is the world's leading graph database
neo4j/neo4j-docker-desktop-pv           4.4.8           -               Sets up persistent disks suitable for simple de...
neo4j/neo4j-gcloud-pv                   4.4.8           -               Sets up persistent disks suitable for simple de...
neo4j/neo4j-standalone                  4.4.8           4.4.8           Neo4j is the world's leading graph database

GKEクラスタ準備

環境変数をセットします。

// GKEを使うproject idを設定
$ export CLOUDSDK_CORE_PROJECT="my-neo4j-project-355407"

// regionを指定
// https://cloud.google.com/compute/docs/regions-zones?hl=ja#available
$ export CLOUDSDK_COMPUTE_REGION="asia-northeast1"

// 上で指定したregionに含まれるzoneを指定
$ export CLOUDSDK_COMPUTE_ZONE="asia-northeast1-b"

Kubernetes Engine APIを有効化します。
Kubernetes Engineの画面に行くと、Kubernetes Engine APIが有効になっていない場合は下の画面が出るので有効化します。

Google Kubernetes Engine(GKE)クラスタを作成します。
マシンタイプは最小でCPU2コアメモリ8GBのe2-standard-2が必要とドキュメントに記載されています。
しかしe2-standard-2だとCPUとメモリ不足でpodが立ち上がらないときがありました。詳しくはつまずいたところとして下に記載しています。

$ gcloud container clusters create my-neo4j-gke-cluster --num-nodes=1 --machine-type "e2-standard-2" --release-channel "stable"
Default change: VPC-native is the default mode during cluster creation for versions greater than 1.21.0-gke.1500. To create advanced routes based clusters, please pass the `--no-enable-ip-alias` flag
Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
Creating cluster my-neo4j-gke-cluster in asia-northeast1-b... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/my-neo4j-project-355407/zones/asia-northeast1-b/clusters/my-neo4j-gke-cluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/asia-northeast1-b/my-neo4j-gke-cluster?project=my-neo4j-project-355407
kubeconfig entry generated for my-neo4j-gke-cluster.
NAME: my-neo4j-gke-cluster
LOCATION: asia-northeast1-b
MASTER_VERSION: 1.21.11-gke.1900
MASTER_IP: 104.198.81.191
MACHINE_TYPE: e2-standard-2
NODE_VERSION: 1.21.11-gke.1900
NUM_NODES: 1
STATUS: RUNNING

作成したGKEクラスタに切り替えます。

$ gcloud container clusters get-credentials my-neo4j-gke-cluster
Fetching cluster endpoint and auth data.
kubeconfig entry generated for my-neo4j-gke-cluster.

Persistent Volumeを作成する

$ gcloud compute disks create --size 128Gi --type pd-ssd "my-neo4j-disk"
Created [https://www.googleapis.com/compute/v1/projects/my-neo4j-project-355407/zones/asia-northeast1-b/disks/my-neo4j-disk].
NAME: my-neo4j-disk
ZONE: asia-northeast1-b
SIZE_GB: 128
TYPE: pd-ssd
STATUS: READY

New disks are unformatted. You must format and mount a disk before it
can be used. You can find instructions on how to do this at:

https://cloud.google.com/compute/docs/disks/add-persistent-disk#formatting

values.yamlを作成

values.yamlはHelmでデプロイする時に使う設定ファイルです。
今回はmy-neo4j.values.yamlの名前で作ります。

my-neo4j.values.yaml

neo4j:
  resources:
    cpu: "0.5" # neo4jに割り当てられるCPUコア数
    memory: "2Gi" # neo4jに割り当てられるメモリ数

  # 初期パスワード
  # コメントの場合は自動で生成される
  password: "my-initial-password"

  # エンタープライズの場合は下2行のコメントを外す
  #edition: "enterprise"
  #acceptLicenseAgreement: "yes"

volumes:
  data:
    mode: "volume"
    volume:
      gcePersistentDisk:
        pdName: "my-neo4j-disk" # 作成したPersistent Volume名

Neo4jをインストール

values.yamlファイルとHelmチャートを使用してNeo4jをインストールします。
コマンドの形は、helm install <リリース名> <チャート名> -f <values.yamlファイル名> です。
values.yamlに初期パスワードを書いていない場合は、ここで出力されるパスワードをメモします。

$ helm install my-neo4j-release neo4j/neo4j-standalone -f my-neo4j.values.yaml
NAME: my-neo4j-release
LAST DEPLOYED: Tue Jul  5 09:42:50 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing neo4j-standalone.

Your release "my-neo4j-release" has been installed .

The neo4j user's password has been set to "my-initial-password".To view the progress of the rollout try:

  $ kubectl rollout status --watch --timeout=600s statefulset/my-neo4j-release

Once rollout is complete you can log in to Neo4j at "neo4j://my-neo4j-release.default.svc.cluster.local:7687". Try:

  $ kubectl run --rm -it --image "neo4j:4.4.8" cypher-shell \
     -- cypher-shell -a "neo4j://my-neo4j-release.default.svc.cluster.local:7687" -u neo4j -p "my-initial-password"

Graphs are everywhere!

ロールアウトのステータスを確認します。
helm installしたときに出力されたkubectl rolloutコマンドをコピーして使います。
partitioned roll out completeとなっていれば完了です。

$ kubectl rollout status --watch --timeout=600s statefulset/my-neo4j-release
W0705 09:50:32.680002     940 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
partitioned roll out complete: 1 new pods have been updated...

インストールの確認

StatefulSetを確認します。READYが1/1になっていればOKです。

$ kubectl get statefulsets
W0705 09:55:35.494980     985 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
NAME               READY   AGE
my-neo4j-release   1/1     12m

podの状態を確認します。READYが1/1、STATUSがRunningになっていればOKです。

$ kubectl get pods
W0705 09:55:49.615853     993 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
NAME                 READY   STATUS    RESTARTS   AGE
my-neo4j-release-0   1/1     Running   0          12m

podのログを確認します。Startedのログが出力されていればOKです。

$ kubectl exec my-neo4j-release-0 -- tail -n50 /logs/neo4j.log
W0705 09:56:03.896224    1002 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
2022-07-05 09:43:58.797+0000 INFO  Command expansion is explicitly enabled for configuration
2022-07-05 09:43:58.909+0000 INFO  Starting...
2022-07-05 09:44:02.884+0000 INFO  This instance is ServerId{f6a437ea} (f6a437ea-6d7c-45c2-8883-ad8bcf47dfa1)
2022-07-05 09:44:14.086+0000 INFO  ======== Neo4j 4.4.8 ========
2022-07-05 09:44:26.203+0000 INFO  Initializing system graph model for component 'security-users' with version -1 and status UNINITIALIZED
2022-07-05 09:44:26.298+0000 INFO  Setting up initial user from `auth.ini` file: neo4j
2022-07-05 09:44:26.299+0000 INFO  Creating new user 'neo4j' (passwordChangeRequired=false, suspended=false)
2022-07-05 09:44:26.405+0000 INFO  Setting version for 'security-users' to 3
2022-07-05 09:44:26.488+0000 INFO  After initialization of system graph model component 'security-users' have version 3 and status CURRENT
2022-07-05 09:44:26.500+0000 INFO  Performing postInitialization step for component 'security-users' with version 3 and status CURRENT
2022-07-05 09:44:28.002+0000 INFO  Bolt enabled on 0.0.0.0:7687.
2022-07-05 09:44:33.699+0000 INFO  Remote interface available at http://localhost:7474/
2022-07-05 09:44:33.705+0000 INFO  id: FB66FD967667705C5D1D68325B94ABEDD60554C9C21AE38EDF49282C41BCEC6C
2022-07-05 09:44:33.706+0000 INFO  name: system
2022-07-05 09:44:33.706+0000 INFO  creationDate: 2022-07-05T09:44:18.096Z
2022-07-05 09:44:33.706+0000 INFO  Started.

Serviceを確認します。
EXTERNAL-IPはブラウザからNeo4jへ接続するときに使うのでメモしておきます。

$ kubectl get services
W0705 09:56:21.218199    1012 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                                        AGE
kubernetes               ClusterIP      10.28.0.1                443/TCP                                        41m
my-neo4j-release         ClusterIP      10.28.2.178              7687/TCP,7474/TCP,7473/TCP                     13m
my-neo4j-release-admin   ClusterIP      10.28.7.235              6362/TCP,7687/TCP,7474/TCP,7473/TCP            13m
my-neo4j-release-neo4j   LoadBalancer   10.28.14.161   34.84.216.249   7474:30197/TCP,7473:30884/TCP,7687:32120/TCP   13m

Neo4jへログイン

kubectl get servicesで確認したEXTERNAL-IPを使ってNeo4jブラウザに接続します。
http://<EXTERNAL-IP>:7474/browser
Username:neo4j
Password: <values.yamlに記載したパスワード or helm install時に出力されたパスワード>

コマンドでもNeo4jに接続してみます。
helm installしたときに出力されたkubectl runコマンドをコピーして使います。

$ kubectl run --rm -it --image "neo4j:4.4.8" cypher-shell \
     -- cypher-shell -a "neo4j://my-neo4j-release.default.svc.cluster.local:7687" -u neo4j -p "my-initial-password"
W0705 10:43:21.825464    3503 gcp.go:120] WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
To learn more, consult https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
If you don't see a command prompt, try pressing enter.
Connected to Neo4j using Bolt protocol version 4.4 at neo4j://my-neo4j-release.default.svc.cluster.local:7687 as user neo4j.
Type :help for a list of available commands or :exit to exit the shell.
Note that Cypher queries must end with a semicolon.
neo4j@neo4j> 
neo4j@neo4j> SHOW DATABASES;
+---------------------------------------------------------------------------------------------------------------------------------+
| name     | aliases | access       | address          | role         | requestedStatus | currentStatus | error | default | home  |
+---------------------------------------------------------------------------------------------------------------------------------+
| "neo4j"  | []      | "read-write" | "localhost:7687" | "standalone" | "online"        | "online"      | ""    | TRUE    | TRUE  |
| "system" | []      | "read-write" | "localhost:7687" | "standalone" | "online"        | "online"      | ""    | FALSE   | FALSE |
+---------------------------------------------------------------------------------------------------------------------------------+

2 rows
ready to start consuming query after 4 ms, results consumed after another 5 ms

リソース削除

Neo4j Helmチャートをアンインストールします。

$ helm uninstall my-neo4j-release
release "my-neo4j-release" uninstalled

Persistent Volumeを削除します。

$ gcloud compute disks describe "my-neo4j-disk"
creationTimestamp: '2022-07-05T02:20:54.325-07:00'
id: '1307731628267256985'
kind: compute#disk
labelFingerprint: nT7_dAxskBs=
labels:
  goog-gke-volume: ''
lastAttachTimestamp: '2022-07-05T02:42:54.925-07:00'
lastDetachTimestamp: '2022-07-05T03:55:52.122-07:00'
name: my-neo4j-disk
physicalBlockSizeBytes: '4096'
selfLink: https://www.googleapis.com/compute/v1/projects/my-neo4j-project-355407/zones/asia-northeast1-b/disks/my-neo4j-disk
sizeGb: '128'
status: READY
type: https://www.googleapis.com/compute/v1/projects/my-neo4j-project-355407/zones/asia-northeast1-b/diskTypes/pd-ssd
zone: https://www.googleapis.com/compute/v1/projects/my-neo4j-project-355407/zones/asia-northeast1-b
$ gcloud compute disks delete my-neo4j-disk
The following disks will be deleted:
 - [my-neo4j-disk] in [asia-northeast1-b]

Do you want to continue (Y/n)?  Y

Deleted [https://www.googleapis.com/compute/v1/projects/my-neo4j-project-355407/zones/asia-northeast1-b/disks/my-neo4j-disk].

GKEクラスタを削除します。

$ gcloud container clusters delete my-neo4j-gke-cluster
The following clusters will be deleted.
 - [my-neo4j-gke-cluster] in [asia-northeast1-b]

Do you want to continue (Y/n)?  Y

Deleting cluster my-neo4j-gke-cluster...done.
Deleted [https://container.googleapis.com/v1/projects/my-neo4j-project-355407/zones/asia-northeast1-b/clusters/my-neo4j-gke-cluster].

つまずいたところ

クラスタを作成するときにマシンタイプがe2-standard-2だとpodが立ち上がらないときがありました。
(状況)
1回目:e2-standard-2:podが正常に立ち上がらず、RESTARTSを繰り返している状態
    kubectl describe podsするとメモリとCPUがinsufficientと表示
2回目:e2-standard-4:正常に立ち上がった
3回目:e2-standard-2:正常に立ち上がった
エラーを再現しようと思った3回目で正常に立ち上がってしまったので1回目のエラーは再現できていません。
GKEの機嫌が悪かったということにしておきます。

まとめ

今回はGKE上にNeo4jを構築してみました。リポジトリ追加からリソース削除までで30分くらいでできると思います。
今回はスタンドアローンでしたが、Enterprise版の場合はNeo4jクラスタを構成することが可能なのでより耐障害性の高いNeo4j環境を構築できます。

Author

ごま煎餅を食べて生きるエンジニア。

n-komukaiの記事一覧

新規CTA