天天看点

在Kubernetes中部署Elasticsearch

介 绍

elasticsearch是一个基于apache lucene并由elastic开发的开源搜索引擎。它可扩展性、弹性和性能等特性都十分优越,全球各地的公司,包括mozilla、facebook、github、netflix、ebay、纽约时报等,每天都在使用它。elasticsearch是大型数据集最受欢迎的分析平台之一,所有你能看到包含搜索引擎的地方都几乎有elasticsearch的存在。它在操作数据时使用基于文档的方法,并且在用户执行搜索时几乎可以实时解析它。它以json格式存储数据,并按索引和类型组织数据。

如果我们在传统关系数据库的组件和elasticsearch的组件之间进行类比,它们看起来像这样:

数据库或表 → 索引

行/列 → 包含属性的文档

elasticsearch的优势

它源自apache lucene,提供了极其强大的全文搜索功能。

它使用基于文档的体系结构,将复杂的现实世界实体存储为结构化json文档。默认情况下,它会索引所有字段,这在搜索时提供了巨大的性能。

它不使用带有索引的模式。文档通过包含它们来添加新字段,从而可以自由添加、删除或更改相关字段,而无需与传统数据库模式升级相关的停机时间。

它对文档执行语言搜索,返回与搜索条件匹配的文档。它使用tfidf算法对结果进行评分,使更多相关文档在结果列表中更高。

它允许模糊搜索,即使拼写错误的搜索词也可以帮助查找结果。

它支持实时搜索自动完成,在用户键入搜索查询时返回结果。

它使用restful api,通过简单、轻量级的界面展示其功能。

elasticsearch以极快的速度执行复杂查询。它还缓存查询,返回与缓存过滤器匹配的其他请求的缓存结果。

它可以水平扩展,从而可以扩展资源并平衡集群节点之间的负载。

它将索引分解为碎片,每个碎片具有任意数量的副本。每个节点都知道集群中每个文档的位置,并在必要时在内部路由请求以检索数据。

术 语

elasticsearch使用特定术语来定义其组件。

集群:一起工作的节点集合。

节点:作为集群一部分的单个服务器,存储数据,并参与集群的索引和搜索功能。

索引:具有类似特征的文档集合。

文档:可以编制索引的基本信息单元。

shard(分片):索引分为多个部分,称为分片,允许索引水平缩放。

副本:索引分片的副本

前期准备

要完成此次demo,我们至少需要以下之一:

已配置好的rancher部署和kubernetes集群,或

两个节点,在其中部署rancher和kubernetes,或

用于部署rancher的节点和在托管提供程序(如gke)中运行的kubernetes集群。

本文使用google cloud platform,但您也可以使用任何其他提供商或基础架构。

启动rancher

如果您还没有部署rancher,请先启动一个,具体步骤可以参考此处快速上手指南:

https://rancher.com/quick-start/

启动集群

根据这一指南,使用rancher设置和配置最适合您的环境的集群:

https://rancher.com/docs/rancher/v2.x/en/cluster-provisioning/

部署elasticsearch

如果您已经习惯了kubectl,可以直接使用manifest。如果您更喜欢使用rancher用户界面,请继续往下阅读。

我们将elasticsearch部署为具有两个服务的statefulset:一个是用于与pod通信的headless service,另一个则用于从kubernetes集群外部与elasticsearch交互。

svc-cluster.yaml

svc-loadbalancer.yaml

es-sts-deployment.yaml

apiversion: v1

kind: configmap

metadata:

  name: es-config

data:

  elasticsearch.yml:|

    cluster.name: my-elastic-cluster

    network.host: "0.0.0.0"

    bootstrap.memory_lock: false

    discovery.zen.ping.unicast.hosts: elasticsearch-cluster

    discovery.zen.minimum_master_nodes: 1

    xpack.security.enabled: false

    xpack.monitoring.enabled: false

  es_java_opts: -xms512m -xmx512m

---

apiversion: apps/v1beta1

kind: statefulset

  name: esnode

