11. 交付与运维
11.1 部署方案
部署架构
智能物流解决方案采用容器化部署,基于Kubernetes集群:
部署拓扑
容器化部署
Docker镜像构建
1. 应用镜像构建
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 启动 应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
2. 镜像构建命令
docker build -t logistics-api:latest .
docker tag logistics-api:latest registry.example.com/logistics-api:v1.0.0
docker push registry.example.com/logistics-api:v1.0.0
Kubernetes部署
1. Deployment配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: logistics-api
namespace: logistics
spec:
replicas: 3
selector:
matchLabels:
app: logistics-api
template:
metadata:
labels:
app: logistics-api
spec:
containers:
- name: api
image: registry.example.com/logistics-api:v1.0.0
ports:
- containerPort: 8000
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: logistics-config
key: db_host
- name: REDIS_HOST
valueFrom:
configMapKeyRef:
name: logistics-config
key: redis_host
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "2Gi"
cpu: "2000m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 10
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: logistics-api-service
namespace: logistics
spec:
selector:
app: logistics-api
ports:
- protocol: TCP
port: 8000
targetPort: 8000
type: LoadBalancer
2. ConfigMap配置
apiVersion: v1
kind: ConfigMap
metadata:
name: logistics-config
namespace: logistics
data:
db_host: "mysql-service"
db_port: "3306"
db_name: "logistics"
redis_host: "redis-service"
redis_port: "6379"
milvus_host: "milvus-service"
milvus_port: "19530"
3. Secret配置
apiVersion: v1
kind: Secret
metadata:
name: logistics-secret
namespace: logistics
type: Opaque
data:
db_password: <base64-encoded-password>
api_key: <base64-encoded-api-key>
数据库部署
MySQL部署
1. MySQL主从部署
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-master
namespace: logistics
spec:
serviceName: mysql-master
replicas: 1
selector:
matchLabels:
app: mysql-master
template:
metadata:
labels:
app: mysql-master
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root-password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 100Gi
Redis部署
1. Redis集群部署
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
namespace: logistics
spec:
serviceName: redis
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 50Gi
11.2 CI/CD流程
持续集成
GitHub Actions配置
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest pytest-cov
- name: Run unit tests
run: |
pytest tests/unit --cov=src --cov-report=xml
- name: Run integration tests
run: |
pytest tests/integration
- name: Upload coverage
uses: codecov/codecov-action@v2
with:
file: ./coverage.xml
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Registry
uses: docker/login-action@v1
with:
registry: registry.example.com
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: |
registry.example.com/logistics-api:${{ github.sha }}
registry.example.com/logistics-api:latest
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v2
- name: Set up kubectl
uses: azure/setup-kubectl@v1
- name: Configure kubectl
run: |
echo "${{ secrets.KUBECONFIG }}" | base64 -d > kubeconfig
export KUBECONFIG=kubeconfig
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/logistics-api \
api=registry.example.com/logistics-api:${{ github.sha }} \
-n logistics
kubectl rollout status deployment/logistics-api -n logistics
持续部署
部署策略
1. 蓝绿部署
- 策略:同时运行两个版本,切换流量
- 优势:快速回滚,零停机时间
- 适用场景:生产环境部署
2. 滚动更新
- 策略:逐步替换旧版本
- 优势:资源利用率高,部署平滑
- 适用场景:开发、测试环境部署
3. 金丝雀发布
- 策略:先发布到小部分用户,逐步扩大
- 优势:风险可控,问题影响小
- 适用场景:重要功能发布
11.3 运维管理
日常运维
监控和告警
1. 系统监控
- 监控指标:CPU、内存、磁盘、网络使用率
- 监控工具:Prometheus + Grafana
- 告警规则:资源使用率超过阈值时告警
2. 应用监控
- 监控指标:API响应时间、错误率、吞吐量
- 监控工具:Prometheus + Grafana
- 告警规则:响应时间超过阈值或错误率过高时告警
3. 业务监控
- 监控指标:订单处理量、路径规划量、风险预警量
- 监控工具:Prometheus + Grafana
- 告警规则:业务指标异常时告警
日志管理
1. 日志采集
- 采集工具:Filebeat、Fluentd
- 采集范围:应用日志、系统日志、访问日志
- 日志格式:JSON格式,结构化日志
2. 日志存储
- 存储工具:Elasticsearch
- 存储策略:实时日志存储7天,历史日志归档
- 日志查询:Kibana查询界面
3. 日志分析
- 分析工具:Kibana、ELK Stack
- 分析内容:错误日志分析、性能日志分析、业务日志分析
故障处理
故障分类
1. 严重故障
- 定义:系统完全不可用,影响所有用户
- 响应时间:15分钟内响应
- 处理时间:1小时内恢复
2. 重要故障
- 定义:系统部分功能不可用,影响部分用户
- 响应时间:30分钟内响应
- 处理时间:4小时内恢复
3. 一般故障
- 定义:系统功能异常,影响较小
- 响应时间:1小时内响应
- 处理时间:8小时内恢复
故障处理流程
容量规划
容量评估
1. 业务容量评估
- 订单处理量:评估每日订单处理量
- 路径规划量:评估每日路径规划量
- 风险预测量:评估每日风险预测量
2. 系统容量评估
- 计算资源:评估CPU、内存需求
- 存储资源:评估存储空间需求
- 网 络资源:评估网络带宽需求
扩容策略
1. 水平扩容
- 策略:增加服务器数量
- 优势:扩容灵活,不影响现有服务
- 适用场景:应用服务扩容
2. 垂直扩容
- 策略:增加服务器配置
- 优势:扩容简单,成本较低
- 适用场景:数据库服务扩容
11.4 备份与恢复
备份策略
数据备份
1. 数据库备份
- 备份方式:每日全量备份,每小时增量备份
- 备份存储:备份数据加密存储
- 备份保留期:全量备份保留30天,增量备份保留7天
2. 文件备份
- 备份方式:每日全量备份
- 备份存储:备份数据加密存储
- 备份保留期:备份保留30天
备份验证
1. 备份完整性验证
- 验证方式:定期验证备份文件完整性
- 验证频率:每周验证一次
- 验证结果:备份完整性100%
2. 备份恢复测试
- 测试方式:定期测试备份恢复
- 测试频率:每月测试一次
- 测试结果:恢复成功率100%
恢复策略
恢复方案
1. 全量恢复
- 恢复时间:< 2小时
- 恢复步骤:停止服务 → 恢复数据 → 启动服务 → 验证功能
2. 增量恢复
- 恢复时间:< 1小时
- 恢复步骤:停止服务 → 恢复增量数据 → 启动服务 → 验证功能
3. 点对点恢复
- 恢复时间:< 30分钟
- 恢复步骤:停止服务 → 恢复到指定时间点 → 启动服务 → 验证功能
11.5 文档管理
技术文档
文档类型
1. API文档
- 文档内容:API接口说明、参数说明、返回值说明
- 文档格式:OpenAPI 3.0规范
- 文档更新:API变更时同步更新
2. 架构文档
- 文档内容:系统架构、技术选型、部署方案
- 文档格式:Markdown格式
- 文档更新:架构变更时同步更新
3. 运维文档
- 文档内容:部署步骤、运维手册、故障处理
- 文档格式:Markdown格式
- 文档更新:运维流程变更时同步更新
用户文档
文档类型
1. 用户手册
- 文档内容:功能说明、操作指南、常见问题
- 文档格式:在线文档、PDF文档
- 文档更新:功能更新时同步更新
2. 培训材料
- 文档内容:培训PPT、培训视频、操作演示
- 文档格式:PPT、视频、在线演示
- 文档更新:培训内容更新时同步更新