使用 Elasticsearch Operator 快速部署 Elasticsearch 集群
同样的,对于 Elasticsearch 应用,现在官方也推出了基于 Kubernetes Operator 的应用:Elastic Cloud on Kubernetes (ECK),用户可使用该产品在 Kubernetes 上配置、管理和运行 Elasticsearch 集群。
Elastic Cloud on Kubernetes
Elastic Cloud on Kubernetes(ECK)是一个 Elasticsearch Operator,但远不止于此。 ECK 使用 Kubernetes Operator 模式构建而成,需要安装在您的 Kubernetes 集群内,其功能绝不仅限于简化 Kubernetes 上 Elasticsearch 和 Kibana 的部署工作这一项任务。ECK 专注于简化所有后期运行工作,例如:
ECK 不仅能自动完成所有运行和集群管理任务,还专注于简化在 Kubernetes 上使用 Elasticsearch 的完整体验。ECK 的愿景是为 Kubernetes 上的 Elastic 产品和解决方案提供 SaaS 般的体验。
在 ECK 上启动的所有 Elasticsearch 集群都默认受到保护,这意味着在最初创建的那一刻便已启用加密并受到默认强密码的保护。
通过 ECK 部署的所有集群都包括强大的基础(免费)级功能,例如可实现密集存储的冻结索引、Kibana Spaces、Canvas、Elastic Maps,等等。您甚至可以使用 Elastic Logs 和 Elastic Infrastructure 应用监测 Kubernetes 日志和基础设施。您可以获得在 Kubernetes 上使用 Elastic Stack 完整功能的体验。
ECK 内构建了 Elastic Local Volume,这是一个适用于 Kubernetes 的集成式存储驱动器。ECK 中还融入了很多最佳实践,例如在缩小规模之前对节点进行 drain 操作,在扩大规模的时候对分片进行再平衡,等等。从确保在配置变动过程中不会丢失数据,到确保在规模调整过程中实现零中断。
安装 ECK
当然前提是你要有一个已经可运行的 kubernetes 集群(1.11版本以上),最好确保你的每个节点上至少有4GB内存可以使用,因为我们知道 Elasticsearch 是比较消耗资源的。
首先在集群中安装 ECK 对应的 Operator 资源对象:
安装成功后,会自动创建一个 elastic-system 的 namespace 以及一个 operator 的 Pod:
这个时候会安装上若干个 CRD 对象,当然这些 CRD 资源的控制器就在上面的 elastic-operator-0 这个 Pod 中:
然后我们可以利用 CRD 对象来创建一个非常简单的单个 Elasticsearch 集群:(elastic.yaml)
但是执行上面的命令会出现超时的情况:Error from server (Timeout): error when creating "STDIN": Timeout: request did not complete within requested timeout 30s,创建不成功。这主要是因为 ECK 添加了一个 validation webhook 的 Admission,我们可以临时将这个对象删除:
然后重新执行上面的创建命令即可成功。创建成功后需要等一小会儿待镜像拉取成功,然后就可以看到一个前缀为elastic的 Pod 运行成功:
同样可以查看自定义的Elasticsearch这个 CRD 资源对象:
我们可以看到集群的相关信息。
同样,也可以用 CRD 对象 Kibana 来部署 kibana 应用:(kibana.yaml)
注意属性spec.elasticsearchRef.name的值为上面我们创建的 Elasticsearch 对象的 name:elastic。直接添加这个资源对象即可:
最后我们可以去访问 kibana 来验证我们的集群,比如我们可以再添加一个 Ingress 对象:(ingress.yaml)
创建上面的 Ingress 对象:
然后我们需要获取访问 kibana 的用户名和密码,用户名默认是elastic,可以通过如下方式获取访问密码:
接下来在浏览器中打开上面的kibana.qikqiak.com地址,正常就会跳转到登录页面了:
使用上面的用户名和密码登录即可进入 kibana dashboard 页面:
更新集群
上面我们部署的 Elasticsearch 集群是一个单节点的,我们可以直接修改 Elasticsearch 的资源清单文件来修改集群配置。ECK 会确保我们在现有集群上进行修改不会中断应用。
比如,我们将集群升级到2个节点,只需要设置spec.nodes[0].nodeCount=2即可:
直接更新集群信息即可:
可以看到 elastic 这个 Elasticsearch 资源的状态是green,两个节点。
持久化
上面我们部署的集群默认是使用的emptyDir volume,我们知道emptyDir和 Pod 的生命周期是一致的,Pod 重建后数据肯定就没有了,在生产环境中肯定是不行的。
我们可以在集群中使用 PV/PVC 来进行持久化,同样,在上面的 Elasticsearch 资源对象中添加存储相关数据:
为了能够获得磁盘的最佳性能,ECK 支持每个节点使用 local volume,关于在 ECK 中使用 local volume 的方法可以查看下面几篇资料:
项目地址:https://github.com/elastic/cloud-on-k8s/