随笔 2026.8.19

949 字
5 分钟
随笔 2026.8.19

1. Kubernetes 小技巧——启动一次性Pod#

在日常使用中,很多场景都需要起一个比较一次性的 Pod 来完成一些操作,如临时Shell(BusyBox),操作数据库(Postgres)等

  • 获得一个临时Shell
Terminal window
kubectl run my-shell --rm -it --restart=Never --image=busybox -- /bin/bash
  • 为运行中的Pod添加临时容器
Terminal window
kubectl debug -it <目标Pod名称> --image=busybox --target=<目标容器名称>

当目标Pod内的容器缺少Shell或已经崩溃,导致无法直接进入时,可以为它添加一个临时容器

  • 临时操作数据库
Terminal window
kubectl run pg-client --rm -it --restart=Never \
--image=postgres:15 \
--namespace=<你的命名空间> \
-- psql -h <数据库Service名称> -U <用户名> -d <数据库名>

2. Authentik 26.5.3 图标加载BUG排障#

2.1 现象#

昨天将 Authentik 的存活探针删除后,再次访问 Web 端时,发现所有的应用图标全部 404 Not Found 了,就很神秘。开始以为是没挂 PVC 的问题,但是 Exec 进容器时发现文件还在,权限也正确。重新上传文件后,可以显示,但是再 rollout restart 一遍就又 404 Not Found 了。

2.2 尝试排查#

尝试了一下,我发现在用户列表界面查看头像可以,但是在文件页面查看又不行,然后观察一下两个请求的URL:

  • 200 OK
https://auth.redrock.team/files/media/public/avatar/TuF3i.jpeg?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoibWVkaWEvcHVibGljL2F2YXRhci9UdUYzaS5qcGVnIiwiZXhwIjoyMDk5MTI3Mzg2LCJuYmYiOjE3ODM3NjczNzF9.6WiZobBVcU7SfaXslnosfhhcw0gKOC8pvp4F0yCToOc
  • 404 Not Found
https://auth.redrock.team/files/media/public/avatar/TuF3i.jpeg?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXRoIjoibWVkaWEvcHVibGljL2F2YXRhci9UdUYzaS5qcGVnIiwiZXhwIjoxNzg2ODk2OTcxLCJuYmYiOjE3ODY4OTYwNTZ9.sKmMqE_bkkQMkhwd1Mm2J1GB7zrXD8GWvniCefZJIQ4

观察了一下,发现只是Token不同,所以应该是Token的问题,查了一下Github的 PR #23213,发现是 Postgres 没有检查Token的过期时间,导致过期Token被重复返回。

2.3 解决方案#

这个BUG已经在 26.5.4 版本中被修复,所以决定给 Authentik 更新成 26.5.4

2.3.1 更新 Server 和 Worker#

  • 下载Chart

因为网有问题,导致 helmChart 拉不下来,所以直接用 wget

Terminal window
wget "https://gh-proxy.org/https://github.com/goauthentik/helm/releases/download/authentik-2026.5.4/authentik-2026.5.4.tgz"
  • values.yaml 改一下镜像
// 第一个地方
image:
repository: ghcr.m.daocloud.io/goauthentik/server
// 第二个地方
outposts:
container_image_base: ghcr.m.daocloud.io/goauthentik/%(type)s:%(version)s
  • 更新 workerserver
Terminal window
helm upgrade authentik authentik-2026.5.4.tgz -f values.yaml -n sso
  • 更新 outpost

更新好 serverworker 后,发现前哨站没有自动更新,手动更新一下

Terminal window
kubectl set image deployment/authentik-outpost-hubble outpost=ghcr.m.daocloud.io/goauthentik/server:2026.5.4 -n sso

其他以此类推

3. Rust llama.cpp 中 AVX2 指令集兼容问题复盘#

3.1 现象#

在部署卷娘的RAG中心时,容器 juan-rag-service 启动后 1ms 内崩溃,exit code 132 无限重启。日志只有一行 配置加载完成,没有报错堆栈。

132 = 128 + 4 = SIGILL(非法指令)。这不是普通错误,是 CPU 拒绝执行某条指令,进程被内核直接杀掉——绕过了 Rust 的所有错误处理和优雅降级。

3.2 排查#

让AI直接读了 vendored 的 llama.cpp/ggml/CMakeLists.txt,发现:

GGML_NATIVE_DEFAULT = ON(非交叉编译时)
if (GGML_NATIVE OR NOT GGML_NATIVE_DEFAULT) → INS_ENB=OFF
else → INS_ENB=ON ← 我们走的这条
option(GGML_AVX2 ... ${INS_ENB}) ← 默认 ON!
option(GGML_AVX ... ${INS_ENB}) ← 默认 ON!
option(GGML_FMA ... ${INS_ENB}) ← 默认 ON!
option(GGML_F16C ... ${INS_ENB}) ← 默认 ON!
option(GGML_BMI2 ... ${INS_ENB}) ← 默认 ON!

llama.cpp 的 cmake 在 GGML_NATIVE=OFF 时,AVX/AVX2/FMA/F16C/BMI2 默认全部 ON**,会自动追加 -mavx2 -mfma 等编译参数。而 build.rs 只在目标特性包含这些指令时才显式设置、**从不主动关闭——两个构建层之间出现了空档:RUSTFLAGS 改了 GGML_NATIVE,但没改 cmake 的 option() 默认值。

3.3 修复#

Dockerfile 构建阶段显式关掉默认值(GGML_* 环境变量会被 build.rs 透传给 cmake、覆盖 option 默认值):

# 嵌入性能损失可忽略。
ENV RUSTFLAGS="-C target-cpu=x86-64-v2"
# 显式关闭 llama.cpp 默认开启的 AVX/AVX2/FMA/F16C/BMI2(保持 x86-64-v2 可移植基线)
ENV GGML_AVX=OFF \
GGML_AVX2=OFF \
GGML_BMI2=OFF \
GGML_FMA=OFF \
GGML_F16C=OFF \
GGML_AVX512=OFF \
GGML_AVX512_VBMI=OFF \
GGML_AVX512_VNNI=OFF \
GGML_AVX512_BF16=OFF \
GGML_AVX_VNNI=OFF

3.4 验证#

用 Dockerfile 完全相同的环境变量本地重编 llama.cpp,然后逐个 objdump 所有 .a 产物

产物AVX2/AVX512 指令数
libggml-cpu.a0
libggml.a0
libllama.a0
其余全部0

部署后容器正常启动到 RAG-Service 启动于 http://0.0.0.0:3000,SIGILL 彻底消失

4. 结尾#

没有了喵,谢谢阅读

gopher
gopher

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

随笔 2026.8.19
https://blog.tuf3i.cc/posts/dairy-1/
作者
TuF3i
发布于
2026-08-20
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
TuF3i
一只区,什么也不想写
分类
标签
站点统计
文章
16
分类
9
标签
18
总字数
43,299
运行时长
0
最后活动
0 天前

目录