LoginSignup
4
2

More than 1 year has passed since last update.

全文検索エンジンMeilisearchをGKE(Autopilot)上に構築する

Last updated at Posted at 2022-12-23

はじめに

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環境を導入しました。
tfenvnodenvpyenv等と同様に複数の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の定義はこちらです:

main.tf
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.tfvariables.tfは説明するまでもないので省略させていただきます。
気になる方はリポジトリをご確認いただければと思います。
terraform.tfvarsはvariableに値を渡せるもので、下記の記事が詳しいです。

GKEを立ち上げる

tfファイルを作成したディレクトリ直下で下記を実行します。

# 初期化
terraform init

# 実行するとどんなリソースが作成されるか確認
terraform plan

# 実行
terraform apply

terraform applyは結構時間がかかりましたが、5-10分程経過後無事にGKEが作られました!

image.png

MeilisearchをGKE上に構築する

Meilisearchのk8sマニフェストとHelmチャートは公式が公開しています。
このリポジトリの指示通りに行えばMeilisearchをGKE含むk8s環境にデプロイ可能です。

今回はデプロイするMeilisearchに対してインターネットからアクセスしたく、「Ingressを利用する」等の設定を行う必要があります。
Helmチャートは柔軟にパラメータ設定が可能なので、上記リポジトリのHelmチャートを利用することにしました。

Helmではアプリケーションのデプロイ時にさまざまなパラメータを与えて設定を行う仕組みが用意されている。これらパラメータは、「helm install」コマンドの実行時に「--set <パラメータ名>=<値>」オプションで指定するか、もしくはYAML形式でファイルに記述し、「-f <YAMLファイル>」オプションでそのファイルを指定することで設定できる。

事実上の標準ツールとなっているKubernetes向けデプロイツール「Helm」入門

Helmチャートのパラメータを設定する

公式リポジトリのREADMEにパラメータの変更方法が記載されています。
記載されている通り、meilisearch-kubernetes/charts/meilisearch/values.yamlにてパラメータを設定します。

image.png

  • service.typeをClusterIPからNodePortに変更
    • Ingressを利用するためNodePortを利用します
  • ingress.enabledをtrueに変更
  • ingress.classNameのnginxを除去しingress.annotationskubernetes.io/ingress.class: gceを追加
    • 公式ドキュメントGKE Ingressコントローラの動作に記載の通りGKE Ingressコントローラは基本的にkubernetes.io/ingress.classの値を見ています
    • L7ロードバランサを作りたかったのでgceを設定しています
  • ingress.hostsを削除

Helmを使ってGKE上にデプロイする

Helmは導入済み前提で話を進めていきます(Helm のインストール)。

まずはHelmがクラスタに接続できるように、kubeconfigの指定先をGKEに変更します。
変更するためのコマンドはGCPコンソールから入手します。

GCPコンソール > GKEクラスタ > クラスタを選択 > 画面上部の「接続」

image.png

コマンド入力後、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です。

image.png

デプロイした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アドレスに直でアクセスすると確認できます。

image.png

後片付け

検証し終わったら後片付けをしましょう。

# Meilisearchを削除
helm uninstall meilisearch

# GKEを削除
terraform destroy

おわりに

GKEにMeilisearchをデプロイする方法をまとめました。
あくまで動かすことを目的としており、証明書とかクラスタの設定とかPVCの設定とか諸々ガバガバな部分があります。
そのため本番環境導入の上では考慮事項は増えますが、MeilisearchのOSS版を利用する上では、Autopilotの採用は結構良さそうだと感じました(マネージドみが強いので)。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2