在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监控
About Rancher Labs
Rancher Labs由硅谷云计算泰斗、CloudStack之父梁胜创建,致力于打造创新的开源软件,帮助企业在生产环境中运行容器与Kubernetes。旗舰产品Rancher是一个开源的企业级Kubernetes平台,是业界首个且唯一可以管理所有云上、所有发行版、所有Kubernetes集群的平台。解决了生产环境中企业用户可能面临的基础设施不同的困境,改善Kubernetes原生UI易用性不佳以及学习曲线陡峭的问题,是企业落地Kubernetes的不二之选。
Rancher在全球已有一亿次下载和超过20000个生产节点部署,在金融、互联网、制造业、政府、教育、媒体等行业里,拥有迪士尼、美国银行、中国人寿、IBM、华为、丰田、中国平安、Cisco、恒丰银行、Intel、海尔、米其林、金风科技等超过500家的国内外大中型企业客户案例。