【RancherLab】在Kubernetes中部署Elasticsearch
在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 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监控
Refer:在Kubernetes中部署Elasticsearch
浙公网安备 33010602011771号