spec:

  servicename: elasticsearch

  replicas: 2

  updatestrategy:

    type: rollingupdate

  template:

    metadata:

      labels:

        app: es-cluster

    spec:

      securitycontext:

        fsgroup: 1000

      initcontainers:

      - name: init-sysctl

        image: busybox

        imagepullpolicy: ifnotpresent

        securitycontext:

          privileged: true

        command: ["sysctl", "-w", "vm.max_map_count=262144"]

      containers:

      - name: elasticsearch

        resources:

            requests:

                memory: 1gi

          privileged: true

          runasuser: 1000

          capabilities:

            add:

            - ipc_lock

            - sys_resource

        image: docker.elastic.co/elasticsearch/elasticsearch:6.5.0

        env:

        - name: es_java_opts

          valuefrom:

              configmapkeyref:

                  name: es-config

                  key: es_java_opts

        readinessprobe:

          httpget:

            scheme: http

            path: /_cluster/health?local=true

            port: 9200

          initialdelayseconds: 5

        ports:

        - containerport: 9200

          name: es-http

        - containerport: 9300

          name: es-transport

        volumemounts:

        - name: es-data

          mountpath: /usr/share/elasticsearch/data

        - name: elasticsearch-config

          mountpath: /usr/share/elasticsearch/config/elasticsearch.yml

          subpath: elasticsearch.yml

      volumes:

          configmap:

            name: es-config

            items:

              - key: elasticsearch.yml

                path: elasticsearch.yml

  volumeclaimtemplates:

  - metadata:

      name: es-data

      accessmodes: [ "readwriteonce" ]

      resources:

        requests:

          storage: 5gi

$ kubectl apply -f es-sts-deployment.yaml 

configmap/es-config created 

statefulset.apps/esnode created

通过rancher ui部署elasticsearch

如果您想的话,可以通过rancher ui将上述每个manifest都导入您的集群。下面的屏幕截图显示了每个过程。

导入 svc-cluster.yaml

导入 svc-loadbalancer.yaml

导入 es-sts-deployment.yaml

检索负载均衡器ip

您后期会需要我们所部署的负载均衡器的地址的。您可以通过kubectl或ui 检索此内容。

使用cli

$ kubectl get svc elasticsearch-loadbalancer 

name                         type           cluster-ip      external-ip      port(s)        age 

elasticsearch-loadbalancer   loadbalancer   10.59.246.186   35.204.239.246   80:30604/tcp   33m

使用ui

在Kubernetes中部署Elasticsearch

测试集群

使用我们在上一步中检索的地址来查询集群以获取基本信息。

在Kubernetes中部署Elasticsearch
在Kubernetes中部署Elasticsearch

查询集群以获取有关其节点的信息。master列中的星号突出显示当前主节点。

在Kubernetes中部署Elasticsearch

检查可用的指数:

在Kubernetes中部署Elasticsearch

因为这是一个全新的安装,所以它没有任何以前的索引或数据。为了继续本教程,我们将注入一些我们稍后可以使用的示例数据。我们将使用的文件可从elastic网站获得:

https://www.elastic.co/guide/en/kibana/current/tutorial-load-dataset.html

下载它们,然后使用以下命令加载它们:

在Kubernetes中部署Elasticsearch

当我们重新检查索引时,我们将看到我们有五个新的索引数据。

$ curl 35.204.239.246/_cat/indices?v 

health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size 

green  open   logstash-2015.05.20 mfdwjxnstish0z9vr0at3g   5   1       4750            0     49.9mb         25.2mb 

green  open   logstash-2015.05.18 llhv2nzvtog9mzlpkag9sg   5   1       4631            0     46.5mb         23.5mb 

green  open   logstash-2015.05.19 pqnnvugxtyadsfmcqzwblq   5   1       4624            0     48.2mb         24.2mb 

green  open   shakespeare         rwl3xbgmqtm8b3v7gfetzq   5   1     111396            0       46mb         23.1mb 

green  open   bank                z0wvgsbrsig2cqwrxwacog   5   1       1000            0    949.2kb        474.6kb

其中每个都包含不同类型的文档。对于shakespeare索引,我们可以搜索游戏的名称。对于logstash-2015.05.19索引,我们可以根据ip地址查询和过滤数据,对于bank索引,我们可以搜索有关特定帐户的信息。

结 论

elasticsearch非常强大。它既简单又复杂——易于部署和使用,而与数据交互的方式也很复杂。

本文向您展示了如何使用rancher和kubernetes 部署它以及如何通过restful api进行查询的基础知识。

如果您希望探索在日常情况下使用elasticsearch的方法,我们建议您探索elk堆栈的其他部分:kibana、logstash和beats。这些工具完善了elasticsearch部署,使其可用于存储、检索和可视化来自系统和应用程序的各种数据。