Concepts Vultr Glossary
Vultr 概念词典
速查 Vultr(vultr.com)所有专有名词,按”是什么 / 跟谁类似 / 怎么用”三段式。
适用场景:把 Elixir 应用部署到 Vultr + Cloudflare 实现”按需起 VM”架构(详见 extensions-serverless-architecture.md)。
基础概念
Instance(实例 = VM)
Vultr 的”一台虚拟机”。类比 AWS EC2 Instance / DigitalOcean Droplet / Hetzner Cloud Server。
关键字段:
| 字段 | 含义 | 例 |
|---|---|---|
id | 实例 ID(创建后唯一) | cb6760b6-1bd9-4abc-91d9-34d4d3a8c123 |
label | 实例名(你自己取) | pipeline-prod-01 |
region | 数据中心地域(见 Region) | sgp (Singapore) |
plan | 配置套餐(见 Plan) | vc2-2c-4gb |
os | 操作系统 ID | 1743 (Custom snapshot) |
main_ip | 主 IPv4 | 149.28.x.x |
status | 当前状态 | active / pending / off |
power_status | 电源状态 | running / stopped |
# 列出所有实例
curl -H "Authorization: Bearer $VULTR_API_KEY" https://api.vultr.com/v2/instances
# 创建实例
curl -X POST -H "Authorization: Bearer $VULTR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"region":"sgp","plan":"vc2-2c-4gb","label":"myapp-01","os_id":1743,"snapshot_id":"abc-123"}' \
https://api.vultr.com/v2/instances
Plan(套餐 = 规格)
Vultr 卖的不是裸金属,是预打包的规格。命名规则 vc2-Xc-Ygb:
| 套餐 | vCPU | RAM | 月费 | 时费 | 带宽 |
|---|---|---|---|---|---|
vc2-1c-1gb | 1 | 1 GB | $5 | $0.007/h | 1 TB |
vc2-1c-2gb | 1 | 2 GB | $10 | $0.014/h | 2 TB |
vc2-2c-4gb | 2 | 4 GB | $20 | $0.027/h | 4 TB |
vc2-4c-8gb | 4 | 8 GB | $40 | $0.055/h | 5 TB |
vc2-8c-16gb | 8 | 16 GB | $80 | $0.110/h | 6 TB |
vhf-8c-16gb | 8 | 16 GB | $128 | $0.176/h | 8 TB |
前缀含义:
vc2-= Intel/AMD Cloud Compute(最常见,性价比高)vhf-= High Frequency(3.8GHz+,适合 CPU 密集型)vdc-= Dedicated Cloud(CPU 不共享,适合生产)bare-= Bare Metal(独享硬件,不虚拟化)vbm-= Bare Metal + GPU
类比:AWS EC2 instance type(如 t3.medium)/ DigitalOcean droplet size(如 s-2vcpu-4gb)。
Elixir 选型建议:
- 1-2 GB = dev / 轻量 worker / 间歇 cron
- 4 GB = 标准 Phoenix 应用(500-2000 WebSocket)
- 8 GB = 高并发 / 内存密集(ETS 大表 / 大 NIF)
Region(地域 = 数据中心)
Vultr 在全球 32+ 城市有数据中心。注意:vultr 没有”中国”地域(出口受 GFW 影响)。
亚洲常用:
| Code | 城市 | 备注 |
|---|---|---|
sgp | Singapore | 中国大陆延迟 30-60ms,离得最近 |
nrt | Tokyo | 东亚低延迟 |
hnd | Tokyo (Haneda) | 同上,新节点 |
icn | Seoul | 韩国 |
lax | Los Angeles | 太平洋光缆好,到中国大陆 130-180ms |
sea | Seattle | 备用 |
选择策略:
- 中国大陆用户 →
sgp(最近的境外节点) - 全球用户 →
lax/nrt(节点多) - 多 Region 集群 → 一个 Region 一个 VM,靠 libcluster gossip 跨 Region 通信
类比:AWS Region(如 ap-southeast-1)/ GCP Zone。
镜像 / 快照
Snapshot(快照 = VM 状态保存)
关键术语,跟 Docker image 类似但不同:
- 包含整个 OS 磁盘(含你的代码、依赖、配置)
- 只能从自己的 VM 拍(不能跨账号)
- 大小 = 已用磁盘空间(不是 VM 配额)
- 可以”restore”出一个新 VM(cold start 15-30s)
类比:AWS AMI / GCP Image / DigitalOcean Snapshot。
# 拍快照
curl -X POST -H "Authorization: Bearer $VULTR_API_KEY" \
-d '{"instance_id":"cb6760b6-...","description":"prod-ready v0.1.0"}' \
https://api.vultr.com/v2/snapshots
# 列出快照
curl -H "Authorization: Bearer $VULTR_API_KEY" https://api.vultr.com/v2/snapshots
# 用快照创建 VM(os_id=1743 表示 "from snapshot")
curl -X POST ... -d '{"region":"sgp","plan":"vc2-2c-4gb","os_id":1743,"snapshot_id":"<snap_id>"}' ...
为什么是”按需起 VM”的关键:第一次起 VM 慢(30-60s),从 snapshot 起 15-30s。
ISO(自定义 ISO 镜像上传)
高级功能,不常用——一般用 snapshot 就够了。ISO 用于:
- 上传自己的 OS 镜像(如定制 Linux)
- 装非 Vultr 官方支持的系统(FreeBSD、OpenBSD、自定义内核)
Elixir 场景:通常不需要。
Application Catalog(一键应用)
Vultr 提供 100+ 预装应用(WordPress、cPanel、GitLab、Mastodon 等)。点一下就装好。
Elixir 场景:❌ 用不上——选 OS: Ubuntu 22.04 裸装,自己跑 mix release。
网络 / IP
Bandwidth Allowance(带宽配额)
每台 VM 每月有固定流量配额:
vc2-2c-4gb= 4 TB/月- 超出部分按 $0.01/GB 计费
- 进出都算(双向)
类比:AWS 数据传出(egress)单独计费,Vultr 包含双向(更便宜)。
Elixir 场景:4 TB 对中等 WebSocket 应用够用。爆量用户加 CDN(Cloudflare)缓存静态资源。
Reserved IP(保留 IP = 弹性公网 IP)
Vultr 的”弹性 IP”——可以从一台 VM detach、attach 到另一台。
类比:AWS Elastic IP / GCP Static IP。
Elixir 场景:
- 不用(因为我们用 Cloudflare Tunnel,VM 无需公网 IP)
- 但要保留 1 个 Reserved IP 给”管理节点”(autoscaler、CI runner)用
# 创建保留 IP
curl -X POST ... -d '{"region":"sgp","label":"mgmt-01","ip_type":"v4"}' \
https://api.vultr.com/v2/reserved-ips
# 附加到实例
curl -POST ... -d '{"ip_address":"149.28.x.x","instance_id":"cb6760b6-..."}' \
https://api.vultr.com/v2/reserved-ips/149.28.x.x/attach
IPv6
Vultr 默认开启 IPv6(每 VM 1 个 /64 子网)。大多数 Elixir 应用可以忽略(Cloudflare 会自动处理)。
关闭 IPv6:POST /v2/instances 时 features: [] 或 enable_ipv6: false。
Firewall Group(防火墙组)
关键概念:Vultr 防火墙是default-deny——新建 VM 所有端口都封!必须显式开端口。
# 创建防火墙组
curl -X POST -H "Authorization: Bearer $VULTR_API_KEY" \
-d '{"description":"allow SSH + Tunnel"}' \
https://api.vultr.com/v2/firewall-groups
# 加规则:允许 SSH(22)
curl -X POST ... \
-d '{"ip_type":"v4","protocol":"tcp","port":"22","subnet":"0.0.0.0","subnet_size":0}' \
https://api.vultr.com/v2/firewall-groups/<group_id>/rules
# 加规则:允许 Cloudflare IP 段(必须限制来源 IP)
curl -X POST ... \
-d '{"ip_type":"v4","protocol":"tcp","port":"8002","subnet":"173.245.48.0","subnet_size":20}' \
...
⚠️ 关键:用 Cloudflare Tunnel 时,绝对不要开 8002 给 0.0.0.0/0——只允许 Cloudflare IP 段(完整列表)。
类比:AWS Security Group / GCP Firewall Rule。
启动 / 自动化
Cloud-init(首次启动脚本)
Vultr 创建 VM 时支持 user_data(cloud-config YAML),VM 第一次启动时跑一次。
Elixir 场景核心:把整个”装 OS 依赖 + 拉代码 + 跑 mix release + 起服务”塞进 cloud-init。
# cloud-config
#cloud-config
packages:
- curl
- git
- postgresql-client
write_files:
- path: /opt/pipeline.env
permissions: '0600'
content: |
DATABASE_URL=postgres://user:pass@db.example.com/pipeline
LLM_URL=https://api.openai.com/v1
LLM_KEY=sk-xxx
SECRET_KEY_BASE=$(openssl rand -hex 64)
runcmd:
- curl -L https://github.com/your/repo/releases/download/v0.1.0/pipeline.tgz -o /tmp/pipeline.tgz
- tar xzf /tmp/pipeline.tgz -C /opt
- useradd -r -s /bin/false pipeline
- chown -R pipeline:pipeline /opt/pipeline
- systemctl enable /opt/pipeline/_build/prod/rel/pipeline/bin/pipeline
- systemctl start pipeline
- curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared -o /usr/local/bin/cloudflared
- chmod +x /usr/local/bin/cloudflared
- cloudflared service install --token=$CLOUDFLARE_TUNNEL_TOKEN
- systemctl enable cloudflared
- systemctl start cloudflared
final_message: "Pipeline VM ready after $UPTIME seconds" # cloud-init 完成
3 个注意点:
- cloud-init 只能跑一次——VM 重建时才会重跑,reboot 不重跑。
- 敏感信息不要写 cloud-init(会进 snapshot 镜像)——走
write_files+ 外部 secret store。 - cloud-init 默认 30 分钟超时——如果你的脚本慢,要
cloud_init_no_timeout: true(Vultr API 参数)。
Startup Scripts(启动脚本 ≠ Cloud-init)
Vultr 还有个单独的 Startup Scripts 功能——保存为模板,可以挂到任意 VM 的 user_data 字段。
类比:AWS Launch Template / user-data 模板化。
什么时候用:同一套”起 VM 流程”反复用(比如 pipeline-prod-01、pipeline-prod-02 都跑同样脚本)。
存储
Block Storage(块存储 = 可挂载的额外磁盘)
Vultr 支持单独购买块存储(类似 AWS EBS),挂载到 VM。
类比:AWS EBS Volume / GCP Persistent Disk。
Elixir 场景:
- 一般不需要(OS 盘够用)
- 如果 ETS 表特别大(GB 级)→ 挂块存储,把 ETS 放那里(注意:ETS 重启会丢,要做持久化用
:mnesia或:disk_log)
| 规格 | 月费 |
|---|---|
| 100 GB | $10 |
| 250 GB | $25 |
| 500 GB | $50 |
| 1 TB | $100 |
Snapshots vs Backups
| 功能 | 何时用 | 频率 | 价格 |
|---|---|---|---|
| Snapshot(手动) | 发版本前打”金本” | 手动 | $0.05/GB/月(按存储大小) |
| Auto Backups(自动) | 防误删 | 每天/每周 | 30% of plan price(2c-4gb = $6/月) |
Elixir 场景:
- ✅ Snapshot:发版本前打一个,写进 cloud-init 的
snapshot_id - ❌ Auto Backups:没必要(按需起 VM 模式,需要时新建一个就行)
弹性 / 自动化 API
Vultr API
REST API + OpenAPI spec。
# 鉴权
Authorization: Bearer $VULTR_API_KEY
# base URL
https://api.vultr.com/v2/
# 速率限制
# 30 requests/秒(Vultr 官方说法;实际更高)
Elixir 调用示例:
defmodule Vultr do
defp req(method, path, body \\ nil) do
headers = [
{"authorization", "Bearer #{System.fetch_env!("VULTR_API_KEY")}"},
{"content-type", "application/json"}
]
body_json = if body, do: Jason.encode!(body), else: ""
case HTTPoison.request(method, "https://api.vultr.com/v2#{path}", body_json, headers) do
{:ok, %{status: 200, body: body}} -> {:ok, Jason.decode!(body)}
{:ok, %{status: code, body: body}} -> {:error, {code, Jason.decode!(body)}}
{:error, reason} -> {:error, reason}
end
end
def list_instances, do: req(:get, "/instances")
def spin_up(attrs), do: req(:post, "/instances", attrs)
def destroy(id), do: req(:delete, "/instances/#{id}")
def list_snapshots, do: req(:get, "/snapshots")
def list_firewall_groups, do: req(:get, "/firewall-groups")
end
关键端点(你的 autoscaler 用得上):
| 端点 | 方法 | 用途 |
|---|---|---|
/instances | GET/POST | 列/创建 VM |
/instances/:id | GET/DELETE/PATCH | 单个 VM 详情/删除/改 label |
/snapshots | GET/POST | 列/拍快照 |
/reserved-ips | GET/POST/DELETE | 保留 IP |
/firewall-groups | GET/POST | 防火墙组 |
/firewall-groups/:id/rules | GET/POST/DELETE | 规则 |
/startup-scripts | GET/POST | 启动脚本模板 |
/applications | GET | 应用市场 |
/plans | GET | 所有套餐 |
/regions | GET | 所有地域 |
完整 API 文档:vultr.com/api。
Tags(标签)
VM 上可以打标签(key-value 字符串),用于:
- 按环境分组(
env=prod、env=staging) - 按团队分组(
team=trading、team=ml) - 按角色分组(
role=worker、role=mgmt)
# 打 tag
curl -X POST ... -d '{"tags":["env:prod","role:worker"]}' \
https://api.vultr.com/v2/instances/<id>/tags
# 按 tag 筛选
curl -H "Authorization: Bearer $VULTR_API_KEY" \
"https://api.vultr.com/v2/instances?tag=env:prod"
Elixir 场景:autoscaler 用 tag=role:worker 找所有 worker VM,scale 时只操作这一组。
高可用 / 集群
Load Balancer(Vultr LB)
Vultr 自家的 L4/L7 负载均衡。
| 规格 | 月费 | 后端 VM 数 | SSL 终止 |
|---|---|---|---|
| 基本 LB | $10 | 最多 100 | ✅ |
类比:AWS ALB / GCP Load Balancer。
Elixir 场景:
- 如果不用 Cloudflare Tunnel → 用 Vultr LB 做 L7 负载均衡
- 用 CF Tunnel → 不需要 LB(CF 本身就是边缘 LB)
进阶
Object Storage(S3 兼容)
Vultr 自家 S3 兼容对象存储。
类比:AWS S3 / Cloudflare R2 / DigitalOcean Spaces。
Elixir 场景:
- 可以用来存 release 产物(
mix release出来的 tarball) - 也可以做 R2 的廉价备份($5/TB/月,比 S3 便宜)
# 创建 bucket
aws s3 --endpoint-url https://sgp1.vultrobjects.com mb s3://my-releases
# 上传 release
aws s3 --endpoint-url https://sgp1.vultrobjects.com \
cp pipeline.tgz s3://my-releases/pipeline-v0.1.0.tgz
Kubernetes Engine(VKE)
Vultr 自家 K8s(托管)。
Elixir 场景:
- ❌ 用不上——我们走 libcluster gossip + cloud-init,K8s 太重
- 如果你已经有 K8s 经验,VKE 比 EKS 便宜 50%,可以选
DNS(Vultr DNS)
免费的 authoritative DNS 服务。
类比:Route 53 / Cloudflare DNS。
Elixir 场景:
- 用 Cloudflare 即可(CF 的 DNS 一站式)
- 不用 Vultr DNS
计费 / 财务
Hourly Billing(按小时计费)
Vultr 的核心计费模式——关掉(halt)不收费,删除(destroy)不收费,只按实际开机时间按小时计费。
# 关机(不计费,但 snapshot / IP 仍计费)
curl -X POST ... https://api.vultr.com/v2/instances/<id>/halt
# 开机(重新计费)
curl -X POST ... https://api.vultr.com/v2/instances/<id>/start
关键:halt ≠ destroy。halt 保留磁盘数据,destroy 全删。
Elixir 按需起 VM 的核心:halt 而不是 destroy——下次起来 5-10s(halt 状态恢复快)而不是 15-30s(destroy + 新建 + snapshot restore)。
Monthly Cap(月度上限)
Vultr 对每台 VM 设月度费用上限(plan 的月费)。超出按小时计费但不会超月费。这是 Vultr 跟 AWS / GCP 不同的”福利”。
例:vc2-2c-4gb = $20/月 = 730 小时。超过 730 小时的部分不额外收费。
Invoice / 计费明细
每张 Vultr 发票列出:
- 每月费用按 VM 拆分
- Snapshot / Backup / Reserved IP 单独算
- 超出 bandwidth allowance 部分
Elixir 场景:autoscaler 在 spin up 前必须检查当月费用,避免超预算。
defmodule BillingGuard do
def safe_to_spin_up? do
current = get_current_month_spend()
cap = Application.get_env(:pipeline, :monthly_cap, 50)
current < cap
end
end
Vultr vs 其他云
| 维度 | Vultr | AWS EC2 | DigitalOcean | Hetzner |
|---|---|---|---|---|
| 按小时计费 | ✅ 原生 | ✅ | ❌(月费) | ✅(部分) |
| Cold start | 15-30s | 60-120s | 60s | 30-60s |
| 小时单价 | $0.007/h | $0.0042/h (t3.nano) | N/A | €0.0045/h |
| 最小月费 | $5 | $0 | $6 | €4.35 |
| Snapshot 成本 | $0.05/GB/月 | $0.05/GB/月 | $1/GB/月 | €0.01/GB/月 |
| Bandwidth | 4TB+ | 单计费 | 1TB+ | 20TB |
| API 质量 | 优秀 (v2) | 复杂 (300+ 服务) | 简单 | 简单 |
| CF 兼容 | ✅ | ✅ | ✅ | ✅ |
| 中文支持 | ❌ | ❌ | ❌ | ❌ |
| 稳定性 | 高 | 极高 | 高 | 极高 |
为什么选 Vultr:
- ✅ 原生按小时计费(DO 不行)
- ✅ Snapshot 廉价(DO 贵 20x)
- ✅ API 质量好(V2 设计干净)
- ✅ Cloudflare 兼容好
自检清单
- 知道
vc2-2c-4gb= 2 vCPU + 4GB + 4TB 带宽 + $20/月 - 知道
sgp= Singapore,nrt= Tokyo,lax= LA - 知道 Snapshot 是整个 VM 状态、cold start 关键
- 知道 Firewall Group 是 default-deny,必须显式开端口
- 知道 cloud-init 只能跑一次(VM 重建才重跑)
- 知道
halt≠destroy(halt 保留数据、destroy 全删) - 知道按小时计费——halt 不计费,destroy 不计费
- 知道 Vultr 没中国节点
- 知道 Reserved IP 是不绑定 VM 的弹性 IP
相关资源
- extensions-serverless-architecture.md — 主架构文档
- Vultr 官方 API — 完整 REST API
- Cloudflare IP 列表 — 配置 firewall 必用
- cloud-init 文档 — user_data 语法
- libcluster — BEAM 集群发现