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

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

🏅个人专栏:《洞察之眼: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-confignamespace: eslabels:app: elasticsearch
data:             #具体挂载的配置文件elasticsearch.yml: |+     cluster.name: "es-cluster"network.host: 0.0.0.0http.cors.enabled: truehttp.cors.allow-origin: "*"http.cors.allow-headers: "*"bootstrap.system_call_filter: falsexpack.security.enabled: falseindex.number_of_shards: 5index.number_of_replicas: 1
#创建StatefulSet,ES属于数据库类型的应用,此类应用适合StatefulSet类型
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: elasticsearchnamespace: es
spec:serviceName: "elasticsearch-cluster"   #填写无头服务的名称replicas: 5selector: matchLabels: app: elasticsearchtemplate:metadata:labels:app: elasticsearchspec:initContainers:- name: fix-permissionsimage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]securityContext:privileged: truevolumeMounts:- name: es-datamountPath: /usr/share/elasticsearch/data- name: increase-vm-max-mapimage: busyboximagePullPolicy: IfNotPresentcommand: ["sysctl", "-w", "vm.max_map_count=262144"]securityContext:privileged: true- name: increase-fd-ulimitimage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "ulimit -n 65536"]securityContext:privileged: truecontainers:- name: elasticsearchimage: elasticsearch:7.17.18imagePullPolicy: Neverresources:requests:memory: "1000Mi"cpu: "1000m"limits:memory: "2000Mi"cpu: "2000m"ports:- containerPort: 9200name: elasticsearchenv:- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name  #metadata.name获取自己pod名称添加到变量MY_POD_NAME,status.hostIP获取自己ip等等可以自己去百度- name: discovery.typevalue: zen- name: cluster.namevalue: elasticsearch- name: cluster.initial_master_nodesvalue: "elasticsearch-0,elasticsearch-1,elasticsearch-2,elasticsearch-3,elasticsearch-4"- name: discovery.zen.minimum_master_nodesvalue: "3"- name: discovery.seed_hostsvalue: "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.hostvalue: "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.datavalue:  /usr/share/elasticsearch/datavolumeMounts:                           - name: es-data                  #挂载数据mountPath: /usr/share/elasticsearch/data volumes:- name: elasticsearch-configconfigMap:                                #configMap挂载name: sirc-elasticsearch-configvolumeClaimTemplates:                     #这步自动创建pvc,并挂载动态pv- metadata:name: es-dataspec:accessModes: ["ReadWriteMany"]storageClassName: nfsresources:requests:storage: 10Gi
#创建Service
---
apiVersion: v1
kind: Service
metadata:name: elasticsearch-cluster  #无头服务的名称,需要通过这个获取ip,与主机的对应关系namespace: eslabels:app: elasticsearch
spec:ports:- port: 9200name: elasticsearchclusterIP: Noneselector: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-0namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-0ports:- protocol: TCPport: 80        # Service 暴露的端口targetPort: 9200   # Pod 中容器的端口nodePort: 30000    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-1namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-1ports:- protocol: TCPport: 80        # Service 暴露的端口targetPort: 9200   # Pod 中容器的端口nodePort: 30001    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-2namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-2ports:- protocol: TCPport: 80        # Service 暴露的端口targetPort: 9200   # Pod 中容器的端口nodePort: 30002    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-3namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-3ports:- protocol: TCPport: 80        # Service 暴露的端口targetPort: 9200   # Pod 中容器的端口nodePort: 30003    # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
---
apiVersion: v1
kind: Service
metadata:name: my-nodeport-service-4namespace: es
spec:type: NodePortselector:statefulset.kubernetes.io/pod-name: elasticsearch-4ports:- protocol: TCPport: 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: elasticsearchheadnamespace: es
spec:replicas: 1selector:matchLabels:app: elasticsearchheadtemplate:metadata:labels:app: elasticsearchheadspec:containers:- name: elasticsearchheadimage: mobz/elasticsearch-head:5ports:- containerPort: 9100
---
apiVersion: v1
kind: Service
metadata:name: elasticsearchhead-servicenamespace: es
spec:type: NodePortports:- port: 9100targetPort: 9100nodePort: 30910  # 可根据需要选择合适的端口号selector:app: elasticsearchhead

部署 elasticsearchhead

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

3、访问测试

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

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

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

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

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

相关文章

Git项目管理——提交项目和版本回退(二)

个人名片: 🎓作者简介:嵌入式领域优质创作者🌐个人主页:妄北y 📞个人QQ:2061314755 💌个人邮箱:[mailto:2061314755qq.com] 📱个人微信:Vir2025WB…

android绘制多个黑竖线条

本文实例为大家分享了android绘制多个黑竖线条展示的具体代码,供大家参考,具体内容如下 1.写一个LinearLayout的布局,将宽度写成5dp将高度写成match_parent. 2.在写一个类继承LinearLayout,用LayoutInflater实现子布局的在这个L…

train_gpt2_fp32.cu - main

llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) 源码 // ---------------------------------------------------------------------------- // main training loop int main(int argc, char *argv[]) {// read in the (optional) command line argumentsco…

三.使用HashiCorp Vault工具管理数据库

三.ubuntu安装使用HashiCorp Vault工具管理数据库 HashiCorp Vault 是一个基于身份的秘密和加密管理系统。机密是您想要严格控制访问的任何内容,例如 API 加密密钥、密码和证书。Vault 提供由身份验证和授权方法门控的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全…

深度优先搜索汇总

