Просмотр исходного кода

Refactor: Simplify global values.yaml, add revisionHistoryLimit, add deployment scripts and guides

DevOps Team 2 месяцев назад
Родитель
Сommit
b9217929b3

+ 183 - 0
DEPLOYMENT_CLEANUP_GUIDE.md

@@ -0,0 +1,183 @@
+# Helm 升级和清理指南
+
+## 概述
+
+本指南说明如何使用 `--cleanup-on-fail` 和自动清理机制来确保Helm升级时的稳定性。
+
+---
+
+## 方案说明
+
+### 1. 旧ReplicaSets的问题
+
+当使用 `helm upgrade` 时,Kubernetes会保留之前的ReplicaSets(包含历史版本的Pod信息)。如果新镜像无法启动,旧的RS会保留但不再运行任何Pod,造成资源浪费。
+
+### 2. 解决方案
+
+#### ✅ 方案A: 使用 `--cleanup-on-fail`(推荐)
+
+这个参数让Helm在升级失败时自动清理新创建的资源:
+
+```bash
+helm upgrade shop-recycle ./ --cleanup-on-fail -f environments/prod-values.yaml
+```
+
+#### ✅ 方案B: 设置 `revisionHistoryLimit`(自动清理)
+
+在 `base/templates/deployment.yaml` 中已配置 `revisionHistoryLimit: 3`,这意味着:
+- 只保留最近3个ReplicaSets版本
+- 更旧的RS会自动删除
+
+#### ✅ 方案C: 定期手动清理
+
+使用提供的清理脚本:
+
+```bash
+# 删除所有没有running pod的RS
+bash scripts/cleanup-old-replicasets.sh
+```
+
+---
+
+## 使用部署脚本
+
+### 快速部署(内置cleanup-on-fail)
+
+```bash
+# 开发环境
+./scripts/deploy-with-cleanup.sh dev
+
+# 预发布环境
+./scripts/deploy-with-cleanup.sh staging
+
+# 生产环境
+./scripts/deploy-with-cleanup.sh prod
+```
+
+### 脚本功能
+
+✅ 自动检测Release是否存在(选择install或upgrade)
+✅ 内置 `--cleanup-on-fail` 参数
+✅ 失败时自动清理资源
+✅ 升级成功后清理旧的ReplicaSets
+✅ 等待Pod就绪后才返回
+
+---
+
+## 检查旧ReplicaSets
+
+```bash
+# 查看所有ReplicaSets
+kubectl get rs -l project=shop-recycle
+
+# 查看没有running pod的RS
+kubectl get rs --field-selector=status.replicas=0 -l project=shop-recycle
+
+# 手动删除特定RS
+kubectl delete rs <rs-name>
+
+# 删除所有没有running pod的RS
+kubectl delete rs --field-selector=status.replicas=0 -l project=shop-recycle
+```
+
+---
+
+## 监控部署状态
+
+```bash
+# 查看Helm Release状态
+helm status shop-recycle
+
+# 查看部署历史
+helm history shop-recycle
+
+# 实时查看Pod日志
+kubectl logs -f -l project=shop-recycle
+
+# 查看特定服务日志
+kubectl logs -f -l app=shop-recycle-payment
+```
+
+---
+
+## 故障排查
+
+### 问题:升级失败但资源未清理
+
+**解决方案:**
+```bash
+# 手动清理
+helm upgrade shop-recycle ./ --cleanup-on-fail --force
+
+# 或者回滚到上一个版本
+helm rollback shop-recycle
+```
+
+### 问题:太多旧ReplicaSets占用空间
+
+**解决方案:**
+```bash
+# 减少历史版本保留数(编辑deployment.yaml的revisionHistoryLimit)
+# 或手动清理
+kubectl delete rs --field-selector=status.replicas=0
+```
+
+### 问题:Pod一直无法启动
+
+**检查日志:**
+```bash
+# 查看pod事件
+kubectl describe pod <pod-name>
+
+# 查看pod日志
+kubectl logs <pod-name>
+
+# 检查镜像是否可用
+kubectl describe pod <pod-name> | grep Image
+```
+
+---
+
+## 最佳实践
+
+### CI/CD集成示例
+
+**GitLab CI:**
+```yaml
+deploy_prod:
+  stage: deploy
+  script:
+    - helm upgrade shop-recycle ./
+      --cleanup-on-fail
+      -f environments/prod-values.yaml
+      --timeout 5m
+      --wait
+  only:
+    - master
+```
+
+**GitHub Actions:**
+```yaml
+- name: Helm Deploy
+  run: |
+    helm upgrade shop-recycle ./
+      --cleanup-on-fail
+      -f environments/prod-values.yaml
+      --timeout 5m
+      --wait
+```
+
+---
+
+## 配置总结
+
+| 配置项 | 文件 | 说明 |
+|--------|------|------|
+| `revisionHistoryLimit: 3` | `charts/base/templates/deployment.yaml` | 只保留最近3个RS版本 |
+| `--cleanup-on-fail` | 命令行参数 | 升级失败时自动清理 |
+| 清理脚本 | `scripts/cleanup-old-replicasets.sh` | 手动清理没有running的RS |
+| 部署脚本 | `scripts/deploy-with-cleanup.sh` | 一键部署(内置cleanup) |
+
+---
+
+**最后更新**: 2026-01-21

