在GKE(Autopilot)上创建全文搜索引擎Meilisearch
首先
中国的新星Meilisearch在全文搜索引擎领域出现,与Elasticsearch、Algolia等并列存在。
该产品提供了SaaS版(Meilisearch Cloud)和OSS版,可根据需求进行选择。
关于OSS版,官方的设置和安装文档非常详细地介绍了在本地、AWS、GCP、Azure等平台上的安装方法,甚至包含了屏幕截图,非常友好。
然而,关于将GCP引入的方法只有使用GCE的示例。
我计划在这里总结在GKE上构建Meilisearch的方法。
我已将创建的文件放在下面的存储库中。
本文的主旨
首先,我們將建立一個 GKE 環境來部署 Meilisearch。在這裡,我們選擇了 Autopilot 版本的 GKE,但對於標準版的 GKE(GKE Standard),我們也可以使用幾乎相同的步驟進行配置。
接下來,我們將創建一個用於在 Kubernetes(k8s)上配置 Meilisearch 的文件。
最後,我們將根據創建的文件在 GKE 上進行部署,並驗證 Meilisearch 的運作。
启动GKE Autopilot
我想你可能很多人都知道,GKE Autopilot与GKE Standard不同,无需管理节点,可以说是”完全托管的k8s”。
如果想要了解更多整体情况,我推荐Google Cloud的Kazuu的文章。
对于我自己来说,通常只使用像Cloud Run这样的无服务器服务,而且我也希望尽可能将有状态的服务管理起来,所以我喜欢这个服务。
要么使用控制台,要么使用Terraform。
当然可以使用控制台手动操作或者使用命令行来进行设置,但是这次我们决定使用Terraform进行构建。
由于平时很少接触Terraform,所以为了备忘录和记录,我们将详细写下从环境设置开始的步骤。
搭建Terraform的开发环境
我根据下面的文章,在安装了tfenv之后引入了Terraform环境。
tfenv类似于nodenv和pyenv,可以管理多个Terraform版本。
由于Terraform在不同的版本中语法可能有所不同,因此可以进行版本管理非常方便(例如:关于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周辺でバージョン指定を行っています
ref. Terraform Adds Support for GKE Autopilot
ref. GKE AutoPilot Failure For Node Count #10782
enable_autopilot = trueでAutopilot指定しています
再利用する部分は基本的にvariables.tfに切り出してvarで参照するようにしました
分かりやすさのため、ブロック内で指定する属性はなるべく最低限になるようにしました
由于provider.tf和variables.tf无需解释,我将省略它们。如果您感兴趣,请查看存储库。
terraform.tfvars是用于传递变量值的文件,以下文章提供了详细介绍。
启动GKE
在创建tf文件的目录下执行以下操作。
# 初期化
terraform init
# 実行するとどんなリソースが作成されるか確認
terraform plan
# 実行
terraform apply
Terraform apply花了相当长的时间,但是经过大约5-10分钟后,GKE已经成功创建了!
在GKE上搭建Meilisearch.
Meilisearch的k8s配置文件和Helm图表已由官方发布。
按照该存储库中的指示操作,即可将Meilisearch部署到包括GKE在内的k8s环境中。
我們希望能從互聯網訪問部署的 Meilisearch,因此需要進行一些設置,如使用 “Ingress”。由於 Helm Chart 具有靈活的參數設定功能,因此我們決定使用上述存儲庫的 Helm Chart。
Helm 提供了在应用程序部署时提供各种参数并进行配置的机制。这些参数可以在执行 “helm install” 命令时使用 “–set <参数名>=<值>” 选项进行指定,或者以 YAML 格式写入文件并使用 “-f <YAML文件>” 选项进行配置。
简明 Kubernetes 部署工具 “Helm” 入门
设置Helm图表的参数
在公式存储库的自述文件中记载了如何更改参数的方法。
按照所述,在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を設定しています
ingress.hostsを削除
使用Helm在GKE上进行部署。
我们将在默认安装Helm的前提下进行讨论(安装Helm)。
首先,我们需要将kubeconfig的指定目标更改为GKE,以便Helm能够连接集群。
您可以从GCP控制台获取用于进行此更改的命令。
GCPコンソール > GKEクラスタ > クラスタを選択 > 画面上部の「接続」
如果在输入命令后,当前上下文发生了改变,那么就代表成功。
# kubectlとHelmはkubeconfigを共有
❯ kubectl config current-context
gke_XXX_asia-northeast1_XXX-meilisearch
使用更改后的valies.yaml文件,在Helm图表的参数设置部分指定并部署到GKE。
helm upgrade -i meilisearch meilisearch/meilisearch -f values.yaml
当查看控制台时,可以确认部署情况!以下是从GCP控制台 > GKE > 服务和入口控制器 > 入口控制器所跟踪的入口控制器。
在部署完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的开源版本时,我觉得采用Autopilot似乎是相当好的选择(因为它更加受管理)。