在GKE上搭建Elasticsearch和cerebro环境
这篇文章是仅属于AdventCalendar PtW.2019活动的第5篇文章。
上一篇文章是hajimeni先生关于需要避免在编程中使用的命名模式 – 闲谈。
简述;概括
我会写出如下的中国语言翻译:
我会告诉您在Google Kubernetes Engine (GKE)上构建Elasticsearch的方法,并提供一些建议事项。我还会验证使用Cerebro监视节点以及当一个Elasticsearch节点宕机时,新节点会自动创建(Self-healing)的情况。
基本前提知識
-
- Elasticsearchを複数ノードで構築したことがある
-
- GKEのチュートリアルをこなし、Kubernetesでアプリをデプロイしたことがある
- kubectlがローカルで使える
所有的成員
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节点。
当确认无事节点后,即可完成。
验证
我們將進行一個簡單的驗證,刪除一個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的概览画面中确认是否已经创建了分片。
我会拿掉一个pod。
$ kubectl delete pod elasticsearch-0
在Cerebro的屏幕上,健康检查几秒钟后会变为黄色。
请等待一段时间,然后您可以确认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的主分支下。