18.5.3 版本与配置管理:制品、配置中心与密钥

版本与配置管理:制品、配置中心与密钥#

在CD流程中,版本与配置管理决定发布的可追溯性、可重复性与安全性。目标是“同一制品、不同配置”,确保回滚、审计和多环境一致性。

原理草图:制品、配置中心与密钥的协作#

文章图片

制品管理:构建一次、处处发布(含示例)#

  • 版本策略:语义化版本 + 构建号 + Git提交。
  • 不可变制品:禁止同版本覆盖,便于回滚。
  • 镜像优先使用Digest:确保拉取一致。

示例:生成版本号并打包

# 在仓库根目录
git rev-parse --short HEAD
export SEMVER=1.2.3
export BUILD_NO=45
export GIT_SHA=$(git rev-parse --short HEAD)
export APP_VER="${SEMVER}+build.${BUILD_NO}.sha${GIT_SHA}"

echo "APP_VER=${APP_VER}" > build-info.txt
mvn -Drevision=${APP_VER} clean package

# 预期:target/*.jar 以版本号可追溯

示例:推送镜像并记录Digest

# 构建镜像并推送
docker build -t harbor.example.com/app/api:${APP_VER} .
docker push harbor.example.com/app/api:${APP_VER}

# 获取Digest并写入部署清单
DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' harbor.example.com/app/api:${APP_VER})
echo "IMAGE_DIGEST=${DIGEST}" >> build-info.txt
echo "${DIGEST}"
# 预期:IMAGE_DIGEST=harbor.example.com/app/api@sha256:xxx

常见排错
- 推送失败:401 Unauthorized
处理:确认Harbor凭据与项目权限。
bash docker login harbor.example.com # 再次 push
- 同版本覆盖
处理:仓库启用“不可变标签”,或在Pipeline中检查版本是否已存在。

配置管理:外置化与环境隔离(含示例)#

  • 配置外置化:应用不内置环境配置。
  • 配置版本化:每次变更记录与可回滚。

安装示例:Nacos(单机)

# 解压并启动(示例路径)
tar -zxvf nacos-server-2.2.3.tar.gz -C /opt
cd /opt/nacos/bin
./startup.sh -m standalone

# 预期:控制台 http://127.0.0.1:8848/nacos

配置示例:Nacos中按环境区分

# dataId: app.yaml, group: DEFAULT_GROUP, namespace: dev
server:
  port: 8080
db:
  url: jdbc:mysql://dev-mysql:3306/app
feature:
  gray: false

应用读取配置(示例:Spring Boot)

# application.yaml
spring:
  config:
    import: nacos:app.yaml?group=DEFAULT_GROUP&namespace=dev

排错与诊断

# 检查Nacos健康
curl -s http://127.0.0.1:8848/nacos/actuator/health

# 常见错误:应用无法拉取配置
# 1) namespace配置错误 2) 权限未授权 3) 配置未发布

密钥与敏感信息管理(含示例)#

  • 密钥外置:禁止硬编码。
  • 最小权限原则:按环境、应用、角色授权。

示例:Kubernetes Secret

# 创建密钥
kubectl -n prod create secret generic db-cred \
  --from-literal=username=app \
  --from-literal=password='S3cReT!'

# 在Deployment中引用
cat <<'EOF' > deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  template:
    spec:
      containers:
      - name: api
        image: harbor.example.com/app/api@sha256:xxx
        env:
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: db-cred
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: db-cred
              key: password
EOF
kubectl -n prod apply -f deploy.yaml

排错提示
- 环境变量为空:检查secret名称与key是否一致。
- 日志泄露:Pipeline中禁用set -x或敏感输出。

Jenkins中的落地实践(含Pipeline)#

pipeline {
  agent any
  environment {
    REGISTRY = "harbor.example.com"
    APP = "app/api"
  }
  stages {
    stage('Build') {
      steps {
        sh '''
          SEMVER=1.2.3
          BUILD_NO=${BUILD_NUMBER}
          GIT_SHA=$(git rev-parse --short HEAD)
          APP_VER="${SEMVER}+build.${BUILD_NO}.sha${GIT_SHA}"
          echo "APP_VER=${APP_VER}" > build-info.txt
          mvn -Drevision=${APP_VER} clean package
        '''
      }
    }
    stage('Image & Push') {
      steps {
        sh '''
          source build-info.txt
          docker build -t ${REGISTRY}/${APP}:${APP_VER} .
          docker push ${REGISTRY}/${APP}:${APP_VER}
          DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' ${REGISTRY}/${APP}:${APP_VER})
          echo "IMAGE_DIGEST=${DIGEST}" >> build-info.txt
        '''
      }
    }
    stage('Deploy') {
      steps {
        withCredentials([string(credentialsId: 'nacos-token', variable: 'NACOS_TOKEN')]) {
          sh '''
            source build-info.txt
            echo "Deploying ${IMAGE_DIGEST}"
            # 参数化环境与配置
            kubectl -n prod set image deploy/api api=${IMAGE_DIGEST}
          '''
        }
      }
    }
  }
}

常见风险与规避(带操作)#

  • 环境漂移:配置未版本化
    规避:配置中心启用历史版本并定期导出。
    bash # Nacos配置导出(示例) curl -H "Authorization: Bearer $NACOS_TOKEN" \ "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=app.yaml&group=DEFAULT_GROUP&tenant=dev"
  • 制品不可变性缺失:同标签覆盖
    规避:启用Harbor“不可变标签”策略。
  • 密钥泄露:日志输出敏感信息
    规避:Pipeline中使用Credentials绑定,禁止打印。

练习与验证#

  1. 制品回滚练习
    - 构建两个版本镜像,记录Digest。
    - 用kubectl set image切换到旧Digest验证回滚。
  2. 配置变更验证
    - 在Nacos修改feature.gray=true,验证应用动态刷新。
  3. 密钥轮转演练
    - 更新K8s Secret并滚动重启,确保应用无明文密码。

通过“制品不可变+配置可控+密钥安全”的组合,可以实现可追溯、可回滚、可审计的稳定发布体系。