在k8s中搭建elasticsearch高可用集群,并对数据进行持久化存储

news2025/1/24 2:16:55

🐇明明跟你说过:个人主页

🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、Elasticsearch简介

2、k8s简介

二、环境准备 

1、k8s集群搭建

2、存储准备

三、搭建es集群

1、编写YAML文件

2、创建es集群 

3、创建Service 

4、访问测试 

四、安装elasticsearch-head工具 

1、elasticsearch-head介绍

2、安装Elasticsearch-Head

3、访问测试


一、引言

1、Elasticsearch简介

Elasticsearch 是一个开源的分布式搜索和分析引擎,最初由 Elasticsearch N.V. 公司开发,并于 2010 年首次发布。它建立在 Apache Lucene 基础之上,提供了分布式的实时搜索和分析功能,被广泛应用于各种场景,包括日志分析、全文搜索、监控和可视化等。

以下是 Elasticsearch 的一些重要特点和功能:

1. 分布式架构:

  • Elasticsearch 是一个分布式系统,数据可以水平扩展到多个节点上存储和处理。
  • 数据被分割成多个分片(Shard),每个分片可以被复制到多个副本(Replica),以提高数据的可用性和容错性。

2. 实时搜索:

  • Elasticsearch 提供了快速的实时搜索功能,可以在大规模数据集上快速地进行搜索、过滤和排序。
  • 支持复杂的搜索查询语法和全文搜索功能,可以满足各种搜索需求。

3. 多种数据类型:

  • Elasticsearch 支持多种数据类型的存储和索引,包括文本、数字、日期、地理位置等。
  • 支持结构化数据和非结构化数据的索引和查询。

4. 强大的聚合和分析:

  • Elasticsearch 提供了丰富的聚合(Aggregation)功能,可以对数据进行统计、分组、计算等操作。
  • 支持各种聚合函数和桶(Bucket)操作,可以生成复杂的数据分析报表和可视化。

5. RESTful API:

  • Elasticsearch 提供了基于 RESTful API 的接口,支持各种 HTTP 请求和 CRUD 操作。
  • 开发者可以使用各种编程语言和工具与 Elasticsearch 进行交互,实现数据的索引、搜索和分析。

6. 可扩展性和灵活性:

  • Elasticsearch 提供了丰富的插件和扩展机制,可以根据需求定制和扩展功能。
  • 支持与其他开源工具和系统集成,如 Logstash、Kibana、Beats 等,构建完整的日志分析和监控解决方案。

2、k8s简介

Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

 有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

​​​

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

二、环境准备 

1、k8s集群搭建

如果还未搭建k8s集群,请参考《在Centos中搭建 K8s 1.23 集群超详细讲解》 

2、存储准备

在K8s中,创建一个存储类,用于持久化存储es集群的数据,保证node节点重启后数据不会丢失

存储类搭建,请参考《k8s 存储类(StorageClass)创建与动态生成PV解析,(附带镜像)》这篇文章

三、搭建es集群

1、编写YAML文件

apiVersion: v1
kind: Namespace
metadata:
  name: es
---
#创建ConfigMap用于挂载配置文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: sirc-elasticsearch-config
  namespace: es
  labels:
    app: elasticsearch
data:             #具体挂载的配置文件
  elasticsearch.yml: |+     
    cluster.name: "es-cluster"
    network.host: 0.0.0.0
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    http.cors.allow-headers: "*"
    bootstrap.system_call_filter: false
    xpack.security.enabled: false
    index.number_of_shards: 5
    index.number_of_replicas: 1
#创建StatefulSet,ES属于数据库类型的应用,此类应用适合StatefulSet类型
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: es
spec:
  serviceName: "elasticsearch-cluster"   #填写无头服务的名称
  replicas: 5
  selector: 
    matchLabels: 
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      initContainers:
      - name: fix-permissions
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: es-data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-vm-max-map
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
      containers:
      - name: elasticsearch
        image: elasticsearch:7.17.18
        imagePullPolicy: Never
        resources:
          requests:
            memory: "1000Mi"
            cpu: "1000m"
          limits:
            memory: "2000Mi"
            cpu: "2000m"
        ports:
        - containerPort: 9200
          name: elasticsearch
        env:
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name  #metadata.name获取自己pod名称添加到变量MY_POD_NAME,status.hostIP获取自己ip等等可以自己去百度
        - name: discovery.type
          value: zen
        - name: cluster.name
          value: elasticsearch
        - name: cluster.initial_master_nodes
          value: "elasticsearch-0,elasticsearch-1,elasticsearch-2,elasticsearch-3,elasticsearch-4"
        - name: discovery.zen.minimum_master_nodes
          value: "3"
        - name: discovery.seed_hosts
          value: "elasticsearch-0.elasticsearch-cluster.es,elasticsearch-1.elasticsearch-cluster.es,elasticsearch-2.elasticsearch-cluster.es,elasticsearch-3.elasticsearch-cluster.es,elasticsearch-4.elasticsearch-cluster.es"
        - name: network.host
          value: "0.0.0.0"
        - name: "http.cors.allow-origin"
          value: "*"
        - name: "http.cors.enabled"
          value: "true"
        - name: "number_of_shards"
          value: "5"
        - name: "number_of_replicas"
          value: "1"
        - name: path.data
          value:  /usr/share/elasticsearch/data
        volumeMounts:                           
          - name: es-data                  #挂载数据
            mountPath: /usr/share/elasticsearch/data 
      volumes:
      - name: elasticsearch-config
        configMap:                                #configMap挂载
          name: sirc-elasticsearch-config
  volumeClaimTemplates:                     #这步自动创建pvc,并挂载动态pv
    - metadata:
        name: es-data
      spec:
        accessModes: ["ReadWriteMany"]
        storageClassName: nfs
        resources:
          requests:
            storage: 10Gi