常用英文 最近公共祖先(Lowest Common Ancestor,简称LCA) posterity,英语单词,主要用作名词,作名词时译为“子孙,后裔;后代”。 什么是深度优先搜索 深度优先搜索,D…

[前端] vue2的/deep/转化为vue3语法(笔记)

vue2语法示例 <style scoped lang"less">/deep/.el-carousel__button {width: 8px;height: 3px;border-radius: 3px;}/deep/.el-carousel__indicator.is-active button {width: 16px;} } </style>在 Vue 3 中&#xff0c;/deep/ 或 >>> 选择器…

24 内核开发- Linux 内核各种设计模式

24 内核开发- Linux 内核各种设计模式 Linux 内核中使用了各种设计模式来组织和结构其庞大的代码库。以下是 Linux 内核中的一些常见设计模式&#xff1a; 1. 单例模式&#xff1a; 模块&#xff1a; init 模块 目的&#xff1a; 初始化内核并创建第一个进程 (init_task) 实现…

uni-app 实现下拉单选功能(六)

总体的设计思想是,一个输入框在客户点击时,弹出需要选择的下拉框选项,客户选择完后,隐藏下拉框选项内容;并将选择的数据填充到输入框内。话不多说直接上代码: <template> <view class="dianjianInfo"> <view class="uni-form…

文心一言指令

文心一言 文心一言&#xff08;ERNIE Bot&#xff09;是百度公司研发的知识增强大语言模型&#xff0c;它可以根据用户的指令和输入&#xff0c;生成相应的回答或文本。以下是一些可能的指令示例&#xff0c;用于指导文心一言完成不同的任务&#xff1a; 知识问答&#xff1a…

【oracle】图片转为字节、base64编码等形式批量插入oracle数据库并查询

1.熟悉、梳理、总结下Oracle相关知识体系 2.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 资源下载&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3个资源文件资源下载&#xff1a; Instant Client Setup.exe资源下载&#xff1a; oci.dll、oraocci11.dll、oraoc…

LangChain_Tools

1、Tools 可以被Agent、Chain、LLM所使用。 2、tool 的必备属性有&#xff1a;name、description、JSON schema &#xff08;tool输入&#xff09;、调用的函数、工具的结果是否应直接返回给用户。其中name、description和 JSON schema 可用于提示 LLM、写入在LLM的system pro…

初识C语言——第二十一天

猜数字小游戏的实现&#xff1a; 学会了之后可以自己制作彩票抽奖&#xff0c;哈哈&#xff01; 代码实现&#xff1a; #include <stdlib.h> #include <time.h>void menu()//无返回值函数 {printf("**************************\n");printf("****…

Linux:退出vim编辑模式

一、使用快捷键进行退出 1、按“Esc”键进入命令模式 当我们在vim编辑模式下输入完毕需要进行退出操作时&#xff0c;首先需要按下“Esc”键&#xff0c;将vim编辑器从插入模式或者替换模式切换到命令模式。 ESC 2、输入“:wq”保存并退出 在命令模式下&#xff0c;输入“:…

在kubernetes中配置Ingress

目录 1. 安装Nginx Ingress Controller2. 准备TLS证书3. 编写Ingress资源定义4. 应用Ingress配置5. 验证配置 1. 安装Nginx Ingress Controller 首先&#xff0c;确保你的Kubernetes集群已经准备好。你可以使用Helm或者直接通过yaml文件来安装Nginx Ingress Controller。这里给…

云原生 初识Kubernetes的理论基础

一、k8s 的由来及其技术运用 1.1 k8s的简介 Kubernetes&#xff0c;词根源于希腊语的 舵手、飞行员。在国内又称k8s&#xff08;因为k和s之间有8个字母&#xff0c;所以得名。“国内程序员的幽默”&#xff09;。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#x…

利用远程控制软件FinalShell远程连接虚拟机上的Linux系统(Windows)

一. VMware Workstation 安装CentOS Linux操作系统 传送门&#xff1a;VMware Workstation 安装CentOS Linux操作系统 1.右键打开终端 2.输入ifconfig 找到ens33对应 inet的id&#xff0c;这个就是虚拟机的ip地址图中所示为&#xff1a;192.168.5.128 3.打开finalshell 如…

如何使用 PuTTY 创建 SSH 密钥以连接到 VPS

公钥和私钥 SSH 密钥的好处 如果您的无头或远程 VPS 可以通过互联网访问&#xff0c;您应该尽可能使用公钥身份验证而不是密码。这是因为与仅使用密码相比&#xff0c;SSH 密钥提供了一种更安全的登录方式。虽然密码最终可以通过暴力破解攻击破解&#xff0c;但 SSH 密钥几乎不…

C++ | Leetcode C++题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode *dummyNode new ListNode(-1);dummyNode->next head;ListNode *pre dummyNode;for (i…

抽象类介绍

抽象类 【一】什么是抽象 # 将某几个具体的生物&#xff0c;根据特征总结成一个类&#xff0c;逐层向上总结 # 唐老鸭 肉鸭 北京烤鸭 ---> 鸭子 # 北极熊 黑熊 --> 熊 # 猫 老虎 --> 猫科 # 鸭子 熊 猫科 --> 动物 【二】什么是继承 # 动物 ---> 熊 --->…

【刷题篇】二分查找(二)

文章目录 1、山脉数组的峰顶索引2、寻找峰值3、寻找旋转排序数组中的最小值4、LCR 点名 1、山脉数组的峰顶索引 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] &l…