本教程针对中大型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内存本地存储网络推荐用途
Master4 核16 GB100 GB SSD≥ 1 Gbps控制平面
Worker Small8 核32 GB500 GB NVMe≥ 1 Gbps中等负载应用
Worker Medium16 核64 GB1 TB NVMe≥ 10 Gbps高负载、数据密集型
Worker HighPerf32 核128 GB2 TB NVMe≥ 25 GbpsML/大数据处理/高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 操作系统准备

在每台节点上执行:

sudo apt update && sudo apt upgrade -y
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

启用内核参数:

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

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组件

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 初始化控制平面(主节点)

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --control-plane-endpoint="LOADBALANCER_DNS:6443"

将输出的kubeadm join命令用于Worker节点加入。

3.5 部署网络插件(Calico示例)

kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml

四、私有镜像仓库(Harbor)

4.1 Harbor安装(Docker Compose)

在专用节点:

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:

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/CDJenkins实现镜像构建与发布。GitLab CI 示例:

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:

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

启用指标服务器:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

6.2 Cluster Autoscaler

Cluster Autoscaler根据节点资源自动伸缩:

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:

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)

helm install elasticsearch elastic/elasticsearch
helm install kibana elastic/kibana
helm install fluentd stable/fluentd

九、性能评测示例

以下为一次压测结果示例(使用k6模拟每秒1000次请求):

指标区域 A区域 B
平均响应时间120 ms135 ms
P95响应时间250 ms270 ms
错误率0.2%0.3%
HPA伸缩范围2→122→10
节点扩缩次数3次4次

十、总结与最佳实践

  • 资源预留与QoS 策略: Deployment中设置requests/limits确保稳定调度。
  • 镜像优化: 镜像体积控制在<200 MB以加快拉取。
  • 网络优化: 使用CNI插件如Calico的BGP模式提升East‑West吞吐。
  • 安全性: 启用Pod Security Policy或OPA/Gatekeeper做策略约束。
  • 灾备: 多Region集群+异地备份。

更多推荐