Contents
English version: Use Cloudflare Load Balancer with Cloudflare Tunnel – Frank’s Weblog
Cloudflare Load Balancer是Cloudflare提供的一个全球负载均衡产品。它可以以传统方式(域名或IP地址)连接源服务器,还可以与Cloudflare Tunnel集成,以创建一个无缝和安全的网络基础设施。
将Cloudflare Tunnel与Cloudflare Load Balancer一起使用的配置与传统方式相比略微复杂,我们需要正确地配置域名和Host头,以确保路由和监控的正常工作。
在这篇文章中,我们将用一个例子来演示如何配置将Cloudflare Load Balancer与Cloudflare Tunnel一起使用。
在开始之前,确保你理解HTTP协议中Host头的作用,下面是一些参考资料:
What is HTTP “Host” header? – Stack Overflow
Host names – IBM Documentation
一个谜之CORS Bug的调试过程 – Frank’s Weblog
步骤
这个示例将使用如下的配置:面向访客的网站网址及源服务器的应用中的配置的网址均为:example.com
[*]。两个通过Cloudflare Tunnel提供服务的源为origin0.example.com
和origin1.example.com
。
[*]:假设源服务器中的应用由nginx提供服务,那么该nginx的server_name
为example.com
。
安装Cloudflare Tunnel
请参考官方教程在源服务器上安装cloudflared:Via the dashboard · Cloudflare Zero Trust docs
如果你要在Kubernetes上运行Cloudflare Tunnel,请参考:在Kubernetes中部署Cloudflare Tunnel – Frank’s Weblog
配置Cloudflare Tunnel
在一个cloudflared
客户端连接到Cloudflare后,将会自动创建一个Tunnel,并分配一个UUID作为Tunnel ID。在这个示例中,我创建了两个Tunnel,其中一个名为primary
,Tunnel ID为aa57***ba18
;另一个名为replica
,Tunnel ID为ad8c***47f5
。
本文仅展示primary
Tunnel的配置,另一个Tunnel的配置与之相似。
为Tunnel创建一个Public hostname。
将其Hostname设置为origin0.example.com
,将HTTP Host Header设置为example.com
在另一个Tunnel origin1.example.com
上重复这些步骤。
在创建Public hostname的同时,Cloudflare会自动为子域名origin0.example.com
创建一个指向(UUID).cfargotunnel.com
的DNS记录。因为这些源服务器将会在负载均衡器背后,所以我们不需要这些DNS记录。为了保障源服务器的安全,可以将这些DNS记录删除。
负载均衡器和源服务器池(Origin Pool)
在完成上述配置后,创建一个负载均衡器和源服务器池(Origin Pool)。将源服务器地址(Origin address)设置为(UUID).cfargotunnel.com
,将下方Host header对应的Header value设置为Public hostname中的Hostname,这里是origin0.example.com
。
这个配置有一些反直觉。(UUID).cfargotunnel.com
是该Tunnel的网络地址,这个地址使Cloudflare Load Balancer在网络中找到正确的主机。我们在上一步骤已经将Public Hostname配置为origin0.example.com
,这是该“Public Hostname”的虚拟地址[1]。我们这里需要将Host设置为相同的值,才能确保Tunnel能够将请求转发到对应的”Public Hostname”。当请求到达Public Hostname后,因为我们在HTTP Settings中设置了HTTP Host Header为example.com
,Tunnel将会使用example.com
作为HTTP Host header将请求转发给上游服务,在这里是http://nginx:80
。
源服务器池监控
要使源服务器池监控正常工作,需要在Advanced health check settings中将Host
头配置为example.com
。[2]
Health Check
监控(Monitor)和健康检查(Health Check)是两个完全不同的功能。Health Check(Traffic -> Health Checks)是一项付费功能,且与Load Balancer无关。Health Check的使用请参考官方文档:Overview · Cloudflare Health Checks docs
Tunnel副本(Replication)不是负载均衡
Tunnel副本(Replication)[3]经常被和负载均衡混淆,但是Tunnel副本不是负载均衡。
一个Cloudflare Tunnel可以有多个连接器(connector),见下图。每个连接器都指向同一个Tunnel。这确保了在其中一个连接器发生故障时,Cloudflare仍然可以通过其他连接器和源服务器保持通信。我们把这些额外的连接器/Cloudflared客户端称为副本。
Tunnel的多个连接器可以位于不同的服务器甚至可以位于不同的地理区域,但是副本不提供任何流量控制(traffic steering),负载均衡器则可以。当一个请求到达Cloudflare时,Cloudflare网络将选择任何可用的源服务器连接。如果一个连接失败,Cloudflare将重试其他连接,但不能保证选择哪个连接。
小结
下图概括了一个数据包的生命周期中所途径的Cloudflare Load Balancer及Tunnel中每个组件的配置。
References
[1] Virtual hosting – IBM Documentation
[2] Load balancers · Cloudflare Zero Trust docs
[3] Tunnel availability and failover · Cloudflare Zero Trust docs
发表回复/Leave a Reply