在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…

文心一言指令

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

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

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

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

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

云原生 初识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 如…

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…

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

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

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后&#xff0c;之前在节能里面通过鼠标点击设置开机关机的方法不能用了&#xff0c;现在只能用命令设置开机…

css笔记总结2

找到所有的 h1 标签。 选择器&#xff08;选对人&#xff09; 设置这些标签的样式&#xff0c;比如颜色为红色&#xff08;做对事&#xff09;。 ##css基础选择器 基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器 ###标签选择器&#xff1a; 标签…

【PB案例学习笔记】-03用户名密码校验

写在前面 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…

KNN算法处理多元分类任务

概述 这个案例还是基于之前的案例进行改造。 之前的案例代码完整如下&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklearn…

Java获取请求参数

1.简单参数接收 前端请求参数与Controller接受变量名一致 如果参数名不一致&#xff0c;接受不成功。 可以用RequestParam指定参数名&#xff0c;可以用username接收&#xff08;不推荐&#xff09;。 required true&#xff0c;表示参数必须传递&#xff0c;如果不传递会报错…

深入剖析Tomcat(八) 载入器与打破双亲委派机制的自定义类加载器

写这篇文章让我头大了好几天&#xff0c;书中描述的内容倒是不多&#xff0c;可能也是那会Tomcat的现状。如今Tomcat发展了好多代&#xff0c;加上springboot的广泛应用&#xff0c;导致现在的类加载的步骤和Tomcat资料中描述的大相径庭。可能也是由于微服务的发展&#xff0c;…

基于 Spring Boot 博客系统开发(十)

基于 Spring Boot 博客系统开发&#xff08;十&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;九&#xff09;&#x1f…

Golang | Leetcode Golang题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; func numDecodings(s string) int {n : len(s)// a f[i-2], b f[i-1], c f[i]a, b, c : 0, 1, 0for i : 1; i < n; i {c 0if s[i-1] ! 0 {c b}if i > 1 && s[i-2] ! 0 && ((s[i-2]-0)*10(s[i-1]-0) < 26) {c…