在Kubernetes中部署Cloudflare Tunnel




English Version: Deploy Cloudflare Tunnel on Kubernetes – Frank’s Weblog

Cloudflare Tunnel 是一个隧道服务,通过Cloudflare Tunnel可以无需在服务器上暴露任何端口的情况下将源站连接到Cloudflare并提供服务,从而降低攻击面。

Cloudflare Tunnel以前叫Cloudflare Argo Tunnel。后来Cloudflare Tunnel成为了Cloudflare Zero Trust的一部分,并向所有用户免费提供。

Cloudflare Tunnel

Cloudflare Tunnel在过去两年经过了大量迭代,网络上的很多教程,甚至包括官方的教程都已经过时。最新的Cloudflare Tunnel无需在客户端(Cloudflared)上做除了token之外的任何配置,所有网站(服务)配置都可以通过Cloudflare Web控制台进行。如果一篇教程让你在Cloudflared上通过yaml来配置网站,那么这篇教程大概率是过时的。

本文将以httpbin为例,介绍如何在Kubernetes上部署Cloudflared并路由Kubernetes上部署的其他服务。

配置Kubernetes Deployment 及 Service

这是一个示例yaml,其中包含httpbin的Deployment和Service。这里创建了一个名为httpbin-svc的Service,通过ClusterIP方式暴露了80端口。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  selector:
    matchLabels:
      app: httpbin
  template:
    metadata:
      labels:
        app: httpbin
    spec:
      containers:
      - name: httpbin
        image: kennethreitz/httpbin
        imagePullPolicy: Always
        ports:
        - containerPort: 80
      restartPolicy: Always
      terminationGracePeriodSeconds: 60
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin-svc
spec:
  type: ClusterIP
  ports:
    - targetPort: 80
      port: 80
  selector:
      app: httpbin

安装Cloudflared

进入Cloudflare Tunnel控制台(Zero Trust控制台 -> Access -> Tunnels)。新建一个Tunnel。命名时可以选择一个较为通用的名字,因为一个Tunnel可以用于暴露同一服务器/集群中的多个服务。

创建后会显示下面的界面,记下界面上显示的token,后面会用到。

这是用于cloudflared的yaml。将其中的{token}替换成控制台上显示的token。需要注意cloudflared的官方镜像(cloudflare/cloudflared)仅支持amd64架构,如果你的Kubernetes是ARM或ARM/AMD混合架构,则需要使用Multi-arch镜像。你可以使用第三方编译的Multi-arch镜像:ghcr.io/maggie0002/cloudflared:2022.7.1 或自己编译。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: cloudflared
  name: cloudflared
spec:
  selector:
    matchLabels:
      app: cloudflared
  template:
    metadata:
      labels:
        app: cloudflared
    spec:
      containers:
      - name: cloudflared
        image: cloudflare/cloudflared:2022.7.1
        # image: ghcr.io/maggie0002/cloudflared:2022.7.1
        imagePullPolicy: Always
        args: ["tunnel", "--no-autoupdate", "run", "--token={token}"]
      restartPolicy: Always
      terminationGracePeriodSeconds: 60

需要注意Cloudflare控制台上提供的命令中的 –token 参数后面没有等号(=)而是空格,在Kubernetes中使用时务必加上等号,否则cloudflared会报错。

将token填写在yaml中并不是很安全,为了确保安全可以将token存放在Kubernetes Secret中并通过环境变量来使用。具体用法请参考:Secrets | Kubernetes

配置Hostname

Cloudflared启动后Status会变为Active。点击Configure进入Tunnel配置。

新建一个Public Hostname,填入对外的提供服务的域名。Service部分填写Kubernetes Service的名称及端口。

完成后即可通过配置的域名访问

References

A Boring Announcement: Free Tunnels for Everyone




One response to “在Kubernetes中部署Cloudflare Tunnel”

Leave a Reply

Your email address will not be published.