SRE 日志:我的包去哪了?
这算是新开的一个系列,主要是记录一些 SRE 日常帮自己/帮人调试问题的经历。会完整的记录排查的过程。希望能帮上大家的忙 这篇是一个非常常见的问题,我的包去哪了? 开篇群里的的一个小伙伴提出了一个问题,他在用 dind (Docker in Docker)的时候,A 容器往 B 容器发送的 UDP 包,B 容器能收到,但是 A 容器收不到返回的值。 OK, 是个很经典的“我的包去哪了“的问题。 我们先来构建一下本地的环境看能不能复现 本机的 IP 为 192.168.0.239 我们单独隔离出一个 network ,CIDR 为 172.18.0.0/16 我们先跑一个 dind 容器,name 为 dind1, IP 为 172.18.0.2, 暴露 UDP 4000 端口至 Host 我们再跑一个 dind 容器,name 为 dind2, IP 为 172.18.0.3 dind1 中启动一个容器运行一段简单的 UDP 服务,监听 4000 端口,IP 为 172.17.0.2,暴露 UDP 4000 端口至 dind1 dind2 中启动一个容器,IP 为...
简单聊聊奥特曼中很有趣的细节
ヒーロが必要なんだよ,金城君。ヒーローが必要なんだ!
简单聊聊 CVE-2024-21626
本来这篇文章应该在初一凌晨发的,但是拖延癌晚期,所以到现在才发,得反思下了 背景众所周知,容器逃逸并不是什么令人稀奇的问题了(不被逃逸的容器才是稀奇),2月初,runc 社区正式公布了一个船新的逃逸 CVE,参见 https://github.com/opencontainers/runc/security/advisories/GHSA-xr7r-f8xq-vfvv,版本横跨 1.0 到 1.1.11 这个 CVE 的核心特性在于“可以通过镜像分发的方式,成本很低的进行逃逸” 我们先来复现一下这个问题 我自己的环境是这样 看这篇博客的同学可以参考下面方式进行环境准备, 按照自己的发行版确保安装了,Docker, libseccomp, golang 按照下面方式进行环境安装 1234567891011git clone https://github.com/opencontainers/runcgit checkout v1.1.0-rc.1makesudo rm -rf $(which runc)sudo make installsudo systemctl...
简单聊聊 Python 3.13 的 JIT 方案
Python 3.13 的 JIT 方案最终确定了,我觉得可以说又新又好。所以深夜水一篇水文,来聊聊这个 JIT 方案 这篇文章可能会有些枯燥,所以如果对此不感兴趣的同学可以直接 x 掉 基础知识在聊 Python 3.13 具体的实现之前,我们需要来了解下它所采用的 JIT 方案的基础知识 JIT 本身的定义我相信阅读这篇文章的同学已经非常了解了,所以此处不再赘述。JIT 核心分为两大块 代码的 profile,以确定热点路径,尽可能的减少 JIT 的 fallback 汇编代码的生成 本文主要会聊代码的生成部分 在此之前,Python 生态里一个 JIT 的实现,Pyston/Pypy,他们所采取的方案其实是和 LuaJIT 的方式类似,开发者手写汇编来完成代码的特化,然后依赖 DynASM 执行相关的代码 这种方式主要的缺陷在于 手写汇编带来的心智负担 对于平台的兼容性 为了给大家一个直观的感受,我给出一个我之前写过的汇编的例子来作为演示 首先,我需要实现的功能很简单,用 C 来描述应该是这样的 123456int main(int argc, char...
Per aspera, Ad astra
外星人一定很奇怪,本星际云本地泡银河系猎户悬臂边缘的太阳系第三行星的人类,怎么又在开始为他们庆祝行星绕行一圈开始忙碌了呢? 开篇如果要说要说今年最让我记忆犹新的瞬间,那么毫无疑问是今年8月,月初的某一天,我毫无征兆的突然情绪爆发,冲到窗口边打开窗户,试图从十八楼一跃而下。不过可能我没法有游戏里的主角这一样的光环,落地,转身,拍拍屁股走人。可能只是在繁华的街道上徒留一地碎肉。 所以,妹子不知道为啥发觉了我的异常,在我一只脚迈出窗外的时候,死命将我拉了回来。我从没想过她的力气会那么大,会那样的无畏的拉着我。 所以我有些闲暇坐在这,写下这篇文章。 生活从试图跳楼往前回溯,是连续几周的同一个噩梦,梦回到了自己被强奸的现场,每一次都是同样的真实。可能我想我的一些坚守的防线在不知不觉中被打破了吧。 如果说2023的关键词第一个是爱,那么第二个应该就是 tough 了 无数的噩梦,自我的怀疑,各种不如意的琐事,最喜爱的演员的离世,最惨的时候两周去了六次急诊缝了5针,打了三针,这一些 tough...
家庭 Homelab 升级计划: v2
人生嘛,Homelab 图个乐子
Python 3.12:一个被人忽略的史诗级版本
Python 3.12 已经发布了一段时间,所以写篇水文来聊一聊这个常常被人忽略的史诗级版本。 正文Python 3.12 绝对是一个史诗级版本,在我心目中,它对于 Python 的意义,大于 “async/await” 的 Python 3.5 和 “Type Hint” 的 Python 3.6 对于 Python 的意义。 或者我们可以这么说在未来数年的时间里,Python 后续的很多意义重大的变更,其都能上溯到 Python 3.12。 理解我这一个观点,我们来说一下 Python 的几大痛点: Python 的可调试性,可观测性问题。历史上 Python 中做 Cost 的消耗极大,同时没有足够的手段可以从旁路去观察 Python 的运行时行为 Python GIL 问题,这个老生长谈了,不多说 Python 的 C API/ABI 问题,之前暴露的 C API/ABI 通常和 CPython VM 实现细节耦合,导致跨版本兼容性会是一个问题 而这样一些问题,Python 3.12 上都有了极大的进步 PEP 669, GH-96143 极大提升了 Python...
开源可能没你想的那么难
去参与社区?难吗?其实不难,只是你想的很难,或者说难是你给自己找的借口 正文很多人觉得参与进开源社区很难,无外乎几个原因 觉得自己技术栈不符合 觉得没啥事可以做 觉得太难了 我自己对于这个观点表示不太认可,所以我从九月中旬开始,用了一个月时间,利用 incubator-opendal 做了一个实验,为什么会选择这个项目?原因以下几点 Rust 对于我来说是一门我非常不熟悉的语言,相当于我跨技术栈去做一些事情 我自己之前是做网关和容器相关的偏多,存储方面对于我来说不是在我的好球区 所以我想看一下,我自己作为 fresh man 能在这个社区里面做什么事 截止到今天,我整体的提交记录如下 整体的花费的时间接近34h 整体工作内容横跨了几个方面 多个 Service 的支持(MySQL/Sqlite/MongoDB) 拾掇拾掇了 CI,参与 Action 的重构 把整体 Layer 的文档覆盖了 把可观测性的部分做了不少改进 而截止到目前,还有很多工作需要去继续跟进,比如 基于 DTrace 的进程调试支持 可观测性的几个 Layer 的完善 Layer...
聊聊 Python 3.12 中 perf 的原生支持
好久没写 Python 相关的文章了,但是 Python 3.12 perf 原生支持的这个特性非常的棒,思路又新又好了属于是,所以写篇水文来聊聊这个特性 正文先聊聊 Python 的栈帧在聊今天的正式内容之前我们需要理解 Python 在内存中的布局 对于传统的 native application 而言,大家对于其内存布局应该是比较熟悉的,这里以 x86-64 的一张图来说明其栈帧结构 但是对于 CPython 来说,其 Native Code 执行的只是 VM 一层的代码。其在 VM 内单独抽象了一套类似 native 的栈帧结构。 其核心结构如下 1234567891011121314151617181920212223242526272829303132333435363738struct _frame { PyObject_HEAD PyFrameObject *f_back; /* previous frame, or NULL */ struct _PyInterpreterFrame *f_frame; /*...
关于 CPU Burst 在 K8s 中的一些设计想法
深夜看群友聊的我实在焦虑,起来随便写个水文压压惊 正文写这篇文章的原因是之前给 runc 提的 CPU Burst 支持的 PR [Carry #3205] libct/cg: add CFS bandwidth burst for CPU 终于开始有了新的动静了,这次换了一个国人的 reviewer,感觉要是运气好能在9月开始合并这个 PR。 如果这个 PR 被合并了,那么在 containerd/nerdctl 等其余项目上支持 CPU Burst 的工作就可以开始了。所以这篇文章就是想记录下我对于 CPU Burst 在 Kubernetes 内实现的一些想法,差不多可以当作自己写正式的 KEP(Kubernetes Enhancement Proposal) 草稿 主要分为两个部分来聊一下 CPU Burst 的一些背景 目前 Kubernetes 对于 CPU 资源切分的设计概要 CPU Burst 在 Kubernetes 中的一些设计想法 CPU Burst 的一些背景聊 CPU Burst 之前必须要先聊一下 Linux 里面关于 CGroup...