在GKE上搭建Elasticsearch和cerebro环境

这篇文章是仅属于AdventCalendar PtW.2019活动的第5篇文章。
上一篇文章是hajimeni先生关于需要避免在编程中使用的命名模式 – 闲谈。

简述;概括

我会写出如下的中国语言翻译:

我会告诉您在Google Kubernetes Engine (GKE)上构建Elasticsearch的方法,并提供一些建议事项。我还会验证使用Cerebro监视节点以及当一个Elasticsearch节点宕机时,新节点会自动创建(Self-healing)的情况。

基本前提知識

    • Elasticsearchを複数ノードで構築したことがある

 

    • GKEのチュートリアルをこなし、Kubernetesでアプリをデプロイしたことがある

 

    kubectlがローカルで使える

所有的成員

image.png

ES建设程序

创建集群

由于使用默认的n1-standard-1会导致ES内存不足,因此将其更改为n1-standard-2。

$ gcloud container clusters create es-cluster --machine-type=n1-standard-2 --num-nodes=2

创建 StorageClass

对于像 Elasticsearch 这样具有状态的容器,需要一个持久化容器数据的机制。首先要创建一个称为 StorageClass 的对象来作为数据存储的目标。

定义名为es-ssd的StorageClass。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: es-ssd
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
  zone: asia-northeast1-b

provisioner: kubernetes.io/gce-pd

GCEのPersistent Diskを使用する設定。

type: pd-ssd

デフォルトはハードディスクですが、高速化のためGCEの提供するSSDを使用します。

创建StorageClass对象

$ kubectl apply -f storage.yaml

创建Service

为了通过HTTP从外部访问ES,我们定义了两个Service。

    • ESのノード同士を接続するためのネットワークを提供するes-cluster

 

    外部からESのエンドポイントにアクセスするためのes-endpoint
apiVersion: v1
kind: Service
metadata:
  name: es-cluster
  labels:
    service: elasticsearch
spec:
  clusterIP: None
  ports:
  - port: 9200
    name: serving
  - port: 9300
    name: node-to-node
  selector:
    service: elasticsearch
---
apiVersion: v1
kind: Service
metadata:
  name: es-endpoint
  labels:
    service: elasticsearch
  annotations:
    cloud.google.com/load-balancer-type: Internal
spec:
  type: LoadBalancer
  selector:
    service: elasticsearch
  ports:
  - protocol: TCP
    port: 9200

clusterIP: None

Noneとすることで、HeadlessServiceとして起動します

type: LoadBalancer

LoadBalancerにすると、GCPのロードバランサを作成し、外部IPアドレスを露出します。

annotation: cloud.google.com/load-balancer-type: Internal

ロードバランサを作成すると外部からアクセスできますが、こちらのannotationを指定すると同サブネットからのアクセスのみ許可します。今回は内部のcerebroからのみアクセスします。

创建服务:

$ kubectl apply -f service.yaml

创建Elasticsearch的StatefulSet

部署带有状态的Pod时,我们可以使用名为StatefulSet的控制器。虽然也可以选择使用Deployment来进行ES部署,但由于在Pod重新生成时可能会导致死锁,因此不建议使用。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  labels:
    service: elasticsearch
spec:
  serviceName: es-cluster
  replicas: 3
  selector:
    matchLabels:
      service: elasticsearch
  template:
    metadata:
      labels:
        service: elasticsearch
    spec:
      terminationGracePeriodSeconds: 300
      # ESを動かすための諸々の初期設定
      initContainers:
      - name: fix-the-volume-permission
        image: busybox
        command:
        - sh
        - -c
        - chown -R 1000:1000 /usr/share/elasticsearch/data
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-the-vm-max-map-count
        image: busybox
        command:
        - sysctl
        - -w
        - vm.max_map_count=262144
        securityContext:
          privileged: true
      - name: increase-the-ulimit
        image: busybox
        command:
        - sh
        - -c
        - ulimit -n 65536
        securityContext:
          privileged: true
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4
        ports:
        - containerPort: 9200
          name: http
        - containerPort: 9300
          name: tcp
        resources:
          requests:
            memory: 2Gi
          limits:
            memory: 2Gi
        env:
          - name: cluster.name
            value: elasticsearch-cluster
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: discovery.zen.ping.unicast.hosts
            value: es-cluster
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: es-ssd
      resources:
        requests:
          storage: 5Gi

