1. 前提与架构概览
- 前提:有台湾云空间VPS账号并能使用API或控制台,具备SSH访问权限、域名、Docker与基本Linux运维能力。
- 架构:外部负载均衡器(Nginx/HAProxy)→ 多节点VPS(运行k3s或Docker Swarm)→ 应用容器。监控(Prometheus/metrics-server)提供伸缩指标,自动化脚本或Terraform调用云API创建/删除节点。
2. 准备工作与基础设施即代码
- 生成SSH密钥:ssh-keygen -t rsa -b 4096,保存公钥用于镜像/模板注入。
- 准备Terraform(可选):编写provider与instance template,变量化机型、镜像、cloud-init脚本,便于批量创建与回收。
3. 制作可自动加入集群的实例模板(cloud-init)
- cloud-init示例:在user-data里安装Docker/k3s并自动加入已有主节点(通过token+主节点IP)。
- 要点:把SSH公钥、主节点join命令、必要的防火墙规则写入cloud-init,保证新节点启动后自动就绪。
4. 部署轻量Kubernetes:k3s快速示例
- 在主节点安装:curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.24.0 sh -,记录/var/lib/rancher/k3s/server/node-token。
- 在cloud-init里使用:curl -sfL https://get.k3s.io | K3S_URL="https://主节点IP:6443" K3S_TOKEN="token" sh -,新节点会自动加入。
5. 监控与指标采集(Prometheus + metrics-server)
- 安装metrics-server:kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml。
- 安装Prometheus:使用prometheus-operator或kube-prometheus-stack,通过ServiceMonitor抓取节点与Pod指标,为自定义自动化决策提供数据。
6. 应用层弹性:Horizontal Pod Autoscaler (HPA)
- 打包容器并部署Deployment,确保设置requests/limits。
- 创建HPA:kubectl autoscale deploy myapp --cpu-percent=60 --min=2 --max=10,验证kubectl get hpa查看伸缩行为。
7. 节点层自动伸缩:两种实现方式
- 若云厂商支持:使用官方cluster-autoscaler并配置provider,安装后可根据Pending Pods自动扩容节点。
- 若无官方支持:编写外部控制器或脚本,周期性读取Prometheus或k8s API,触发云API(curl或terraform apply)创建/删除实例。
8. 示例:用Shell+云API简单扩/缩容脚本
- 扩容(伪代码): curl -X POST "https://api.cloud.tw/v1/instances" -H "Authorization: Bearer $TOKEN" -d '{"name":"node-`date +%s`","image":"ubuntu","user_data":"
..."}'。
- 缩容:先通过kubectl cordon+drain节点,然后调用DELETE实例API。务必等待Pod迁移完成再销毁实例,避免数据丢失。
9. 成本优化实战策略
- 使用抢占式/低价机型处理批量或可中断任务;关键服务运行在按需实例。
- 启用闲置节点自动停机并保留快照,或用最小长期运行池与动态池混合(长期稳定负载用小型常驻节点,尖峰用动态节点)。使用右尺寸化(monitor一周负载,调整规格)。
10. 自动化运维与备份策略
- 将基础镜像与cloud-init放入版本控制,结合Terraform实现可重复部署;定期备份etcd或应用数据库。
- 设置告警(CPU/内存/响应时长),并在成本与可用性阈值间建立SLA策略(例如:当成本>预算触发缩容警告并降级非关键服务)。
11. 测试与验证步骤(务必按顺序)
- 1) 在测试环境用负载测试(wrk/ab)制造流量,看HPA是否扩容Pod;2) 触发Pending Pod验证节点层扩容脚本或cluster-autoscaler是否创建实例;3) 模拟实例回收验证Drain流程与数据安全性。
12. 运维注意事项与安全
- 确保API Token与SSH Key安全,使用Vault或Secret管理;限制API权限仅可创建/删除实例且记录审计日志。
- 对公网端口做最小暴露,内部通信用私有网段,启用节点与Pod的资源配额与限制。
13. 问:在台湾云空间VPS上没有原生cluster-autoscaler支持,我该如何实现自动扩容?
答:可实现自定义外部控制器:1) 部署metrics(Prometheus)与监控脚本,2) 脚本读取k8s API(查找Pending Pods或CPU趋势),3) 调用云厂商实例创建API(或执行Terraform apply)并通过cloud-init让新节点自动join,完成后验证Pod调度;缩容时先kubectl drain再销毁实例。
14. 问:如何在保证成本最低的同时保证高峰期可用性?
答:采用混合池策略:保留小型常驻实例池保证基础可用,使用动态/抢占池应对峰值;对非关键任务用抢占实例并结合自动重试;设置预算警报与自动降级策略(如降低副本数或暂停非必要服务)。
15. 问:实现完成后有哪些常见故障排查步骤?
答:1) 若Pod无法调度,检查节点是否已创建并处于Ready;2) 若节点被立刻删除,检查缩容逻辑或云API回收策略;3) 若负载高但未扩容,查看metrics-server/Prometheus是否采集指标及autoscaler脚本日志;4) 检查cloud-init日志(/var/log/cloud-init.log)与k3s/kubelet日志定位失败原因。
来源:如何在台湾云空间vps上实现自动弹性伸缩与成本优化