はじめに
Elasticsearch、Algolia、群雄割拠の全文検索エンジン界に現れた新星Meilisearch。
SaaS版(Meilisearch Cloud)とOSS版があり用途に合わせて選択することができます。
OSS版について、公式ドキュメントのSetup and installationにはローカルやAWS、GCP、Azureで導入する方法が画面スクショも込みで詳細に記載されており大変親切です。
しかしGCPへの導入方法についてはGCEを利用するサンプルしかありません。
ここではGKE上にMeilisearchを構築する方法をまとめていこうと思います。
作成したファイルは下記リポジトリに置いています。
本稿の流れ
まず、MeilisearchをデプロイするためのGKEを構築します。ここでGKEはAutopilot版を採用しましたが、通常のGKE(GKE Standard)でもほぼ同様の手順で構成できるかと思います。
次にMeilisearchをKubernetes(k8s)上で構成するためのファイルを作成します。
最後に作成したファイルをもとにGKE上にデプロイし、Meilisearchの動作を検証します。
GKE Autopilotを立ち上げる
ご存知の方も多いと思いますが、GKE AutopilotはGKE Standardとは異なりNodeの管理をする必要がなくまさに「完全マネージドなk8s」です。
全体像をキャッチアップしたい場合はGoogle CloudのKazuuさん記事がオススメです。
自分の場合、普段Cloud Run等のサーバーレスなサービスしか使っておらず、ステートフルなサービスもなるべくマネージドに作りたい思いがあるので好きなサービスです。
コンソールポチポチか、Terraformか
もちろんコンソールポチポチで作ることもできますし、コマンドラインで作ることもできますが、今回はTerraformで構築することにしました。
普段あまりTerraformを触らないので、備忘録も兼ねて、環境構築からの手順を書いていきます。
Terraformの開発環境を構築する
下記の記事を参考にbrew install tfenv
でTerraform環境を導入しました。
tfenv
はnodenv
やpyenv
等と同様に複数のTerraformバージョンを管理できるモノです。
Terraformはバージョンによって構文が違ったりするのでバージョン管理できると便利です(ex. Terraformバージョンについての注意)。
❯ tfenv --version
tfenv 3.0.0
❯ terraform --version
Terraform v1.3.6
Terraformのファイルを作成する
Terraformを本番利用する場合はディレクトリをどう切るか設計する必要があるかと思いますが、今回はひとつのディレクトリに平たく置いています。
❯ tree
.
├── main.tf # resourceの定義
├── provider.tf # providerの定義
├── terraform.tfvars # variableの値の定義
└── variables.tf # variableの定義
main.tf
に記載のresourceの定義はこちらです:
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.3.0"
}
}
required_version = "~> 1.0"
}
resource "google_compute_network" "vpc" {
name = "meilisearch-network"
project = var.project_id
}
resource "google_compute_subnetwork" "subnet" {
name = "meilisearch-subnet"
project = var.project_id
ip_cidr_range = "10.0.11.0/24"
network = google_compute_network.vpc.id
}
resource "google_container_cluster" "meiilisearch" {
name = "${var.project_id}-meilisearch"
project = var.project_id
location = var.region
initial_node_count = 1
network = google_compute_network.vpc.name
subnetwork = google_compute_subnetwork.subnet.name
enable_autopilot = true
}
ポイントは:
- GKE AutopilotはGoogle Cloud Terraformプロバイダが
3.63.0
以上である必要があります。更にTerraformも0.14
以上である必要があります。そのためrequired_providers
周辺でバージョン指定を行っています -
enable_autopilot = true
でAutopilot指定しています - 再利用する部分は基本的に
variables.tf
に切り出してvar
で参照するようにしました - 分かりやすさのため、ブロック内で指定する属性はなるべく最低限になるようにしました
provider.tf
とvariables.tf
は説明するまでもないので省略させていただきます。
気になる方はリポジトリをご確認いただければと思います。
terraform.tfvars
はvariableに値を渡せるもので、下記の記事が詳しいです。
GKEを立ち上げる
tf
ファイルを作成したディレクトリ直下で下記を実行します。
# 初期化
terraform init
# 実行するとどんなリソースが作成されるか確認
terraform plan
# 実行
terraform apply
terraform apply
は結構時間がかかりましたが、5-10分程経過後無事にGKEが作られました!
MeilisearchをGKE上に構築する
Meilisearchのk8sマニフェストとHelmチャートは公式が公開しています。
このリポジトリの指示通りに行えばMeilisearchをGKE含むk8s環境にデプロイ可能です。
今回はデプロイするMeilisearchに対してインターネットからアクセスしたく、「Ingressを利用する」等の設定を行う必要があります。
Helmチャートは柔軟にパラメータ設定が可能なので、上記リポジトリのHelmチャートを利用することにしました。
Helmではアプリケーションのデプロイ時にさまざまなパラメータを与えて設定を行う仕組みが用意されている。これらパラメータは、「helm install」コマンドの実行時に「--set <パラメータ名>=<値>」オプションで指定するか、もしくはYAML形式でファイルに記述し、「-f <YAMLファイル>」オプションでそのファイルを指定することで設定できる。
Helmチャートのパラメータを設定する
公式リポジトリのREADMEにパラメータの変更方法が記載されています。
記載されている通り、meilisearch-kubernetes/charts/meilisearch/values.yaml
にてパラメータを設定します。
-
service.type
をClusterIPからNodePortに変更- Ingressを利用するためNodePortを利用します
-
ingress.enabled
をtrueに変更 -
ingress.className
のnginxを除去しingress.annotations
にkubernetes.io/ingress.class: gce
を追加- 公式ドキュメントGKE Ingressコントローラの動作に記載の通りGKE Ingressコントローラは基本的に
kubernetes.io/ingress.class
の値を見ています - L7ロードバランサを作りたかったので
gce
を設定しています
- 公式ドキュメントGKE Ingressコントローラの動作に記載の通りGKE Ingressコントローラは基本的に
-
ingress.hosts
を削除
Helmを使ってGKE上にデプロイする
Helmは導入済み前提で話を進めていきます(Helm のインストール)。
まずはHelmがクラスタに接続できるように、kubeconfigの指定先をGKEに変更します。
変更するためのコマンドはGCPコンソールから入手します。
GCPコンソール > GKEクラスタ > クラスタを選択 > 画面上部の「接続」
コマンド入力後、current-context
が変更されていれば成功です。
# kubectlとHelmはkubeconfigを共有
❯ kubectl config current-context
gke_XXX_asia-northeast1_XXX-meilisearch
Helmチャートのパラメータを設定するの項で変更したvalies.yaml
を指定してGKEにデプロイします。
helm upgrade -i meilisearch meilisearch/meilisearch -f values.yaml
コンソールを見るとデプロイが確認できます!
下記はGCPコンソール > GKE > ServicesとIngress > INGRESS
から辿ったIngressです。
デプロイしたMeilisearchの動作確認
上記のIngressスクショで黒塗りした「フロントエンド」には自動で割り振られたIPアドレスが記載されています。
このIPアドレスを対象にMeilsearchの動作を確認していきます。
# データ投入
curl \
-H "Content-Type: application/json" \
-X POST 'http://<自動で割り振られたIPアドレス>/indexes/musics/documents' \
--data '[{
"id": 100,
"title": "Kid A",
"by": "Radiohead",
"release_date": "2000-10-2"
},{
"id": 200,
"title": "The Bends",
"by": "Radiohead",
"release_date": "1995-3-13"
},{
"id": 300,
"title": "OK Computer",
"by": "Radiohead",
"release_date": "1997-5-21"
},{
"id": 400,
"title": "A Moon Shaped Pool",
"by": "Radiohead",
"release_date": "2016-5-8"
}]'
# 確認
❯ curl -v http://<自動で割り振られたIPアドレス>/indexes/musics/documents
{"results":[{"id":100,"title":"Kid A","by":"Radiohead","release_date":"2000-10-2"},{"id":200,"title":"The Bends","by":"Radiohead","release_date":"1995-3-13"},{"id":300,"title":"OK Computer","by":"Radiohead","release_date":"1997-5-21"},{"id":400,"title":"A Moon Shaped Pool","by":"Radiohead","release_date":"2016-5-8"}],"offset":0,"limit":20,"total":4}
ちなみにMeilisearchにはGUIコンソールがついており、ブラウザからIPアドレスに直でアクセスすると確認できます。
後片付け
検証し終わったら後片付けをしましょう。
# Meilisearchを削除
helm uninstall meilisearch
# GKEを削除
terraform destroy
おわりに
GKEにMeilisearchをデプロイする方法をまとめました。
あくまで動かすことを目的としており、証明書とかクラスタの設定とかPVCの設定とか諸々ガバガバな部分があります。
そのため本番環境導入の上では考慮事項は増えますが、MeilisearchのOSS版を利用する上では、Autopilotの採用は結構良さそうだと感じました(マネージドみが強いので)。