February 15, 2023
kubernetes 之 client-go 之 informer 工作原理源码解析
"本文主要介绍有关 client go 架构实现原理,在整个client-go架构中有一个很重要的组件就是 informer,本节我们重点对其进行一些介绍。\nInformer 机制 采用 k8s HTTP API 可以查询集群中所有的资源对象并 Watch 其变化,但大量的 HTTP 调用会对 API Server 造成较大的负荷,而且网络调用可能存在较大的延迟。除此之外,开发者还需要在程序中处理资源的缓存,HTTP 链接出问题后的重连等。为了解决这些问题并简化 Controller 的开发工作,K8s 在 client go 中提供了一个 informer 客户端库,可以视其为一个组件。\n在 Kubernetes 中,Informer 可以用于监视 Kubernetes API 服务器中的资源并将它们的当前状态缓存到本地(index -\u0026gt; store) ,这样就避免了客户端不断地向 API 服务器发送请求,直接从本地即可。\n相比直接采用 HTTP Watch,使用 Kubernetes Informer 有以下优势:\n减少 API 服务器的负载:通过在本地缓存资源信 …"
January 16, 2023
Golang 中网络请求使用指定网卡
"当用户发起一个网络请求时,流量会通过默认的网卡接口流出与流入,但有时需要将流量通过指定的网卡进行流出流入,这时我们可能需要进行一些额外的开发工作,对其实现主要用到了 Dialer.Control 配置项。\ntype Dialer struct { // If Control is not nil, it is called after creating the network // connection but before actually dialing. // // Network and address parameters passed to Control method are not // necessarily the ones passed to Dial. For example, passing \u0026#34;tcp\u0026#34; to Dial // will cause the Control function to be called with \u0026#34;tcp4\u0026#34; or \u0026#34;tcp6\u0026#34;. Control func(network, …"
December 28, 2022
Envoy中的 gRPC限流服务
"上一节 我们大概介绍了一下Envoy中有关速率限制(限流)的一些内容,这一节我们看一下对于外部的 gRPC限流服务它又是如何工作和配置的。\n在 Envoy 中对服务限流的配置除了可以在 Envoy 本身中实现外,还可以在通过外部服务实现,此时 Envoy 将通过 gRPC 协议调用外部限流服务,官方对此实现有一套现成的解决方案,主要是redis数据库+令牌桶算法实现,可参考官方\n本文中的限制器或限流器均是同一个意思。\nEnvoy 实现限流 此实现是基于令牌桶算法实现,本身比较的简单,比较适合一般的使用场景。\n这里是官方提供的一个配置示例\n13 http_filters: 14 - name: envoy.filters.http.local_ratelimit 15 typed_config: 16 \u0026#34;@type\u0026#34;: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit 17 stat_prefix: http_local_rate_limiter 18 …"
December 20, 2022
Envoy 中的速率限制 ratelimit
"在 Envoy 架构中 Rate limit service 共支持 global rate limiting 和 local rate limit filter 两种速率限制。推荐使用 https://github.com/envoyproxy/ratelimit 库。\nGlobal rate limiting Envoy 提供了两种全局限速实现\n每个连接 或 每个HTTP请求 速率限制检查。 基于配额,具有定期负载报告,允许在多个 Envoy 实例之间公平共享全局速率限制。此实现适用于每秒请求负载较高的大型 Envoy 部署,这些负载可能无法在所有 Envoy 实例之间均匀平衡。 Per connection or per HTTP request rate limiting Envoy 直接与全局 gRPC rate limiting service 集成, …"
November 30, 2022
shell终端配置
"oh-my-zsh 是一款非常不错的shell配置,最近几年一直是重度用户。由于一些原因经常登录一些服务器,这里根据自己的习惯做一个笔记,以后不用每一次都要重新从各个地方找安装脚本了。\n安装 zsh 安装zsh 一般系统默认的都是bash,所以我们先安装 zsh。如果不清楚当前使用的哪一类shell的,可通过以下命令查看\n$ cat $SHELL /bin/bash 我这里使用的默认shell。根据平台选择相应的安装zsh命令, 我这里是Ubuntu系统。\nLinux、Debian平台\nsudo apt install -y zsh macOS\nbrew install zsh Centos/RHE\nsudo yum update \u0026amp;\u0026amp; sudo yum -y install zsh 确认版本 $ zsh --version zsh 5.8.1 (aarch64-unknown-linux-gnu) 查看 /etc/shell 看是否存在zsh\n$ cat /etc/shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash …"
October 31, 2022
在 vmware 里扩容Linux硬盘空间
"在mac上创建了一个ubuntu的虚拟机做为k8s远程开发调试机器,但在编译程序的时候发现磁盘空间不足,于是需要对磁盘进行扩容。\n下面为整个硬盘扩容过程。\n硬盘扩容 首先将虚拟机关机,在 Vmware Fusion 软件上面菜单,点击 Virtual Machine -\u0026gt; Setting 菜单,然后在突出框框里的找到硬盘 Hard Disk ,点击调整硬盘空间大小,然后点击Apply 应用按钮。\n磁盘格式化 查看当前磁盘分区信息\nsxf@vm:~/workspace$ sudo fdisk -l [sudo] password for sxf: Disk /dev/loop0: 63.29 MiB, 66359296 bytes, 129608 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop1: …"
October 30, 2022
Linux下两种 DNAT 用法的差异
"前段时间使用 iptables 的 DNAT 实现一个业务需求的时候,遇到了一些问题这里将其整个过程记录下来。\n需求 这里假设开发机地址为 192.168.3.80,要实现的需求是当用户在开发机访问一个IP地址 192.168.3.196时,将请求转发到另一台机器 192.168.3.58,很明显直接使用 DNAT 来实现即可。\n问题现象 iptables 命令如下\nsudo iptables -t nat -F sudo iptables -t nat -A PREROUTING -d 192.168.3.196 -p tcp --dport 8080 -j DNAT --to-destination 192.168.3.58:8080 sudo iptables -t nat -A POSTROUTING -d 192.168.3.58 -p tcp --dport 8080 -j SNAT --to-source 192.168.3.196:8080 这时在开发机器访问\ncurl http://192.168.3.196:8080 发现提示错误\ncurl: (7) Failed …"
July 20, 2022
Linux中调试 iptables
"环境:\n客户端(windows) 192.168.6.21\n服务器(Ubuntu): 192.168.6.23\n开启iptables调试内核模块 $ modprobe nf_log_ipv4 $ sysctl net.netfilter.nf_log.2 net.netfilter.nf_log.2 = nf_log_ipv4 添加iptables规则 $ iptables -t raw -A PREROUTING -p icmp -j TRACE $ iptables -t raw -A OUTPUT -p icmp -j TRACE 测试规则 客户端执行 ping 命令,\n$ ping 192.168.6.23 -n 1 这里使用 -n 参数指定发送的包数量为1,方便我们分析日志\n此时在服务器上执行查看日志命令, 日志文件为:/var/log/syslog 或者 /var/log/kern.log 或者 /var/log/messages\n$ tail -f /var/log/syslog Jul 20 11:28:40 ubuntu kernel: [ 7606.531051] …"
June 10, 2022
https 是如何建立连接的
"一、什么是HTTPS、TLS、SSL HTTPS,也称作HTTP over TLS。TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。\n二、HTTP和HTTPS协议的区别 1、HTTPS协议需要到证书颁发机构(Certificate Authority,简称CA)申请证书,一般免费证书很少,需要交费。\n2、HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。\n3、HTTP和HTTPS使用的是完全不同的连接方式,使用的端口也不一样,前者是80,后者是443。\n4、HTTP的连接很简单,是无状态的。\n5、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。\n从上面可看出,HTTPS和HTTP协议相比提供了\n· 数据完整性:内容传输经过完整性校验\n· 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥\n· 身份认证:第三方无法伪造服务端(客户端)身份\n其 …"
June 10, 2022
实现 Linux 终端录屏转gif动画
"在一些开源其中,有些文档使用git动画来介绍的话效果会好很多,所以这里把在Linux终端下如何生成git动画效果整理出来,供大家参考。\n安装录屏软件 asciinema Mac\nbrew install asciinema Ubuntu\nsudo apt-add-repository ppa:zanchey/asciinema Debian\nsudo apt-get install asciinema Pip安装\nsudo pip3 install asciinema 目前此软件不支持 Windows。更多安装教程参考:\n用法介绍 ❯ asciinema -h usage: asciinema [-h] [--version] {rec,play,cat,upload,auth} ... Record and share your terminal sessions, the right way. positional arguments: {rec,play,cat,upload,auth} rec Record terminal session play Replay …"
May 24, 2022
Linux 中的 Tun/Tap 介绍
"TUN/TAP 设备 在计算机中TUN与TAP是操作系统内核中的虚拟网络设备。不同于硬件设备这些虚拟的网络设备全部用软件实现,但提供了与硬件设备完全相同的功能。\n我们先了解一下物理设备的工作原理 所有主机物理网卡收到的数据包时,会先将其交给内核的 Network Stack 处理,然后通过 Socket API 通知给用户态的用户程序。\nLinux 中 Tun/Tap 驱动程序为应用程序提供了两种交互方式:\n虚拟网络接口和字符设备 /dev/net/tun。写入字符设备 /dev/net/tun 的数据会发送到虚拟网络接口中; 发送到虚拟网络接口中的数据也会出现在该字符设备上; 我们再看下 tun 设备的工作原理 用户态应用往字符设备 /dev/tunX 写数据时,写入的数据都会出现在TUN虚拟设备上,当内核发送一个包给 TUN 虚拟设备时,通过读这个字符设备 /dev/tunX 同样可以拿到包的内容。\n用户态应用程序写数据到 tun/tap 设备后进入内核态,内核态通过TCP协议复制到用户态,最后数据再次复制到内核态并通过物理网卡转发出去,期间共经历了三次用户态与内核态的复制操作,相 …"
March 31, 2022
用 Goalng 开发 OPA 策略
"Open Policy Agent 简称OPA是一个开源的通用策略引擎,可在整个堆栈中实现统一的、上下文感知的策略实施。OPA 已经成为了云原生计算基金会 ( CNCF) 领域的毕业项目,已经在 Kubernetes / Istio 等多个知名项目里使用 。\nOPA的核心思想就是策略即代码。\n它使用Rego语言开发,Rego 的灵感来自 Datalog,它是一种易于理解、已有数十年的历史的查询语言。Rego 扩展了 Datalog 以支持 JSON 等文档模型。对于它的详细介绍请参考官方文档 ,这里不再介绍,本方主要介绍如何使用Golang 来开发一个opa策略。\n概述 OPA 将 策略决策 与 策略执行 分离,当您的软件需要做出策略决策时,它会查询 OPA 并提供结构化数据(例如 JSON)作为输入。 OPA 接受任意结构化数据作为输入。\n对于它的输入一般称为 input, 可以为任意类型,输出也一样可以为任意类型,即可以输出布尔值 true 或 false,也可以输出一个 JSON 字符串对象。\n示例 我们先从官方提供的一个 playground 开始,它是一个官方提供的在线执行平 …"
February 25, 2022
一文看懂Golang 定时器源码
"计时器分 Timer 和 Ticker 两种,它们底层基本是一样的,两差的区别请参考 , 这里我们的介绍对象是 Timer 。golang timer\n计时器结构体 // NewTimer creates a new Timer that will send // the current time on its channel after at least duration d. func NewTimer(d Duration) *Timer { c := make(chan Time, 1) t := \u0026amp;Timer{ C: c, r: runtimeTimer{ when: when(d), f: sendTime, arg: c, }, } startTimer(\u0026amp;t.r) return t } 通过调用 NewTimer() 函数创建一个 Timer,首先创建一个长度为1的有缓冲channel,再创建一个Timer的结构体,并将 channel 置于 Timer 结构体内。\n注意这里的 runtimeTimer."
January 8, 2022
了解eBPF技术
"eBPF 的全称“扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter)” 来看,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。\nBPF 提供了一种在 内核事件 和 用户程序 事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。随着内核的发展,BPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等,而且它的功能特性还在快速发展中,这种扩展后的 BPF 被简称为 eBPF(早期的 BPF 被称为经典 BPF,简称 cBPF)。实际上,现代内核所运行的都是 eBPF,如果没有特殊说明,内核和开源社区中提到的 BPF 等同于 eBPF 。\n使用场景及分类 根据 eBPF 的功能和使用场景,主要分类三类:\n跟踪 从内核和程序的运行状态中提取跟踪信息,来了解当前系统正在发生什么。\n跟踪类 eBPF 程序主要用于从系统中提取跟踪信息,进而为监控、排错、性能优化等提供数据支撑。\n其中 BCC 工具集中包含的绝大部分工具也都属于这个类型。\n网络 对网络数据包进行过滤和处理,以便了 …"
November 25, 2021
Golang常见编译参数
"在执行 go build 命令的时候,经常需要添加一些参数,或许是为了调试,也或许是为了生成最终部署二进制文件。\n在编译特定包时需要传递参数,格式应遵守“包名=参数列表”,如\ngo build -gcflags -gcflags=\u0026#39;log=-N -l\u0026#39; main.go -gcflags go build 可以用 -gcflags 给_go_编译器传入参数,也就是传给 go tool compile 的参数,因此可以用 go tool compile –help 查看所有可用的参数。\n其中 -m 可以检查代码的编译优化情况,包括逃逸情况和函数是否内联。\n-ldflags go build用 -ldflags 给go链接器传入参数,实际是给go tool link的参数,可以用go tool link –help查看可用的参数。\n常用-X来指定版本号等编译时才决定的参数值。例如代码中定义var buildVer string,然后在编译时用go build -ldflags “-X main.buildVer=1.0” … 来赋值。注意-X只能给string类型变量赋值。"