在 Kubernetes(K8s)上运行 Elasticsearch 是讲解实一种在容器化环境中部署和管理 Elasticsearch 集群的常见方法。Elasticsearch 是战操作版一款流行的分布式搜索和分析引擎,而 Kubernetes 则提供了一个出色的讲解实平台,用于编排容器并管理 Elasticsearch 的战操作版可伸缩性和容错性。
以下是讲解实在 Kubernetes 上部署 Elasticsearch 的一般步骤:
虽然这些步骤提供了在 Kubernetes 上部署 Elasticsearch 的高层次概述,但具体的步骤可能会根据你的用例和环境而有所不同。考虑使用 Kubernetes Operators、Helm 图表或其他工具来简化在 Kubernetes 中部署和管理 Elasticsearch 集群的过程。此外,请参考 Elasticsearch 和 Kubernetes 文档,获取详细的说明和最佳实践。
Elasticsearch 节点类型和配置在集群的设计和性能优化中起着关键作用。以下是一些常见的 Elasticsearch 节点类型以及它们的配置示例:
作用:主节点用于管理集群状态、索引创建和分片分配。它们不负责数据存储或搜索查询。
配置示例:
node.master: truenode.data: false
作用:数据节点存储索引数据并执行搜索查询。
配置示例:
node.master: falsenode.data: true
作用:协调节点用于接收客户端请求,并将其路由到数据节点。配置示例:
node.master: falsenode.data: false
作用:仲裁节点不存储数据,但可以参与主节点选举。配置示例:
node.master: truenode.data: false
作用:Ingest 节点用于文档的预处理和转换。配置示例:
node.master: falsenode.data: falsenode.ingest: true
作用:Machine Learning 节点用于运行 Elasticsearch 的机器学习任务。配置示例:
node.ml: true
作用:Transform 节点用于执行数据转换操作,将结果存储在新的索引中。配置示例:
node.transform: true
作用:Remote 节点用于转发请求到远程 Elasticsearch 集群。配置示例:
node.remote_cluster_client: true
作用:Hot 节点用于接收实时数据,Warm 节点用于冷热数据分离,Cold 节点用于长期存储。配置示例:
node.attr.hot: truenode.attr.warm: truenode.attr.cold: true
请注意,上述示例是典型的节点类型和配置示例。在实际的集群配置中,可以根据需求和性能要求进行更详细的调整。配置文件通常是 Elasticsearch 的 elasticsearch.yml,你可以在每个节点上的该文件中设置节点类型和其他相关配置。根据需要,你可以将不同的节点类型配置在不同的节点上,以构建具有适当角色的 Elasticsearch 集群。同时,还可以使用其他设置来调整内存、存储、网络和性能参数,以满足特定的用例需求。
k8s 环境安装之前写过很多文档,可以参考我以下几篇文章:
地址:https://artifacthub.io/packages/helm/elastic/elasticsearch
# 添加数据源helm repo add elastic https://helm.elastic.co# 下载helm pull elastic/elasticsearch --version 7.17.3# 解压tar -xf elasticsearch-7.17.3.tgz
Elasticsearch 各版本下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
这里就不重新构建镜像了,有不知道怎么构建镜像的小伙伴可以给我留言或私信,这里是将远程的镜像推送到我们本地harbor,加速拉取镜像。
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.3docker tag docker.elastic.co/elasticsearch/elasticsearch:7.17.3 registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/elasticsearch:7.17.3# 上传镜像到阿里云镜像仓库docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/elasticsearch:7.17.3
这里只显示修改部分,在最后会提供修改后的git下载地址。
image: "registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/elasticsearch"### 去掉这几行volumeClaimTemplate: accessModes: ["ReadWriteOnce"] resources: requests: storage: 30Gipersistence: enabled: true labels: # Add default labels for the volumeClaimTemplate of the StatefulSet enabled: false annotations: { } accessModes: - ReadWriteOnce size: 1Gi storageClass: "elasticsearch-local-storage" local: - name: elasticsearch-0 host: "local-168-182-110" path: "/opt/bigdata/servers/elasticsearch/data/data1" - name: elasticsearch-1 host: "local-168-182-111" path: "/opt/bigdata/servers/elasticsearch/data/data1" - name: elasticsearch-2 host: "local-168-182-112" path: "/opt/bigdata/servers/elasticsearch/data/data1"protocol: httphttpPort: 9200transportPort: 9300service: enabled: true type: NodePort nodePort: 30920 httpPortName: http
kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: { { .Values.persistence.storageClass }}provisioner: kubernetes.io/no-provisioner
{ { - range .Values.persistence.local }}---apiVersion: v1kind: PersistentVolumemetadata: name: { { .name }} labels: name: { { .name }}spec: storageClassName: { { $.Values.persistence.storageClass }} capacity: storage: { { $.Values.persistence.size }} accessModes: { { - range $.Values.persistence.accessModes }} - { { . | quote }} { { - end }} local: path: { { .path }} nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - { { .host }}---{ { - end }}
spec: volumeClaimTemplates: spec:# 去掉这行{ { toYaml .Values.volumeClaimTemplate | indent 6 }}# 新增以下内容: accessModes: { { - range .Values.persistence.accessModes }} - { { . | quote }} { { - end }} resources: requests: storage: { { .Values.persistence.size | quote }} { { - if .Values.persistence.storageClass }} { { - if (eq "-" .Values.persistence.storageClass) }} storageClassName: "" { { - else }} storageClassName: "{ { .Values.persistence.storageClass }}" { { - end }} { { - end }}
# 如果没有挂载目录,则需要提前创建,也可自己更换挂载目录# 先创建本地存储目录mkdir -p /opt/bigdata/servers/elasticsearch/data/data1chmod -R 777 /opt/bigdata/servers/elasticsearch/data/data1helm install my-elasticsearch ./elasticsearch -n elasticsearch --create-namespace# 查看helm get notes my-elasticsearch -n elasticsearchkubectl get pods,svc -n elasticsearch -owide# 查看日志kubectl logs -f elasticsearch-master-0 -n elasticsearch
notes,可以获取用户密码
NAME: my-elasticsearchLAST DEPLOYED: Sat Sep 9 22:01:15 2023NAMESPACE: elasticsearchSTATUS: deployedREVISION: 1NOTES:1. Watch all cluster members come up. $ kubectl get pods --namespace=elasticsearch -l app=elasticsearch-master -w2. Retrieve elastic user's password. $ kubectl get secrets --namespace=elasticsearch elasticsearch-master-credentials -ojsnotallow='{ .data.password}' | base64 -d3. Test cluster health using Helm test. $ helm --namespace=elasticsearch test my-elasticsearch
账号:elastic密码获取:
kubectl get secrets --namespace=elasticsearch elasticsearch-master-credentials -ojsnotallow='{ .data.password}' | base64 -d
curl 访问:
curl http://192.168.182.110:30920/curl http://192.168.182.110:30920/_cat/nodescurl http://192.168.182.110:30920/_cat/health?pretty
图片
elasticsearch-head GitHub下载地址:https://github.com/mobz/elasticsearch-headGoogle 浏览器 elasticsearch-head 插件:
链接:https://pan.baidu.com/s/1kYcTjBDPmSWVzsku2hEW7w?pwd=67v4提取码:67v4
helm uninstall my-elasticsearch -n elasticsearch# 删除数据rm -fr /opt/bigdata/servers/elasticsearch/data/data1/*
地址:https://artifacthub.io/packages/helm/bitnami/kibana?modal=install
helm repo add bitnami https://charts.bitnami.com/bitnamihelm pull bitnami/kibana --version 10.2.6tar -xf kibana-10.2.6.tgz
这里也不重新构建镜像了,只是将镜像推送到本地harbor加速,对构建镜像不清楚的可以留言或私信。Kibana 和 Elasticsearch 需保证所用版本互相兼容,版本兼容性:https://www.elastic.co/cn/support/matrix#matrix_compatibility
图片
docker pull docker.io/bitnami/kibana:7.17.3docker tag docker.io/bitnami/kibana:7.17.3 registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/kibana:7.17.3# 上传镜像docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/kibana:7.17.3
image: registry: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative repository: kibana tag: 7.17.3replicaCount: 1persistence: enabled: true accessModes: - ReadWriteOnce size: 10Gi storageClass: "kibana-local-storage" local: - name: kibana-0 host: "local-168-182-111" path: "/opt/bigdata/servers/kibana/data/data1"service: ports: http: 5601 type: NodePort nodePorts: http: "30601"elasticsearch: hosts: - elasticsearch-master.elasticsearch port: "9200"
{ { - range .Values.persistence.local }}---apiVersion: v1kind: PersistentVolumemetadata: name: { { .name }} labels: name: { { .name }}spec: storageClassName: { { $.Values.persistence.storageClass }} capacity: storage: { { $.Values.persistence.size }} accessModes: { { - range $.Values.persistence.accessModes }} - { { . | quote }} { { - end }} local: path: { { .path }} nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - { { .host }}---{ { - end }}
kind: StorageClassapiVersion: storage.k8s.io/v1metadata: name: { { .Values.persistence.storageClass }}provisioner: kubernetes.io/no-provisioner
# 先创建本地存储目录mkdir -p /opt/bigdata/servers/kibana/data/data1chmod -R 777 /opt/bigdata/servers/kibana/data/data1helm install my-kibana ./kibana -n kibana --create-namespace# 查看helm get notes my-kibana -n kibana kubectl get pods,svc -n kibana -owide
kibana web 地址:http://192.168.182.110:30601/
图片
helm uninstall my-kibana -n kibanakubectl delete ns kibana --forcessh local-168-182-111 rm -fr /opt/bigdata/servers/kibana/data/data1/*
要查看 Elasticsearch 7 集群的状态和信息,您可以使用以下 API 操作:
使用 GET 请求来获取集群的健康状态。以下是一个示例:
GET /_cluster/health
这个请求将返回有关集群健康状态的信息,包括集群名称、状态(例如:green、yellow、red)、节点数量、分片数量、副本数量等。
使用 GET 请求来获取有关集群中节点的信息。以下是一个示例:
GET /_cat/nodes?v
这个请求将返回节点的详细信息,包括节点的名称、IP 地址、节点角色(主节点、数据节点、协调节点等)等。
使用 GET 请求来获取有关集群中索引的信息。以下是一个示例:
GET /_cat/indices?v
这个请求将返回索引的详细信息,包括索引的名称、状态、文档数量、分片数量、副本数量等。
使用 GET 请求来获取集群的设置信息。以下是一个示例:
GET /_cluster/settings
这个请求将返回有关集群设置的信息,包括索引的分片和副本配置、分配策略等。
使用 GET 请求来获取集群中节点的统计信息。以下是一个示例:
GET /_nodes/stats
这个请求将返回有关节点的各种统计信息,包括内存使用、CPU 使用、磁盘使用等。
在 Elasticsearch 7 中,POST 和 PUT 请求的区别涉及到文档的创建和更新。以下是它们之间的主要区别:
示例使用 POST 请求创建文档:
POST /my_index/_doc{ "name": "John Doe", "age": 30}
示例使用 PUT 请求创建或更新文档:
PUT /my_index/_doc/1{ "name": "Jane Smith", "age": 35}
总结:
在 Elasticsearch 7 中,您可以使用 RESTful API 执行索引数据(文档)的增删改查操作。以下是一些常见的 Elasticsearch 操作示例及其讲解:
要将文档添加到 Elasticsearch 索引中,可以使用 POST 或 PUT 请求。以下是一个示例:
POST /my_index/_doc/1{ "name": "John Doe", "age": 30}
这个示例使用 POST 请求将一个文档添加到名为 my_index 的索引中。文档的 ID 设置为 1。如果您使用 PUT 请求,也可以指定文档的 ID。
要按 ID 获取文档,可以使用 GET 请求。以下是一个示例:
GET /my_index/_doc/1
这个示例使用 GET 请求按文档 ID 1 从索引 my_index 中获取文档。
要更新现有文档,可以使用 POST 或 PUT 请求。以下是一个示例:
POST /my_index/_doc/1/_update{ "doc": { "age": 31 }}
这个示例使用 POST 请求来更新文档 ID 1 中的 age 字段的值为 31。
要删除文档,可以使用 DELETE 请求。以下是一个示例:
DELETE /my_index/_doc/1
Elasticsearch 7 中引入了索引模板(Index Templates) API,允许您定义模板来自动应用于新索引的设置、映射和别名。这对于确保索引的一致性和管理大规模的数据非常有用。以下是 Elasticsearch 7 中索引模板 API 的一些示例和解释:
使用 PUT 请求创建索引模板,指定模板的名称和设置。以下是一个示例:
PUT /_index_template/my_template{ "index_patterns": ["logs-*"], "template": { "settings": { "number_of_shards": 3, "number_of_replicas": 2 }, "mappings": { "properties": { "timestamp": { "type": "date" }, "message": { "type": "text" } } } }}
使用 GET 请求获取特定索引模板的信息。以下是一个示例:
GET /_index_template/my_template
这个请求将返回名为 my_template 的索引模板的详细信息。
使用 GET 请求列出所有已定义的索引模板。以下是一个示例:
GET /_index_template
使用 DELETE 请求删除特定索引模板。以下是一个示例:
DELETE /_index_template/my_template
Elasticsearch 提供了数据热(hot)和冷(cold)阶段的设置,以帮助优化数据存储和查询性能,特别是对于大规模的时间序列数据(如日志、度量和事件数据)非常有用。以下是设置冷热数据的一般步骤和一些配置选项:
首先,您可以创建一个索引模板,以定义新索引的设置和分配策略,以及索引在不同阶段之间的迁移策略。在模板中,您可以指定哪些条件应将索引划分为热、温和冷(或其他阶段),并定义相应的设置。
以下是一个示例索引模板,定义了热、温和冷阶段的索引分配策略:
PUT /_index_template/logs_template{ "index_patterns": ["logs-*"], "template": { "settings": { "number_of_shards": 3, "number_of_replicas": 1, "index.lifecycle.name": "logs_policy", "index.lifecycle.rollover_alias": "logs-alias", "index.routing.allocation.require.box_type": "hot" }, "mappings": { "properties": { "timestamp": { "type": "date" }, "message": { "type": "text" } } } }}
接下来,创建一个生命周期策略,以定义索引在不同阶段之间的迁移条件和操作。
PUT /_ilm/policy/logs_policy{ "policy": { "phases": { "hot": { "min_age": "0ms", "actions": { "rollover": { "max_size": "50GB", "max_age": "30d" } } }, "warm": { "min_age": "30d", "actions": { "forcemerge": { "max_num_segments": 1 } } }, "cold": { "min_age": "90d", "actions": { "freeze": { }, "read_only": { } } }, "delete": { "min_age": "365d", "actions": { "delete": { } } } } }}
现在,当您创建新的日志索引时,它将自动应用索引模板和生命周期策略,以及分配到热节点。
一旦索引和生命周期策略配置完成,Elasticsearch 将自动执行索引的迁移操作。数据将根据生命周期策略从一个阶段迁移到另一个阶段,以优化性能和降低存储成本。
这个设置允许您根据数据的访问模式和重要性来优化 Elasticsearch 集群的性能和成本效益。新的日志数据将从热存储阶段自动迁移到温存储和冷存储阶段,从而使热节点保持高性能,同时降低了冷数据的存储成本。
虽然不推荐手动分片迁移,但您可以使用以下 API 将分片从一个节点迁移到另一个节点:
POST /_cluster/reroute{ "commands": [ { "move": { "index": "your_index", "shard": 0, "from_node": "source_node", "to_node": "destination_node" } } ]}
这个操作需要非常小心,因为错误的分片移动可能会导致数据丢失或集群不稳定。因此,只有在非常特殊的情况下才应该手动干预分片分配。
在 Elasticsearch 7 中,默认情况下,数据平衡是自动启用的,它确保数据均匀分布在集群的各个节点和分片之间。然而,有时您可能需要禁用数据平衡,尤其是在特定情况下,例如集群维护期间或者出现异常情况时。以下是禁用数据平衡的方法:
Elasticsearch 允许您为节点设置属性(node attributes)。您可以通过设置节点的属性来控制数据平衡的行为。例如,您可以为节点设置一个自定义属性,然后在进行集群维护期间,通过将节点标记为不可分配(disable allocation)来禁用数据平衡。
PUT /_cluster/settings{ "transient": { "cluster.routing.allocation.exclude._name": "node_name" }}
在上面的示例中,将 node_name 替换为您要禁用数据平衡的节点名称。
您可以使用以下 API 暂时禁用数据平衡,直到您重新启用它。这可以在进行特定维护操作时使用。
PUT /_cluster/settings{ "transient": { "cluster.routing.allocation.enable": "none" }}
这将暂时禁用数据平衡,直到您通过以下方式重新启用它:
PUT /_cluster/settings{ "transient": { "cluster.routing.allocation.enable": "all" }}
Elasticsearch 7 引入了集群维护模式(cluster maintenance mode),允许您更方便地执行维护操作而不影响数据平衡。您可以将集群设置为维护模式,然后执行维护操作,最后再将集群恢复到正常状态。
启用维护模式:
PUT /_cluster/settings{ "transient": { "cluster.routing.allocation.cluster_maintenance_mode": "enable" }}
执行维护操作后,禁用维护模式:
PUT /_cluster/settings{ "transient": { "cluster.routing.allocation.cluster_maintenance_mode": "disable" }}
请注意,在维护模式下,Elasticsearch 会暂时禁用自动分片分配和数据平衡,以便您可以执行维护操作。
无论您使用哪种方法,都应小心使用禁用数据平衡的功能,并确保在维护操作完成后重新启用它,以保持集群的健康状态。
责任编辑:武晓燕 来源: 大数据与云原生技术分享 KibanaK8s数据(责任编辑:探索)
HM INTL HLDGS(08416.HK)2020年盈转亏至452.7万港元 基本每股净亏1.13港仙
二季度社保基金现身122家公司 54只个股被社保基金连续5个季度持有
“海基一号”平台主体工程海上安装完成 处于南海内波流主通道上
国资划转社保明确“时间表” 专家称免征税费可加快进度 提高划转效率
健康险保费上半年大增三成逼近4000亿元 健康险晋升为第二大险种
新矿资源(01231.HK)年度扭亏为盈至83.1万美元 每股基本及摊薄盈利0.02美分
为期货人才“提质” 破局期货人才发展瓶颈 交易所打响“提质”第一枪