使用 Kubernetes 部署 Elasticsearch 集群

随着互联网应用的快速发展,数据的积累和处理变得越来越重要。Elasticsearch 是一款开源的全文搜索引擎,可实现大规模数据的存储、搜索和分析。在本文中,我们将介绍如何使用 Kubernetes 部署 Elasticsearch 集群,以满足大规模数据处理需求。

什么是 Kubernetes?

Kubernetes 是一款Google开源的容器编排引擎,用于管理容器化应用程序的部署、升级和运行。它提供了自动化的应用程序部署、弹性调度、自我修复、水平扩展及滚动升级等功能。

部署 Elasticsearch 集群

  1. 首先需要创建一个 Kubernetes 集群。可以选择使用腾讯云等云服务厂商提供的 Kubernetes 服务,也可以在本地使用开源 Kubernetes 发行版(如 minikube)创建一个 Kubernetes 集群。

  2. 获取 Elasticsearch 镜像

    在部署 Elasticsearch 前,我们需要获取相应的 Elasticsearch 镜像,并将其上传到 Kubernetes 集群中。常用的 Elasticsearch 镜像有官方提供的 Docker 镜像和第三方的 K8S 镜像,我们以 Docker 镜像为例:

    docker pull elasticsearch:7.6.2
  3. 创建 Elasticsearch StatefulSet

    所有 Elasticsearch 节点共享一个 Cluster 名称,节点会依赖于 StatefulSet 提供的唯一标识符来实现互相发现。我们可以使用 Kubernetes 内置的 StatefulSet API 创建 Elasticsearch 集群,具体示例代码如下:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: elasticsearch
    spec:
      serviceName: elasticsearch
      replicas: 3
      selector:
        matchLabels:
          app: elasticsearch
      template:
        metadata:
          labels:
            app: elasticsearch
        spec:
          containers:
          - name: elasticsearch
            image: elasticsearch:7.6.2
            ports:
            - containerPort: 9200
              name: http
            - containerPort: 9300
              name: transport
            volumeMounts:
            - name: data
              mountPath: /usr/share/elasticsearch/data
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          resources:
            requests:
              storage: 10Gi
          accessModes:
          - ReadWriteOnce
          storageClassName: standard

    上述代码中,StatefulSet 的名称为 elasticsearch,服务名称也为 elasticsearch,replicas 为 3,表明将创建三个 Elasticsearch 节点。模板中包含了一个容器 elasticsearch,指定了容器使用的镜像 elasticsearch:7.6.2,暴露了 http 端口9200 和 transport 端口9300。同时,我们为每个容器定义了一个本地持久化存储卷,用于存储 Elasticsearch 数据。使用上述配置即可创建一个 Elasticsearch 集群。

  4. 创建 Elasticsearch Headless Service

    为了实现 Elasticsearch 节点之间的互相发现和网络通信,我们需要创建一个 Headless Service。具体示例代码如下:

    apiVersion: v1
    kind: Service
    metadata:
      name: elasticsearch
    spec:
      clusterIP: None
      selector:
        app: elasticsearch
      ports:
      - name: http
        port: 9200
        protocol: TCP
        targetPort: http
      - name: transport
        port: 9300
        protocol: TCP
        targetPort: transport

    上述代码中,http端口和transport端口分别与容器暴露的端口对应。clusterIP 设置为 None,表示这是一个 Headless Service,用于实现 DNS 解析和服务发现。

  5. 部署 Kibana

    Kibana 是 Elasticsearch 的一个可视化工具,用于跨多个索引进行搜索和数据分析。我们可以通过部署一个 Kibana Pod 以方便地访问 Elasticsearch 集群。同样的,需要先获取相应的 Kibana 镜像,常用的 Kibana 镜像有官方提供的 Docker 镜像和第三方的 K8S 镜像,我们依然以 Docker 镜像为例:

    docker pull kibana:7.6.2

    下面是部署 Kibana 的示例代码:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kibana
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: kibana
      template:
        metadata:
          labels:
            app: kibana
        spec:
          containers:
          - name: kibana
            image: kibana:7.6.2
            env:
            - name: ELASTICSEARCH_HOSTS
              value: elasticsearch.default.svc.cluster.local:9200

    Kibana Pod 中需要指定环境变量 ELASTICSEARCH_HOSTS,指定 Elasticsearch 集群的地址。使用上述配置文件即可部署一个 Kibana Pod。

至此,我们已经完成了 Elasticsearch 集群和 Kibana 工具的部署。由于 Kubernetes 的优秀性能和不断更新的功能,我们能够充分利用其特性,扩展集群规模、实现弹性伸缩,以应对不断增长的数据处理需求。

总结

本文介绍了如何使用 Kubernetes 部署 Elasticsearch 集群。通过本文的学习,我们了解了 Kubernetes 的基本概念和 StatefulSet 和 Headless Service 两种 Kubernetes API 的使用方法,并从零开始创建一个 Elasticsearch 集群和部署 Kibana 工具。希望本文能够为容器编排相关的开发人员提供一些帮助和指导。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65ab6fcaadd4f0e0ff515d8d