【k8s部署elasticsearch】k8s环境下安装elasticsearch集群和kibana

news2024/9/28 5:32:41

文章目录

      • 简介
      • 一.条件及环境说明
      • 二.需求说明
      • 三.实现原理及说明
      • 四.详细步骤
        • 4.1.规划节点标签
        • 4.2.创建三个statefulset和service headless配置
        • 4.3.创建service配置
      • 五.安装kibana
      • 六.调整索引分区
      • 七.安装说明

简介

k8s集群中搭建有elasticsearch服务一般都会用到pvc,但是考虑到有些自建k8s环境下,搭建的共享存储可能会存在稳定性及性能问题,所以这次是通过采用节点亲和性和hostpath来实现,目前的operator的基本都是采用共享存储的方法。本文将根据现有环境及不同需求将elasticsearch集群的搭建采用hostpath+亲和性的权重+多个副本分区的方式来实现数据持久化和高可用。

一.条件及环境说明

k8s版本k8s-1.29.4,环境搭建在电信机房,六个worker节点,每个节点有一块非系统盘的ssd盘挂载到/data/路径,不采用ceph或nas之类的共享存储,也未采用operator。

二.需求说明

  • 搭建三个节点的elasticsearch集群,并配置三个主分区,2个副本分区。
  • 高可用:有一个k8s节点长期故障后或重启pod之后也不影响使用。
  • 高性能:读写本地磁盘实现高性能的io,共享存储如果资源及硬件性能不够的话,io将会是性能瓶颈。
  • 数据安全:在发生切换,节点故障以后,数据要尽可能的保证完整
  • 安装简单、管理维护容易

三.实现原理及说明

四.详细步骤

4.1.规划节点标签
节点名称角色标签
k8s-worker-120-81storage-selector=node-a-master
k8s-worker-120-82storage-selector=node-b-master
k8s-worker-120-83storage-selector=node-c-master
k8s-worker-120-84storage-selector=node-a-slve
k8s-worker-120-85storage-selector=node-a-slve
k8s-worker-120-86storage-selector=node-a-slve

注:这里的角色划分是指:redis由于是一主两从,每个redis的pod分别落在三个主的节点上,当主节点发生故障是,就切换到备节点,例如:名称为autopocket-es-a-0的pod,默认落在标签为storage-selector=node-a-master的节点上,当该节点发生故障是,就会根据权重匹配罗在storage-selector=node-a-slve的节点上。

4.2.创建三个statefulset和service headless配置

1.elasticsearch_a.yaml 节点a的statuflset配置和无头服务配置

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: autopocket-es-a
  namespace: zx-app
  labels:
    app: autopocket-es-a 
    appname: pcauto-pocket
    appgroup: autopocket-es
spec:
  serviceName: "autopocket-es-a"
  replicas: 1 
  selector:
    matchLabels:
      app: autopocket-es-a
      appgroup: autopocket-es
  template:
    metadata:
      labels:
        app: autopocket-es-a
        appgroup: autopocket-es
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 80
            preference:
              matchExpressions:
              - key: storage-selector 
                operator: In
                values:
                - node-a-master
          - weight: 20
            preference:
              matchExpressions:
              - key: storage-selector 
                operator: In
                values:
                - node-a-slave
      containers:
      - name: elasticsearch
        image: "xxx.cn-shenzhen.cr.aliyuncs.com/public/elasticsearch:7.17.22"
        command: ["/bin/sh","-c"]
        args:
        - mkdir -p /home/elastic/${POD_NAME}/data /home/elastic/${POD_NAME}/logs;chown elasticsearch.elasticsearch -R /home/elastic;su elasticsearch -c "/usr/share/elasticsearch/bin/elasticsearch"
        env:
        - name: cluster.name
          value: autopocket-es 
        - name: K8S_SERVICE_NAME
          value: autopocket-es-a 
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: discovery.seed_hosts
          value: "autopocket-es-a-0.autopocket-es-a.$(POD_NAMESPACE).svc.cluster.local,autopocket-es-b-0.autopocket-es-b.$(POD_NAMESPACE).svc.cluster.local,autopocket-es-c-0.autopocket-es-c.$(POD_NAMESPACE).svc.cluster.local"
        - name: cluster.initial_master_nodes
          value: "autopocket-es-a-0.autopocket-es-a.$(POD_NAMESPACE).svc.cluster.local"
        - name: node.name
          value: $(POD_NAME).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local 
        - name: path.data
          value: /home/elastic/$(POD_NAME)/data
        - name: path.logs
          value: /home/elastic/$(POD_NAME)/logs
        - name: xpack.security.enabled
          value: "false"
        ports:
        - name: rest
          containerPort: 9200
        - name: inter-node
          containerPort: 9300
        volumeMounts:
        - name: elasticsearch-data
          mountPath: /home/elastic
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      volumes:
        - name: elasticsearch-data 
          hostPath:
            path: /data/es_data
            type: ""
      tolerations:
      - key: node.kubernetes.io/not-ready
        operator: Exists
        effect: NoExecute
        tolerationSeconds: 3600
      - key: node.kubernetes.io/unreachable
        operator: Exists
        effect: NoExecute
        tolerationSeconds: 3600