+ 218 - 0
GLOBAL_VALUES_REFACTORING.md

@@ -0,0 +1,218 @@
+# 全局values.yaml重构说明
+
+## 问题分析
+
+### 旧设计的问题 ❌
+- **严重冗余**: 全局values.yaml包含所有34个服务的完整配置(1073行)
+- **维护困难**: 修改镜像版本需要在全局和各服务文件中修改两次
+- **配置不同步**: 全局用 `your-registry`,但实际使用 `harbor.stardance`
+- **浪费空间**: 重复了charts/<service>/values.yaml中的所有配置
+
+### 示例对比
+
+**旧做法(冗余):**
+```yaml
+# 全局values.yaml (1073行)
+shop-recycle-payment:
+  image:
+    repository: your-registry/shop-recycle-payment
+    tag: "1.0.0"
+  config:
+    yml: {...}  # 500+ 行配置
+
+# + 各服务配置 (charts/shop-recycle-payment/values.yaml)
+shop-recycle-payment:
+  image:
+    repository: harbor.stardance/shoprecycle/shop-payment
+    tag: v2.0.0
+  config:
+    yml: {...}  # 相同的500+行配置
+```
+
+---
+
+## 新设计 ✅
+
+### 精简后的全局values.yaml
+
+**作用**: 仅定义真正的全局配置
+```yaml
+# 1. 全局镜像配置
+global:
+  image:
+    registry: harbor.stardance
+    pullPolicy: IfNotPresent
+    
+# 2. 全局标签(所有Pod都会附加)
+global:
+  labels:
+    platform: microservice-platform
+    project: shop-recycle
+    
+# 3. 服务启用/禁用开关
+shop-recycle-payment:
+  enabled: true
+shop-recycle-store:
+  enabled: true
+# ... 其他服务
+```
+
+**优点:**
+- ✅ 代码简洁(102行 vs 1073行)
+- ✅ 易于维护(单一职责)
+- ✅ 配置一致(无重复)
+- ✅ 易于快速启用/禁用服务
+
+---
+
+## 文件结构对比
+
+### 旧结构
+```
+values.yaml               (1073行, 冗余配置)
+├── global config
+├── shop-recycle-payment (完整配置)
+├── shop-recycle-store   (完整配置)
+└── ... 32个服务 (每个包含完整配置)
+
+charts/shop-recycle-payment/values.yaml  (独立配置)
+charts/shop-recycle-store/values.yaml    (独立配置)
+```
+
+**问题**: 配置在两个地方,容易不同步!
+
+### 新结构 (推荐)
+```
+values.yaml                            (102行, 仅全局和启用开关)
+├── global:
+│   ├── image
+│   └── labels
+└── <service>: enabled: true
+
+charts/shop-recycle-payment/values.yaml  (完整配置)
+├── app
+├── image
+├── service
+├── resources
+└── config
+    
+charts/shop-recycle-store/values.yaml   (完整配置)
+```
+
+**优点**: 单一配置源,配置一致!
+
+---
+
+## 使用方式
+
+### 查看当前配置
+```bash
+# 查看所有值(包括从charts/<service>/values.yaml继承的)
+helm template shop-recycle ./
+
+# 只查看全局值
+helm values ./
+```
+
+### 启用/禁用服务
+```bash
+# 禁用某个服务
+helm upgrade shop-recycle ./ \
+  --set shop-recycle-payment.enabled=false
+
+# 启用特定服务
+helm upgrade shop-recycle ./ \
+  --set shop-recycle-gateway.enabled=true
+```
+
+### 修改全局配置
+```bash
+# 修改全局镜像拉取策略
+helm upgrade shop-recycle ./ \
+  --set global.image.pullPolicy=Always
+
+# 修改全局标签
+helm upgrade shop-recycle ./ \
+  --set global.labels.environment=production
+```
+
+### 修改特定服务配置
+由于配置在各服务的values.yaml中,修改方式:
+
+```bash
+# 方式1: 命令行覆盖
+helm upgrade shop-recycle ./ \
+  --set shop-recycle-payment.image.tag=v2.1.0 \
+  --set shop-recycle-payment.app.replicaCount=3
+
+# 方式2: 使用环境特定的values文件
+helm upgrade shop-recycle ./ \
+  -f environments/prod-values.yaml
+
+# 方式3: 修改charts/shop-recycle-payment/values.yaml
+# 然后git push提交更新
+```
+
+---
+
+## 迁移检查清单
+
+- ✅ 全局values.yaml精简到102行(仅全局配置 + 启用开关)
+- ✅ 全局镜像registry更新为harbor.stardance
+- ✅ 所有34个服务的values.yaml独立配置完整
+- ✅ 旧的values.yaml备份为values.yaml.backup
+- ✅ 验证Helm chart仍然能正确部署
+
+---
+
+## FAQ
+
+### Q: 如何部署特定版本的服务?
+A: 修改 `charts/<service>/values.yaml` 的 `image.tag` 或使用命令行覆盖:
+```bash
+helm upgrade shop-recycle ./ \
+  --set shop-recycle-payment.image.tag=v2.1.0
+```
+
+### Q: 全局values.yaml还有用吗?
+A: 有的。用途:
+1. 定义全局镜像拉取策略
+2. 定义全局标签(Pod自动带上)
+3. 快速启用/禁用服务
+4. 环境级别的全局配置
+
+### Q: 如何批量修改所有服务的配置?
+A: 使用environment values文件:
+```yaml
+# environments/prod-values.yaml
+shop-recycle-payment:
+  app:
+    replicaCount: 3
+shop-recycle-store:
+  app:
+    replicaCount: 3
+shop-recycle-gateway:
+  app:
+    replicaCount: 5
+# ...其他服务
+```
+
+然后:
+```bash
+helm upgrade shop-recycle ./ -f environments/prod-values.yaml
+```
+
+---
+
+## 性能和维护收益
+
+| 方面 | 旧设计 | 新设计 | 收益 |
+|------|-------|-------|------|
+| 代码行数 | 1073 | 102 | 减少90% |
+| 维护点 | 68 (34服务×2文件) | 35 (34服务×1文件) | 减少50% |
+| 配置一致性 | 易出错 | 自动一致 | ✅ 高 |
+| 快速查看 | 困难 | 简单 | ✅ 高 |
+
+---
+
+**最后更新**: 2026-01-21

