cloudflare-tunnel · Cloudflare Tunnel 出站接入
集群通过 cloudflared 与 Cloudflare 边缘建立出站隧道,把外部 HTTPS 流量在没有公网入站端口的情况下引到集群内部。
cloudflared 以 tunnel run 模式运行,根据隧道配置里的 ingress 规则把不同 hostname 的请求转发到集群内服务:*.yldm.tech、*.yldm.ai、dunaifen.games 及其通配子域统一回源到 kube-system 命名空间的 Traefik(http://traefik.kube-system.svc.cluster.local:80),k3s-api.yldm.tech 则直连 Kubernetes API Server(https://192.168.88.99:6443,集群 VIP,noTLSVerify: true),其余 hostname 返回 http_status:404。隧道出口连接 Cloudflare 边缘,因此集群侧无需暴露公网入站端口。
部署形态
- Name
- 命名空间
- Description
- cloudflare-tunnel
- Name
- 工作负载
- Description
- Deployment
cloudflared,3 副本,RollingUpdate(maxSurge 1 / maxUnavailable 0)
- Name
- 镜像
- Description
- cloudflare/cloudflared:2026.6.0
- Name
- 初始化容器
- Description
- busybox:1.38
wait-for-ingress—— 启动前轮询解析traefik.kube-system.svc.cluster.local,DNS 通了才放行主容器
- Name
- 网络
- Description
- hostNetwork: true;dnsPolicy: None,自定义 dnsConfig(nameservers 10.43.0.10 / 1.1.1.1 / 8.8.8.8,ndots 5)
- Name
- 调度
- Description
- nodeAffinity 排除 control-plane 节点(仅在 worker 上运行);podAntiAffinity 按
kubernetes.io/hostname强制每节点至多一个副本
- Name
- 端口
- Description
- containerPort 2000(metrics)
- Name
- 资源
- Description
- requests cpu 50m / mem 64Mi,limits cpu 200m / mem 256Mi(命名空间另有 LimitRange 默认值与 ResourceQuota 上限)
- Name
- 存储
- Description
- 无 PVC;隧道配置经 ConfigMap、凭证经 Secret 以只读卷挂载
命名空间级别的限额:ResourceQuota cloudflare-tunnel-quota 上限 pods 5、requests.cpu 300m / mem 384Mi、limits.cpu 1000m / mem 1Gi;LimitRange 为容器设默认 requests(cpu 25m / mem 32Mi)和上限(cpu 500m / mem 512Mi)。
配置与依赖
隧道配置来自 ConfigMap tunnel-config(挂载在 /etc/cloudflared/config/config.yaml),核心字段:隧道 ID 79da7b14-d126-41d9-84c2-bb8469358f95、credentials-file: /etc/cloudflared/creds/credentials.json、metrics: 0.0.0.0:2000,以及上文的 ingress 路由表。
隧道凭证由 ExternalSecret tunnel-credentials 从 Vault 拉取:ClusterSecretStore vault-backend,remoteRef.key: cloudflare-tunnel/credentials,property credentials.json,刷新间隔 1h,生成的同名 Secret 以只读卷挂载到 /etc/cloudflared/creds。
回源依赖:*.yldm.tech / *.yldm.ai / dunaifen.games 依赖 kube-system 命名空间的 Traefik Service,k3s-api.yldm.tech 依赖集群 VIP 192.168.88.99:6443 上的 API Server。
NetworkPolicy(命名空间默认拒绝入站,逐条放行):
| Policy | 方向 | 放行内容 |
|---|---|---|
| default-deny-ingress | Ingress | 默认拒绝所有入站 |
| allow-same-namespace | Ingress | 同命名空间 Pod 互通 |
| allow-dns-egress | Egress | 到 kube-system 的 53/UDP、53/TCP |
| allow-external-egress | Egress | 出公网 443/TCP、7844/UDP(Cloudflare 边缘隧道) |
| allow-ingress-egress | Egress | 到 kube-system 的 80/TCP、443/TCP(回源 Traefik) |
| allow-kubernetes-api | Egress | 到 default 命名空间的 443/TCP(Kubernetes API) |
访问与监控
无 Service / Ingress 对象:cloudflared 作为出站隧道客户端工作,外部流量从 Cloudflare 边缘经隧道进入,再由 cloudflared 转发给集群内服务,不依赖集群内的 Service 暴露自身。metrics 通过容器 2000 端口的 /metrics 暴露,并同时用作 liveness 与 readiness 探针(HTTP GET /metrics:2000)。
该目录下未包含 ServiceMonitor、PrometheusRule、HPA、VPA、PDB;副本数固定为 3。
注意事项
Deployment 带有 reloader.stakater.com/auto: "true" 注解。manifest 注释指出 cloudflared 只在启动时读取配置、没有热重载,因此只改 ConfigMap 而不重启 Pod 是静默无效的(曾导致 pve.yldm.tech 路由长期失效);该注解让 Reloader 在 tunnel-config 或凭证 Secret 变更时自动触发滚动重启。
dunaifen.games 为 DNF 私服门户:apex 域命中 game 命名空间下 dnf-backend 的 Ingress(经 Traefik,host dunaifen.games),通配 *.dunaifen.games 保留以备未来子域拆分(如 admin.dunaifen.games)。
需要区分两个隧道应用:README 中描述对外访问(*.yldm.tech 通配转 Traefik)的是 cloudflare-tunnel-yldm,本页文档对应的是 applications/networking/cloudflare-tunnel/ 这一份 manifest。两者均在 bootstrap/applications/networking/ 下各自注册为独立 ArgoCD Application。
返回 networking 总览