本教程针对中大型SaaS(Software as a Service)平台在Ubuntu 20.04 LTS 环境下进行容器化部署、弹性伸缩与跨地域分布的完整解决方案。A5数据在文章中侧重实战细节、具体产品参数、硬件配置建议、实现步骤与性能评测数据,适合真实生产环境落地执行。
本文核心方案基于以下技术栈:
- 操作系统:Ubuntu 20.04 LTS
- 容器运行时:containerd
- 容器编排:Kubernetes 1.25+
- 镜像仓库:Harbor 2.7
- 负载均衡:NGINX Ingress Controller + MetalLB(裸金属)/云厂商LB(公有云)
- 自动弹性伸缩:Horizontal Pod Autoscaler(HPA)/Cluster Autoscaler
- 跨区域分布:多Kubernetes集群+全球负载调度(如DNS Geo Routing)
- 监控:Prometheus & Grafana
- 日志系统:EFK (Elasticsearch + Fluentd + Kibana)
一、架构总体设计
以下为目标平台架构图的文字描述:
全球流量调度(DNS Geo Routing)
│
┌────────────────┴───────────────────┐
│ │
区域A集群(K8s Cluster A) 区域B集群(K8s Cluster B)
│ │
┌───────┴────────┐ ┌──────────┴────────┐
│ Ingress/Load Balancer │ │ Ingress/Load Balancer │
│ HPA + CA │ │ HPA + CA │
│ App Pods (Deployment) │ │ App Pods (Deployment) │
│ Prometheus/Node Exporter│ │ Prometheus/Node Exporter│
- Kubernetes: 核心编排系统
- Ingress Controller + Load Balancer: 暴露服务,做L7流量管理
- HPA: 根据指标伸缩Pods
- Cluster Autoscaler: 根据节点资源状况自动扩缩节点
- 多Region部署: 每个区域独立集群,通过DNS Geo Routing实现按地域或健康度调度
二、香港服务器www.a5idc.com硬件资源及网络规划
为满足SaaS平台的弹性伸缩和高可用需求,硬件建议如下。
2.1 节点规格建议
| 角色 | CPU | 内存 | 本地存储 | 网络 | 推荐用途 |
|---|---|---|---|---|---|
| Master | 4 核 | 16 GB | 100 GB SSD | ≥ 1 Gbps | 控制平面 |
| Worker Small | 8 核 | 32 GB | 500 GB NVMe | ≥ 1 Gbps | 中等负载应用 |
| Worker Medium | 16 核 | 64 GB | 1 TB NVMe | ≥ 10 Gbps | 高负载、数据密集型 |
| Worker HighPerf | 32 核 | 128 GB | 2 TB NVMe | ≥ 25 Gbps | ML/大数据处理/高TPS |
真实生产环境中,建议使用NVMe SSD以优化I/O性能,并搭配高带宽网络(≥10 Gbps)以支持East‑West 流量。
2.2 网络规划
- Pod CIDR: 10.244.0.0/16
- Service CIDR: 10.96.0.0/12
- 跨区域连通性: 使用VPN或专线(如IPsec/WireGuard)构建集群间安全网络
- DNS全球调度: Cloudflare Load Balancing / AWS Route 53 Geo Routing
三、Kubernetes集群部署
3.1 操作系统准备
在每台节点上执行:
bash
sudo apt update && sudo apt upgrade -y
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
启用内核参数:
bash
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
3.2 安装containerd
bash
sudo apt install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
3.3 安装Kubernetes组件
bash
sudo apt install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3.4 初始化控制平面(主节点)
bash
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint="LOADBALANCER_DNS:6443"
将输出的kubeadm join命令用于Worker节点加入。
3.5 部署网络插件(Calico示例)
bash
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
四、私有镜像仓库(Harbor)
4.1 Harbor安装(Docker Compose)
在专用节点:
bash
wget https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-offline-installer-v2.7.0.tgz
tar xvf harbor-offline-installer-v2.7.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
# 编辑 harbor.yml: hostname, https 证书 等
sudo ./install.sh
4.2 Kubernetes中使用Harbor
创建Secret:
bash
kubectl create secret docker-registry harbor-regcred \
--docker-server=harbor.example.com \
--docker-username=admin \
--docker-password='HarborP@ssw0rd' \
--docker-email='admin@example.com'
在Deployment中引用此Secret。
五、应用持续交付
推荐使用GitLab CI/CD 或Jenkins实现镜像构建与发布。GitLab CI 示例:
yaml
stages:
- build
- deploy
build:
image: docker:20.10.16
services:
- docker:dind
script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" harbor.example.com
- docker build -t harbor.example.com/saas/app:$CI_COMMIT_SHA .
- docker push harbor.example.com/saas/app:$CI_COMMIT_SHA
deploy:
image: bitnami/kubectl:1.25
script:
- kubectl set image deployment/app-deployment app=harbor.example.com/saas/app:$CI_COMMIT_SHA -n production
六、弹性伸缩配置
6.1 Horizontal Pod Autoscaler
部署一个基于CPU的HPA:
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app-deployment
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
启用指标服务器:
bash
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
6.2 Cluster Autoscaler
Cluster Autoscaler根据节点资源自动伸缩:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: cluster-autoscaler
namespace: kube-system
spec:
template:
spec:
containers:
- image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.25.0
name: cluster-autoscaler
command:
- ./cluster-autoscaler
- --nodes=3:15:<YOUR_NODE_GROUP_NAME>
- --balance-similar-node-groups
- --skip-nodes-with-local-storage=false
七、跨区域部署与全球负载调度
实际生产多Region场景中,通常采用以下模式:
| 区域 | 集群数量 | 主要目的 |
|---|---|---|
| 华东(CN) | 3 | 服务国内SaaS客户 |
| 北美(US) | 3 | 服务北美/全球客户 |
| 欧洲(EU) | 3 | 服务欧盟GDPR合规客户 |
7.1 DNS Geo Routing
使用全球DNS服务提供商(Cloudflare Load Balancing 或AWS Route 53 GeoDNS):
- 配置A/AAAA 记录分别指向不同区域的Ingress IP
- 根据客户端IP归属地调度到最近的Region
7.2 数据同步
跨Region场景需处理数据一致性:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 主从/多主数据库 | 强一致性 | 网络延迟大 |
| Eventual Consistency (Kafka) | 可扩展性高 | 业务需容忍最终一致性 |
| API 同步 | 逻辑简单 | 易受网络抖动影响 |
根据业务类型选择恰当策略。
八、监控与日志
8.1 部署Prometheus & Grafana
使用Helm:
bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm install prometheus prometheus-community/prometheus
helm install grafana grafana/grafana
设置Node Exporter、Alertmanager、Dashboard。
8.2 日志系统(EFK)
bash
helm install elasticsearch elastic/elasticsearch
helm install kibana elastic/kibana
helm install fluentd stable/fluentd
九、性能评测示例
以下为一次压测结果示例(使用k6模拟每秒1000次请求):
| 指标 | 区域 A | 区域 B |
|---|---|---|
| 平均响应时间 | 120 ms | 135 ms |
| P95响应时间 | 250 ms | 270 ms |
| 错误率 | 0.2% | 0.3% |
| HPA伸缩范围 | 2→12 | 2→10 |
| 节点扩缩次数 | 3次 | 4次 |
十、总结与最佳实践
- 资源预留与QoS 策略: Deployment中设置requests/limits确保稳定调度。
- 镜像优化: 镜像体积控制在<200 MB以加快拉取。
- 网络优化: 使用CNI插件如Calico的BGP模式提升East‑West吞吐。
- 安全性: 启用Pod Security Policy或OPA/Gatekeeper做策略约束。
- 灾备: 多Region集群+异地备份。