cloudflare-tunnel · Cloudflare Tunnel 出站接入

集群通过 cloudflared 与 Cloudflare 边缘建立出站隧道,把外部 HTTPS 流量在没有公网入站端口的情况下引到集群内部。

cloudflared 以 tunnel run 模式运行,根据隧道配置里的 ingress 规则把不同 hostname 的请求转发到集群内服务:*.yldm.tech*.yldm.aidunaifen.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-bb8469358f95credentials-file: /etc/cloudflared/creds/credentials.jsonmetrics: 0.0.0.0:2000,以及上文的 ingress 路由表。

隧道凭证由 ExternalSecret tunnel-credentials 从 Vault 拉取:ClusterSecretStore vault-backendremoteRef.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-ingressIngress默认拒绝所有入站
allow-same-namespaceIngress同命名空间 Pod 互通
allow-dns-egressEgress到 kube-system 的 53/UDP、53/TCP
allow-external-egressEgress出公网 443/TCP、7844/UDP(Cloudflare 边缘隧道)
allow-ingress-egressEgress到 kube-system 的 80/TCP、443/TCP(回源 Traefik)
allow-kubernetes-apiEgress到 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 总览

评论