在Kubernetes上部署Elasticsearch: Hands on Guide With Code Examples

想在Kubernetes上运行Elasticsearch ?这篇指南将告诉你如何做。

Kubernetes是一个开源系统,用于容器应用程序的自动化部署、扩展和管理。它允许用户运行单个应用程序的多个副本,同时提供内置的扩展、运行状况检查和自动修复机制,从而可以处理中断和需求峰值。

简单地说,Kubernetes通过一个描述文件来工作,该文件指定了容器必须如何工作,每个容器的内存和CPU限制,它应该保持多少个副本在线,以及应该采取什么策略来增加或减少实例的数量。K8s还提供了一种机制(又名部署控制器),在保持可用性的同时部署应用程序的新版本。

如果您需要Kubernetes的快速入门知识,以及它如何与有状态应用程序一起工作,请跳到我们的Kubernetes入门知识。

Kubernetes上的Elasticsearch:建议的架构

Elasticsearch按设计分布式,提供了通过复制存储数据的不同方法,同时提供可靠性和可伸缩性。

Elasticsearch有不同的活动部件,必须部署它们才能可靠地工作。下图展示了我们在Kubernetes上部署Elasticsearch的建议架构。

Elasticsearch部署在kubernetes上

所提议的体系结构具有三个主要组件,它们可以组合。但是由于Kubernetes组件易于部署,建议将每个组件分离到不同的计算单元中。

  • 客户机节点使用水平自动缩放器(如果可用)部署为单个部署。这些节点充当整个集群的反向代理,可能需要根据请求动态增加或减少节点数量。客户端节点查询主节点以发现数据是如何在每个数据节点之间分布的。查询转到多个数据节点,并在请求的客户机中合并。
  • 主节点也作为部署发布,但可以有固定数量的实例:为了高可用性,理想情况下是三个。Kubernetes将确保总是有三个实例在不同的机器上运行。一个Kubernetes无头服务将用于自动发现。主节点保存关于数据节点的元信息,例如位置、分片和数据复制。
  • 数据节点是事情变得有趣的地方。作为statefulset部署,每个实例都有一个持久卷声明。如果实例发生故障,Kubernetes确保恢复的实例将附加到正确的索赔。数据节点将索引分割成碎片,并在节点之间复制信息,以便在节点数据丢失或节点停机的情况下不会引起集群数据丢失。

此外,还有丰富的文档了解Elasticsearch拓扑结构,以及如何根据您的需求部署最佳的Elasticsearch集群。重要的是了解必须部署哪种类型的节点。

在Kubernetes上部署Elasticsearch:循序渐进

本节详细介绍如何在Kubernetes上轻松部署Elasticsearch,并检查到目前为止您所学到的所有内容。

先决条件

硬件需求

这些示例应该适用于任何更新的Kubernetes实例。初始设置从三个至少有4 GB RAM的节点开始。请按照您的云提供商的说明,了解如何在您的集群中启用Kubectl(谷歌cloud、Microsoft Azure、Amazon AWS、Digital Ocean)。雷竞技地址ray

Kubernetes仪表板

为了更好地理解接下来的步骤,您可以使用K8s Dashboard,它显示命令行提供的信息,并将其转换为易于理解的图形化web界面。遵循以下步骤:

  1. 运行命令安装仪表板:

  2. 代理连接

    Kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yam访问地址:
  3. 访问地址:
    https://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/在浏览器上。使用云提供商提供的_Kubeconfig_文件的令牌。

Kubernetes面板显示如下:

K8s工作负载状态

Helm for ElasticSearch:使用Kubernetes Helm部署ElasticSearch

Kubernetes Helm是Kubernetes的开源包管理器。部署Elasticsearch最简单的方法之一是使用官方的Elasticsearch Helm图表。

