准备要点:购买台湾节点VPS或使用支持API的云厂商;提前生成SSH公钥(ssh-keygen -t rsa -b 4096);准备域名和DNS提供商API Key。
安全:在每台VPS上配置ufw或iptables,关闭不必要端口,仅开放SSH(改端口)、HTTP/HTTPS、监控端口。建议部署fail2ban,禁止root直接登录。
步骤:在一台干净VPS上安装基础包(nginx、docker、git、ntp),配置好SSH公钥、时区、基础防火墙,然后制作快照/模板。这样扩容是克隆模板再完成少量引导。
命令示例(Ubuntu):apt update && apt install -y nginx docker.io git python3-pip;配置完后使用云厂商的snapshot API保存模板。
安装 node_exporter:下载二进制,创建 systemd 服务并启动。示例:wget https://github.com/prometheus/node_exporter/releases/download/v*/node_exporter-*; systemctl enable --now node_exporter。
Prometheus 服务端:在监控服务器上配置 prometheus.yml,加入被监控VPS的 scrape_configs。示例片段:scrape_configs: - job_name: 'nodes' static_configs: - targets: ['10.0.0.2:9100','10.0.0.3:9100']。
容器监控:在宿主或容器主机上启cadvisor(docker run --volume=/:/rootfs:ro ... gcr.io/cadvisor/cadvisor),使Prometheus能抓取容器指标。
Prometheus 告警规则示例:groups: - name: autoscale.rules rules: - alert: HighCPUForSite expr: avg by (instance) (rate(node_cpu_seconds_total{mode!="idle"}[3m])) > 0.7 for: 2m labels: severity: critical annotations: summary: "CPU 使用高于70%"
Alertmanager 配置:把高优先告警路由到 webhook。alertmanager.yml 中 receivers 配置 webhook_configs,url 指向扩容管理器(例如 /webhook/scale)。
整体流程:Prometheus 告警 → Alertmanager Webhook → 扩容服务接收 → 调用云API克隆/创建VPS模板 → 使用cloud-init或Ansible做配置 → 注册到负载池/更新DNS/通知LB reload。
推荐工具:使用一台轻量的扩容控制机(可以用Flask或FastAPI做Webhook接收),使用Ansible做后续配置,使用云商API(如Vultr/Hetzner/其他)做实例创建与快照管理。
Webhook处理示例(伪Python):
from flask import Flask, request; import requests; app=Flask(__name__); @app.route('/webhook/scale', methods=['POST']) def scale(): data=request.json; # 校验和决策 if need_expand: r=requests.post('https://api.vendor.com/instances', json={...}, headers={'Authorization':'Bearer TOKEN'}); # 返回实例IP后调用ansible -> 执行 playbook 部署 return 'ok'
Ansible playbook 摘要:安装docker、拉取站点镜像、配置nginx/upstream并启动。命令示例:ansible-playbook -i inventory site.yml --extra-vars "host_ip=1.2.3.4".
答:在扩容流程里必须完成三步:1)新节点上部署相同的站点内容(通过镜像或rsync/容器镜像)并保证URL一致;2)通过负载均衡或DNS轮询加入后端池(建议使用低TTL DNS或HTTP反向代理动态更新upstream);3)健康检查通过后再放流,Nginx可用ip_hash或sticky保持会话,防止半路切流。
答:缩容需要基于多维度窗口判断,如CPU/流量/响应时间持续低于阈值超过N分钟(比如15~30min)才触发,同时保留最小节点数。实现上使用Prometheus的for:字段和Alertmanager的抑制/分组,再在扩容控制端加入冷却时间(cooldown)与避免并发缩容的锁。
答:常见问题有:监控抓取不到目标(检查防火墙与node_exporter端口)、扩容后应用未就绪(查看Ansible日志与容器日志)、DNS未及时生效(检查TTL与API更新返回值)。排查顺序:查看Prometheus targets → 查看扩容服务日志 → SSH到新节点查看systemd/journal与docker logs,必要时回滚到快照并重试。