饮墨

子安饮墨馀三斗,留与卿儿作赋来

Podman Quadlet:用 systemd 原生方式管理容器,彻底告别 docker-compose

痛点

在非 Kubernetes 的服务器环境中(边缘节点、单体应用服务器、CI Runner),我们通常用 docker-compose 编排容器。但它带来几个尴尬问题:

  1. compose 是个额外守护进程层 — 服务启停依赖 docker compose up -d,与系统的 init 体系割裂,重启后需要额外 enable
  2. 日志管理分裂 — 容器日志走 docker driver,系统日志走 journald,排查故障两头看
  3. 依赖管理弱 — compose 的 depends_on 只做启动顺序,不做健康依赖,复杂场景照样翻车
  4. Rootless 场景受限 — docker-comp...

Read more

Falco 实战:Kubernetes 运行时安全威胁检测与响应

痛点

容器安全扫描(如 Trivy)解决了镜像构建阶段的漏洞发现,但运行时阶段的异常行为——容器内反弹 Shell、敏感文件读取、异常网络外连——传统工具几乎无能为力。Kubernetes 集群一旦被攻破,从横向移动到数据外泄,整个链路可能在几分钟内完成,而你的告警系统可能毫无感知。

Falco 是 CNCF 毕业项目,基于 eBPF/kernel module 在内核层实时捕获系统调用,用规则引擎检测运行时威胁,填补了从「镜像安全」到「运行时安全」的最后一块拼图。

方案

Falco 的核心架构:

┌────────────────────────────────────────────...

Read more

Infisical:开源密钥管理平台,彻底替代 .env 散落式密钥管理

痛点:.env 文件在生产环境的致命缺陷

运维工程师大概都经历过这些场景:

  • 新人入职,前辈把 .env 文件通过 Slack/钉钉明文发一份过来
  • 某个 API Key 轮换,需要逐台服务器手动更新 .env,漏改一台就是 P0 事故
  • 审计要求追溯"谁在什么时间修改了哪个密钥",.env 文件毫无审计能力
  • 多环境(dev/staging/prod)密钥靠命名约定(.env.prod)区分,一旦复制错误直接打到生产数据库

.env 是开发阶段的便利工具,但它从来不是为生产环境设计的密钥管理方案。当团队规模超过 5 人、服务超过 10 个时,散落的 .env 文件就是一颗定时炸弹。


方案...

Read more

Kaniko:在 Kubernetes 中构建容器镜像,彻底告别 Docker Daemon

痛点

在 CI/CD 流水线中构建容器镜像,传统方案是 Docker-in-Docker(DinD)或挂载宿主机 Docker Socket。两种做法都有硬伤:

  • DinD:需要 --privileged 特权模式,Pod 拥有宿主机几乎所有权限,一旦被攻破等同于节点沦陷
  • 挂载 Socket:任何能访问 /var/run/docker.sock 的容器都能操控宿主机上所有容器,安全审计直接红灯
  • Kubernetes 1.24+ 已移除 dockershim:节点上可能根本没有 Docker Daemon,containerd/CRI-O 环境下 DinD 方案失效

生产环境需要一种 无...

Read more

Mise:一个工具统一管理所有开发语言版本,彻底告别 nvm/pyenv/rbenv

痛点

运维团队的开发环境管理是个老问题:项目 A 需要 Node 18 + Python 3.11,项目 B 需要 Node 20 + Python 3.12 + Go 1.22。传统方案是装一堆 *env 工具——nvm 管 Node、pyenv 管 Python、goenv 管 Go、rbenv 管 Ruby。

实际痛点:

  • 工具碎片化:每个语言一个版本管理器,shell 初始化慢,.bashrc 越来越臃肿
  • asdf 虽好但慢:asdf 解决了统一管理的问题,但它是纯 Shell 实现,每次切换目录都有明显延迟(尤其在有几十个插件时)
  • CI 环境难复现:本地和 CI 用不同的版本管...

Read more

Temporal 分布式工作流引擎生产实践:告别脆弱的 Cron Job 和消息队列

痛点:分布式任务编排的脆弱性

运维团队经常面对这样的场景:一个跨服务的业务流程——比如「用户注册 → 发邮件 → 创建资源 → 配置权限 → 通知上游」——被拆成 5 个 Cron Job + 3 个消息队列 + 若干重试逻辑。任何一个环节失败,排查成本极高:

  • Cron Job 没有状态持久化,失败后从头开始还是从断点续跑?靠人肉判断
  • 消息队列的消费者幂等性难保证,重试导致重复执行
  • 跨步骤的超时、取消、补偿逻辑散落在各处,维护噩梦
  • 流程可观测性几乎为零,只能靠日志 grep

Temporal 正是为解决这类问题而生的开源分布式工作流引擎。它将「工作流即代码」的理念落地,让你用普通编程...

Read more

Kubernetes PDB 生产实战:零停机集群维护的关键配置

痛点

集群升级节点、内核补丁滚动更新、节点缩容时,kubectl drain 一把梭直接驱逐 Pod,结果核心服务瞬间副本数归零,告警群炸了——这是很多运维团队踩过的坑。

根本原因:Kubernetes 默认不关心你的业务可用性,drain 操作会无差别驱逐节点上所有 Pod。如果多个副本恰好调度在同一节点,或者驱逐速度快于新 Pod 就绪速度,服务就会出现中断窗口。

PodDisruptionBudget(PDB) 正是解决这个问题的原生机制——它告诉集群:"在任何自愿中断(voluntary disruption)期间,我的服务至少要保持 N 个副本可用"。

方案

PDB 的核心逻辑...

Read more

Litestream:SQLite 流式复制,单节点应用也能拥有生产级数据保障

痛点:轻量应用的数据库选型困境

你有一个日活几千的内部工具、一个 side project、或者一个单节点部署的 API 服务。数据量不大,QPS 不高,但你依然被迫部署一套 PostgreSQL 或 MySQL —— 因为"SQLite 不能用于生产"这个根深蒂固的观念。

结果是:一个 RDS 实例每月 $30-60 的账单、额外的连接池管理、网络延迟、备份配置……这些复杂度对于一个本可以用 SQLite 搞定的场景来说,完全是过度工程。

核心矛盾:SQLite 性能够用、部署简单,但缺乏持续备份和灾难恢复能力。一旦磁盘故障或误操作,数据就没了。

方案:Litestream — SQL...

Read more

OpenCost 实战:Kubernetes 集群成本可视化与优化指南

痛点

Kubernetes 集群规模一上来,成本就成了黑洞。常见问题:

  • 无法归因:每月云账单一大坨,根本分不清哪个团队、哪个 Namespace、哪个 Pod 在烧钱
  • 资源浪费严重:开发者 request 设 4C8G,实际用了 0.5C1G,节点利用率不到 30%
  • Showback/Chargeback 无数据支撑:财务要求按部门分摊成本,运维拿不出精确数据
  • 商业方案太贵:Kubecost Enterprise 动辄几万美金/年,中小团队承受不起

OpenCost 是 CNCF 孵化的开源 Kubernetes 成本监控项目(Kubecost 开源核心),能以 Pod 粒度实时计算...

Read more

EKS Pod Identity 实战:告别 IRSA,更优雅地管理 Pod AWS 权限

痛点

在 EKS 集群中,Pod 访问 AWS 资源(S3、DynamoDB、SQS 等)需要 IAM 权限。长期以来,IRSA(IAM Roles for Service Accounts) 是标准方案,但随着集群规模增长,IRSA 的痛点越来越明显:

  1. OIDC Provider 管理复杂 — 每个集群需要配置 OIDC Provider,跨账户场景下信任关系配置繁琐
  2. IAM Role Trust Policy 膨胀 — 每个 Role 的信任策略必须精确匹配 OIDC issuer URL + namespace + SA name,维护成本高
  3. Role 数量爆炸 — 多集群共享同...

Read more