天天看點

在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部署,使其可用于存儲、檢索和可視化來自系統和應用程式的各種資料。