非HELM环境下能否在Kubernetes Deployment中配置ConfigMap校验和?
实现ConfigMap更新自动重启Deployment(无需Helm)
当然可以实现,不需要依赖Helm,你只需要手动计算ConfigMap的校验和并添加到Deployment的注解中,就能触发ConfigMap更新后的自动滚动重启。
核心原理
Kubernetes的Deployment会监控Pod模板(spec.template)的内容变化,只要模板里的任何字段(包括注解)发生改变,就会触发滚动更新。把ConfigMap的校验和加到Deployment的注解里,当ConfigMap内容更新时,校验和也会变化,进而触发Deployment重启Pod。
具体操作步骤
计算单个ConfigMap的校验和
使用kubectl导出ConfigMap的YAML并计算SHA256校验和:kubectl get configmap <你的ConfigMap名称> -o yaml | sha256sum | awk '{print $1}'添加校验和到Deployment注解
在Deployment的metadata.annotations中,为每个ConfigMap添加对应的校验和注解,比如:apiVersion: apps/v1 kind: Deployment metadata: name: 你的Deployment名称 annotations: configmap/checksum-cm1: "abc123..." # 第一个ConfigMap的校验和 configmap/checksum-cm2: "def456..." # 第二个ConfigMap的校验和 configmap/checksum-cm3: "ghi789..." # 第三个ConfigMap的校验和 spec: # ... 其他Deployment配置 template: # ... Pod模板配置触发更新
每次更新ConfigMap后,重新计算对应的校验和,更新Deployment的注解(可以用kubectl apply -f <更新后的Deployment YAML>或者kubectl patch命令),Kubernetes就会自动滚动重启Pod。
自动化脚本示例
如果手动计算校验和太麻烦,可以写个简单的Shell脚本自动完成:
#!/bin/bash # 配置你的资源名称 CONFIGMAP_LIST=("cm1" "cm2" "cm3") DEPLOYMENT_NAME="my-app-deployment" # 构建注解字符串 ANNOTATIONS="" for CM in "${CONFIGMAP_LIST[@]}"; do # 计算当前ConfigMap的校验和 CM_HASH=$(kubectl get configmap "$CM" -o yaml | sha256sum | awk '{print $1}') ANNOTATIONS+=" configmap/checksum-$CM: \"$CM_HASH\"\n" done # 使用kubectl patch更新Deployment注解 kubectl patch deployment "$DEPLOYMENT_NAME" -p "$(cat <<EOF metadata: annotations: $(echo -e "$ANNOTATIONS") EOF )"
给脚本添加执行权限后,每次更新ConfigMap后运行它,就能自动更新Deployment的注解并触发重启。
内容的提问来源于stack exchange,提问作者Ankit Soni
相关产品推荐
相关产品推荐