---
apiVersion: v1
kind: Service
metadata:
  name: autopocket-es-a
  namespace: zx-app
  labels:
    appname: pcauto-pocket
    app: autopocket-es-a
spec:
  ports:
  - port: 9200
    name: rest
  - port: 9300
    name: inter-node
  clusterIP: None
  selector:
    app: autopocket-es-a

2.elasticsearch_b.yaml 节点b的statuflset配置和无头服务配置

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: autopocket-es-b
  namespace: zx-app
  labels:
    app: autopocket-es-b 
    appname: pcauto-pocket
    appgroup: autopocket-es
spec:
  serviceName: "autopocket-es-b"
  replicas: 1 
  selector:
    matchLabels:
      app: autopocket-es-b
      appgroup: autopocket-es
  template:
    metadata:
      labels:
        app: autopocket-es-b
        appgroup: autopocket-es
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 80
            preference:
              matchExpressions:
              - key: storage-selector 
                operator: In
                values:
                - node-b-master
          - weight: 20
            preference:
              matchExpressions:
              - key: storage-selector 
                operator: In
                values:
                - node-b-slave
      containers:
      - name: elasticsearch
        image: "xxx.cn-shenzhen.cr.aliyuncs.com/public/elasticsearch:7.17.22"
        command: ["/bin/sh","-c"]
        args:
        - mkdir -p /home/elastic/${POD_NAME}/data /home/elastic/${POD_NAME}/logs;chown elasticsearch.elasticsearch -R /home/elastic;su elasticsearch -c "/usr/share/elasticsearch/bin/elasticsearch"
        env:
        - name: cluster.name
          value: autopocket-es 
        - name: K8S_SERVICE_NAME
          value: autopocket-es-b 
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: discovery.seed_hosts
          value: "autopocket-es-a-0.autopocket-es-a.$(POD_NAMESPACE).svc.cluster.local,autopocket-es-b-0.autopocket-es-b.$(POD_NAMESPACE).svc.cluster.local,autopocket-es-c-0.autopocket-es-c.$(POD_NAMESPACE).svc.cluster.local"
        - name: cluster.initial_master_nodes
          value: "autopocket-es-a-0.autopocket-es-a.$(POD_NAMESPACE).svc.cluster.local"
        - name: node.name
          value: $(POD_NAME).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local 
        - name: path.data
          value: /home/elastic/$(POD_NAME)/data
        - name: path.logs
          value: /home/elastic/$(POD_NAME)/logs
        - name: xpack.security.enabled
          value: "false"
        ports:
        - name: rest
          containerPort: 9200
        - name: inter-node
          containerPort: 9300
        volumeMounts:
        - name: elasticsearch-data
          mountPath: /home/elastic
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      volumes:
        - name: elasticsearch-data 
          hostPath:
            path: /data/es_data
            type: ""
      tolerations:
      - key: node.kubernetes.io/not-ready
        operator: Exists
        effect: NoExecute
        tolerationSeconds: 3600
      - key: node.kubernetes.io/unreachable
        operator: Exists
        effect: NoExecute
        tolerationSeconds: 3600
---
apiVersion: v1
kind: Service
metadata:
  name: autopocket-es-b
  namespace: zx-app
  labels:
    appname: pcauto-pocket
    app: autopocket-es-b
spec:
  ports:
  - port: 9200
    name: rest
  - port: 9300
    name: inter-node
  clusterIP: None
  selector:
    app: autopocket-es-b

3.elasticsearch_c.yaml 节点c的statuflset配置和无头服务配置

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: autopocket-es-c
  namespace: zx-app
  labels:
    app: autopocket-es-c 
    appname: pcauto-pocket
    appgroup: autopocket-es
spec:
  serviceName: "autopocket-es-c"
  replicas: 1 
  selector:
    matchLabels:
      app: autopocket-es-c
      appgroup: autopocket-es
  template:
    metadata:
      labels:
        app: autopocket-es-c
        appgroup: autopocket-es
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 80
            preference:
              matchExpressions:
              - key: storage-selector 
                operator: In
                values:
                - node-c-master
          - weight: 20
            preference:
              matchExpressions:
              - key: storage-selector 
                operator: In
                values:
                - node-c-slave
      containers:
      - name: elasticsearch
        image: "xxx.cn-shenzhen.cr.aliyuncs.com/public/elasticsearch:7.17.22"
        command: ["/bin/sh","-c"]
        args:
        - mkdir -p /home/elastic/${POD_NAME}/data /home/elastic/${POD_NAME}/logs;chown elasticsearch.elasticsearch -R /home/elastic;su elasticsearch -c "/usr/share/elasticsearch/bin/elasticsearch"
        env:
        - name: cluster.name
          value: autopocket-es 
        - name: K8S_SERVICE_NAME
          value: autopocket-es-c 
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: discovery.seed_hosts
          value: "autopocket-es-a-0.autopocket-es-a.$(POD_NAMESPACE).svc.cluster.local,autopocket-es-b-0.autopocket-es-b.$(POD_NAMESPACE).svc.cluster.local,autopocket-es-c-0.autopocket-es-c.$(POD_NAMESPACE).svc.cluster.local"
        - name: cluster.initial_master_nodes
          value: "autopocket-es-a-0.autopocket-es-a.$(POD_NAMESPACE).svc.cluster.local"
        - name: node.name
          value: $(POD_NAME).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local 
        - name: path.data
          value: /home/elastic/$(POD_NAME)/data
        - name: path.logs
          value: /home/elastic/$(POD_NAME)/logs
        - name: xpack.security.enabled
          value: "false"
        ports:
        - name: rest
          containerPort: 9200
        - name: inter-node
          containerPort: 9300
        volumeMounts:
        - name: elasticsearch-data
          mountPath: /home/elastic
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      volumes:
        - name: elasticsearch-data 
          hostPath:
            path: /data/es_data
            type: ""
      tolerations:
      - key: node.kubernetes.io/not-ready
        operator: Exists
        effect: NoExecute
        tolerationSeconds: 3600
      - key: node.kubernetes.io/unreachable
        operator: Exists
        effect: NoExecute
        tolerationSeconds: 3600
---
apiVersion: v1
kind: Service
metadata:
  name: autopocket-es-c
  namespace: zx-app
  labels:
    appname: pcauto-pocket
    app: autopocket-es-c
spec:
  ports:
  - port: 9200
    name: rest
  - port: 9300
    name: inter-node
  clusterIP: None
  selector:
    app: autopocket-es-c
4.3.创建service配置

给9200 9300配置一个service的代理服务,注意其中的selector是指向到appgroup,这是将三个statefulset定义了一个appgroup的标签。

apiVersion: v1
kind: Service
metadata:
  name: autopocket-es
  namespace: zx-app
  labels:
    app: autopocket-es
    appname: pcauto-zx
spec:
  ports:
  - port: 9200
    name: rest
  - port: 9300
    name: inter-node
  selector:
    appgroup: autopocket-es
  type: LoadBalancer 

五.安装kibana

apiVersion: apps/v1
kind: Deployment
metadata:
  name: autopocket-es-kibana
  namespace: zx-app
  labels:
    app: autopocket-es-kibana
    appname: pcauto-pocket
spec:
  replicas: 1
  selector:
    matchLabels:
      app: autopocket-es-kibana
  template:
    metadata:
      labels:
        app: autopocket-es-kibana
    spec:
      containers:
      - name: kibana
        image: "xxx.cn-shenzhen.cr.aliyuncs.com/public/kibana:7.17.22"
        ports:
        - containerPort: 5601
        env:
        - name: ELASTICSEARCH_HOSTS
          value: '["http://autopocket-es-a-0.autopocket-es-a:9200","http://autopocket-es-b-0.autopocket-es-b:9200","http://autopocket-es-c-0.autopocket-es-c:9200"]'
---
apiVersion: v1
kind: Service
metadata:
  name: autopocket-es-kibana
  namespace: zx-app
  labels:
    app: autopocket-es-kibana
    appname: pcauto-pocket
spec:
  selector:
    app: autopocket-es-kibana
  ports:
  - port: 5601
    targetPort: 5601
  type: LoadBalancer

查看集群健康情况:http://10.16.xx.xx:9200/_cat/health?v

elasticsearch集群状态查看:http://10.16.1xx.xx:9200/_cat/nodes?v
在这里插入图片描述

索引状态查看:http://10.16.1xx.xx:9200/_cat/indices?v
在这里插入图片描述

kibana地址登录:http://10.16.1xx.xx:5601/app/home#/
在这里插入图片描述

六.调整索引分区

调整已存在索引的副本分区:curl -XPUT -H "Content-Type:application/json" -d '{"settings":{"number_of_replicas":2}}' 'http://10.16.xx.xx:9200/testindex/_settings'

调整集群最大分片数:curl -XPUT -H "Content-Type:application/json" http://10.16.xx.xx:9200/_cluster/settings -d '{"transient":{"cluster":{"max_shards_per_node":10000}}}'

调整默认主分片和副本分片数: curl -X PUT -H "Content-Type:application/json" -d '{"index_patterns":["*"],"settings":{"number_of_shards":3,"number_of_replicas":2}}' http://10.16.xx.xx:9200/_template/template_http_request_record

七.安装说明

  • 需要先在k8s的节点创建/data/es_data的路径来存放数据。
  • 使用配置前将配置中的autopocket替换成自己需要的命名,配置的命名空间为:zx-app,修改成自己的命名空间,appname为pcauto-pocket,修改成自己的应用名称,该标签也可以删除。
  • 配置中的镜像地址采用了私有的镜像地址,镜像是dockerhub上下载的elasticsearch:7.17.22 镜像到私有镜像仓库的,如果能直通外网的k8s可以直接用elasticsearch:7.17.22,kibana的镜像是kibana:7.17.22。否则配置一个可以通的镜像地址。
  • 默认没有配置用户名和密码。
  • 节点标签的命名规则若有更改需要在每个statefulset中的affinity: 中的标签名称进行修改。

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

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

相关文章

苹果入局,AI手机或将实现“真智能”?

【潮汐商业评论/原创】 “AI应用智能手机不就是现在的AI手机。” 当被问到现阶段对AI手机的看法时,John如是说。“术业有专攻,那么多APP在做AI功能,下载用就是了,也用不着现在换个AI手机啊。” 对于AI手机,或许大多…

阿里云调整全球布局关停澳洲云服务器,澳洲服务器市场如何选择稳定可靠的云服务?

近日,阿里云宣布将关停澳大利亚地域的数据中心服务,这一决定引发了全球云计算行业的广泛关注。作为阿里云的重要海外市场之一,澳洲的数据中心下架对于当地的企业和个人用户来说无疑是一个不小的挑战。那么,在阿里云调整全球布局的…

JS爬虫实战之极验四代

极验四代滑块验证码 一、目标网站说明二、流程步骤1. 逆向步骤一般分为:2. 接口确认1- 确认流程2- 获取verify的参数3- 构建requests验证verify的参数4- 锁定secode参数的作用 ok,让我们去获取verify接口中的响应!!! 3…

在若依框架基础上开发新功能

本文介绍如何在若依框架(不分离版本)的基础上开发新功能。 目录 运行若依框架 下载若依框架代码 IDEA打开若依框架代码 初始化数据库 修改数据库配置 运行项目 设计数据库 数据表命名规则 建表及初始化数据 开发新功能 后端CRUD功能 前端接口…

YOLOv10改进 | 添加注意力机制篇 | 添加LSKAttention大核注意力机制助力极限涨点

一、本文介绍 在这篇文章中,我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv10,以实现显著的性能提升。首先,我们介绍LSKAttention机制的基本原理,它主要通过将深度卷积层的2D卷积核分解为水平和垂直1D卷积核&#xff0…

网络编程!

网络编程 【1】网络开发架构 ( 1 ) C / S 架构 C : client (客户端) S: server (服务端) APP - 就是服务端 C/S 架构通过客户端软件和服务器之间的交互,实现了前端界面和后端业务逻辑的分离,提供了一种…

昇思学习打卡-8-计算机视觉/FCN图像语义分割

目录 FCN介绍FCN所用的技术训练数据的可视化模型训练模型推理FCN的优点和不足优点不足 FCN介绍 FCN主要用于图像分割领域,是一种端到端的分割方法,是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因…

【JavaScript 算法】快速排序:高效的排序算法

🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 快速排序(Quick Sort)是一种高效的排序算法,通过分治法将数组分为较小的子数组,递归地排序子数组。快速排序通常…

近期几首小诗汇总-生活~卷

生活 为生活飘零,风雨都不阻 路见盲人艰,为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…

使用ffmpeg将一个目录下的mkv格式的视频文件转换成mp4格式

最近学剪辑,从BT种子下载的素材资源都是mkv格式的,不能直接导入到视频剪辑软件中。这种情况下需要用一些格式转换工具进行转换,也可以使用ffmpeg进行编辑。 ffmpeg是一个命令行工具,用来对本地的音频视频软件进行编辑。ffmpeg我也…

【服务器】端口映射

文章目录 1.端口映射的概念1.1 端口映射的类型1.2 端口映射的应用场景1.3 示例 2.为什么要进行端口映射呢?3.原理3.1【大白话】原理解释3.2 原理图 4.代码 1.端口映射的概念 端口映射(Port Mapping),也称为端口转发(P…

萝卜快跑:未来出行的双刃剑

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 在这个日新月异的科技时代,无人驾驶技术正以前所未有的速度改变着我们的出行方式。萝卜快跑,作为自动驾驶出租车领域的佼佼者,其出现无疑为城市交通注入了新的活力&#xff…

[微信小程序知识点]自定义组件-拓展-外部样式类

使用组件时,组件使用者可以给组件传入css类名,通过传入的类名修改组件的样式 。 如果需要使用外部样式类修改组件的样式,在Component中需要用extemalClassess定义若干个外部样式类。 具体用法如下: (1)在Components文件里创建custom06组件 (…

谷粒商城实战笔记-26-分布式组件-SpringCloud-Gateway网关核心概念原理

微服务架构中,API网关扮演着至关重要的角色,它不仅作为微服务间的通信桥梁,还负责安全、监控、限流等职责。 一,网关的发展历程 SpringCloud的网关经历了两代的迭代和更替。 第一代网关是早期的Zuul,由 Netflix 开发…

【密码学】数字签名

一、数字签名的基本概念 数字签名是一种用于验证电子文档完整性和身份认证的密码学技术。它通过使用公钥加密体系中的私钥对文档的一部分(通常是文档的摘要)进行加密,从而创建一个“签名”。这个签名可以附在文档上,或作为一个单独…

巧用 VScode 网页版 IDE 搭建个人笔记知识库!

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 巧用 VScode 网页版 IDE 搭建个人笔记知识库! 描述:最近自己在腾讯云轻量云服务器中部署了一个使用在线 VScode 搭建部署的个人Markdown在线笔记,考虑到在线 VScode 支持终…

C++笔试真题

可变分区管理方案 最佳适应:空闲区按容量递增最坏适应:空闲区按容量递减首先适应:空闲区按地址递增 C的结构体中有构造函数。 Linux新建用户或组 useradd:命令用于建立用户账号usermod:修改用户账号groupadd&#…

Spire.PDF for .NET【文档操作】演示:C#/VB.NET:压缩 PDF 文档

大型 PDF 文件处理起来很麻烦,占用宝贵的存储空间并减慢传输和上传速度。压缩 PDF 文档是一种简单有效的方法,可以减少文件大小并针对各种用途进行优化。通过压缩 PDF,您可以更轻松地通过电子邮件或云存储平台共享它们,加快下载速…

用Apipost压力测试接口

用Apipost压力测试接口 1.点击自动化测试 2.选择要测试的接口 3.如果没有接口,就先在api调试中添加要测试的接口 4.根据自己的需求设置相应的参数,这里我压测10次 5.这样就可以压测接口了,非常nice

接口幂等性和解决方案

针对前端重复发起相同请求的解决方案: 注意: Redis保证了在相同key的情况下,只会保留一条数据,这就保证了多次请求只会消费一条数据。 并且需要注意的是,生成/获取token和携带token发送请求的过程需要是两个不同的过…