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类型变量赋值。"
November 25, 2021
Golang中的 CGO_ENABLED 环境变量
"Golang中的编译参数\n开发中经常使用 go build 命令来编译我们的程序源码,然后将生成二进制文件直接部署,极其方便。\n对于 go build 有一些参数,对于针对程序源码进行一些编译优化,下面我们对经常使用的一些参数来介绍一下。\n环境变量 环境变量需要在go命令前面设置,如果多个变量的话,中间需要用“空格”分隔。下面我们介绍一个非常常见到的一些环境变量\n$ CGO_ENABLED=1 GOARCH=amd64 GOOS=linux go build -o myserver main.go 除了这里给出的这几个变量外,还有一些其它变量,如 GODEBUG、GOFLAGS、GOPROXY 等,所有支持环境变量都可以在 里找到,有兴趣的话可以看看他们的作用。\n这里重点介绍一下 CGO_ENABLED 环境变量对我们程序的影响。 CGO_ENABLED是用来控制golang 编译期间是否支持调用 cgo 命令的开关,其值为1或0,默认情况下值为1,可以用 go env 查看默认值。\n如果你的程序里调用了cgo 命令,此参数必须设置为1,否则将编译时出错。这里直接用文档 中的一个例子验 …"
November 23, 2021
理解 firewalld/ufw 与iptables、netfilter 的关系
"iptables 作为 Linux/Unix 下一款优秀的防火墙软件,在安全方面发挥着极其重要的作用,作为系统管理员来讲一点也不陌生。不过对于一些新手来说,复杂性是一个门槛,Linux厂商为了解决这个问题,于是推出了新的管理工具,如 Centos 下的 Firewalld 和 Ubuntu 下的ufw, 他们对新手十分友好,只需要几个很简单的命令即可实现想要的功能,再不也必为记不住iptables中的四表五键而烦恼了。 那么,是不是有了 firewalld 和 ufw就不需要iptables了呢?并不是的。\n首先我们要清楚firewalld、ufw 与iptables的关系,可以理解为两者只是对iptables其进行了一层封装,它们在用户交互方面做了非常多的改进,使其对用户更加友好,不需要再记住原来那么多命令了。\n而目前对于一些系统管理员来讲,大概率还是会直接使用 iptables,主要原因是灵活性,当然也有一定的历史原因。对比前面两个管理工具,他们也存在一定的问题,如只能对单条规则进行管理,详细参考相关文档。\n另外对于 firewalld 还有图形界面。 …"
November 23, 2021
利用代理拉取docker镜像
"在日常开发中经常会遇到有些镜像在 gcr.io 仓库,其仓库是google提供的,由于国内网络环境的复杂性是无法拉取到这些镜像的,这时候就需要我们想一些办法来实现拉取了。\n这里给出了两种解决方法,一种是直接使用代理,这种可以直接拉取远程镜像到本地。另一种是通过中转的方法,先找一个可以直接拉取到镜像的网络,先将存储到本地,然后再转镜像上传到三方国内可以访问的镜像,如我们最常用镜像 https://hub.docker.com。\n代理方式 使用代理方法的时候,如果通过直接设置 http_proxy 和 https_proxy 这两个环境变量是不可行的。如果是k8s环境的话,可能会使用到 containerd 运行时,这时可能还需要设置 crictl 配置,因此下面将分别介绍这个软件的配置方式。\n如果k8s运行时,使用的是 Docker Engine ,则可以通过 docker 命令管理镜像;如果使用的是 containerd运行时,则需要通过 crictl 命令管理镜像。\n不同运行时需要不同的管理客户端,因此下面我们将一下针对这两个软件配置的不同代理配置。 …"
October 9, 2021
k8s解决证书过期问题
"在k8s中的时间会提示证书过期问题,如\n# kubectl get nodes Unable to connect to the server: x509: certificate has expired or is not yet valid 这里我们介绍一下续期方法。\n注意:当前集群通过 kubeadm 命令创建。\nkubeadm 安装得证书默认为 1 年,注意原证书文件必须保留在服务器上才能做延期操作,否则就会重新生成,集群可能无法恢复。\n准备 这里先查看一下测试集群的证书过期时间\n# kubeadm certs check-expiration [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with \u0026#39;kubectl -n kube-system get cm kubeadm-config -o yaml\u0026#39; CERTIFICATE EXPIRES RESIDUAL TIME …"