name: discovery.zen.ping.unicast.hosts value: es-cluster

ESのdiscoveryはKubernetesではServiceの名前を入れるだけで探すことができました。

volumeClaimTemplates:

先程のStorageClassオブジェクトが作成されただけでは、まだ実態としての容量が確保されていません。volumeClaimTemplatesを使うことで実態としての容量を確保します。

创建ES的StatefulSet:

$ kubectl apply -f elasticsearch-stateful-set.yaml

创建Cerebro

Cerebro是一种便捷工具,可以实时监测Elasticsearch节点的状态、执行RESTAPI,并在图形界面上进行设置更改。

下面定义了Cerebro的部署和服务。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cerebro
  labels:
    service: cerebro
spec:
  replicas: 1
  selector:
    matchLabels:
      service: cerebro
  template:
    metadata:
      labels:
        service: cerebro
    spec:
      terminationGracePeriodSeconds: 300
      containers:
      - name: cerebro
        image: lmenezes/cerebro
        ports:
        - containerPort: 9000
          name: http
---
apiVersion: v1
kind: Service
metadata:
  name: cerebro
  labels:
    service: cerebro
spec:
  type: LoadBalancer
  ports:
  - port: 9000
  selector:
    service: cerebro

脑信息处理器的制造。

$ kubectl apply -f cerebro.yaml

确认Cerebro负载均衡器的IP地址。

$ kubectl get svc -o wide
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)             AGE       SELECTOR
cerebro       LoadBalancer   10.51.254.133   34.85.105.164   9000:32654/TCP      7m        service=cerebro
es-cluster    ClusterIP      None            <none>          9200/TCP,9300/TCP   9m        service=elasticsearch
es-endpoint   LoadBalancer   10.51.246.125   10.146.0.21     9200:32653/TCP      9m        service=elasticsearch

在外部IP地址上通过9000端口访问cerebro。

请在浏览器中输入以下网址:http://{cerebro的EXTERNAL-IP}:9000

确认节点

在Cerebro的文本框中输入http://{es-endpoint的EXTERNAL-IP}:9200,并在概览界面上确认Elasticsearch节点。

image.png

当确认无事节点后,即可完成。

验证

我們將進行一個簡單的驗證,刪除一個pod並確認是否能訪問到ES。

首先,创建一个合适的索引。您可以通过Cerebro菜单中的rest选项轻松访问Elasticsearch的API。

PUT twitter

我会创建多个适当的文档,如下所示。

POST twitter/_doc
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}

您可以在Cerebro的概览画面中确认是否已经创建了分片。

image.png

我会拿掉一个pod。

$ kubectl delete pod elasticsearch-0

在Cerebro的屏幕上,健康检查几秒钟后会变为黄色。

image.png

请等待一段时间,然后您可以确认elasticsearch-0节点已经恢复并且状态已经变为正常(green)。

总结:尝试使用Kubernetes的ES

我才刚开始学习,但我感觉以下有一些优点。

    • Self-healingやAutoScaleがやりやすい

デフォルトでSelf-healingの仕組みがあり、Podの水平垂直オートスケールに加えNodeもオートスケールが可能。

オンラインでnodeのスケールアップやディスク容量リサイズもできる

業務で苦労したこれらの問題に対してすでにノウハウがあります。

ESのzen.discovery設定が楽

AWSではec2-discoveryのプラグインが必要で、設定にハマりましたが、こちらは不要です。

引用的文献源

本文参考了这个ES的清单文件。在本文中,我对其进行了简化,并增加了Cerebro的Pod,以指导在Google Kubernetes Engine上部署Elasticsearch集群。

有点复杂,但我也参考了官方提供的kibana+Elasticsearch的方式。
click-to-deploy/README.md位于GoogleCloudPlatform/click-to-deploy的主分支下。

广告
将在 10 秒后关闭
bannerAds