<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>vault on </title>
    <link>/tags/vault/</link>
    <description>Recent content in vault on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 27 May 2026 17:00:00 +0800</lastBuildDate><atom:link href="/tags/vault/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>重启即 sealed：homelab Vault 自愈链路的三个坑</title>
      <link>/posts/homelab-vault-reboot-recovery/</link>
      <pubDate>Wed, 27 May 2026 17:00:00 +0800</pubDate>
      
      <guid>/posts/homelab-vault-reboot-recovery/</guid>
      <description>背景：一次内存扩容引出的连锁恢复 事情的起点很无聊：homelab 那台单节点 K3s 跑在 Proxmox VM 上，内存只给了 10G，kube-prometheus-stack 加上一堆有状态服务之后内存 requests 一直在 58% 上下，限制（limits）甚至超卖到 186%。我决定把 VM 从 10G 扩到 12G。
Terraform 改一行 vm_memory，apply，VM 重启——这一步本身顺利完成，节点回来了，kubectl top node 显示 12G 到位。但紧接着我发现一连串东西不对：
argocd 里 personal-services 是 Synced/Degraded 12 个 ExternalSecret 全部 SecretSyncedError calibre-web、grafana 等依赖 secret 的 pod 起不来 表面上看是 ExternalSecrets 集体挂掉，但直接触发点集中在一个地方：Vault 一重启就 sealed 了。
这篇文章把从&amp;quot;重启后 secret 全挂&amp;quot;到&amp;quot;固化成一条 just homelab-recover&amp;ldquo;的排查过程整理出来，重点是中间踩到的三个坑——其中第三个是我自己写的恢复脚本里的 bug。
Vault 为什么一重启就 sealed 先说这个不是 bug，是设计。
HashiCorp Vault 启动时数据是加密的，主密钥（master key）本身又被一组 unseal key 保护。进程刚起来时处于 sealed 状态：它能响应健康检查，但任何读写密钥的请求都会被拒。需要用 unseal key 把 master key 解出来、加载进内存，Vault 才进入 unsealed 状态开始服务。</description>
    </item>
    
    <item>
      <title>Homelab 消息通知：Alertmanager 通过 Gotify 推送告警</title>
      <link>/posts/homelab-alertmanager-gotify-bridge/</link>
      <pubDate>Sat, 25 Apr 2026 01:00:00 +0800</pubDate>
      
      <guid>/posts/homelab-alertmanager-gotify-bridge/</guid>
      <description>背景 Homelab 跑了一套 LGTM 可观测性栈（Loki + Grafana + Tempo + Prometheus），Prometheus Alertmanager 已经在收集各种告警，但一直没有配出通知渠道——告警只是静静地积在队列里，没有任何推送。
Gotify 是一个轻量的自托管推送通知服务，已经在集群里跑着了，主要用于接收 Redpanda Connect 推送的消息。顺手把 Alertmanager 的告警也接进来，省得再引入第三方服务。
架构 Alertmanager 的 webhook receiver 发送的是自己定义的 JSON 格式；Gotify 的 POST /message API 期望的是另一套字段（title / message / priority）。两者不能直接对接，需要一个中间层做格式转换。
DRuggeri/alertmanager_gotify_bridge 是一个专门做这件事的小服务。它的 README 说明默认监听 /gotify_webhook，并把收到的 Alertmanager webhook 转换后转发到 Gotify。
flowchart LR P[Prometheus] --&gt; A[Alertmanager] A --&gt;|webhook| B[alertmanager-gotify-bridge] B --&gt;|POST /message| G[Gotify] 部署拓扑：
组件 Namespace 说明 Gotify personal-services 消息服务端，已有 alertmanager-gotify-bridge monitoring 格式转换 bridge Alertmanager monitoring kube-prometheus-stack 的一部分 Token 管理走 Vault + External Secrets Operator：在 Gotify 创建一个专用 Application，把 token 存入 Vault，ESO 自动同步到 bridge 所在的 monitoring namespace。</description>
    </item>
    
    <item>
      <title>从 Cilium Gateway 到 CoreDNS：一次跨层级的 K8s 连锁故障排查</title>
      <link>/posts/cilium-gateway-argocd-dns-recovery/</link>
      <pubDate>Sun, 08 Mar 2026 18:30:00 +0800</pubDate>
      
      <guid>/posts/cilium-gateway-argocd-dns-recovery/</guid>
      <description>背景 这次故障一开始看起来像两个互不相干的问题：
ArgoCD 里 gateway Application 一直是 Degraded 其他几个 Application 又出现了 OutOfSync 或者后续的 Unknown 如果只看表面，很容易把它归类成“Cilium Gateway API 有问题”或者“ArgoCD 状态异常”。
但真正麻烦的地方在于，这次故障不是单点失效，而是一条跨层级的链路问题：
ArgoCD 健康状态异常 -&amp;gt; 先看到 Gateway Degraded -&amp;gt; 再发现 repo-server 拉 Git 也失败 -&amp;gt; 往下追到 CoreDNS 外部解析异常 -&amp;gt; 再继续追到 ZITADEL 根本没有把 backend Service 建出来 -&amp;gt; 最后发现 Vault 里的 ZITADEL master key 长度也不对 也就是说，最上层暴露出来的是 Gateway 和 ArgoCD，真正的根因却横跨了：
Cilium Gateway API ArgoCD repo-server CoreDNS systemd-resolved Vault + External Secrets ZITADEL Helm 安装链路 这篇文章就按我实际排查的顺序，把整个问题怎么拆开、怎么验证、最后怎么收敛讲清楚。</description>
    </item>
    
    <item>
      <title>Oracle Cloud K3s 迁移到 Cilium：一次把网络、密钥和状态数据都翻出来的升级</title>
      <link>/posts/oracle-k3s-cilium-migration/</link>
      <pubDate>Sat, 07 Mar 2026 22:45:00 +0800</pubDate>
      
      <guid>/posts/oracle-k3s-cilium-migration/</guid>
      <description>背景 我的 homelab 现在是双集群结构：
homelab 跑在 Proxmox 上，负责 Vault、ZITADEL、ArgoCD、Grafana、Kopia 这类核心服务。 oracle-k3s 跑在 Oracle Cloud A1 免费机上，负责 Homepage、Miniflux、KaraKeep、Uptime Kuma、Timeslot 等轻量工作负载。 前一阵我先把 homelab 主集群从 Flannel 切到了 Cilium。迁移完成后，整个架构留下了一个非常明显的不对称：一边是 Cilium，一边还是 K3s 默认 Flannel。
这件事短期看没有坏处，但中长期会越来越烦：
网络问题的排障路径不一致。 两套集群文档会慢慢分叉。 以后不管是做 ClusterMesh PoC，还是只是想统一认知模型，都会被这块技术债反咬。 所以这次我决定把 oracle-k3s 也迁到 Cilium。
这次迁移真正的目标 表面目标是把 CNI 从 Flannel 换成 Cilium，但真正目标其实有三个：
统一双集群数据面：以后提到 Pod 网络、Hubble、NetworkPolicy，两个集群说的是同一套东西。 验证恢复能力：既然是重装 K3s，就顺手检验一下 GitOps、Vault、备份、PVC 恢复到底是不是纸上谈兵。 识别复杂度来源：哪些问题是 Cilium 带来的，哪些其实是之前就存在，只是这次被重建过程暴露出来了。 迁移步骤概览 最终流程大致是这样：
备份本地 PVC 数据 -&amp;gt; 卸载 K3s -&amp;gt; 关闭 Flannel，重装 K3s -&amp;gt; 安装 Cilium Helm chart -&amp;gt; 重装 ESO / Traefik 配置 / 各类 manifests -&amp;gt; 修 Vault Secret / Cloudflare Tunnel / 探针 / 数据库连接 -&amp;gt; 恢复 PVC 数据 -&amp;gt; 验证所有对外服务 其中真正耗时间的不是安装 Cilium，而是安装完以后把整条依赖链重新扶起来。</description>
    </item>
    
  </channel>
</rss>
