Nova Kwok's Awesome Blog

16C32G 一个月不到 50 欧元的服务商——Hetzner 简评

几个月之前和 Plausible Analytics 的 CEO 聊了聊之后发现了 Hetzner 这么个服务商,经过一段时间的尝试之后发现体验真心不错并逐渐将自己的基础设施迁移到了 Hetzner 上,目前使用了快半年了,借此做一个小小的简评。

Hetzner Online GmbH is a company and data center operator based in Gunzenhausen, Germany.

Hetzner 是个德国的服务商,拥有自己的 Server Parks( https://www.hetzner.com/unternehmen/rechenzentrum ),据我个人观察,在 LocalBitcoins 切换到 Sendgrid 之前也是使用的 Hetzner 的机器来发的邮件。

对于我个人而言,Hetzner 最吸引我的地方在于以下几点。

较为友好的 Terraform Provider

由于我大量使用 Terraform 来管理自己的基础设施, Hetzner 的整体逻辑有点像 DigitalOcean,不像 AWS 有太多关于 VPC,Subnet,SG 的复杂配置,对于一个比较简单的项目而言,要创建对应的内网段,内网 IP,和机器来说的话, Terraform 文件基本类似如下简单:

机器配置,设置一个稳定的内网 IP:

resource "hcloud_server" "app_server" {
  name        = "app_server"
  image       = var.os_type
  server_type = "cpx21"
  location    = "fsn1"
  ssh_keys    = [hcloud_ssh_key.default.id]
  labels = {
    "clickhouse" = "true"
  }
  backups = true
  delete_protection = true
  rebuild_protection = true

  firewall_ids = [hcloud_firewall.server_firewall.id]
}

resource "hcloud_server_network" "app_network" {
  server_id = hcloud_server.app_server.id
  network_id = hcloud_network.nova_private.id
  ip = "10.1.0.10"
}

网络段的设置:

resource "hcloud_network" "app_private" {
  name     = "app_private"
  ip_range = var.ip_range
}

resource "hcloud_network_subnet" "app_private_subnet" {
  network_id   = hcloud_network.app_private.id
  type         = "cloud"
  network_zone = "eu-central"
  ip_range     = var.ip_range
}

默认 SSH :

resource "hcloud_ssh_key" "default" {
  name       = "app_pem_key"
  public_key = file("~/.ssh/new_id_rsa.pub")
}

不过没法通过 Terraform 来升级机器配置(这点感觉不如 AWS),升级机器需要手动关闭机器后登录到 Web 管理页面点击升级。

内网互通

Yes, you can connect instances from our locations in Falkenstein, Nuremberg and Helsinki to the same network

只要在一个内网下,Hetzner 的欧洲三个可用区之间是内网互通的,而且之间的流量是免费的,比如从芬兰到德国的延迟是这样的:

root@ubuntu-2gb-hel1-1:~# ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=63 time=25.5 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=63 time=23.9 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=63 time=24.1 ms
64 bytes from 10.0.0.3: icmp_seq=4 ttl=63 time=23.9 ms
64 bytes from 10.0.0.3: icmp_seq=5 ttl=63 time=23.9 ms
64 bytes from 10.0.0.3: icmp_seq=6 ttl=63 time=23.9 ms

测速结果如下:

root@ubuntu-2gb-hel1-1:~# iperf3 -c 10.0.0.3
Connecting to host 10.0.0.3, port 5201
[  5] local 10.0.0.2 port 40820 connected to 10.0.0.3 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  88.6 MBytes   743 Mbits/sec  265   3.99 MBytes       
[  5]   1.00-2.00   sec   115 MBytes   965 Mbits/sec    0   3.99 MBytes       
[  5]   2.00-3.00   sec   115 MBytes   965 Mbits/sec    0   3.99 MBytes       
[  5]   3.00-4.00   sec   119 MBytes   996 Mbits/sec    0   3.99 MBytes       
[  5]   4.00-5.00   sec   116 MBytes   975 Mbits/sec    0   3.99 MBytes       
[  5]   5.00-6.00   sec   116 MBytes   975 Mbits/sec    0   3.99 MBytes       
[  5]   6.00-7.00   sec   116 MBytes   975 Mbits/sec    0   3.99 MBytes       
[  5]   7.00-8.00   sec   109 MBytes   912 Mbits/sec  271   2.86 MBytes       
[  5]   8.00-9.00   sec   116 MBytes   975 Mbits/sec    0   3.00 MBytes       
[  5]   9.00-10.00  sec  90.0 MBytes   755 Mbits/sec  317   1.51 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.08 GBytes   924 Mbits/sec  853             sender
[  5]   0.00-10.02  sec  1.07 GBytes   920 Mbits/sec                  receiver

iperf Done.

root@ubuntu-2gb-hel1-1:~# iperf3 -c 10.0.0.3 -R
Connecting to host 10.0.0.3, port 5201
Reverse mode, remote host 10.0.0.3 is sending
[  5] local 10.0.0.2 port 40824 connected to 10.0.0.3 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  96.1 MBytes   806 Mbits/sec                  
[  5]   1.00-2.00   sec   114 MBytes   958 Mbits/sec                  
[  5]   2.00-3.00   sec   119 MBytes  1.00 Gbits/sec                  
[  5]   3.00-4.00   sec  67.5 MBytes   566 Mbits/sec                  
[  5]   4.00-5.00   sec  66.7 MBytes   559 Mbits/sec                  
[  5]   5.00-6.00   sec  68.2 MBytes   572 Mbits/sec                  
[  5]   6.00-7.00   sec  70.5 MBytes   591 Mbits/sec                  
[  5]   7.00-8.00   sec  73.2 MBytes   614 Mbits/sec                  
[  5]   8.00-9.00   sec  73.4 MBytes   616 Mbits/sec                  
[  5]   9.00-10.00  sec  59.8 MBytes   502 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.02  sec   812 MBytes   680 Mbits/sec  1099             sender
[  5]   0.00-10.00  sec   809 MBytes   678 Mbits/sec                  receiver

iperf Done.

有了这样的结构的话,我们可以将 App (或者 K8s 集群)分散在不同的 Region 下,然后使用内网互联。

什么时候深圳到香港的内网可以这么跑而且免费就好了

较为友好的价格

如果说简单的 Terraform 这种对于大多数「The developer cloud」都有的话,那么价格这块也是一个非常重要的因素,首先我们可以看看大家用的很多的 DigitalOcean 的价格。

然后对比一下 Hetzner 的价格:

可以看到 Hetzner 即使到了 16Core,32G 的配置,价格也控制在了不到 50EUR/mo,对应 DO 上类似配置的是 General Purpose Droplets 的 8vCPUs,32GB 已经到了 272USD/mo,且 Hetzner 给所有的机器都给了 20TB 的流量。

(注:Hetzner 也是按照小时计费的)

如此高的性价比,我的第一个尝试便是在之前的 ClickHouse 测试「ClickHouse 各版本在不同 CPU 架构上的性能差异对比」中大量使用 Hetzner 的机器作为 Self-Hosted Runner,发现特别香,之后便将自己的各种异构(非生产)应用全部丢到了 Hetzner 上。

缺点

Hetzner 也有对应的缺点,对于我们常规用户而言一般是如下:

  1. 注册风控很严,如果不填写真实的信息(且用真实 IP 之类)的话容易被直接「Account is closed」,不过一般来说在正常使用了一个月出了账单并成功付款后就比较稳了
  2. 到大陆地区延迟很大(毕竟欧洲服务商),不适合建站并直接解析上去用,不过特别适合起服务后通过 Cloudflare Argo Tunnel 来暴露
  3. 相比较各种「The developer cloud」而言,缺乏很多设施,比如 Managed SQL,Managed K8s 之类,他们提供的只有 VM,Network,Disk ,比较原始,对于一个典型的生产环境应用(Managed K8s + 各种 Managed DB/Redis)而言会有较大的运维成本。
  4. 有过些奇怪的故障,比如 https://news.ycombinator.com/item?id=31015840https://lowendtalk.com/discussion/178548/hetzner-data-loss-incident

总结

目前我已经将大部分自己的基础设施(包括但不限于 WebP Cloud ServiceMagLinkGitHub Runner 等)迁移到了 Hetzner 上,并且感觉在我的使用场景下使用体验不错,如果你也想试试看的话,欢迎点以下链接来注册: https://hetzner.cloud/?ref=6moYBzkpMb9s ,这样你可以在注册后直接得到 20EUR 的 Credit 用于玩耍。

#Chinese #Hetzner