在 Kubernetes 集群上安装 Elasticsearch(ES)集群,可以实现分布式、高可用性的 Elasticsearch 部署,可以提高 Elasticsearch 的稳定性和可靠性。在 Kubernetes 集群中,每个 Elasticsearch 实例都作为一个 Kubernetes pod 运行,多个 Elasticsearch 实例组成一个 ES 集群。
以下是在 Kubernetes 集群上安装 ES 集群的步骤:
创建存储类
ES 需要使用持久化存储来存储数据,因此需要在 Kubernetes 集群中创建一个存储类。存储类定义了如何为 ES 分配存储资源。
可以使用以下 yaml 文件创建一个名为 es-storage-class.yaml
的存储类:
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
的示例文件:
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
的示例文件:
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
的示例文件:
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
的示例文件:
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