+ 1 - 0
charts/base/templates/deployment.yaml

@@ -6,6 +6,7 @@ metadata:
     app: {{ .Values.app.name }}
 spec:
   replicas: {{ .Values.app.replicaCount }}
+  revisionHistoryLimit: 3
   selector:
     matchLabels:
       app: {{ .Values.app.name }}

+ 13 - 0
scripts/cleanup-old-replicasets.sh

@@ -0,0 +1,13 @@
+#!/bin/bash
+# cleanup-old-replicasets.sh
+# 定期删除没有running pod的ReplicaSet和Deployment
+
+# 删除所有没有running pod的ReplicaSet
+echo "Cleaning up old ReplicaSets..."
+kubectl delete rs --field-selector=status.replicas=0 -n default
+
+# 删除所有没有running pod的Deployment  
+echo "Cleaning up orphaned Deployments..."
+kubectl get deployment -n default -o jsonpath='{.items[?(@.spec.replicas==0)].metadata.name}' | xargs -I {} kubectl delete deployment {} -n default
+
+echo "Cleanup completed!"

+ 66 - 0
scripts/deploy-with-cleanup.sh

@@ -0,0 +1,66 @@
+#!/bin/bash
+# deploy-with-cleanup.sh
+# Helm部署脚本,内置cleanup-on-fail和自动清理旧RS
+
+set -e
+
+RELEASE_NAME="shop-recycle"
+CHART_PATH="./"
+ENVIRONMENT="${1:-dev}"  # 默认dev环境
+
+case $ENVIRONMENT in
+  dev)
+    VALUES_FILE="environments/dev-values.yaml"
+    ;;
+  staging)
+    VALUES_FILE="environments/staging-values.yaml"
+    ;;
+  prod)
+    VALUES_FILE="environments/prod-values.yaml"
+    ;;
+  *)
+    echo "未知环境: $ENVIRONMENT"
+    echo "用法: ./deploy-with-cleanup.sh [dev|staging|prod]"
+    exit 1
+    ;;
+esac
+
+echo "=========================================="
+echo "部署配置:"
+echo "Release: $RELEASE_NAME"
+echo "环境: $ENVIRONMENT"
+echo "Values文件: $VALUES_FILE"
+echo "=========================================="
+
+# 检查Helm Release是否存在
+if helm status $RELEASE_NAME > /dev/null 2>&1; then
+  echo "升级现有Release..."
+  helm upgrade $RELEASE_NAME $CHART_PATH \
+    -f $VALUES_FILE \
+    --cleanup-on-fail \
+    --timeout 5m \
+    --wait
+  
+  echo "等待2秒后清理旧的ReplicaSets..."
+  sleep 2
+  
+  # 清理旧的ReplicaSets(只保留3个最新版本)
+  echo "清理旧的ReplicaSets..."
+  kubectl delete rs --field-selector=status.replicas=0 -l project=shop-recycle || true
+else
+  echo "安装新Release..."
+  helm install $RELEASE_NAME $CHART_PATH \
+    -f $VALUES_FILE \
+    --timeout 5m \
+    --wait
+fi
+
+echo "=========================================="
+echo "部署完成!"
+echo "=========================================="
+echo ""
+echo "验证部署状态:"
+helm status $RELEASE_NAME
+echo ""
+echo "查看Pods:"
+kubectl get pods -l project=shop-recycle -o wide

Разница между файлами не показана из-за своего большого размера
+ 44 - 1015
values.yaml