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環境を構築できます。