部署 Elastic Stack

    由于 Elasticsearch 的关系,ELK Stack 属于典型的有状态应用,Elastic.co 官方也推出了基于 Kubernetes Operator 的 Elastic Cloud on Kubernetes(ECK),用户可使用该产品在 Kubernetes 上较为轻松地配置、管理和运行 Elasticsearch 集群。

    ECK 使用 Kubernetes Operator 模式构建而成,但它的功能并不局限于部署与迁移,下面为 Elastic.co 官方博客上对 ECK 的中文介绍,供你对 ECk 有个基本的了解:

    官方博客《在 Kubernetes 上运行 Elasticsearch:开启新篇》

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

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

    ECK 不仅能自动完成所有运行和集群管理任务,还专注于简化在 Kubernetes 上使用 Elasticsearch 的完整体验。ECK 的愿景是为 Kubernetes 上的 Elastic 产品和解决方案提供 SaaS 般的体验。 在 ECK 上启动的所有 Elasticsearch 集群都默认受到保护,这意味着在最初创建的那一刻便已启用加密并受到默认强密码的保护。

    ECK 内构建了 Elastic Local Volume,这是一个适用于 Kubernetes 的集成式存储驱动器。ECK 中还融入了很多最佳实践,例如在缩小规模之前对节点进行 drain 操作,在扩大规模的时候对分片进行再平衡,等等。从确保在配置变动过程中不会丢失数据,到确保在规模调整过程中实现零中断。

    —— Anurag Gupta

    由于 Elasticsearch 是相对重量级的应用,建议你的 Kubernetes 每个节点至少有 4 至 8 GB 的可用内存。ECK 支持的最低软件版本如下所示:

    • kubectl 1.11+
    • Kubernetes 1.12+ or OpenShift 3.11+
    • Google Kubernetes Engine (GKE), Azure Kubernetes Service (AKS), and Amazon Elastic Kubernetes Service (EKS)
    • Elasticsearch, Kibana, APM Server: 6.8+, 7.1+
    • Enterprise Search: 7.7+
    • Beats: 7.0+

    首先在集群中安装 ECK 对应的 Operator 资源对象:

    安装成功后,会自动创建一个elastic-system的名称空间以及一个 Operator 的 Pod:

    1. NAME READY STATUS RESTARTS AGE
    2. elastic-operator-0 1/1 Running 1 15h

    你可以通过以下命令来查看 Operator 的工作日志:

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

    该命令执行完毕后,Pod、Service 均已自动生成,你可以使用一下命令验证:

    1. $ kubectl get elasticsearch
    2. NAME HEALTH NODES VERSION PHASE AGE
    3. quickstart green 1 7.9.2 Ready 1m
    4. $ kubectl get service quickstart-es-http
    5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

    你只要获取访问凭证,就可以通过 HTTP 访问到 Elasticsearch 服务,获取访问凭证的操作如下:

    1. PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')

    通过 HTTP 访问 Elasticsearch 服务的操作如下:

    如果需要在外部访问,通过 Kubernetes 的端口转发即可实现:

    1. $ kubectl port-forward service/quickstart-es-http 9200
    2. # 在另一个Console中:
    3. $ curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
    4. "name" : "quickstart-es-default-0",
    5. "cluster_name" : "quickstart",
    6. "cluster_uuid" : "XqWg0xIiRmmEBg4NMhnYPg",
    7. "version" : {...},
    8. "tagline" : "You Know, for Search"

    与部署 Elasticsearch 集群类似,使用类型为Kibana的自定义资源即可快速部署 Kibana 实例,命令如下所示:

    1. $ cat <<EOF | kubectl apply -f -
    2. apiVersion: kibana.k8s.elastic.co/v1
    3. kind: Kibana
    4. metadata:
    5. name: quickstart
    6. spec:
    7. version: 7.9.2
    8. count: 1
    9. elasticsearchRef:
    10. name: quickstart

    你可以通过集群 ClusterIP 及 5601 端口来访问 Kibana,或者进行端口转发到外部: