June 11, 2023
k8s调度器 kube-scheduler 源码解析
"版本号:v1.27.2\nKubernetes 调度程序作为一个进程与其他主组件(例如 API 服务器)一起运行。它与 API 服务器的接口是监视具有空 PodSpec.NodeName 的 Pod,并且对于每个 Pod,它都会发布一个 Binding,指示应将 Pod 调度到哪里。\n调度过程 +-------+ +---------------+ node 1| | +-------+ | +----\u0026gt; | Apply pred. filters | | | | +-------+ | +----+----------\u0026gt;+node 2 | | | +--+----+ | watch | | | | | +------+ | +----------------------\u0026gt;+node 3| +--+---------------+ | +--+---+ | Pods in apiserver| | | +------------------+ | | | | | | +------------V------v--------+ | Priority function | …"
May 21, 2023
树莓派安装 kubernetes v1.27.2
"Ubuntu 22.04.2 LTS ARM64位系统 kubernetes v1.27.2\n以前写过一篇安装教程 https://blog.haohtml.com/archives/30924 ,当时安装的版本是 \u0026lt; v1.24.0 版本,由于k8s 从 v1.24.0 版本开始,弃用了 Dockershim 因此没有办法继续使用 Docker Engine 作为运行时,因此如果还想继续使用旧的运行时的话,则需要安装一个 cri-docker 的软件, 本文主要是介绍(版本 \u0026gt;=v1.24.0 )继续使用 Docker Engine 的安装方法,这里以最新版本 v1.27.1 为例。\n安装环境初始化 以下内容来自: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/\n执行下述指令:\ncat \u0026lt;\u0026lt;EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo …"
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] …"
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协议复制到用户态,最后数据再次复制到内核态并通过物理网卡转发出去,期间共经历了三次用户态与内核态的复制操作,相 …"