在Kubernetes中部署Cloudflare Tunnel
source link: https://nyan.im/p/cloudflare-tunnel-on-kubernetes
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
在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
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK