[单master节点k8s部署]23.构建EFK日志收集平台(二)
部署elasticsearch集群
已经完成的工作:创建存储。首先配置了nfs存储提供商(nfs-deployment.yaml),然后通过创建存储类(storageclass.yaml)来将nfs服务器与存储类绑定:
[root@master 31efk]# cat storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: do-block-storage
provisioner: example.com/nfs
创建了elasticsearch的服务(elasticsearch_svc.yaml),定义了两个接口,一个是对外的,一个是elasticsearch集群内部通信的。
[root@master 31efk]# cat elasticsearch_svc.yaml
kind: Service
apiVersion: v1
metadata:name: elasticsearch31namespace: kube-logging31labels:app: elasticsearch
spec:selector:app: elasticsearchclusterIP: Noneports:- port: 9200name: rest- port: 9300name: inter-node
现在创建elasticsearch的具体pod。
这里的集群创建方式为statefulset,因为elasticsearch需要稳定的pod管理和持久化的存储。
-
有状态服务:Elasticsearch节点存储数据,因此需要持久化存储(即磁盘卷),并且需要保证每个节点能够持有自己特定的数据,即使在Pod重启或迁移时。
-
稳定的网络标识:StatefulSet为每个Pod分配一个稳定且唯一的网络标识(DNS名),这对于Elasticsearch这样的分布式系统至关重要,因为节点之间需要通过固定的名称相互通信。
-
顺序部署和终止:StatefulSet保证Pod按照顺序创建和删除,这有助于Elasticsearch集群的节点顺利加入和退出,确保集群的健康状态。
elasticsearch的yaml文件
第一部分
第一部分,可以看到部署在kube-logging31命名空间,匹配了elasticsearch31的service。容器内部也开放对应的端口。
对于statefulset来讲,需要持久化存储,这里定义了PVC模板,用来从storageClass进行请求PV。(当 PVC 指定了某个 StorageClass 时,Kubernetes 会使用该 StorageClass 动态创建(或供应)一个 PV,并将其绑定到 PVC 上。)这里的PVC的name是data,这里容器绑定的存储名称也是data,路径为/usr/share/elasticsearch/data。
apiVersion: apps/v1
kind: StatefulSet
metadata:name: elastic-cluster31namespace: kube-logging31
spec:serviceName: elasticsearch31replicas: 3selector:matchLabels:app: elasticsearchvolumeClaimTemplates:- metadata:name: datalabels:app: elasticsearchspec:accessModes: [ "ReadWriteOnce" ]storageClassName: do-block-storageresources:requests:storage: 10Gi template:metadata:labels:app: elasticsearchspec:containers:- name: elasticsearchimage: docker.elastic.co/elasticsearch/elasticsearch:7.2.0imagePullPolicy: IfNotPresentresources:limits:cpu: 1000mrequests:cpu: 100mports:- containerPort: 9200name: restprotocol: TCP- containerPort: 9300name: inter-nodeprotocol: TCPvolumeMounts:- name: datamountPath: /usr/share/elasticsearch/data
第二部分
container的环境变量:这里设置的环境变量主要是为了进行一个集群的搭建,这里的集群和statefulset里面的name是不一样的,具体关系如下:
-
selector主要用于 Kubernetes 内部,它负责确定哪些 Pods 属于哪个 StatefulSet,或者哪些 Pods 应该由某个服务来管理。但是,selector并不能直接影响 Elasticsearch 集群的内部逻辑,也不能用来标识 Elasticsearch 中的节点。 -
可以说selector主要方便容器的生命周期管理,不能控制elasticsearch集群内部的逻辑。而elasticsearch需要进行节点选举等更加精确的控制,因此还需要额外的配置。
-
node.name:作用于 Elasticsearch 层,是 Elasticsearch 集群中唯一标识每个节点的配置。每个 Elasticsearch 节点必须有一个唯一的node.name,以便 Elasticsearch 能够正确地管理和协同多节点的操作,如主节点选举、数据分片分配等。
所以下面的container的环境变量就是规定了elasticsearch的集群名称,以及node.name。
由于在statefulset中,创建的pod的名字是固定的,名称格式是<statefulset-name>-<ordinal> 。由于statefulset的名称是es-cluster,所以pod的名称就是es-cluster31-0,es-cluster31-1,es-cluster31-2。而这里的discovery.seed_hosts是每一个pod的DNS地址,每一个pod的DNS地址格式为:
<pod-name>.<service-name>.<namespace>.svc.cluster.local
所以看到 discovery.seed_hosts:"es-cluster31-0.elasticsearch31.kube-logging31.svc.cluster.local,es-cluster31-1.elasticsearch31.kube-logging31.svc.cluster.local,es-cluster31-2.elasticsearch31.kube-logging31.svc.cluster.local"
env:- name: cluster.namevalue: k8s-logs- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name- name: discovery.seed_hostsvalue: "elastic-cluster31-0.elasticsearch31.kube-logging31.svc.cluster.local,elastic-cluster31-1.elasticsearch31.kube-logging31.svc.cluster.local,elastic-cluster31-2.elasticsearch31.kube-logging31.svc.cluster.local"- name: cluster.initial_master_nodesvalue: "elastic-cluster31-0,elastic-cluster31-1,elastic-cluster31-2"- name: ES_JAVA_OPTSvalue: "-Xms512m -Xmx512m"
第三部分
这里的三个初始化容器是为了更好的准备elasticsearch的容器环境,确保在elasticsearch启动之前,所有的权限都已经配置正确。
fix-permission
第一个fix-permission是为了修复数据目录的权限。这里需要介绍pod的创建顺序。initcontainers 和主容器都是 Pod 的一部分。当 Kubernetes 创建 Pod 时,会按照以下顺序执行操作:
- 创建 Pod:Kubernetes 会首先创建整个 Pod 实体,包括其描述的所有容器(
initContainers和主容器)。 - 挂载卷(PVC):当 Pod 被创建时,Kubernetes 会根据 Pod 的定义(包括
volumeMounts和PersistentVolumeClaim)将所需的持久卷挂载到 Pod 中的指定路径。这一步是 在所有容器启动之前 完成的。 - 启动
initContainers:卷挂载完成后,Kubernetes 会启动initContainers,这些容器可以访问 Pod 中已经挂载的卷。 - 启动主容器:当 所有
initContainers成功运行完成 后,Kubernetes 才会启动主容器(即 Elasticsearch 容器)。
所以可以看到,在initContainer启动之前,持久卷的挂载已经到了pod的指定路径。但是Kubernetes 动态分配的存储卷(通过 PVC 申请的持久卷)可能默认具有不适合 Elasticsearch 的文件权限。
Elasticsearch 容器通常以特定用户身份(如 UID 1000)运行,而持久卷可能以 root 用户(UID 0)创建。为了让 Elasticsearch 拥有正确的访问权限,initContainer 需要修改挂载卷的数据目录权限。因此第一个initContainer:fix-permissions 容器的运行确保数据目录的权限是正确的(chown -R 1000:1000),这样 Elasticsearch 主容器启动时能够正常访问和写入数据。
initContainers:- name: fix-permissionsimage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]securityContext:privileged: truevolumeMounts:- name: 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: true
increase-vm-max-map
容器本质上是一个轻量级的隔离环境,在容器中运行的应用程序实际上是一个linux进程。一般来讲,linux会限制每一个进程的内存映射数量,从而限制这个进程对资源的消耗。
Luence是elasticsearch的核心技术,是一个全文检索技术。Luence通过使用操作系统的 内存映射(memory-mapped I/O) 技术来高效访问索引文件,尤其是在处理大规模的索引时。内存映射允许 Lucene 将磁盘上的索引文件映射为进程的虚拟内存空间,因此可以像访问普通内存一样访问这些文件。
但是对于elasticsearch这种日志收集的容器,linux给的 65530个内存映射区域是不够的,当 Elasticsearch/Lucene 达到系统允许的最大内存映射区域数量时,操作系统会拒绝为新的索引文件或数据文件创建内存映射。这会导致 Lucene 无法加载新的索引文件,从而影响搜索和查询的执行。
所以这个increase-vm-max-map的容器,把vm-max-count的数量增加到了262144。
increase-fd-ulimit
这个容器用来提升进程可以打开的最大文件描述符的限制。
elasticsearch部署
随后进行elasticsearch的部署,发现三个容器正常启动:
[root@master 31efk]# kubectl get pods -n kube-logging31 -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
elastic-cluster31-0 1/1 Running 0 114s 10.244.104.62 node2 <none> <none>
elastic-cluster31-1 1/1 Running 0 110s 10.244.166.184 node1 <none> <none>
elastic-cluster31-2 1/1 Running 0 103s 10.244.104.63 node2 <none> <none>
由于elasticsearch没有对外暴露端口,可以进行端口映射,然后在集群外面访问
kubectl port-forward elastic-cluster31-0 9200:9200 -n kube-logging31
然后打开另一个端口,进行访问,可以看到很多内容。
[root@master 31efk]# curl http://localhost:9200/_cluster/state?pretty
{"cluster_name" : "k8s-logs","cluster_uuid" : "4fuxJ67HSxSBsVDfKIA8Qg","version" : 17,"state_uuid" : "PpwhJDXlQvarKzCMhUy2Og","master_node" : "UWRrJRlCQ-uDcqZ3M6Y4YQ","blocks" : { },"nodes" : {"UWRrJRlCQ-uDcqZ3M6Y4YQ" : {"name" : "elastic-cluster31-1","ephemeral_id" : "S3NLgNGrRBOjWuoNC1CcHw","transport_address" : "10.244.166.185:9300","attributes" : {"ml.machine_memory" : "3953741824","ml.max_open_jobs" : "20","xpack.installed" : "true"}},"PlT4KVDFSI2qztJqF99eYw" : {"name" : "elastic-cluster31-2","ephemeral_id" : "z1akgw8xTjurYdq1_DZ7-Q","transport_address" : "10.244.104.1:9300","attributes" : {"ml.machine_memory" : "3953741824","ml.max_open_jobs" : "20","xpack.installed" : "true"}},"XXd95XfcRgW69C1ls0ZFTw" : {"name" : "elastic-cluster31-0","ephemeral_id" : "aKjaY6m0TbCTnynDPdD7JA","transport_address" : "10.244.104.2:9300","attributes" : {"ml.machine_memory" : "3953741824","ml.max_open_jobs" : "20","xpack.installed" : "true"}}},"metadata" : {"cluster_uuid" : "4fuxJ67HSxSBsVDfKIA8Qg","cluster_coordination" : {"term" : 1,"last_committed_config" : ["UWRrJRlCQ-uDcqZ3M6Y4YQ","PlT4KVDFSI2qztJqF99eYw","XXd95XfcRgW69C1ls0ZFTw"],"last_accepted_config" : ["UWRrJRlCQ-uDcqZ3M6Y4YQ","PlT4KVDFSI2qztJqF99eYw","XXd95XfcRgW69C1ls0ZFTw"],
...
其实如果不进行端口映射,在elasticsearch的内部也可以进行访问。可以看到elasticsearch的三个pod,他们之间可以互相发现。
[root@master 31efk]# kubectl exec -it elastic-cluster31-0 -n kube-logging31 -- /bin/bash
Defaulted container "elasticsearch" out of: elasticsearch, fix-permissions (init), increase-vm-max-map (init), increase-fd-ulimit (init)
[root@elastic-cluster31-0 elasticsearch]# curl http://localhost:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.244.166.185 18 95 1 0.13 0.20 0.18 mdi * elastic-cluster31-1
10.244.104.1 17 88 0 0.02 0.05 0.08 mdi - elastic-cluster31-2
10.244.104.2 23 88 0 0.02 0.05 0.08 mdi - elastic-cluster31-0
pv和pvc
[root@master 31efk]# kubectl get pv --all-namespaces -owide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pvc-124274e8-1977-4e46-895d-d6b9449682f7 10Gi RWO Delete Bound kube-logging31/data-elastic-cluster31-1 do-block-storage 145m Filesystem
pvc-677221e5-ed6a-417b-ac69-6b90304afa4e 10Gi RWO Delete Bound kube-logging31/data-elastic-cluster31-0 do-block-storage 148m Filesystem
pvc-944a372c-1c0d-442d-998a-b62c5be7ca21 10Gi RWO Delete Bound kube-logging31/data-elastic-cluster31-2 do-block-storage 144m Filesystem
[root@master 31efk]# kubectl get pvc --all-namespaces -owide
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE
kube-logging31 data-elastic-cluster31-0 Bound pvc-677221e5-ed6a-417b-ac69-6b90304afa4e 10Gi RWO do-block-storage 149m Filesystem
kube-logging31 data-elastic-cluster31-1 Bound pvc-124274e8-1977-4e46-895d-d6b9449682f7 10Gi RWO do-block-storage 145m Filesystem
kube-logging31 data-elastic-cluster31-2 Bound pvc-944a372c-1c0d-442d-998a-b62c5be7ca21 10Gi RWO do-block-storage 145m Filesystem
相关文章:
[单master节点k8s部署]23.构建EFK日志收集平台(二)
部署elasticsearch集群 已经完成的工作:创建存储。首先配置了nfs存储提供商(nfs-deployment.yaml),然后通过创建存储类(storageclass.yaml)来将nfs服务器与存储类绑定: [rootmaster 31efk]# c…...
C#的属性(Property)应用说明(二)
Property的应用说明补充: 一.自定义逻辑: 可以在 get 和 set 访问器中包含自定义的逻辑。 public class Person {private string name;public string Name{get { return name; }set{if (string.IsNullOrWhiteSpace(value))throw new ArgumentException…...
VUE.js笔记
1.介绍vue Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 Vue 应用程序的基本…...
SpringBoot--yml配置文件的时间/大小的单位转换
原文网址:SpringBoot--yml配置文件的时间/大小的单位转换_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍SpringBoot的yml(properties)配置文件的时间/大小的单位转换。 概述 SpringBoot可以将yml中的配置绑定到一个Java类的字段&#x…...
【算法业务】互联网风控业务中的拒绝推断场景算法应用分享(涉及半监督算法、异常检测、变分自编码、样本权重自适应调整、迁移学习等)
1. 业务目标和任务描述 该项目是很早期的一个工作,属于互联网信贷风控场景,研究并应用信贷中的拒绝推断任务,处理方式也许对于目前的一些业务还有参考意义,因此这里做下分享。拒绝推断是指在信贷业务中,利用已知的接受…...
Windows PowerShell相关笔记
之前我写的一篇,把我的PS(power shell)该了配置文件 pyqt5vscode 配置坑笔记_vscode使用pyqt command failed-CSDN博客 文件里写的自动加载conda #region conda initialize # !! Contents within this block are managed by conda init !!…...
力扣9.24
2207. 字符串中最多数目的子序列 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。 你可以在 text 中任意位置插入 一个 字符,这个插入的字符必须是 pattern[0] 或者 pattern[1] 。…...
NRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块
nRF21540是一款射频前端模块(FEM),可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备,nRF21540是一种“即插即用型”的无线传输范围扩展器,可与nRF52和nRF53系列的高级多协议无线SoC搭配使用,所需的外部器件数…...
2024最新Linux Socket编程
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket&am…...
Linux下的驱动开发二
一、IO模型 I/O 模型在操作系统中用于处理应用程序与设备驱动之间的数据传输。I/O 通信模型的核心是解决程序与设备之间如何高效、合理地进行数据通信。不同的模型通过阻塞、非阻塞、同步、异步的方式来控制数据流和处理 I/O 请求。 注:在驱动开发中可以定义一个全…...
【JAVA报错已解决】 Java.lang.ArrayIndexOutOfBoundsException
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...
2024 CSP 游记
J 组 初赛 早上也是五点钟就起来 打游戏 了。 考点在八达小学,除了感觉小、破、旧就没有其他感觉( 我妈也是成功的给我提前一小时到达考场。 拿到试卷后,瞄一眼,咋这么简单,和一本通的模拟卷难度一样?…...
双十一有什么推荐好物?,这些你不能错过的宝藏好物推荐
随着双十一的临近,这场盛大的购物狂欢蓄势待发!为了让大家不在琳琅满目的商品中徘徊,琪琪用心归纳了一份购物清单,分享那些我亲自使用过,觉得必须拥有的商品。 这些商品不仅价格公道,而且质量上乘…...
NSSCTF [HUBUCTF 2022 新生赛]simple_RE(变种base64编码)
文件无壳 拖入IDA中 shiftF12查看可疑字符串 发现两串字符串 一看这两个等于号就猜测是base64编码 进入主函数看看 这段代码是一个简单的 C 语言程序,主要功能是接受用户输入的字符串作为“flag”,然后通过对输入的字符串进行一些处理和比较来验证是否输…...
clickhouse使用extract提取分号之前,之后,中间的内容
Area:‘安徽;宣城;宣州’,要提取分号之前,两个分号之前,最后一个分号之后的内容作为省市区 这是最后得到的正确的结果,感谢chatgpt 刚开始本来想使用splitByString -- 宣城 select splitByString(;,安徽;宣城;宣州)[2…...
Unity3D Compute Shader同步详解
前言 在Unity3D中,Compute Shader是一种强大的工具,它利用GPU的并行处理能力来执行复杂的计算任务,从而减轻CPU的负担,提高游戏的性能和效率。然而,由于GPU的工作方式,对共享资源的访问需要特别注意同步问…...
3D模型在UI设计中应用越来越多,给UI带来了什么?
当前3D模型在UI设计中应用很多,极大地拓展了UI设计的发挥空间,也拓宽了UI的应用领域,本文分享下UI中引入3D模型到底能带来什么价值. 3D模型在UI设计中的应用可以给用户界面带来以下几个方面的好处: 更真实的视觉体验:…...
前端框架的选择与考量:一场技术的盛宴
在当今快速迭代的Web开发领域,前端框架的选择成为了项目启动初期不可忽视的重要环节。随着React、Vue、Angular等主流框架的崛起,以及Svelte、Quasar等新兴力量的加入,开发者们面临着前所未有的选择难题。本文旨在探讨前端框架的选择依据、主…...
第五部分:7---信号的捕捉
目录 信号递达期间,该信号会被屏蔽直到递达完成。 sigaction实现信号的捕捉: 案例:在处理2号信号时屏蔽3号信号。 子进程退出向父进程发送SIGCHLD信号: 信号递达期间,该信号会被屏蔽直到递达完成。 当某个信号的处…...
HarmonyOS鸿蒙开发实战( Beta5.0)页面加载效果实现详解实践案例
鸿蒙HarmonyOS开发实战往期必看文章:(持续更新......) HarmonyOS NEXT应用开发性能实践总结(持续更新......) HarmonyOS NEXT应用开发案例实践总结合集(持续更新......) 一分钟了解”纯血版&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
