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绑定,禁止打印。
练习与验证#
- 制品回滚练习
- 构建两个版本镜像,记录Digest。
- 用kubectl set image切换到旧Digest验证回滚。 - 配置变更验证
- 在Nacos修改feature.gray=true,验证应用动态刷新。 - 密钥轮转演练
- 更新K8s Secret并滚动重启,确保应用无明文密码。
通过“制品不可变+配置可控+密钥安全”的组合,可以实现可追溯、可回滚、可审计的稳定发布体系。