- 博客(147)
- 资源 (1)
- 收藏
- 关注

原创 【kubernetes】k8s中的选主机制
如果有人认为,传统应用需要部署多个通常是为了容灾,而在k8s上运行的Pod受控制器管理,如果Pod异常或者Pod所在宿主机宕机,Pod是可以漂移到其他节点的,所以,不需要部署多个Pod,只需要部署一个Pod就行。leader-election的具体工作方式是:各候选者将自身的信息写入某一个资源,如果写成功,某个后选择就称为了主,其他就是备,同时,在之后主会定期更新资源的时间,如果超过一段时间未更新时间,其他候选者发现资源的最后更新时间超过一定值,就会认为主挂掉,然后会向资源写入自身信息,从而成为新的主。
2023-09-25 23:43:19
8855
1

原创 基于Flink的实时告警实现(3):时间窗口
本专题将会从0到1实现告警处理流程,并会讲解实现过程中使用到的Flink中的技术。1 告警需求前面的(1)和(2)简单的介绍了flink、开发环境的搭建以及读取kafka的数据并对数据进行转换以便后续处理,现在就可以开始真正的实现告警了。先简单说下需求:该需求的主要目的是对网络交换机进行监控,快速发现网络的问题。采集器接收到网络交换机的指标数据,例如错包等,将这些指标存入到kafka中,然后再从kafka中读取数据并写入到后端的持久化存储。这里需要添加告警功能,常规的方法可能是另外写一个程序,通过.
2021-05-06 19:53:28
2516

原创 基于prometheus的网络指标监控
1 网络指标监控 网络设备(交换机、路由器、防火墙)本身并没有太多的监控方式,常规的是使用snmp,通过oid去采集网络设备的指标,例如,流量或者错包,不过近年来也出现了新的采集方式,例如,telemetry或者gnmi,不过这种方式通常都需要对接接口,并且较新的设备才支持。 prometheus本身提供snmp的exporter,在项目初期人力不足的情况下,可以直接部署prometheus,只要将要采集的设备列表放到配置文件,然后配置好告警规则就可以完成初步的网络指标监控。2 pr...
2021-03-09 23:16:33
5917

原创 那些年我们一起追寻过的考研(华科计算机)
——痛并快乐着我的基本情况: 我是武汉市的一名应届本科生,参加了2012年的考研,报考华中科技大学计算机学院。 初试成绩:政治:61分 英语:63分 数学:138分 专业课:124分 总分:386分我的考研经历: 高考失利,让我只能在一所非211的高校就读,很早就下定决心要考研了。我是大三下学期开始准备的,大三寒假一来,早上记记单词,平时有时间的话看看高数的教
2012-04-26 10:22:52
7417
2
原创 【Kubernetes】对资源进行PATCH
中看到某个字段的策略:patch strategy和patch merge key,会发现,只有数组才会配置,这是因为,当使用上面的Merge Patch时,是直接采用替换的方式,但是有时候,我们又不希望增加,而是只修改其中的某个字段,或者给数组增加一个元素,此时Merge Patch就做不到了。而PATCH的部分更新可以直接修改某个字段值,例如,升级时只需要修改资源的镜像,就可以调用PATCH更新镜像,而不需要先GET再PUT。更新资源则有两种方式:PUT和PATCH,分别是资源的整体更新和部分更新。
2025-02-27 17:21:14
1105
原创 【kubernetes】K8S节点状态的维护
kubelet会每隔一段时间(kubelet的–node-status-update-frequency参数,默认为10秒)更新节点状态到apiserverNodeController每隔一段时间(kube-controller-manager的–node-monitor-period参数,默认为5秒)检查一次节点状态。
2025-01-14 16:23:56
672
原创 【Linux】Linux中用户信息相关的配置文件:/etc/passwd、/etc/group、/etc/shadow、/etc/sudoers
作为管理的角度来说,通常建议直接是在/etc/sudoers.d/目录下新增配置文件,然后开启/etc/sudoers配置文件中的加载/etc/sudoers.d的配置。从权限的角度来说,确实是这样,但是,由于root用户是超级用户,拥有对所有文件的完全访问权限,换句话说,即便文件权限是000,root用户依然可以查看和修改。为了安全,/etc/sudoers配置文件的权限是440,也就是说,只允许root用户和root用户组的用户查看,难道说,该文件不允许修改?命令修改/etc/sudoers文件。
2024-12-26 18:53:25
810
原创 记一次域名解析的问题定位
发现,域名查询时会尝试search中的多个域名,但是都失败了,最后会尝试不带域名的形式,从而找到正确的IP地址,而对我们的程序执行strace时,发现在尝试search中的最后一个域名时成功了,返回了OpenShift集群的引导节点的IP。如果要访问的域名不以点号结尾,且点号的个数小于ndots,则将要访问的域名依次跟search中的主域名拼接,然后再向nameserver配置的域名服务器查询,否则,直接向nameserver发起域名查询请求。
2024-09-23 18:04:11
792
原创 eBPF编程指南(二):CO-RE
生成精简的BTF文件,内核有很多数据结构和函数,但是我们的BPF程序通常只使用很少一部分,因此,可以通过BPF的内核态程序结合BTF文件生成精简的必须的BTF文件,文件大小相隔1万倍,同时,虽然内核在变化,但是可能我们的BPF程序使用的这部分很少变化,所以,可能某个发型版本的大版本生成的精简的BTF文件是一模一样的,这无形中也减少了BTF文件的个数,通过这两种方式,整个BTFHub仓库的BTF文件大小可以降到几MB,完全可以打包在客户端程序中进行分发。
2024-09-05 15:38:35
1547
1
原创 kubernetes排障:kubelet cgroup driver: “systemd“ is different from docker cgroup driver: “cgroupfs“
在容器环境下,有两种使用cgroup的方式:一种是直接操作cgroup在操作系统上的文件,另一种是通过一层代理的方式间接使用cgroup,这两种方式就分别对应了cgroup driver中的cgroupfs和systemd。在k8s的组件中,kubelet负责与容器运行时交互,因此,cgroup driver的配置就在kubelet的配置yaml中。容器运行时和k8s都可以设置cgroup driver,并且两者的配置必须一致,否则就会报上述的错误信息。目录中指定这一组进程的pid以及资源的使用上限。
2024-08-27 11:15:11
732
原创 systemd-journald日志服务:systemd-journald-audit.socket
systemd-journald的作用是收集系统启动阶段的日志以及服务在启动和运行中的日志,因此,如果服务是用systemd管理的,打印到标准输出的信息就会作为日志被systemd-journal获取到。前面systemd-journald的配置可以看出,日志在保存时可以保存在内存,也可以保存在磁盘,保存在内存中的日志,当机器重启就没了,但是性能会比较好,保存在磁盘中的日志,重启还在,但是性能会差一些。为了提高日志存储的效率,日志保存的格式肯定会采用二进制的方式,因此,无法直接打开日志文件查看,需要使用。
2024-08-26 18:31:19
1849
原创 eBPF编程指南(一):eBPF初体验
EBPF是一种可以让程序员在内核态执行自己的程序的机制,但是,为了安全起见,无法像内核模块一样随意调用内核的函数,只能调用一些bpf提前定义好的函数。为了让内核执行程序员自己的代码,需要指定HOOK点,相当于当内核执行到某个地方时就会执行程序员的代码,这有点类似于ftrace。内核态代码:编译为.o文件,在内核态执行,将数据发送到队列用户态代码:将内核态代码的.o文件加载到内核,接收队列中的数据并分析。
2024-08-09 17:38:02
2473
2
原创 【容器】【Linux】CentOS 9使用Docker镜像实现交叉编译
之后就可以拉取镜像了,由于一些原因,无法从DockerHub拉取镜像,此时通常有两种办法,一种是找国内对应的镜像仓库,另一种方式是找代理。,之后就可以基于上述镜像去编译自己的程序。与x86的主要区别是基础镜像要用。
2024-07-18 11:56:40
713
1
原创 【Linux】Linux中DNS配置文件/etc/resolv.conf详解
当然也跟服务的FQDN格式有关,可以看到如果用全的FQDN格式,其中就有4个点号,而且,根据服务名的规范,服务名中是不能包含点号的,因此,服务的FQDN中只有4个点号。这里提到一个重要的配置项:ndots,该配置项会作为是否需要优先与search配置的域名后缀拼接还是直接查询域名的判断依据,也就是说,如果域名中的点号超过ndots,说明域名足够长,大概率是全域名,直接查询该域名,如果域名中的点号小于ndots,说明该域名比较短,大概率需要与域名后缀拼接。,会直接报错查询不到;
2024-06-26 12:08:22
14433
1
原创 【安全】使用Fanotify拦截文件操作
前文已经说过,Fanotify相比Inotify,比较大的优势是获取的数据多以及Fanotify的阻断能力。阻断能力,顾名思义,就是在用户操作文件时,如果判断出文件是有问题的,可以不让用户操作。
2024-06-21 16:36:38
882
原创 【安全】Linux Fanotify使用入门
fanotify是另一种文件监控机制,在使用上两者类似,都是先调用init函数初始化句柄,然后调用类似watch的函数添加监控路径,再使用select+read的方式读取出变化的事件,根据事件中给出的参数获取文件的路径、事件类型以及其他需要的数据。如果是监控主机上的路径,directed结合FAN_EVENT_ON_CHILD标志就只能监控目录以及目录下的文件,per-mount可以监控pathname所在的挂载点中所有文件或者目录的变化,而global模式可以监控整个文件系统。
2024-06-19 18:06:31
2709
原创 【kubernetes】集群中的DNS配置以及问题定位
CoreDNS查询本地的数据,如果查询到对应的域名则返回,如果查询不到,则查询宿主机的/etc/resolv.conf。当程序需要解析域名时,会通过两个文件进行解析:/etc/hosts和/etc/resolv.conf,其中,/etc/hosts记录的是域名和IP的直接映射关系,/etc/resolv.conf记录的是域名服务器和根域名,会先尝试使用/etc/hosts文件进行解析,解释失败再使用/etc/resolv.conf中的域名服务器查询。首先,在dnsutils的Pod中执行。
2024-06-14 17:10:17
1829
原创 【Linux】使用AddressSanitizer分析内存非法使用问题
AddressSanitizer是进行内存异常使用分析的工具,该工具已经集成到编译器中,因此,只能用于分析C/C++语言的内存问题分析。与Valgrind相比,运行速度更快,但是,从场景来说,AddressSanitizer主要用于检测内存的非法使用,当然也包括内存未正确释放的问题,而Valgrind则可以分析出导致内存增长的调用栈。如果出现内存偏高的问题,可以使用Valgrind工具分析如果出现内存导致的core问题,可以使用gdb的watchpoint或者AddressSanitizer分析。
2024-05-23 17:48:37
2093
原创 【Linux】使用Valgrind定位内存增长问题
Valgrind是Linux上的一套开源的动态分析工具集,通常用来检测和分析程序中的错误,提高程序的稳定性和性能。Valgrind整体架构上包含内核和周边工具集,将程序放到内核模拟的仿真环境中运行,并提供一些能力接口,然后基于这些接口实现周边工具。当程序运行过程中,内存持续增长,一段时间后就可能造成OOM,此时可以使用Valgrind的Massif工具分析程序执行过程中的堆分配内存量。
2024-05-11 16:01:07
1764
原创 【Linux】如何定位客户端程序的问题
不管什么语言开发的程序,都会遇到两类比较棘手的问题:崩溃和性能问题,其中性能问题又可以分为CPU占用高和内存占用高。C/C++需要获取core文件,根据堆栈分析出现问题的代码行,开发环境可以配置core路径,正式环境可以使用Breadpadgolang中可以将GOTRACEBACK设置为crash让程序崩溃时生成core文件(但是,发现用gdb打开时没有程序的符号名,并且core文件很大),也可以在程序退出时利用中的Stack()获取堆栈。
2024-05-09 15:08:31
737
原创 【监控】使用process-exporter监控进程
exporter在基于prometheus的监控系统中属于数据采集模块,每个exporter采集某类数据,由prometheus定时调用exporter接口拉取,因此,如果需要通过prometheus监控某个指标,就需要找到实现这个指标的exporter,或者自己实现exporter。exporter能够采集哪些指标(是否能够采集所需的指标数据)exporter的配置exporter提供的指标可能需要经过计算才能得到所需的指标在实际监控进程时,主要使用的指标就是cpu和内存。
2024-04-09 17:24:32
5935
原创 IDA查看std::string的各种操作
相对C语言来说,C++中增加了很多特性,例如,构造函数、析构函数、异常处理等,因此,从汇编级别的语言看,C++就复杂很多。下面使用IDA工具查看std::string的一些操作背后的实现。以下程序在编译,g++版本为。std::string提供了更高层次的字符串操作,并且提供了很多的方法,与C风格字符串相比,使用起来更加方便,但是,在这些方法的底层,编译器默默做了很多事情。
2024-03-29 11:19:21
1678
原创 使用IDA查看二进制
IDA是一款可以查看二进制的汇编级别代码的工具,并且提供了图形的方式展示程序的执行流程,有时候可以用来定位汇编级别的代码崩溃问题。
2024-03-25 18:05:05
1629
原创 stm32之GPIO寄存器
外部引脚以16位为一组,内部的数据寄存器都是32位,为了对端口进行配置并方便的进行数据的输入输出,在提供基本的输入输出寄存器的同时,还提供了端口配置寄存器和设置/清除寄存器,能够配置寄存器的模式,并且能够方便的操作单个位。从开发编程的角度上看,数据寄存器都是只能整体操作,而不能单个位操作,因此,如果是直接操作数据寄存器的话,就需要先读取再设置,操作起来比较麻烦,有了设置/清除寄存器,可以方便的操作单个位,而不影响其他位。而在C51单片机中,数据寄存器是可以位寻址的,可以直接对某一位进行与或的操作。
2024-03-24 23:34:53
1733
原创 stm32之使用串口下载程序
当从网上购买stm32开发板基础套件时,可能只有USB TO TTL,因此只能使用串口下载方式。使用串口下载方式需要了解stm32的启动配置,也就是BOOT0和BOOT1对应的含义。下载程序之前需要先将CH340的引脚接好,然后在点击复位时,将程序下载到stm32中。
2024-03-21 23:14:25
9250
原创 stm32之GPIO电路介绍
保护二极管:保护引脚,让引脚的电压位于正常的范围施密特触发器:将外部的模拟信号转换为数字信号上/下拉电阻:通过控制开关,可以设置输入引脚的默认电平状态输入数据寄存器:外部引脚电平转换为数字信号后保存到输入数据寄存器,然后由内部处理器读取输出数据寄存器:内部处理器将数据写入输出数据寄存器,然后通过输出控制电路输出到外部引脚位设置/清除寄存器:该寄存器用于修改输出数据寄存器中的某一位的值。
2024-03-19 23:47:02
1739
原创 ANTLR4规则解析生成器(五):错误处理
antlr4在进行语法分析时,如果发现有不符合语法规则的语句时,默认情况下是会打印一行错误信息,通过创建基于的类,可以对错误信息自定义,使得错误信息的可读性更好。
2024-03-11 15:18:04
1824
原创 ANTLR4规则解析生成器(四):优化计算器程序
antlr4默认只会为一条规则生成一个节点处理函数,如果规则的备选分支比较多,在处理该节点时就需要在里面写很多的分支语句,通过为每个备选分支设置标签,可以为每个备选分支生成一个处理函数,在单个处理函数中就可以直接处理Listener适合只需要遍历语法分析树,不需要进行数据交互的场景,例如,语法检查,但是也可以通过创建一个全局的数据结构保存中间结果;Visitor适合可以自定义节点访问的场景,在访问节点时可以返回数据,例如,计算器程序。
2024-03-06 15:49:58
652
原创 python环境搭建(Python 3.11.8)
当开发完成后,需要将我们的程序分发,一种方式是直接给python脚本,这种方式其他人就可以看到你的逻辑,但是对于不想知道你的逻辑,只是想调用的话,就需要安装python的环境,但是大家知道,python的环境跟python的版本和包的版本相关,有时候还比较麻烦,另一种方式是将程序编译为二进制,其他人不关心你的实现逻辑,只想调用的话,这种方式是比较好的。会发现只有默认的pip和setuptools,然后我们就可以自由的在里面进行开发了,也可以使用。的包,在比较新的版本中是可以直接使用内部的模块安装的。
2024-03-01 11:48:31
1705
原创 ANTLR4规则解析生成器(三):遍历语法分析树
定义好词法和语法规则,就可以对提供的输入串进行词法分析和语法分析,得到语法分析树,antlr4提供了Listener和Visitor两种机制遍历语法分析树
2024-02-29 21:06:59
2250
原创 ANTLR4规则解析生成器(二):编写规则文件
本文简单回顾了编译原理中的一些名词解释,然后对sqlite中的sql的g4文件的部分内容进行了解析,大概可以了解到g4文件的编写方式,其实就是用正则表达式描述所有支持的文本结构。
2024-02-20 18:44:37
1509
原创 ANTLR4规则解析生成器(一):入门
ANTLR是ANother Tool for Language Recognition的缩写,它是一个强大的用于读取、处理、执行和翻译结构化文本或二进制文件的语法分析器生成器,广泛用于构建语言、工具和框架,通过语法描述规则,它能够生成一个可以遍历解析树的解析器。ANTLR4是ANTLR的第4个版本。
2024-02-05 19:04:00
4681
4
原创 【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式
Flannel作为k8s中广泛使用的网络插件,它的实现相对容易理解,它还提供了不同的模式,常用的是VxLan和Host-GW,由于Host-GW要求宿主机在同一个网段,使用受限,因此,最常用的还是VxLan。
2024-02-01 21:40:40
1625
原创 C++多线程编程(四): atomic原子操作
原子操作的意思是该操作执行过程中不能被中断,该操作要么不执行,要么全部执行,不存在执行一部分的情况。在编程语言中,有些操作虽然看起来只有一行,但是变成机器语言后就是多个操作步骤,其中的每个操作步骤都是一个原子操作,但是这些操作合起来却不是原子操作,这样的代码在并发执行时可能会调度到其他线程,从而出现中断的情况,造成数据不一致。原子操作是不能被分割和中断的操作,在多线程并发环境中修改共享数据时,由于数据更新操作不是原子的,会造成数据不一致。
2024-01-21 20:28:05
3346
1
原创 C++多线程编程(三): std::thread线程类
在C++11以前,如果要使用多线程,就需要使用各平台的多线程库,例如,Linux上可以使用pthread,windows上可以使用win32或者MFC提供的多线程API,也就是说,如果要使用多线程,就必须与平台绑定,那么程序就不具备跨平台的能力,为了让程序更好的运行在各平台而不需要用大量的宏来控制编译选项,C++11提供了对多线程的支持,提供了std::thread类。
2024-01-19 18:46:55
759
原创 C++多线程编程(二):条件变量
互斥锁是为了保证多个线程在访问共享资源时不会出现不可预期的结果,能够让多个线程不会同时执行lock和unlock之间的代码,也就是说,互斥锁只是保证在访问共享资源时不会出现问题,但是,有一种场景是需要线程之间进行协作,典型的是生产者-消费者模型:生成者生成数据,放到队列后,通知消费者,消费者接收到信号后,从队列中取出数据进行处理。互斥量是用于解决多个线程同时访问某个资源的并发问题,条件变量是解决多个线程之间进行同步的问题。
2024-01-17 18:58:12
1100
Elastic FileBeat 8.0.0支持http output
2023-10-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人