自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Crazy博客

记录技术的每一刻

  • 博客(96)
  • 问答 (1)
  • 收藏
  • 关注

原创 kube-proxy源码分析

本文主要是对kube-proxy的源码分析,了解其代码结构和实现原理。这里是根据版本来进行分析的。在下面贴上的代码会一定裁剪,主要用于理解主流程。首先是各种对象套娃式的初始化,Options->ProxyServier->proxier->syncRunner然后是向informer中注册service和endpoint事件,当发生改动时,会给bfr.run发送信号syncRunner收到信号会去执行proxier.syncProxyRules()方法,刷新主机的iptables规则。

2024-01-22 08:00:00 849

原创 kubernetes service如何通过iptables转发

本文主要是介绍kubernetes的service是如何利用iptables来进行流量的转发达到流量的负载均衡的,并会通过实践操作来更好的理解与验证其原理。

2024-01-19 08:00:00 854

原创 tcp缓存引起的日志丢失

logstash从数据源拉取日志,然后通过tcp插件发送到proxy进程中。在业务侧发现日志量明显少了,所以有了这一次的问题排查。

2023-12-26 18:30:31 959

原创 django-apschedule定时任务异常停止

在django项目中使用`django-apschedule`来实现定时任务,使用的是`BackgroundScheduler`调度类,该调度的实现是通过后台线程的方式执行定时任务。其中任务都是持久化到数据库中的。在项目的运行过程中,因为数据库的异常,导致定时任务线程异常终止,即使数据库后续恢复正常,但也不再继续执行。我多次尝试复现未果,在开启定时任务期间,手动将数据库连接断开,定时任务执行失败,然后再将数据库建立连接,定时任务竟然重新恢复了,这让我一时摸不着头脑。

2023-11-01 12:24:45 587

原创 理解flannel的三种容器网络方案原理

本文主要介绍flannel在k8s网络中作为网络插件通过UDP、VXLAN、HOST-GATEWAY三种模式来解决容器跨主机网络通信的,并通过手动实现这三种模式深入理解其原理。在Flannel的UDP模式中,每个节点都会启动一个UDP服务器,用于监听来自其他节点的数据包。当一个容器向另一个容器发送数据包时,它会将数据包发送到目标容器的IP地址和端口号。Flannel会将该数据包封装在一个UDP数据包中,并将其发送到目标节点的UDP服务器。目标节点的UDP服务器会解析该数据包,并将其传递给目标容器。

2023-06-05 08:00:00 1243

原创 理解calico容器网络通信方案原理

Calico是k8s中常用的容器解决方案的插件,本文主要介绍BGP模式和IPIP模式是如何解决的,并详细了解其原理,并通过实验加深理解。Calico是属于纯3层的网络模型,每个容器都通过IP直接通信,中间通过路由转发找到对方。容器所在的节点类似于传统的路由器,提供了路由查找的功能。每个容器所在的主机节点扮演了虚拟路由器 (vRouter)的功能,vRouter必须有某种方法,能够知道整个集群的路由信息。之前提到的FlannelHost Gateway模式。

2023-06-04 17:48:30 643

原创 理解Linux IPIP隧道

IPIP隧道是一种点对点的隧道协议,用于在IPv4网络上传输IPv4或IPv6数据包。IPIP隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包中,新的IP数据包的目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原始IP数据包,并将其传递到目标主机。IPIP隧道可以在不同的网络之间建立连接,例如在IPv4网络和IPv6网络之间建立连接。

2023-05-29 08:00:00 1184

原创 理解VXLAN网络

在三层可达的网络中部署VXLAN,在每个VXLAN网络端点中都有一个VTEP设备,负责将VXLAN协议的数据包进行UDP数据包的封包和解包,可以将其理解为隧道,将VXLAN数据包从逻辑网络转发到物理网络VXLAN使用24位的VXLAN网络标识符(VNI)来标识不同的虚拟网络‍。

2023-05-26 13:09:56 731

原创 理解Linux TunTap设备

通信流程是,在Node1中的NS1进行ping Node2中NS2的veth0网卡的IP,ICMP的IP包会通过veth0到达veth1中,并进入到宿主机的网络协议栈,通过路由配置达到tun设备,这时app服务从tun设备中读取到IP包数据,然后将其封装在UDP包中,并通过eth0网卡发送到Node2的eth0网卡上,通过网络协议栈解包达到app程序中,拿到里面的IP包,将其写入到tun设备中,进入到网络协议栈中,通过路由达到veth1中,然后到达net ns1的veth0网卡。

2023-05-26 11:10:19 1036

原创 快速了解iptables

它包含 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 五个链,分别用于处理进入本机前的数据包、进入本机的数据包、转发的数据包、从本机发出的数据包和本机生成的数据包。iptables的规则就是挂载netfilter钩子上的函数,用来修改数据包的内容或者过滤数据包等操作,iptables的表就是所有规则的5个逻辑集合。不同的表挂不同的链,这是为了分类管理iptables规则(rule)的,系统所有的iptables规则都被划分到不同的表集合中。

2023-05-26 10:11:21 326

原创 kafka中listener和advertised.listeners的作用

但是在集群外部时,kafka客户端进行连接,它是需要有能力访问kafka的每一个broker节点的,所以需要在advertised.listeners中配置公网IP,并存储在zookeeper中,这样kafka客户端就能拿到所有broker节点的公网IP并进行访问。kafka客户端连接kafka broker时,会先获取所有brokers的元数据信息,获取到endpoints的信息,然后再通过其中的endpint进行对broker进行连接操作。​的,也就是只有通过绑定的地址才能够访问到该Broker。

2023-05-01 18:12:53 1408

原创 django rest_framework 分页

本文主要介绍在drf框架中如何对查询的数据进行分页,在drf框架中有提供该基础功能的使用案例和文档,详情参考drf-pagination-官网文档框架本身提供了分类的模块,但在实际工作中并不适用,所以我们可以通过继承的方式对内置的分页模块中的部分属性进行覆盖,以符合自身业务。page_size:请求接口未指明时,默认使用该值来查询数据量max_page_size:这个是限制一页最大能展示的数量。page_size_query_param:前端请求分页数量的字段。

2023-03-28 08:00:00 138

原创 django后端服务、logstash和flink接入VictoriaMetrics指标监控

通过指标监控可以设置对应的告警,快速发现问题,并通过相应的指标定位问题。背景:使用的 VictoriaMetrics(简称 VM) 作为监控的解决方案,需要将 django 服务、logstash 和 flink 引擎接入进来,VM 可以实时的获取它们的指标存储并进行监控告警,以上的服务都是部署在 k8s 中的。

2023-02-27 18:58:30 580

原创 python中import原理

在 python 中引入 Module 是再常见不过了,那么当我们 import 时它做了什么事情呢?它是如何加载 Module 使用的呢?一般,Module 是一个后缀为.py的文件,其 module 名称一般是文件名称去除.py,我们可以通过__name__来查看 module 名称。demo.py 是需要被引入的 module,main.py 是入口程序,它们在同一级目录。demo如果 module 为入口文件,则__name__为__main__,这也是常见的写法由来。__main__包含了。

2023-02-21 11:24:50 515

原创 docker容器单机网络

通过文章容器的本质可知,容器只是一个进程,而容器所能看到的网络栈,是隔离在自己的中。docker 容器单机网络支持四种网络模式,也都是基于 Network Namespace 实现的。本文主要是介绍这四种模式的使用方法及实现原理。

2023-02-20 12:33:05 488

原创 手动实现docker容器bridge网络模型

本文主要是通过使用Network Namespace来模式docker的bridge模式来深入的理解其原理。

2023-02-09 15:56:31 285

原创 mysql之MVCC原理

MVCC 的全称是 Multi-VersionConcurrency Control,也就是多版本并发控制,该机制是只有支持事务的 InnoDB 引擎下才存在的,用来实现提高数据库的并发性能,可以做到:读不加锁,读写不冲突。那么它是如何实现的呢?

2023-01-10 16:52:47 103

原创 mysql之日志

一条数据在更新过程当中,如果中途 mysql crash 了,mysql 是如何保证数据的一致性和持久性的?在这个过程中 mysql 的日志系统起到了至关重要的作用。本文将会介绍 mysql 中的 undo log、redo log 和 bin log 在这其中的作用。

2023-01-09 08:00:00 301

原创 使用python实现单例模式的三种方式

在整个进程中,有且只有一个对象存在,在任何地点使用都是同一个对象,可以解决多线程资源竞争问题,也常用于配置信息。本文主要介绍使用python的三种实现单例模式的方式。

2022-12-22 08:00:00 1670

原创 redis之缓存

reids 是基于内存的数据库,它的特性之一就快,缓存是其最主要的应用场景,本文主要介绍 redis 的缓存特性,以及该如何正确的使用它。

2022-12-21 08:00:00 3087

原创 redis之分片集群

在海量的数据面前,单个 redis 实例的能力是有限的,无可能无限增大的内存,所以必须要构建分片集群,来横向拓展来支持保存更多的数据。

2022-12-20 08:00:00 592

原创 redis之哨兵机制

我们知道,只有主库才能有写操作,而从库只能进行读操作,那么当主库宕机后,如何保证服务的正常进行呢?本文主要介绍的是 Redis 提供的哨兵机制,通过哨兵监控主库的状况,如果发现主库下线,则会从从库中选择一个状态优秀的当做主库,从而保证服务的高可用。

2022-12-15 08:00:00 285

原创 redis之持久化

本文主要是介绍 redis 是如何进行持久化数据的,我们知道 redis 是基于内存的数据库,那么只要服务器一旦宕机,那么数据则将全部丢失,如果从后端数据库进行恢复,则可能导致性能变慢,那么 redis 需要自身持久化,而不通过后端数据库来恢复数据是重要的。Redis 向 AOF 写日志时,并不会校验命令的语法,如果先记日志,则可能保存了错误的命令导致出错。所以让系统先执行命令,执行成功后再记录日志。后写日志也不会阻塞当前操作,但是下一次操作有阻塞风险。

2022-12-12 09:36:07 91

原创 redis之主从库同步

在单点故障后,我们需要保证服务不间断,所以需要使用冗余的副本提供集群服务,从而达到服务的高可用。redis 提供了主从库数据同步机制,从而保证数据副本的一致性,而主从库使用的是读写分离的机制。

2022-12-12 09:36:04 459

原创 redis之五种基本数据类型

本文主要讲解 redis 的五种基本数据类型:String、List、Set、Sorted Set、Hash。学习如何使用它们,并且了解它们的底层数据结构实现,这样我们才能在适当的应用场景选择最适合的数据类型来解决我们的需求。redis 之所以快,正是因为其有着丰富的数据结构,所以我们需要理解它们,在设计方案时,就能正确的选择数据类型来实现我们的业务需求。

2022-12-12 00:54:04 869

原创 go中如何处理error

go 中的异常处理和其他语言大不相同,像 Java、C++、python 等语言都是通过抛出 Exception 来处理异常,而 go 是通过返回 error 来判定异常,并进行处理。在 go 中有 panic 的机制,但 panic 意味着程序终止,代码不能继续运行了,不能期望调用者来解决它。而 error 是预期中的异常,希望调用者可以对其进行处理的。其实就是先预定义一些可以预料中的错误,在使用过程中,通过判断 error 是属于哪一种 error 并进行对应的处理。

2022-11-14 10:53:30 2014

原创 pod中将代码与运行环境分离

本文介绍如何将 pod 中的代码与运行的环境进行拆分。

2022-11-14 10:45:26 365

原创 ddt源码分析

ddt 是 python 的第三方库,主要是解决使用 unittest 来写单测时可以支持参数化的配置,这个库的使用方法可以参考我之前写的文章。本文主要是讲自己在学习 ddt 库时所获。ddt 库的使用方法是用装饰器来实现的,可以参考python装饰器使用方法。

2022-10-27 08:00:00 1301

原创 使用ddt实现unittest的参数化测试

本文介绍如何使用ddt库来完成unitest的参数化设置。ddt的github地址ddt的官方文档本文是介绍ddt的基本并常用的用法,如果想要深入使用可以参考官方文档。其实ddt有个缺点是不能针对某一个单测方法进行单独的执行,必须要运行整个Unittest class才行,这样在调试的过程中非常不方便。如果你看到本文其实我比较推荐你使用pytest来替代unittest使用,pytest中也有参数化的使用,并且可以单独的去运行每一个单测。

2022-10-26 08:00:00 1797

原创 python装饰器的使用方法

装饰器在 python 中使用的频率非常高,它可以在不改动原有函数的基础上对其进行增强功能。下面主要是介绍装饰器的各种用法,并理解其运行过程。装饰器的用法很多,封装成库,给其他人使用也非常的方便,我们需要理解它的运行过程,才能更好的使用它。

2022-10-25 08:00:00 4889 2

原创 读书笔记:如何阅读一本书

本文是我阅读完《如何阅读一本书》的读后感,作者主要是将阅读分为了四个层次:基础阅读、检视阅读、分析阅读和主题阅读,并讲解这几个层次该如何去做,能够更好的帮助我们阅读,让我们从中收获到更多。

2022-10-24 08:00:00 154

原创 介绍分布式锁

本文介绍了分布式锁遇到的问题及对应的解决方案。

2022-09-29 08:00:00 219

原创 使用kubeadm安装k8s

将安全配置文件放在指定目录中,该文件时kubectl需要读取的授权文件,放在指定目录下,kubectl才能读取到并访问到k8s。先在主节点使用kubeadm token create --print-join-command来获取到子节点加入主节点的命令。自动生成的文件会使用k8s.gcr.io/pause:3.6镜像,国内无法下载,导致kubeadm初始化失败。子节点也需要主节点的config文件,才能通过kubectl访问集群。在安装kubeadm之前,都需要配置yum源,创建文件。

2022-09-27 08:00:00 464

原创 gin中go-playground模块的源码分析

在gin中使用的是go-playground模块来对表单进行校验的。go-playground模块github地址。

2022-09-17 08:00:00 715

原创 优化gin表单的错误提示信息

个人觉的虽然gin灵活小巧,但是功能真的很不完善。每次一次输出友好信息,我们都要手动调用Translate来翻译,并且还需要通过RemoveTopStruct方法来修改返回的信息,按简单的来说,应该由框架来做,我们只需要通过配置,就能自动输出我们想要的友好提示信息才对。

2022-09-16 08:00:00 634

原创 go简单使用grpc

proto文件是用来预先定义的消息格式。数据包会按照proto文件所定义的消息格式完成二进制码流的编码和解码。// 指定生成的 go 文件存放位置及其包名proto";// 定义User rpc服务// 定义rpc服务的方法}// 请求的结构体}// 响应的结构体}}}

2022-09-15 08:00:00 700

原创 python简单使用grpc

文件,创建User的rpc服务定义,该服务中包含AddUser和GetUser两个调用,并使用下面创建的对应的结构体作为请求体和响应体。然后,运行命令对proto文件进行编译,会根据上面的proto文件生成对应的python文件,你会发现在proto目录下创建了。我们创建proto_test.py文件,创建User对象,填充值,并将该对象序列化成字符串输出。下面是使用之前创建的protobuf和grpc文件来构建grpc服务端代码。然后我们再创建User对象将将上面的输出的序列化字符串反序列化进来。

2022-09-13 10:09:49 1353

原创 k8s之StatefulSet

快速了解StatefulSet

2022-09-08 09:00:00 4515 2

原创 k8s之PV、PVC和StorageClass

快速了解PV、PVC和StorageClass

2022-09-08 08:00:00 1238

原创 k8s之DaemonSet

快速了解DaemonSet

2022-09-07 08:00:00 191

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除