#创建Service
---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-cluster  #无头服务的名称,需要通过这个获取ip,与主机的对应关系
  namespace: es
  labels:
    app: elasticsearch
spec:
  ports:
    - port: 9200
      name: elasticsearch
  clusterIP: None
  selector:
    app: elasticsearch 

 

  • Namespace 定义:这个部分定义了一个 Kubernetes Namespace,命名为 es,用于将所有的资源组织在同一个命名空间下。
  • ConfigMap 定义:这个部分创建了一个 ConfigMap,其中包含了 Elasticsearch 的配置文件 elasticsearch.yml 的内容。这些配置将被挂载到 Elasticsearch 容器中。
  • StatefulSet 定义:这个部分定义了一个 StatefulSet,用于管理 Elasticsearch 的部署。它指定了多个副本数、镜像版本、资源请求、容器端口以及其他的配置。还包括了一些 initContainers,用于初始化容器环境,以及 volumeClaimTemplates,用于动态创建持久化存储。
  • Service 定义:这个部分创建了一个 Headless Service,用于为 StatefulSet 中的 Elasticsearch Pods 提供服务发现。它没有 ClusterIP,意味着它不会暴露端口到集群内部,而是用于在集群内部进行通信。

这个 YAML 文件通过使用 Kubernetes 的各种资源对象来定义了一个完整的 Elasticsearch 部署方案

2、创建es集群 

[root@master es]# kubectl  apply -f  es.yaml

查看pod状态

 

 

3、创建Service 

为es集群创建nodeport类型的service,以便在k8s集群外部访问使用es

编写YAML文件

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service-0
  namespace: es
spec:
  type: NodePort
  selector:
    statefulset.kubernetes.io/pod-name: elasticsearch-0
  ports:
    - protocol: TCP
      port: 80        # Service 暴露的端口
      targetPort: 9200   # Pod 中容器的端口
      nodePort: 30000    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service-1
  namespace: es
spec:
  type: NodePort
  selector:
    statefulset.kubernetes.io/pod-name: elasticsearch-1
  ports:
    - protocol: TCP
      port: 80        # Service 暴露的端口
      targetPort: 9200   # Pod 中容器的端口
      nodePort: 30001    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service-2
  namespace: es
spec:
  type: NodePort
  selector:
    statefulset.kubernetes.io/pod-name: elasticsearch-2
  ports:
    - protocol: TCP
      port: 80        # Service 暴露的端口
      targetPort: 9200   # Pod 中容器的端口
      nodePort: 30002    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service-3
  namespace: es
spec:
  type: NodePort
  selector:
    statefulset.kubernetes.io/pod-name: elasticsearch-3
  ports:
    - protocol: TCP
      port: 80        # Service 暴露的端口
      targetPort: 9200   # Pod 中容器的端口
      nodePort: 30003    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service-4
  namespace: es
spec:
  type: NodePort
  selector:
    statefulset.kubernetes.io/pod-name: elasticsearch-4
  ports:
    - protocol: TCP
      port: 80        # Service 暴露的端口
      targetPort: 9200   # Pod 中容器的端口
      nodePort: 30004    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整

1. Service 元数据:定义了服务的元数据,包括名称和命名空间。这个服务的名称为 my-nodeport-service-0,命名空间为 es。

2. Service 规范:规定了服务的类型、选择器和端口设置。

  • type: NodePort:指定了这个服务的类型为 NodePort,这意味着服务将通过每个节点上的指定端口(nodePort)暴露给外部客户端。
  • selector:定义了服务所匹配的 Pod 选择器。在这里,它使用了一个特殊的标签 statefulset.kubernetes.io/pod-name,以匹配名为 elasticsearch-0 的 StatefulSet 中的 Pod。
  • ports:定义了服务所使用的端口配置。
  • protocol: TCP:指定了服务使用的协议为 TCP。
  • port: 80:指定了服务暴露的端口号为 80,这是外部客户端可以连接的端口。
  • targetPort: 9200:指定了服务转发到 Pod 中容器的端口号为 9200,这是 Elasticsearch Pod 中运行的实际服务的端口。
  • nodePort: 30000:指定了 NodePort 类型的端口号为 30000,这个端口将被每个节点使用来暴露服务。

