2

在Kubernetes中部署Cloudflare Tunnel

 2 years ago
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.
neoserver,ios ssh client

在Kubernetes中部署Cloudflare Tunnel

Frank

July 29, 2022

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的一部分,并向所有用户免费提供。

Argo-tunnel-diagram-2.jpg!s

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,后面会用到。

tunnel.png!s

这是用于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配置。

tunnel1.png!s

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

tunnel-config.png!s

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

httpbin.png

References

A Boring Announcement: Free Tunnels for Everyone


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK