cloudflare-tunnel-yldm · account-B 的 Cloudflare 隧道入口连接器

cloudflare-tunnel-yldm 是一组运行在集群里的 cloudflared 连接器,为 account-B(Cloudflare 账户 "Evan@yldm.tech")的隧道 2b822c22-21be-4d1e-98d4-c02a83f1cace 建立出站长连接,把外部 HTTPS 请求从 Cloudflare 边缘拉回集群内部。

它按 Host 把流量分流:*.yldm.tech / *.yldm.ai / *.fluxa.cash / kamify.store 等通配与 apex 域名全部转发给 kube-system 的 Traefik(再由各服务的 Ingress 路由),而 k3s-api.yldm.techpve.yldm.tech 则绕过 Traefik,由隧道直连裸金属上的 k3s API server 和 Proxmox VE Web UI。

部署形态

这是一组未套 kustomize 的原始 manifest(无 kustomization.yaml),直接以独立资源部署在自己的命名空间里。

  • Name
    命名空间
    Description
    cloudflare-tunnel-yldm(独立 Namespace)
  • Name
    工作负载类型
    Description
    Deployment(name: cloudflared)
  • Name
    镜像
    Description
    cloudflare/cloudflared:2026.6.0
  • Name
    副本数
    Description
    2,RollingUpdate(maxSurge: 1 / maxUnavailable: 0)
  • Name
    网络模式
    Description
    hostNetwork: true;metrics 监听宿主机 :2001(区别于 account-A 隧道的 :2000,使两个连接器能共节点不抢端口)
  • Name
    调度
    Description
    nodeAffinity 要求 node-role.kubernetes.io/control-plane 不存在(即只调度到 worker);podAntiAffinity 按 kubernetes.io/hostname 强制两副本分散到不同节点
  • Name
    端口
    Description
    containerPort 2001(name: metrics, TCP)
  • Name
    资源
    Description
    requests cpu 50m / mem 64Mi;limits cpu 200m / mem 256Mi
  • Name
    启动命令
    Description
    tunnel --config /etc/cloudflared/config/config.yaml run

Pod 没有持久化存储,挂载两个只读卷:ConfigMap tunnel-config 挂到 /etc/cloudflared/config,Secret tunnel-credentials 挂到 /etc/cloudflared/creds

initContainer wait-for-ingress(busybox:1.38)会循环 nslookup traefik.kube-system.svc.cluster.local,直到 Traefik 的 DNS 解析可用才放行主容器启动,避免连接器在 Traefik 尚未就绪时先建立隧道。

配置与依赖

隧道路由集中在 ConfigMap tunnel-configconfig.yaml 里,ingress 规则按声明顺序匹配,最后兜底 http_status:404

hostname转发目标说明
k3s-api.yldm.techhttps://192.168.88.99:6443(noTLSVerify)k3s API server,直连不走 Traefik
pve.yldm.techhttps://192.168.88.68:8006(noTLSVerify)Proxmox VE Web UI(PVE3,i9/64GB 节点);必须排在 *.yldm.tech 通配之前,否则被通配吞进 Traefik 导致 404
*.yldm.techhttp://traefik.kube-system.svc.cluster.local:80由 Traefik 按 Host 路由到各服务 Ingress
*.yldm.aihttp://traefik.kube-system.svc.cluster.local:80同上
*.fluxa.cashhttp://traefik.kube-system.svc.cluster.local:80platform-fluxa(api / mcp / mcp-admin 等);按 slug 的代理 CNAME 由 app 经 Cloudflare API(TENANT_DNS)创建
kamify.store / *.kamify.storehttp://traefik.kube-system.svc.cluster.local:80app-kamify-frontend;apex + www,DNS 经 Cloudflare API 带外创建

凭据通过 ExternalSecret tunnel-credentials 从 Vault 拉取(ClusterSecretStore vault-backend,refreshInterval 1h):remoteRef.key: cloudflare-tunnel-yldm/credentials,property credentials.json 落成同名 Secret 的 credentials.json 键,对应 config 里的 credentials-file: /etc/cloudflared/creds/credentials.json

Pod 自定义 DNS(dnsPolicy: None):nameservers 为集群 CoreDNS 10.43.0.10 加上 1.1.1.1 / 8.8.8.8,search 域含本命名空间与 cluster.local,ndots: 5

依赖关系:上游依赖 Cloudflare 边缘与 account-B 隧道;下游主要依赖 kube-system 的 Traefik(绝大多数域名的最终目标),以及裸金属的 k3s API(192.168.88.99:6443)与 Proxmox(192.168.88.68:8006)。

pve.yldm.tech 的 DNS 记录由额外的 ExternalName Service pve(services-pve-dns.yaml)驱动:它本身不转发流量,只承载 external-dns 注解,让 external-dns 创建代理 CNAME pve.yldm.tech2b822c22-21be-4d1e-98d4-c02a83f1cace.cfargotunnel.com(proxied,TTL 300)。没有这条记录就 NXDOMAIN,隧道里的 pve 路由也永远到不了。

访问与监控

本组件不对外暴露 Service(连接器是出站长连接,外部经 Cloudflare 边缘进入),唯一的 Service 是上面用于建 DNS 记录的 ExternalName pve,不承载实际流量。

健康检查走 /metrics(端口 2001):livenessProbe(initialDelay 30s / period 10s / failureThreshold 3)与 readinessProbe(initialDelay 10s / period 5s / failureThreshold 3)均命中该端点。manifest 中未包含 ServiceMonitor、PrometheusRule、HPA、VPA 或 PDB。

注意事项

Deployment 带 reloader.stakater.com/auto: "true" 注解:cloudflared 只在启动时读取配置、没有热加载,单改 ConfigMap 不会生效,必须触发一次 rollout——这正是 pve.yldm.tech 路由曾长期失效的原因,Reloader 在 tunnel-config 或凭据 Secret 变更时自动重启 Pod 来兜住这一点。

ingress 规则的顺序敏感:精确主机 pve.yldm.tech 必须排在 *.yldm.tech 通配规则之前,否则会被通配吞进 Traefik(Traefik 没有它的路由 → 404)。

域名归属有意区分:yldm.tech / yldm.ai 的 zone 已迁到 account-B("Evan@yldm.tech")走本隧道;dunaifen.games 的 zone 仍在旧账户,继续使用旧的 cloudflare-tunnel(隧道 79da7b14),不在本配置内。

返回 networking 总览

评论