ElasticsearchCloudOnKubernetes是一个 Elasticsearch Operator,但远不止于此。ECK 使用 Kubernetes Operator 模式构建而成,需要安装在您的 Kubernetes 集群内,其功能绝不仅限于简化 Kubernetes 上 Elasticsearch 和 Kibana 的部署工作这一项任务。ECK 专注于简化所有后期运行工作,例如:

  • 管理和监测多个集群
  • 轻松升级至新的版本
  • 扩大或缩小集群容量
  • 更改集群配置
  • 动态调整本地存储的规模(包括 Elastic Local Volume(一款本地存储驱动器))
  • 备份

Github地址:https://github.com/elastic/cloud-on-k8s

安装

部署elastic

如果kubernets集群版本在1.13及其以上,用如下命令:

  1. kubectl apply -f https://download.elastic.co/downloads/eck/1.0.0-beta1/all-in-one.yaml

如果kubernetes集群版本在1.12及其以下,用如下命令:

  1. kubectl apply -f https://download.elastic.co/downloads/eck/1.0.0-beta1/all-in-one-no-validation.yaml

执行成功后会创建一个namespace(elastic-system)和一个Operator(elastic-operator):

  1. # kubectl get pod -n elastic-system
  2. NAME READY STATUS RESTARTS AGE
  3. elastic-operator-0 0/1 ImagePullBackOff 0 60s

并且其会创建几个CRD对象:

  1. # kubectl get crd
  2. NAME CREATED AT
  3. apmservers.apm.k8s.elastic.co 2019-11-20T01:29:08Z
  4. elasticsearches.elasticsearch.k8s.elastic.co 2019-11-20T01:29:11Z
  5. kibanas.kibana.k8s.elastic.co 2019-11-20T01:29:12Z

通过如下命令来获取operator日志:

  1. kubectl -n elastic-system logs -f statefulset.apps/elastic-operator

然后我们创建一个简单的Elasticsearch集群:
simple-elstic.yaml

  1. apiVersion: elasticsearch.k8s.elastic.co/v1beta1
  2. kind: Elasticsearch
  3. metadata:
  4. name: quickstart
  5. spec:
  6. version: 7.4.2
  7. nodeSets:
  8. - name: default
  9. count: 1
  10. config:
  11. node.master: true
  12. node.data: true
  13. node.ingest: true
  14. node.store.allow_mmap: false

然后创建这个YAML文件:

  1. # kubectl apply -f simple-elastic.yaml

创建的Elasticsearch集群有如下几个字段:

  1. # kubectl get elasticsearch
  2. NAME HEALTH NODES VERSION PHASE AGE
  3. quickstart green 1 7.4.2 Ready 1m

注意:在集群刚启动的时候PHASE和HEALTH状态都没有,只有等PHASE状态变为Ready,HEALTH才会变为green。

我们查看Pod状态:

  1. # kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=quickstart'
  2. NAME READY STATUS RESTARTS AGE
  3. quickstart-es-default-0 1/1 Running 0 79s

当创建完集群后,集群会自动创建一个Service:

  1. # kubectl get service quickstart-es-http
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. quickstart-es-http ClusterIP 10.15.251.145 <none> 9200/TCP 34m

并且会创建一个认证用户elastic,它的密码存储在secret里:

  1. PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)

部署kibana

YAML文件如下:
simple-kibana.yaml

  1. apiVersion: kibana.k8s.elastic.co/v1beta1
  2. kind: Kibana
  3. metadata:
  4. name: quickstart
  5. spec:
  6. version: 7.4.2
  7. count: 1
  8. elasticsearchRef:
  9. name: quickstart

其依然会自动创建一个Service,用户还是上面创建的elastic。

  1. # kubectl get service quickstart-kb-http

更新升级

增加节点

我们上面部署的简单集群是单节点的,如果要增加节点,只需更新count的数量,如下:

  1. apiVersion: elasticsearch.k8s.elastic.co/v1beta1
  2. kind: Elasticsearch
  3. metadata:
  4. name: quickstart
  5. spec:
  6. version: 7.4.2
  7. nodeSets:
  8. - name: default
  9. count: 3
  10. config:
  11. node.master: true
  12. node.data: true
  13. node.ingest: true
  14. node.store.allow_mmap: false

持久化存储

我们上面定义的简单的集群,使用的默认存储,只有1GiB,我们可以自定义存储,如下:

  1. spec:
  2. nodeSets:
  3. - name: default
  4. count: 3
  5. volumeClaimTemplates:
  6. - metadata:
  7. name: elasticsearch-data
  8. spec:
  9. accessModes:
  10. - ReadWriteOnce
  11. resources:
  12. requests:
  13. storage: 5Gi
  14. storageClassName: standard

当然,storageClass需要我们自己定义好。

增加运行内存和CPU

默认的内存大小为2GiB,如过不够可以引用podTemplate模板进行扩充,如下:

  1. spec:
  2. nodeSets:
  3. - podTemplate:
  4. spec:
  5. containers:
  6. - name: elasticsearch
  7. env:
  8. - name: ES_JAVA_OPTS
  9. value: -Xms2g -Xmx2g
  10. resources:
  11. requests:
  12. memory: 4Gi
  13. cpu: 0.5
  14. limits:
  15. memory: 4Gi
  16. cpu: 2