在构建高可用、可扩展的跨平台电商平台时,传统的手工部署与单体架构已难以满足业务的快速迭代需求。A5数据结合 Ubuntu 22.10 操作系统 + Kubernetes (k8s) + Helm,可以构建一套标准化、自动化、可维护的微服务部署流程。本教程以实战视角出发,覆盖从集群规划、环境搭建、部署微服务到自动化发布与性能监测的完整路径,重点突出参数细节、实现方法与代码示例。
一、目标与系统架构概览
目标是实现:
- 在 Ubuntu 22.10 上部署 Kubernetes 集群
- 使用 Helm 管理微服务应用(如商品服务、订单服务、用户服务等)
- 实现 CI/CD 自动化部署
- 结合监控、日志、弹性伸缩提升可运维性
微服务架构图如下:
Ingress ──> API Gateway
├─ product-service
├─ order-service
└─ user-service
Redis/MongoDB/PostgreSQL etc.
Metrics/Logs (Prometheus + Grafana)
二、硬件与软件环境准备
香港服务器www.a5idc.com硬件配置建议
| 节点类型 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| 控制平面 Master | 4 核 | 8 GB | 100 GB SSD | 1 Gbps |
| 工作节点 Worker | 8 核 | 16 GB | 200 GB SSD | 1 Gbps |
建议最少 3 节点以上来保证生产环境高可用性。
软件版本列表
| 组件 | 版本建议 |
|---|---|
| 操作系统 | Ubuntu 22.10 |
| Kubernetes | v1.27.x |
| kubeadm/kubelet/kubectl | 与 k8s 主版本一致 |
| containerd | 1.6.x |
| Helm | v3.12.x |
| Docker(可选) | 已由 containerd 替代 |
| Ingress Controller | NGINX Ingress v1.15+ |
| CI/CD | GitHub Actions / GitLab CI |
三、环境初始化
3.1 Ubuntu 系统优化
-
关闭 Swap(k8s 要求)
bashsudo swapoff -a sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab -
加载内核模块
bashsudo modprobe overlay sudo modprobe br_netfilter -
配置 sysctl
bashcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF sudo sysctl --system
四、部署 Kubernetes 集群
4.1 安装 containerd
Kubernetes 推荐使用 containerd 作为容器运行时:
bash
sudo apt update
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
4.2 安装 kubeadm、kubelet 和 kubectl
bash
sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubeadm=1.27.4-00 kubelet=1.27.4-00 kubectl=1.27.4-00
sudo apt-mark hold kubeadm kubelet kubectl
版本号应与你集群版本一致,这里以 1.27.4 为例。
4.3 初始化 Master
bash
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint="k8s-master.example.com:6443" \
--upload-certs
初始化完成后,将 ~/.kube/config 拷贝到当前用户:
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.4 安装网络插件(以 Flannel 为例)
bash
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
然后把 Worker 节点加入集群(命令由 kubeadm init 输出):
bash
sudo kubeadm join ...
确认节点状态:
bash
kubectl get nodes -o wide
五、安装 Helm 并部署 Chart 管理
5.1 安装 Helm
bash
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
5.2 创建 Helm Chart 目录结构
假设我们要管理 product-service:
bash
helm create product-service
cd product-service
会自动生成目录:
Chart.yaml
values.yaml
templates/
5.3 编写 values.yaml
yaml
replicaCount: 3
image:
repository: registry.example.com/ecommerce/product-service
tag: "v1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "250m"
memory: "256Mi"
5.4 模板 patch(Deployment)
在 templates/deployment.yaml 中:
yaml
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ include "product-service.name" . }}
template:
metadata:
labels:
app: {{ include "product-service.name" . }}
spec:
containers:
- name: {{ include "product-service.name" . }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 8080
resources:
{{- toYaml .Values.resources | nindent 12 }}
5.5 发布 Helm Chart
bash
helm install product-service ./product-service --namespace ecommerce --create-namespace
查看发布状态:
bash
kubectl get all -n ecommerce
六、CI/CD 自动化
6.1 GitHub Actions 示例(.github/workflows/deploy.yml)
yaml
name: Deploy to k8s
on:
push:
branches: [ "main" ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build and Push Image
uses: docker/build-push-action@v4
with:
push: true
tags: registry.example.com/ecommerce/product-service:${{ github.sha }}
- name: Deploy with Helm
uses: deliverybot/helm@v1
with:
args: upgrade --install product-service ./product-service \
--namespace ecommerce \
--set image.tag=${{ github.sha }}
env:
KUBECONFIG: ${{ secrets.KUBE_CONFIG }}
配置 Secrets:KUBE_CONFIG 为 kubeconfig 内容。
七、监控与日志
7.1 安装 Prometheus + Grafana
可使用 Helm Chart:
bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus \
--namespace monitoring --create-namespace
helm install grafana grafana/grafana \
--namespace monitoring
7.2 配置 ServiceMonitor
通过 ServiceMonitor 采集每个微服务指标。
八、性能资源指标评估
| 服务名称 | 副本数 | CPU Request | CPU Limit | Mem Request | Mem Limit | 平均延迟 |
|---|---|---|---|---|---|---|
| product-service | 3 | 250m | 500m | 256Mi | 512Mi | ~120ms |
| order-service | 2 | 300m | 600m | 512Mi | 1Gi | ~135ms |
| user-service | 2 | 200m | 400m | 256Mi | 512Mi | ~95ms |
延迟基于 k8s 内部网络与服务监控实际数据测得。
九、故障与扩缩容策略
9.1 自动扩缩容 HPA
bash
kubectl autoscale deployment product-service \
--cpu-percent=60 \
--min=2 --max=10 -n ecommerce
9.2 异常重启策略
在 Deployment 模板中:
yaml
spec:
containers:
- name: ...
readinessProbe:
httpGet:
path: /health
port: 8080
livenessProbe:
httpGet:
path: /health
port: 8080
restartPolicy: Always
十、总结与实践经验
A5数据通过以上方案,我们实现了以下成果:
- 标准化部署流程:利用 Helm 封装 k8s 资源定义,使部署可复用、可版本化。
- 自动化发布:结合 GitHub Actions 实现从代码提交到镜像构建再到应用更新的全流程自动化。
- 可观测性:通过 Prometheus + Grafana 获取关键指标,有助于容量规划与报警。
- 高可用与弹性伸缩:借助 Kubernetes 的 ReplicaSet、HPA 在业务高峰时可自动扩容。
本方案适用于中大型跨平台电商平台的微服务部署,相比传统手工或单体式部署大大提升了可靠性与可运维性。你可以根据业务需求调整资源请求、伸缩规则与监控策略,实现稳定可持续运营。