本教程介绍如何在各种环境中设置 Elastic Stack 平台以及如何执行从 Elastic Cloud on Kubernetes (ECK) 到 Elastic Cloud on Google Cloud 的基本数据迁移。
随着组织迁移到 Google Cloud,迁移策略变得越来越重要。无论您是从另一个云环境还是本地环境迁移,都必须确保业务流程继续进行,而中断最少。处理、存储和提供分析数据的数据平台通常可以提供有关您的业务和应用基础结构如何运行的重要见解。对于许多组织而言,Elastic Stack 是提供此类见解的关键组件。
本教程适用于参与将系统和应用迁移到 Google Cloud 的数据以及企业架构师和系统管理员。本教程为您提供了在 Google Cloud 的各种环境中实例化 Elastic Stack 的经验。
本教程是使用 ECK 1.0.1 版进行开发和测试的。
关键组件
本教程与以下技术互动:
- Elastic Stack:一个包含以下主要组件的平台:
- Elasticsearch:一种基于 JSON 的分布式搜索和分析引擎,旨在实现横向伸缩、最大可靠性和简化管理。
- Kibana:为数据提供了形状,是可扩展的界面,可用于配置和管理 Elastic Stack 的所有方面。
- Beats:一种轻量级插件,将数据从边缘机器发送到 Logstash 和 Elasticsearch。
- Logstash:一个具有可扩展插件生态系统和强大 Elasticsearch 合成器的动态数据收集流水线。
- Elastic Cloud:一个可在 Google Cloud 上运行的托管式 Elasticsearch 和 Kibana 服务。
- ECK:扩展了基本的 Kubernetes 编排功能,以支持在 Kubernetes 上设置与管理 Elasticsearch、Kibana 和 APM Server。
- Google Kubernetes Engine (GKE):提供了一个受管环境,您可以使用 Google 基础架构在其中部署、管理和伸缩容器化应用。GKE 环境由多个机器(Compute Engine 实例)组成,这些机器组合在一起就形成了集群。
目标
- 部署 ECK on GKE。
- 将样本数据加载到 ECK 集群中。
- 部署 Elastic Cloud。
- 截取数据快照并将其加载到 Cloud Storage 中。
- 使用存储的快照恢复 ECK 实例。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Compute Engine
- GKE
- Cloud Storage
- Elastic Cloud(请参阅 Google Cloud Marketplace)
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
在 Cloud Shell 中,启用 Compute Engine 和 GKE API:
gcloud services enable compute.googleapis.com \ container.googleapis.com
这些 API 用于预配部署本教程所需的 GKE 资源所需的计算资源。该过程可能需要几分钟。完成后,您可以继续操作。
设置要在其中部署数据库和计算资源的默认计算可用区:
gcloud config set compute/zone us-central1-a export COMPUTE_ZONE=us-central1-a
本教程使用
us-central1-a
作为可用区。您还可以部署到您选择的可用区。如需了解详情,请参阅地理位置和区域。
将 ECK 部署到 GKE 集群
在以下部分中,您将设置必要的基础架构和软件,以运行 Elastic Cloud on Google Cloud。
预配服务帐号以创建和管理 GKE 集群
在本部分中,您将创建一个服务帐号,该帐号用于创建和管理本教程的 GKE 集群。集群是 Compute Engine 上的虚拟机实例,默认情况下继承默认的 Compute Engine 服务帐号。此服务帐号具有的权限超出了教程所需的权限。最佳做法是,在创建服务帐号时遵循最小权限原则。
在以下步骤中,您将向服务帐号授予 Monitoring Viewer (roles/monitoring.viewer
)、Monitoring Metric Writer (roles/monitoring.metricWriter
) 和 Logs Writer (roles/logging.logWriter
) IAM 角色。此外,您还需要向服务帐号授予 Compute Admin 角色 (roles/compute.admin
)。此角色拥有所有 Compute Engine 资源的完全控制权。本教程不需要此角色。但是,如果您仍然将此服务帐号用于集群并需要添加计算节点,则 Compute Admin 角色允许您预配额外的计算资源。
在 Cloud Shell 中,将 Google Cloud 项目 ID 设置为变量,然后设置服务帐号名称:
export PROJECT_ID=$(gcloud config get-value project 2> /dev/null) export SA_ID=eck-sa
创建服务帐号以及使用服务帐号的电子邮件地址创建新变量:
gcloud iam service-accounts create $SA_ID --display-name=$SA_ID export GKE_SA_EMAIL=$(gcloud iam service-accounts list \ --filter=displayName:"$SA_ID" --format='value(email)')
元数据可能需要一段时间才能同步。同步完成后,变量中会显示该电子邮件地址。在此之前,此变量为空。
验证是否已使用服务帐号 ID 设置本地环境变量:
echo $GKE_SA_EMAIL
如果输出为空,请重新运行上一个
export
命令,直到填充变量。如果设置了环境变量,您会看到服务帐号 ID,其格式类似于电子邮件地址。同步元数据后,将政策绑定关联到服务帐号:
gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$GKE_SA_EMAIL --role roles/logging.logWriter gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$GKE_SA_EMAIL --role roles/monitoring.metricWriter gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$GKE_SA_EMAIL --role roles/monitoring.viewer gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$GKE_SA_EMAIL --role roles/storage.admin gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$GKE_SA_EMAIL --role roles/compute.admin
创建 GKE 集群
下一步是部署集群。以下命令使用 n1-standard-4
机器类型和 256 GB 永久性磁盘 (SSD) 创建三节点集群。您可以更改这些资源。
在 Cloud Shell 中,部署您的集群:
gcloud container clusters create "eck-tutorial" \ --project $PROJECT_ID --zone $COMPUTE_ZONE \ --service-account $GKE_SA_EMAIL \ --no-enable-basic-auth --machine-type "n1-standard-4" \ --image-type "COS" --disk-type "pd-standard" \ --disk-size "256" --metadata disable-legacy-endpoints=true \ --num-nodes "3" \ --enable-ip-alias --no-issue-client-certificate
获取身份验证凭据,以便
kubectl
能够与您的新集群进行交互:gcloud container clusters get-credentials eck-tutorial
ECK 使用入门
下一步是将 ECK 设置为在预配的基础架构上运行。
部署 Elasticsearch Operator
Kubernetes 运算符模式支持在 Kubernetes 上设置自定义资源。Elasticsearch Operator 使用该模式在 Kubernetes 上部署 Elastic Stack 的组件。
在 Cloud Shell 中,安装自定义资源定义 (CRD):
kubectl apply -f https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yaml
(可选)监控 Operator 日志:
watch kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
通常,ECK 在您安装 CRD 后不到一分钟即可完成。
生成用于访问 Cloud Storage 的 Secret
下一步是使新的 Elasticsearch 集群读取快照并将其写入 Cloud Storage 存储分区。
在 Cloud Shell 中,生成服务帐号密钥和 Kubernetes Secret:
gcloud iam service-accounts keys create ~/gcs.client.default.credentials_file \ --iam-account=$GKE_SA_EMAIL kubectl create secret generic gcs-credentials \ --from-file=gcs.client.default.credentials_file
为您的快照创建 Cloud Storage 存储分区,并显示存储分区的名称:
export GCSBUCKET=$RANDOM-eck-gcs-snapshot && gsutil mb gs://$GCSBUCKET
复制存储分区的名称,以便在后续步骤中使用。
部署 Elastic Stack
在 Cloud Shell 中,应用示例集群规范,该规范将 Elasticsearch、Kibana 和 APM 服务器的服务器部署到集群中:
cat << 'EOF' > ~/eck.yaml apiVersion: elasticsearch.k8s.elastic.co/v1 kind: Elasticsearch metadata: name: quickstart spec: version: 7.6.1 secureSettings: - secretName: gcs-credentials nodeSets: - name: default count: 3 config: node.master: true node.data: true node.ingest: true node.store.allow_mmap: false podTemplate: spec: initContainers: - name: install-plugins command: - sh - -c - | bin/elasticsearch-plugin install --batch repository-gcs --- apiVersion: kibana.k8s.elastic.co/v1 kind: Kibana metadata: name: kibana-sample spec: version: 7.6.1 count: 1 elasticsearchRef: name: quickstart --- apiVersion: apm.k8s.elastic.co/v1 kind: ApmServer metadata: name: apm-server-sample spec: version: 7.6.1 count: 1 elasticsearchRef: name: quickstart EOF kubectl apply -f eck.yaml
(可选)监视部署的状态:
watch kubectl get elasticsearch,kibana,apmserver
当三个服务的运行状况指示器为绿色时,您的集群正在运行。
创建负载平衡器并登录 Kibana
默认情况下,集群中的服务只有内部 IP 地址,无法通过公共互联网访问。如果您运行 kubectl get services
命令,则会看到所有服务如何具有内部 IP 地址和没有外部 IP 地址。如需通过网络浏览器连接到 Kibana,您需要公开应用,即可通过多种方式完成这些操作,每种方式具有各自的优点和缺点。在本教程中,您将创建一个负载平衡器。
在 Cloud Shell 中,创建负载平衡器:
kubectl expose deployment kibana-sample-kb \ --type=LoadBalancer \ --port 5601 \ --target-port 5601
此负载平衡器接受端口
5601
的请求,该端口是 Kibana 服务的默认端口。检查名为
kibana-sample-kb
的新负载平衡器服务:watch kubectl get services
等待预配外部 IP 地址。
出现地址后,将网址复制到
EXTERNAL_IP
变量中,然后将整个网址粘贴到浏览器中以加载 Kibana 门户:https://EXTERNAL_IP:5601
如果您使用的是 Google Chrome,请点击高级,然后点击仍然继续。
使用
elastic
用户名登录门户。要查找密码并将其设置为变量,请在 Cloud Shell 中运行以下命令:PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode) && echo $PASSWORD
如果您以后想更改此密码,最好将其保存在安全位置。
加载和准备示例数据
首次登录 Kibana 时,系统会提示您开始使用样本数据。
在 Kibana 门户中,点击试用我们的示例数据:
在示例航班数据卡片上,点击添加数据,添加示例航班数据。
如需熟悉这些示例,请浏览信息中心和地图。
查询 Elasticsearch 数据
下一步验证您是否可以查询 Elasticsearch 数据。首先,将端口 9200
(Elasticsearch 服务侦听的端口)从 ECK 集群转发到本地机器。然后,您对数据运行测试查询。
在 Cloud Shell 中,启用端口转发:
kubectl port-forward service/quickstart-es-http 9200
在 Cloud Shell 菜单栏上,点击
打开新标签页。第二个 Cloud Shell 会话随即开始。将 Elastic 用户的密码存储为局部变量:
PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
测试连接:
curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
输出内容类似如下:
{ "name" : "quickstart-es-default-0", "cluster_name" : "quickstart", "cluster_uuid" : "ifdFjTixQ9q7sVc7uUpSnA", "version" : { "number" : "7.6.1", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "aa751e09be0a5072e8570670309b1f12348f023b", "build_date" : "2020-02-29T00:15:25.529771Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
计算样本数据集中的文档数:
curl -u "elastic:$PASSWORD" -k "https://localhost:9200/kibana_sample_data_flights/_count"
输出类似于以下内容:
{"count":13059,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
输出表明索引包含 13059 个文档。
关闭第二个 Cloud Shell 终端会话,但保持原始会话打开。
在原始 Cloud Shell 会话中,按 Control+C 停止不再需要的端口转发。
注册快照注册表
如需创建和恢复快照,您必须注册快照代码库。
在 Kibana 门户中,点击 Elasticsearch 菜单中的快照截取及恢复,然后点击注册代码库:
在注册代码库页面上的名称字段中输入
examplerepo
,选择 Google Cloud Storage 作为您的代码库类型,然后点击下一步:输入以下配置详细信息:
- 对于客户端,输入
default
。 在存储分区部分,输入您之前在生成用于访问 Cloud Storage 的 Secret 时创建的存储分区名称。
如果您忘记了存储分区名称,请执行以下操作:
在 Cloud Shell 中,列出所有存储分区:
gsutil ls
如需找到您的存储分区,请查看列表。
在门户中,输入您的存储分区名称(不含上一步中的
gs://
命名方案)。例如,如果您的存储分区 URI 为gs://1234-eck-gcs-snapshot
,请输入1234-eck-gcs-snapshot
。
将其余字段留空。
- 对于客户端,输入
点击注册。
在代码库的详细信息窗格中,点击验证代码库,确保您已连接。下图显示了成功的连接:
开始使用 Elastic Cloud
此时,您可以在 Elastic Cloud 上设置托管式集群,并将数据迁移到此新集群。
启动集群
转到 Cloud Marketplace 上的 Elastic Cloud 页面。
如果您接受该页面上显示的价格,请点击购买,然后点击订阅。
点击启用以启用 API。您将被重定向到 Elastic Cloud 服务的 API 和服务页面。
点击通过 Elastic 管理:
点击确认以确认您要重定向到 Elastic Cloud 网站。
如需注册 Elastic Cloud 帐号,请填写表单。您的电子邮件帐号已通过验证。
出现提示时,创建一个密码,然后登录。
在 Elastic Cloud 的主门户中,点击创建部署。
执行以下操作:
- 为您的集群
example-ec
命名。 - 选择 Google Cloud 作为您的 Cloud Platform。
- 选择
us-central1
作为区域。 - 所有其他选项都保留默认值。
- 为您的集群
点击创建部署。
几分钟后,您在 Elastic Cloud 上的工作集群即会预配,并且您将自动转到实例的部署信息中心。
从 ECK 准备快照
下一步是创建 ECK 实例的快照并将其迁移到 Elastic Cloud 实例中。
创建 ECK 快照
要创建快照,您必须在 ECK 集群中设置快照政策。创建单个快照后,此政策将被删除,因为它仅在一次性迁移中适用。
在 ECK 集群的网络浏览器中,如需登录 Kibana,请复制您早些时候在 GKE 集群上创建的负载平衡器的外部 IP 地址。
在 Elasticsearch 菜单上,点击快照截取及恢复:
点击创建政策。
在政策名称字段中,输入
onetime-migration
。在快照名称字段中,输入
<onetime-migration-{now/d}>
。将其他设置保留为默认值,然后点击下一步:
在快照设置页面中,将设置保留为默认值,然后点击下一步。
当系统提示您输入快照保留政策时,请将所有字段留空,然后点击下一步。由于您要创建的是一次性快照,因此不需要使用保留政策。
在评价政策页面上,点击创建政策。
在政策的摘要窗格中,点击关闭。
在快照截取及恢复概览页面的操作部分中,点击
立即运行,然后点击新窗口中的运行政策:如需验证新快照,请点击快照标签页上带有时间戳、以
onetime-migration
开头的快照。系统会显示快照详情:
删除快照政策
现在 ECK 实例的快照位于 Cloud Storage 中,方便您删除快照政策。
- 在 Kibana 门户中,点击管理,点击快照截取及恢复,然后点击原则标签页。
- 在一次性迁移政策的操作部分中,点击 删除。
- 如需确认您想要删除政策,请点击删除政策。
删除政策不会影响您使用该政策创建的快照,但这样做会阻止您根据该政策截取更多快照。
将快照移至 Elastic Cloud
下一步是截取新创建的数据快照,并将其恢复到 Elastic Cloud 上的实例中。
创建和配置新的服务帐号
第一步是创建 Elastic Cloud 用于访问 Cloud Storage 的服务帐号。然后启用访问权限。
在 Cloud Shell 中创建服务帐号:
gcloud iam service-accounts create ecloud-sa \ --display-name "Elasticcloud Service Account" export ec_sa=$(gcloud iam service-accounts list \ --filter=displayName:"Elasticcloud Service Account" \ --format='value(email)') gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$ec_sa --role roles/storage.admin gsutil iam ch serviceAccount:$ec_sa:roles/storage.admin gs://$GCSBUCKET
为此服务帐号创建密钥并将其下载到本地客户端机器:
gcloud iam service-accounts keys create ~/ec-sa.json --iam-account $ec_sa
输出内容类似如下:
created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as [/usr/home/username/ec-sa.json] for [ecloud-sa@project-id.iam.gserviceaccount.com]
从输出中复制绝对路径和文件名。您需要使用它们下载文件。
点击
更多,然后点击下载文件:输入您在上一步中复制的密钥的绝对路径和文件名,然后点击下载。JSON 密钥会下载到本地机器。
在 Elastic Cloud 中部署的 Elasticsearch 服务页面中,点击安全,然后点击添加设置:
对于设置名称,输入
gcs.client.default.credentials_file
,然后选择 JSON 块/文件。在本地机器上使用文本编辑器,打开您下载的 JSON 密钥并将其复制到密钥字段中,然后点击保存。您会在密钥库中看到新条目。
点击重置密码即可为
elastic
用户获取新密码,然后记下该密码。在在 Kibana 中进行安全更改说明中,点击 Kibana。
使用这些凭据登录 Kibana。
出现提示时,点击自行探索,并且不加载任何示例数据。
创建代码库
在 Kibana 门户中,点击菜单图标 (
),然后点击堆栈管理:在 Elasticsearch 下,点击快照截取及恢复。
点击代码库标签页,然后点击注册代码库:
对于代码库名称,请输入
examplerepo
。选择 Google Cloud Storage。
点击下一步。
在存储分区字段中,输入您之前在生成用于访问 Cloud Storage 的 Secret 时创建的存储分区名称。
输入存储分区名称,而不输入
gs://
命名方案。例如,如果您的存储分区 URI 为gs://1234-eck-gcs-snapshot
,请输入1234-eck-gcs-snapshot
。将其余字段留空,然后点击注册。
如需验证连接,请点击验证代码库。
点击关闭。
恢复快照
在 Kibana 门户中,点击快照标签页,然后在代码库下拉菜单中选择
examplerepo
:您会看到之前在 ECK 中创建的快照。
在操作下,点击
恢复。关闭所有索引(包括系统索引)切换开关:
点击取消全选,然后重新选择 kibana_sample_data_flights、ilm-history-1-000001,以及所有前缀谓 apm- 的索引。请勿选择名称前带有句点的任何索引,因为它是系统索引。
如果尝试使用默认设置进行恢复,则会收到类似于以下内容的错误消息:
[snapshot_restore_exception] [examplerepo:onetime-migration2020.07.07-mt2pg1p7sb2sci9fs-yxlw/7OdEOWYVRQyIh9S2NaPypQ] cannot restore index [.security-7] because an open index with same name already exists in the cluster. Either close or delete the existing index or restore the index under a different name by providing a rename pattern and replacement name
发生此错误的原因是系统索引不能并且不应该恢复。如果您按照消息的说明进行操作,则 Kibana 可能无法再正常运行。关闭或删除现有打开索引的过程仅适用于非系统索引。
其余设置保留为默认值,然后点击下一步。
在索引设置菜单中,保留所有设置作为默认值,然后点击下一步。
在恢复详情页面上,点击恢复快照。
恢复过程完成后,您将进入恢复状态信息中心,其中显示您的数据已恢复。
在 Kibana 下,点击索引模式以恢复索引。
点击创建索引模式。
您会看到一些可用的索引。查找 ECK 自动创建的 kibana_sample_data_flights 索引。
在索引模式字段中输入
kib
。请注意,kibana_sample_data_flights
与该模式匹配。点击下一步。
在时间过滤条件字段名称下拉菜单中,选择时间戳。
点击创建索引模式。
(可选)如果点击发现,您会看到在 ECK 环境中显示原始数据。
在主菜单上,滚动到菜单末尾,然后点击管理部分下的开发工具。
在左侧输入
GET /kibana_sample_data_flights/_count
,然后点击“Send request”按钮。输出显示已计数 13059 个文档,这符合在 ECK 的索引中找到的文档数。
清除数据
为避免因本教程中使用的资源而导致您的 Google Cloud 帐号产生费用,您可以删除为本教程创建的 Google Cloud 项目。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
- 使用 Cloud Marketplace 上的 Google Cloud 设置 Elasticsearch on Elastic Cloud。
- 阅读 Google Cloud 博客中有关 Kubernetes 的最佳做法。
- 按照教程开始使用 GKE。
- 探索有关 Google Cloud 的参考架构、图表、教程和最佳做法。查看我们的 Cloud Architecture Center。