要使用Kubernetes Helm部署Elasticsearch,请遵循以下步骤:

  1. 在本地机器和Kubernetes集群中安装Helm(见文档

2.安装后,添加Elastic Helm存储库:

头盔回购增加弹性https://helm.elastic.co

3.使用以下命令安装Elastic:

Helm install ${es_cluster_name} elastic/elasticsearch

例如:

头盔安装esarticle elastic/elasticsearch

4.按照部署步骤检查pod部署:

Kubectl get pods——namespace=default -l app=elasticsearch-master -w

系统显示如下信息:

NAME READY STATUS重启AGE elasticsearch-master-0 1/1运行0 2d elasticsearch-master-1 1/1运行0 2d elasticsearch-master-2 1/1运行0 2d

默认情况下,ES Helm Package创建三个主节点,分别作为客户端、主节点和数据节点。因此,每个副本都有其持久的体积声明:

Kubectl得到pv
NAME CAPACITY ACCESS MODES RECLAM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-2b7f3e47-c2a0-4654-baed-94ad32b507c2 30g RWD Delete Bound default/elasticsearch-master-elasticsearch-master-0 gp2 2d pvc-9078604-elfe-4097-897b-ba8bf84af863 30g RWD Delete Bound default/elasticsearch-master-elasticsearch-master-2 gp2 2d pvc-b857fdie-b387-4b54-b144-00ed66045047 30g RWD Delete Bound default/elasticsearch-master-elasticsearch-master-1 gp2 2d

Helm还创建了一个带有负载均衡器的服务,因此可以使用负载均衡器连接到ElasticSearch服务:

库贝特尔得到服务
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE elasticsearch-master ClusterIP 10.245.80.223 <无> 9200/TCP,9300/TCP 2d elasticsearch-master-headless ClusterIP无<无> 9200/TCP,9300/TCP 2d . elasticsearch-master-headless ClusterIP无

Elasticsearch Helm图表提供了许多不同的配置,以个性化您的部署,如中所述手册

把Kibana和Helm一起部署

Kibana是Elasticsearch的图形用户界面,用于查询数据和创建(接近实时的)仪表板。还有一个头盔图表,所以你可以很容易地安装它。

由于您已经将Elastic Helm存储库添加到本地机器中,请键入以下命令:

头盔安装kibanaesarticle elastic/kibana

注意:您可能需要Kubernetes集群上的一个新节点。每个ES主实例已经接收了大部分以前的Kubernetes节点资源,k8无法部署Kibana。雷竞技rabet官网您可以使用Kubernetes仪表板来检查情况是否如此。

一旦一切都部署好了,你可以通过创建反向代理来检查服务:

Kubectl port-forward svc/kibanaesarticle-kibana 5601:5601

然后,访问您的网页浏览器:https://localhost:5601。Kibana将使用之前Helm图表创建的服务名称连接到Elasticsearch。如果ES为空,Kibana将提供一些示例数据以导入并提供一个仪表板示例。

Kibana样本仪表盘

您可以通过填写图表提供的变量来更改服务名称。

Kubernetes快速入门:在Kubernetes上运行有状态应用程序

为了更好地理解我们在Kubernetes架构上的Elasticsearch,这里有一个关于Kubernetes如何工作的快速入门,特别是它如何服务于有状态应用程序。有几个Elasticsearch组件是有状态的。

有状态服务保存可能不会丢失的数据。例如数据库、用户目录、消息传递和身份验证服务。这些服务不能简单地启动新的实例并使用负载均衡器以平衡的方式工作。首先,每个实例都需要持久存储,即使服务关闭也不会丢失。其次,每个服务都有一个关于如何以分布式方式工作的策略。

Kubernetes处理持久数据的范例分为三个结构。

持久的卷

持久卷由集群管理员设置,以便用户可以使用它,就像节点可以用于计算一样。这些卷由NFS、iSCSI等插件或云提供商解决方案(如谷歌、AWS或Azure)管理。雷电竞官网进入持久卷声明是用户请求持久存储,就像请求容器映像的CPU资源一样。雷竞技rabet官网声明不需要理解底层存储结构,并且尽可能地通用。

存储类

存储类用于动态持久卷。如果没有持久卷参与索赔,k8将尝试基于存储类(storage classes)提供存储索赔,存储类是由管理员定义和命名的结构,该结构指定每个存储单元使用的约束和资源。雷竞技rabet官网

StatefulSet

StatefulSet是用于管理有状态应用程序的API。与无状态应用程序的部署类似,StatefulSet管理pod,但保留每个pod的标识,以便在停机时附加到正确的持久卷声明。

当涉及到分布式计算时,有状态应用程序本身的约束超过了Kubernetes上可用的资源:它们需要被设计为处理多个实例和回退。雷竞技rabet官网

Kubernetes上有状态应用程序的架构考虑

主/从体系结构是分布式环境中最常见也是最容易部署的体系结构。该体系结构规定只有一个实例接收读写请求,而worker只更新数据。在某些特定的情况下,工作实例也被允许为读请求服务。如果主实例出现故障,其中一个worker将自动承担主实例的角色。

除了主从架构之外,还有许多其他架构提供了多个可写节点。但是,高性能有状态集群的开发必须由专家仔细处理,因为它会增加复杂性,而且如果配置不当,其性能可能比单个实例差。

即使使用单实例服务,也应该谨慎使用。虽然升级/降级服务可能很容易,但必须特别注意有状态应用程序。通常,一旦这些应用程序升级,存储在持久卷上的数据就会被更改。这一更改将导致原始数据在旧版本中无法使用。这意味着如果您需要回滚版本升级,应用程序可能无法按预期运行。这个问题的解决方案并不依赖于k8;它取决于应用程序如何设计来处理回滚。

我们在Kubernetes架构上的Elasticsearch依赖于另一种著名的模式,即分片。

总结:有状态应用程序可以在Kubernetes上很好地工作

有状态应用程序(如Kubernetes上的Elasticsearch)是需要可靠的持久存储单元的应用程序:数据丢失是不可避免的。除此之外,这些应用程序更难以分发和扩展。新实例必须小心地与现有实例同步。实例的关闭还需要与同一服务的其他实例仔细协调,以避免数据丢失。

升级或降级有状态应用程序时也会出现问题。版本升级通常会导致数据结构更改,因此应该在生产之前测试回滚计划。

Kubernetes是最流行的容器编排器。它提供了有效的解决方案,通过创建回退和持续监雷电竞官网进入控运行中的应用程序等来提高应用程序的可靠性。通常情况下,有状态应用程序没有考虑到编配器。通常,这些产品有一个完整的团队致力于操作和维护其内部部件。然而,Kubernetes表明,在不失去编排系统所提供的许多优点的情况下,有可能实现有状态应用程序所需的定制级别。

Baidu
map