创建svc

[root@master es]# kubectl apply -f  service.yaml

 查看svc

 

4、访问测试 

在浏览器输入node节点IP加30000端口

 

四、安装elasticsearch-head工具 

1、elasticsearch-head介绍

Elasticsearch-Head 是一个基于浏览器的开源工具,用于可视化和管理 Elasticsearch 集群。它提供了一个直观的用户界面,可以帮助用户轻松地监控和管理 Elasticsearch 集群中的索引、节点、分片等。

以下是 Elasticsearch-Head 的一些主要特点和功能:

  1. 索引管理:Elasticsearch-Head 允许用户查看和管理 Elasticsearch 集群中的索引。它可以显示索引的状态、文档数量、存储大小等信息,并提供索引的创建、删除、优化等操作。
  2. 节点监控:用户可以通过 Elasticsearch-Head 实时监控集群中的节点状态。它可以显示每个节点的健康状况、负载情况、分片分布等信息,帮助用户识别并解决潜在的问题。
  3. 分片管理:Elasticsearch-Head 提供了对分片的可视化管理功能。用户可以查看每个索引的分片状态,包括分片的分配情况、复制情况等,还可以手动执行重新分片、分片移动等操作。
  4. 查询执行:用户可以通过 Elasticsearch-Head 发送和执行查询请求,以检索和分析索引中的数据。它提供了一个简单的查询构建器,可以帮助用户构建和调试 Elasticsearch 查询语句。
  5. 集群状态:Elasticsearch-Head 显示了整个集群的状态和健康状况。它可以显示集群中的节点数量、主节点数量、分片数量等信息,并提供了实时的集群健康指标。

 

总的来说,Elasticsearch-Head 是一个非常有用的工具,可以帮助用户更加轻松地管理和监控 Elasticsearch 集群。它的直观界面和丰富功能使得用户可以更加高效地进行索引管理、节点监控、分片管理等操作。

2、安装Elasticsearch-Head

编写YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearchhead
  namespace: es
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearchhead
  template:
    metadata:
      labels:
        app: elasticsearchhead
    spec:
      containers:
      - name: elasticsearchhead
        image: mobz/elasticsearch-head:5
        ports:
        - containerPort: 9100
---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearchhead-service
  namespace: es
spec:
  type: NodePort
  ports:
  - port: 9100
    targetPort: 9100
    nodePort: 30910  # 可根据需要选择合适的端口号
  selector:
    app: elasticsearchhead

部署 elasticsearchhead

[root@master es]# kubectl apply -f  elasticsearch-head.yaml

3、访问测试

在浏览器输入node节点IP加30910端口

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s概述及核心组件

一、k8s概述 1.1 引言 docker compose 单机编排工具 有企业在用 docker swarm 能够在多台主机中构建一个docker集群 基本淘汰集群化管理处理工具 容器 微服务封装 dockerfile 编写成镜像 然后进行发布 dockerfile 可以写成shell脚本(函数做调…

xmzs切换镜像源

1.全局安装 npm install xmzs -g 2.mmp ls 查看镜像源 3.mmp use 选择镜像源

CTF网络安全大赛web题目:just_sqli

这道题目是bugku的web题目 题目的 描  述: KosenCTF{} 原文链接&#xff1a; CTF网络安全大赛web题目&#xff1a;just_sqli - 红客网-网络安全与渗透技术 题目Web源代码&#xff1a; <?php$user NULL; $is_admin 0;if (isset($_GET["source"])) {highlig…

Spring实现数据库读写分离(MySQL实现主从复制)

目录 1、背景 2、方案 2.1 应用层解决: 2.2 中间件解决 3、使用Spring基于应用层实现 3.1 原理 3.2 DynamicDataSource 3.3 DynamicDataSourceHolder 3.4 DataSourceAspect 3.5 配置2个数据源 3.5.1 jdbc.properties 3.5.2 定义连接池 3.5.2 定义DataSource 3.6…

企业微信hook接口协议,ipad协议http,大文件网络上传

大文件网络上传 参数名必选类型说明url是String网络图片地址 请求示例 {"uuid":"2b0863724106a1160212bd1ccf025295","authkey":"0AAxxx031", "filekey":"346b7bff-08d5-4ac2-bc67-fd10e3eb2388", "fileur…

恒创科技:域名CNAME解析和A记录解析有哪些区别?

​  域名是互联网上的一种地址&#xff0c;是用以替代复杂IP地址的字符标识&#xff0c;在进行域名解析时&#xff0c;主要有两种常见的记录类型&#xff1a;CNAME 记录和 A记录解析。今天就给大家讲下CNAME解析和A记录解析有哪些区别、优势。这里&#xff0c;我们先了解下什…

2024年代理!武汉重点实验室申报条件、奖励补贴

2024年武汉重点实验室申报条件、奖励补贴的想想内容整理如下&#xff0c;江岸区、江汉区、硚口区、汉阳区、武昌区、青山区、洪山区、蔡甸区、江夏区、黄陂区、新洲区、东西湖区、汉南区、武汉经开区、东湖高新区企业申报重点实验室有不明白的可了解&#xff1a; 武汉重点实验室…

【Leetcode每日一题】 综合练习 - 括号生成(难度⭐⭐)(76)

1. 题目解析 题目链接&#xff1a;22. 括号生成 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 问题描述 我们需要找出所有可能的、有效的括号序列。一个有效的括号序列指的是一个仅由(和)组成的字符串&#xff0c;…

高效协同,智慧绘制:革新型流程图工具全解析

流程图&#xff0c;作为一种直观展示工作过程和系统运作的工具&#xff0c;在现代办公和项目管理中发挥着不可或缺的作用。 其优势在于能够清晰、直观地呈现复杂的过程和关系&#xff0c;帮助人们快速理解并掌握关键信息。同时&#xff0c;流程图也广泛应用于各种场景&#xf…

C++ static_cast学习

static_cast可实现&#xff0c; 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时&#xff0c;会损失精度类似于C语言的强制转化&#xff1b; 下面先看一下void指针的转换&#xff1b; …

cpu卡片详解(FM1208)

​ 目录 ​1. 引言 1.1 FM1208 CPU卡芯片 2. FM1208 CPU卡芯片概述 2.1 FM1208及其在智能卡中的作用 2.2 FM1208功能框图 3.FM1208的技术规格 4.FM1208工作流程 5.&#xff26;&#xff2d;1208文件结构 6.FM1208与其他智能卡技术的比较 7.FM1208安全特性 7.1 DES/…

哈希表法快速求解最长连续序列 | 力扣128题详细解析

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

美团小程序mtgsig1.2逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

HarmonyOS ArkTS 实现类似Android中RadioButton得效果

在Android中如实现下图可以用radioGroup和RadioButton实现&#xff0c;但在ArkTs中radio不能实现自定义样式&#xff0c;所以用Tabs来实现这种效果&#xff0c;效果图如下&#xff1a; 一、效果图 二、实现横向布局的三个TabContent&#xff0c;代码如下 State currentIndex: n…

互联网轻量级框架整合之控制反转和注入

依赖注入和依赖查找 应该说IoC的工作方式有两种&#xff0c;一种是依赖查找&#xff0c;通过资源定位&#xff0c;把对应的资源查找出来&#xff0c;例如通过JNDI找到数据源&#xff0c;依赖查找被广泛使用在第三方的资源注入上&#xff0c;比如在Web项目中&#xff0c;数据源往…

小程序|锁定查询功能如何使用?

学生或家长想要实现自己查询完成后&#xff0c;任何人都无法再次查询&#xff0c;老师应该如何设置&#xff1f;易查分的【锁定查询功能】就可实现&#xff0c;下面教大家如何使用吧。 &#x1f4cc;使用教程 &#x1f512;锁定查询功能介绍 ✅学生或家长自主锁定&#xff1a;开…

酷开科技丨女性群像大戏《惜花芷》在酷开系统热播中

在这个国产剧市场蓬勃发展的时代&#xff0c;酷开科技通过其生态智能电视系统&#xff0c;为剧迷们打造了一个精彩的观剧平台。通过酷开科技的智能推荐算法&#xff0c;消费者能够轻松地发掘并观看各种题材的高质量剧集&#xff0c;无论是扣人心弦的金融较量、深刻的家庭代际关…

QCustomPlot的了解

&#xff08;一&#xff09;QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现-CSDN博客 关键代码&#xff1a; QT core gui printsupport 使用上面文章中的代码跑起来的程序效果图&#xff1a; 我的学习过程&#xff1a; 最开始初…

位图和布隆过滤器:位图

在《unordered_map 和 unordered_set》 中提到过&#xff1a; 哈希是一种思想&#xff0c;通过哈希函数将数据转化为一个或多个整型 —— 映射关系&#xff1b;通过这种映射关系&#xff0c;可以做到以 O(1) 的时间复杂度查找数据。 本文即将介绍的 位图 和 布隆过滤器 就是两个…

【漏洞复现】泛微OA E-Cology GetLabelByModule SQL注入漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology getLabelByModule存在SQL注入漏洞&#xff0c;允许攻击者非法访问和操…