工程

Elastic Cloud on Kubernetes 入门:部署

作者

尽管仍在 α 测试阶段,近期有关 Elastic Cloud on Kubernetes (ECK) 的公告还是在 Elasticsearch 社区和 Kubernetes 社区引发了人们浓厚的兴趣。ECK 由 Elastic Stack 的开发人员开发和提供支持,是在 Kubernetes 上部署 Elastic 的首选方式。本系列博文共有两篇,旨在带您逐步完成下面的过程:

  1. 在 Kubernetes 集群(Minikube 或 GKE)中部署 ECK
  2. 在 ECK 中部署 Elastic Stack
  3. 在 ECK 中对 Elasticsearch 和 Kibana 进行缩放和升级
  4. 部署一个由 Elastic APM 检测的范例应用程序,并将 APM 数据发送至由 ECK 托管的 Elasticsearch 集群
  5. 将 Metricbeat 作为 DaemonSet 部署到 Kubernetes 中,并将 Metribeat 安全地连接至由 ECK 托管的 Elasticsearch 集群

按照博文进行操作后,您将会拥有一套如下图所示的系统。在第一篇博文中,我们专注于部署 ECK 和 Elastic Stack。

ECK 部署关系图

您还可以参考快速入门页面或产品页面,以了解有关 ECK 的最新信息。

创建您的 k8s 集群

您必须准备好一个 Kubernetes 集群,然后才能部署 ECK 和 Elastic Stack。在本篇博文中,Minikube 或 Google Kubernetes Engine (GKE) 都可以。我们还支持其他 Kubernetes 分发包,例如 OpenShift、Amazon EKS 和 Microsoft AKS。由于我们要部署 ECK、Elasticsearch、Kibana、APM Server 和一个范例应用程序,我建议您将集群配置为 16 GB 内存和 4 核处理器。您也可以将 Kubernetes 集群配置为 12 GB 内存,但 16 GB 肯定能为您带来流畅的使用体验。

Minikube

如果您准备使用 Minikube,请按照安装说明进行安装。安装完毕后,使用所需的资源对 Minikube 进行配置并将其启动:

minikube config set memory 16384 
minikube config set cpus 4
minikube start

借助 Kubernetes 仪表板,您能够十分便捷地对 Kubernetes 集群进行监测和管理。您通过一条命令便可为 Minikube 启用仪表板:

minikube dashboard

会自动打开一个浏览器窗口,并显示 Kubernetes 仪表板。就这么简单——您可以进行下一步了。

Google Kubernetes Engine (GKE)

如想使用 GKE,请按照 Google 文档来配置您的集群。我的 GKE 集群包括一个节点,该节点的配置为 15 GB 内存,4 个 vCPU。您可以选择小一些的集群,但是内存不得小于 12 GB。而且,如要使用 GKE,您需要 gcloud 命令行工具

您的 GKE 集群设置完毕并运行后,使用下方命令来连接至您的集群并设置所需的权限。对于 GKE,您必须拥有集群管理员权限。确保将 project name(项目名称)、zone name(区域名称)、cluster name(集群名称)和 user ID(用户 ID)替换为您的信息:

gcloud config set project elastic-sa 
gcloud config set compute/zone us-central1-a
gcloud config set container/cluster aquan
gcloud auth login
gcloud container clusters get-credentials aquan --zone us-central1-a --project elastic-sa
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co
kubectl create clusterrolebinding adam.quan-cluster-admin-binding --clusterrole=cluster-admin --user=adam.quan@elastic.co

最后,我们将要使用 Kubernetes 命令行工具与 Minikube 或 GKE 进行交互。按照指南安装 kubectl。确保您所安装的 kubectl 为 1.11 或更新版本。

至于本篇博文所使用的项目,您可从这个 GitHub 存储库下载。

部署 Elasticsearch Operator

只需一条命令便可部署 ECK,您相信吗?就是这样——只需运行下方命令便可部署最新的 ECK 0.9.0(截至撰写本文时)。无比简单快捷。

kubectl apply -f https://download.elastic.co/downloads/eck/0.9.0/all-in-one.yaml

部署完成后,您可以使用下方命令监测来自 Operator 的日志并确保一切顺利。片刻之间,便能部署完并运行 ECK 。

kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

部署 Elastic Stack

既然现在 ECK 已在运行,我们可以开始部署 Elastic Stack 了,也是仅需一条命令。查看 apm_es_kibana.yaml 并了解配置 Kibana 和 APM Server 有多么简单;配置完后,Kibana 和 APM Server 便可使用 elasticsearchRef 彼此进行通信。

