April 25, 2023
istio之pilot-agent 源码分析
"源码版本:istio-v1.11.3\n为了方便理解,本文会介绍到 vm 和 容器 两种部署形式的情况,一般会在讲解时提到,因此需要注意当前的部署方式,不过他们的架构是完全一样的。\n架构 pilot 共分两个主要模块,一个是 pilot-agent 用来提供 pod 中的服务发现 客户端,另一个是 polot-discovery 提供服务发现 服务端。\n其中 envoy 和 Istio Agent 就是我们上面所讲的 pilot-agent 模块,其为 数据面 组件,而 Istiod 则为 控制面,模块对应源码见\npilot-agent 对于 polot-agent 它运行在每个pod中 ,并以 sidecar 方式与应用容器运行在同一个pod。如果你使用的是 vm 的话,则可以在当前主机通过 pstree 命令看到进程视图\n# pstree -pu 24530 su(24530)───pilot-agent(24611,istio-proxy)─┬─envoy(24619)─┬─{envoy}(24620) │ ├─{envoy}(24621) │ ├─{envoy}(24622) │ …"
April 4, 2023
GBP工作原理
" https://zhuanlan.zhihu.com/p/305982159 https://www.cnblogs.com/wushuai2018/p/16450239.html "
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] …"