查看原文
其他

在Kubernetes中部署Elasticsearch

CALIN RUS RancherLabs 2019-03-28

介 绍


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

metadata:

  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

        securityContext:

          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:

        - name: elasticsearch-config

          configMap:

            name: es-config

            items:

              - key: elasticsearch.yml

                path: elasticsearch.yml

  volumeClaimTemplates:

  - metadata:

      name: es-data

    spec:

      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



测试集群


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



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

检查可用的指数:

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

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


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

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

$ 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部署,使其可用于存储、检索和可视化来自系统和应用程序的各种数据。




拓展阅读

在Kubernetes集群上部署和管理JFrog Artifactory

如何在多Kubernetes集群和多租户环境中使用Prometheus监控

Kubernetes上的负载均衡详解


About Rancher Labs



Rancher Labs由硅谷云计算泰斗、CloudStack之父梁胜创建,致力于打造创新的开源软件,帮助企业在生产环境中运行容器与Kubernetes。旗舰产品Rancher是一个开源的企业级Kubernetes平台,是业界首个且唯一可以管理所有云上、所有发行版、所有Kubernetes集群的平台。解决了生产环境中企业用户可能面临的基础设施不同的困境,改善Kubernetes原生UI易用性不佳以及学习曲线陡峭的问题,是企业落地Kubernetes的不二之选。


Rancher在全球已有一亿次下载和超过20000个生产节点部署,在金融、互联网、制造业、政府、教育、媒体等行业里,拥有迪士尼、美国银行、中国人寿、IBM、华为、丰田、中国平安、Cisco、恒丰银行、Intel、海尔、米其林、金风科技等超过500家的国内外大中型企业客户案例。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存