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的一部分,并向所有用户免费提供[1]。
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
)从2022.12.0
版本起已支持amd64/arm64 Multi-arch。如果你需要其他架构,可以使用第三方编译的Multi-arch镜像:ghcr.io/maggie0002/cloudflared
或自己编译。
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的名称及端口。
完成后即可通过配置的域名访问
发表回复/Leave a Reply