您可以通过很多方法对部署进行自定义,例如:

  • Pod 模板
  • 节点配置
  • 虚拟内存
  • 自定义 HTTP 证书
  • 安全设置

使用下方命令部署堆栈:

kubectl apply -f apm_es_kibana.yaml

通过 kubectl 或者 Kubernetes 仪表板了解 Elasticsearch、Kibana 和 APM Server 的状态,并确保所有均为绿色和可用状态:

kubectl get elasticsearch,kibana,apmserver

所有三个组件均变为绿色即表示您的 Elasticsearch 集群已部署完毕并正常运行,可以向其中采集数据了。ECK 可帮助我们完成很多任务。稍停一下,我们看一下 ECK 到底对我们的集群进行了哪些操作:

  • 为 ECK 开启了安全功能。通过 ECK 部署的所有 Elastic Stack 资源均默认受到安全保护。内置的基本身份验证用户 elastic 已通过 TLS 进行配置,而且往返于 Elasticsearch 集群的以及 Elasticsearch 集群内的网络流量均通过 TLS 受到安全保护。
  • 证书:默认情况下,会针对每个集群使用一个自签名 CA 证书。还可以配置自定义 HTTPS 证书。
  • 默认服务暴露:会自动为您的集群和 Kibana 创建一项 ClusterIP 服务。如有需要,您当然可以将其配置为 LoadBalancer 类型。

现在 Elasticsearch、Kibana 和 APM Server 都已正常运行,我们从 Kibana 中看一下。

访问 Kibana

默认情况下,Kibana 会暴露为一项可从集群内部访问集群 IP 的服务,但 Kibana 不会暴露至互联网。然而,您可以使用下方的端口转发命令让您的笔记本电脑可以访问 Kibana:

kubectl port-forward service/kibana-sample-kb-http 5601

登录 Kibana 之前,我们需要获得默认 elastic 用户的凭据。您可以运行 kubectl get secret,然后检查密钥以找出密钥的 JSON 路径。下面是我们案例的正确密钥和路径:

echo `kubectl get secret elasticsearch-sample-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode`

Elastic 用户的密码已显示出来。将其复制并保存至记事本中。

现在,打开浏览器并连接至 https://localhost:5601。由于我们使用的是自签名证书,您将需要接受浏览器的安全警告。使用 Elastic 用户和您刚检索到的密码登录 Kibana。您将会来到 Kibana 主页。我们的集群已完全部署完毕啦!

缩放和升级

在 ECK 中缩放和升级 Elasticsearch 集群的过程十分简单,只需编辑部署配置并通过 kubectl 加以应用即可。

缩放

编辑您的部署清单 apm_es_kibana.yaml,在下面部分中将 elasticsearch 容器的内存大小从 3 GB 调整为 2 GB 即可:

        containers:
- name: elasticsearch
resources:
limits:
memory: 3Gi

保存文件并通过这条命令对节点进行缩放:

kubectl apply -f apm_es_kibana.yaml

立即切换至 Kubernetes 控制台,您在这里会看到创建了几个 Elasticsearch Pod。ECK 正在缩放 Elasticsearch 节点,而且实现了零中断。很快您就会发现新的 Pod 开始运行,而原始 Pod 也会消失。原始 Pod 的数据也畅通无阻地转移了过来。

您当然还可以通过其他方式对集群规模进行缩放,例如向其中添加更多节点。无论采用什么方式,通过简单的一条 kubectl apply 命令就能搞定。

正在创建 Elasticsearch 集群

升级

现在,我们将集群升级至 7.2.0,只需简单地在部署清单文件 apm_es_kibana.yaml 中将 Elasticsearch、Kibana 和 APM Server 的版本从 7.1.0 更改为 7.2.0 即可。保存并通过下面的命令应用升级:

kubectl apply -f apm_es_kibana.yaml

相似地,从 Kubernetes 控制台中您可以看到 ECK 正在流畅地对 Elasticsearch、Kibana 和 APM Server 进行升级,而且实现了零中断。

升级过程完成后,验证并确认您所运行 Elastic Stack 的版本是 7.2.0。您现在完全相信 ECK 的强大能力了吧?希望如此。

总结

希望您喜欢 Elastic Cloud on Kubernetes 的快速入门过程,并且认识到这一过程有多么简单。在本篇博文的第 2 部分,我们将会部署一个由 APM 检测的简单应用程序,并让其将 APM 数据发送至我们由 ECK 托管的集群。我们还会在 Kubernetes 中部署 Metricbeat,以将指标数据发送至集群。