kubernetes安装es集群

2023-03-30 13:34:42 浏览数 (1)

在 Kubernetes 集群上安装 Elasticsearch(ES)集群,可以实现分布式、高可用性的 Elasticsearch 部署,可以提高 Elasticsearch 的稳定性和可靠性。在 Kubernetes 集群中,每个 Elasticsearch 实例都作为一个 Kubernetes pod 运行,多个 Elasticsearch 实例组成一个 ES 集群。

以下是在 Kubernetes 集群上安装 ES 集群的步骤:

创建存储类

ES 需要使用持久化存储来存储数据,因此需要在 Kubernetes 集群中创建一个存储类。存储类定义了如何为 ES 分配存储资源。

可以使用以下 yaml 文件创建一个名为 es-storage-class.yaml 的存储类:

代码语言:javascript复制
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: es-storage-class
provisioner: kubernetes.io/gce-pd # 修改为你的存储类型
parameters:
  type: pd-standard
  replication-type: none

其中 provisioner 需要根据你的存储类型进行修改,比如如果你使用的是 AWS EBS 存储,可以将 provisioner 修改为 kubernetes.io/aws-ebs

然后执行以下命令创建存储类:

代码语言:javascript复制
arduinoCopy codekubectl apply -f es-storage-class.yaml

创建 StatefulSet

在 Kubernetes 集群中,ES 实例可以使用 StatefulSet 进行管理。StatefulSet 可以保证每个 ES 实例都有一个唯一的名称和稳定的网络标识符,这对于构建 ES 集群非常重要。

以下是一个名为 es-statefulset.yaml 的示例文件:

代码语言:javascript复制
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es
spec:
  replicas: 3 # 修改为你的实例数
  serviceName: elasticsearch
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
        ports:
        - containerPort: 9200
          name: rest
        - containerPort: 9300
          name: inter-node
        volumeMounts:
        - name: es-data
          mountPath: /usr/share/elasticsearch/data
      initContainers:
      - name: init-chown
        image: busybox
        command: ['sh', '-c', 'chown -R 1000:1000 /usr/share/elasticsearch/data']
        volumeMounts:
        - name: es-data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: es-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: es-storage-class
      resources:
        requests:
          storage: 10Gi # 修改为你的存储大小

在这个示例中,spec.replicas 指定了 ES 实例的数量,spec.serviceName 指定了服务的名称,

ES 实例的容器中使用了 docker.elastic.co/elasticsearch/elasticsearch:7.10.1 镜像,该镜像来自于 Elastic 官方,可以根据自己的需要进行修改。

在容器中挂载了名为 es-data 的持久化存储卷,该卷用于存储 ES 实例的数据。

在 StatefulSet 中还包含一个名为 init-chown 的初始化容器,该容器用于将 ES 数据目录的权限设置为 1000:1000,这是 ES 运行时需要的权限。

最后,通过 volumeClaimTemplates 定义了 ES 数据卷的持久化存储卷模板,包含了存储大小、访问模式等信息。

执行以下命令创建 StatefulSet:

代码语言:javascript复制
kubectl apply -f es-statefulset.yaml

创建 Service

创建 Service 可以为 ES 实例提供一个稳定的网络标识符,使其能够在集群内互相访问。

以下是一个名为 es-service.yaml 的示例文件:

代码语言:javascript复制
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
spec:
  selector:
    app: elasticsearch
  ports:
  - name: rest
    port: 9200
    targetPort: rest
  - name: inter-node
    port: 9300
    targetPort: inter-node

在这个示例中,spec.selector 指定了 Service 对应的标签,这与 StatefulSet 中的标签是一致的。spec.ports 定义了两个端口,分别对应 ES 的 HTTP 端口 9200 和集群间通信端口 9300。

执行以下命令创建 Service:

代码语言:javascript复制
kubectl apply -f es-service.yaml

配置 ES

在完成 StatefulSet 和 Service 的部署之后,需要对 ES 实例进行配置。可以使用 ConfigMap 来定义 ES 的配置文件。

以下是一个名为 es-config.yaml 的示例文件:

代码语言:javascript复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: elasticsearch-config
data:
  elasticsearch.yml: |
    cluster.name: es-cluster
    network.host: 0.0.0.0
    node.master: true
    node.data: true
    node.ingest: true
    discovery.seed_hosts: "es-0.elasticsearch,es-1.elasticsearch,es-2.elasticsearch"
    cluster.initial_master_nodes: "es-0,es-1,es-2"
  jvm.options: |
    -Xms2g
    -Xmx2g

在这个示例中,elasticsearch.yml 定义了 ES 的配置项,包括集群名称、网络主机、节点角色等。discovery.seed_hosts 定义了 ES 实例的种子节点列表,cluster.initial_master_nodes 定义了集群的初始主节点列表。

jvm.options 定义了 ES 的 JVM 参数,包括堆内存的最小和最大值。

执行以下命令创建 ConfigMap:

代码语言:javascript复制
kubectl apply -f es-config.yaml

部署 Head 插件

Head 是一个 ES 的 Web 管理工具,可以通过 Web 界面来管理 ES 集群。以下是一个名为 es-head.yaml 的示例文件:

代码语言:javascript复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: es-head
spec:
  replicas: 1
  selector:
    matchLabels:
      app: es-head
  template:
    metadata:
      labels:
        app: es-head
    spec:
      containers:
      - name: es-head
        image: mobz/elasticsearch-head:5
        ports:
        - containerPort: 9100
        env:
        - name: ELASTICSEARCH_HOSTS
          value: "http://elasticsearch:9200"

在这个示例中,spec.template.spec.containers 中定义了 Head 容器。image 指定了 Head 的镜像,该镜像来自于 mobz/elasticsearch-head,可以根据自己的需要进行修改。

ports 定义了 Head 的端口,该端口用于通过 Web 界面访问 ES 集群。

env 定义了 Head 的环境变量,其中 ELASTICSEARCH_HOSTS 指定了 ES 集群的地址。

执行以下命令创建 Head:

代码语言:javascript复制
kubectl apply -f es-head.yaml

0 人点赞