Day 12 - ConfigMap 与 Secret
📘 Day 12:ConfigMap 与 Secret
🎯 今日目标
- 会用 4 种方式创建 ConfigMap
- 会用 envFrom、valueFrom、volume 三种方式消费配置
- 能创建 Opaque、TLS、dockerconfigjson 三种 Secret
- 理解 ConfigMap 挂载为 Volume 时的热更新
- 掌握 immutable ConfigMap/Secret
🧠 理论精讲(30 分钟)
ConfigMap vs Secret
| 特性 | ConfigMap | Secret |
|---|---|---|
| 用途 | 非敏感配置 | 敏感数据(密码、证书) |
| 存储 | 明文(etcd 中) | Base64 编码(可配合加密) |
| 大小限制 | 1 MiB | 1 MiB |
| 热更新 | ✅(Volume 挂载模式) | ✅(Volume 挂载模式) |
消费配置的三种方式
1 | 1. envFrom — 整个 ConfigMap/Secret 作为环境变量 |
Secret 类型
| 类型 | 用途 | 数据 key 要求 |
|---|---|---|
| Opaque | 通用密钥(默认) | 任意 |
| kubernetes.io/tls | TLS 证书 | tls.crt、tls.key |
| kubernetes.io/dockerconfigjson | 镜像拉取凭证 | .dockerconfigjson |
| kubernetes.io/basic-auth | 基础认证 | username、password |
🔧 动手实操(120 分钟)
练习 12.1:ConfigMap 四种创建方式
1 | # 方式 1:--from-literal(字面值) |
练习 12.2:ConfigMap 三种使用方式
1 | # === 方式 1:envFrom(整批注入) === |
练习 12.3:ConfigMap 热更新验证
1 | # 1. 创建 ConfigMap 并以 Volume 方式挂载 |
练习 12.4:Secret 实战
1 | # 1. 创建 Opaque Secret |
练习 12.5:Immutable ConfigMap/Secret
1 | # 不可变(immutable)的 ConfigMap 不能修改,只能删除重建 |
🐛 排错练习(30 分钟)
场景 1:ConfigMap 未更新
1 | # 问题:修改了 ConfigMap,但应用没有变化 |
场景 2:Secret 未正确解码
1 | # 问题:Pod 中的环境变量显示乱码或空值 |
🏆 赛题模拟(40 分钟)
⚠️ 严格限时 35 分钟
题目:应用配置管理综合
1 | 【操作要求】 |
📋 命令速查
| 命令 | 功能 | 注解 |
|---|---|---|
kubectl get cm |
列出 ConfigMap | short name: cm |
kubectl get cm <name> -o yaml |
查看 ConfigMap 完整内容 | 检查所有 key-value 数据 |
kubectl create cm <name> --from-file=<file> |
从文件创建 ConfigMap | key 为文件名,value 为文件内容 |
kubectl create cm <name> --from-file=key=<file> |
从文件创建并指定 key | key 可以不同于文件名 |
kubectl create cm <name> --from-literal=key=value |
从字面值创建 ConfigMap | 快速创建简单配置项,多个 --from-literal 可合并 |
kubectl create cm <name> --from-env-file=<file> |
从 .env 文件创建 ConfigMap | 每行 KEY=VALUE 格式 |
kubectl get secret |
列出 Secret | 默认只显示名称和类型(不显示值) |
kubectl get secret <name> -o yaml |
查看 Secret 完整 YAML | data 字段为 base64 编码 |
kubectl get secret <name> -o jsonpath='{.data.<key>}' | base64 -d |
解码 Secret 某个 key | jsonpath 提取 + base64 解码,常用组合 |
kubectl get secret <name> -o jsonpath='{.data}' | jq 'map_values(@base64d)' |
解码所有 Secret 字段 | jq 一次性解码所有 base64 值 |
kubectl create secret generic <name> --from-literal=key=value |
创建 Opaque Secret | 值自动 base64 编码存储(注意:仅仅是编码非加密) |
kubectl create secret generic <name> --from-file=<file> |
从文件创建 Secret | 文件内容自动 base64 |
kubectl create secret docker-registry <name> --docker-server=<url> --docker-username=<user> --docker-password=<pass> |
创建镜像拉取密钥 | 私有镜像仓库认证 |
kubectl create secret tls <name> --cert=cert.pem --key=key.pem |
创建 TLS Secret | Ingress HTTPS 专用 |
kubectl describe cm <name> |
ConfigMap 概要 | 显示 key 列表但不显示 value |
kubectl edit cm <name> |
在线编辑 ConfigMap | 立即生效,挂载到 Pod 中的文件会延迟更新(取决于 kubelet 同步周期) |
kubectl set env deploy/<name> --from=cm/<cm-name> |
将 ConfigMap 注入为环境变量 | 更新 Deployment 环境变量,触发滚动更新 |
echo -n "secret-value" | base64 |
base64 编码 | 手动编码 Secret 值,填入 YAML 中的 data 字段 |
kubectl exec <pod> -- cat /etc/config/<key> |
验证 ConfigMap 挂载内容 | 确认文件内容和路径是否正确 |
📚 参考来源
| 来源 | 链接 / 说明 |
|---|---|
| Kubernetes 官方:ConfigMap | https://kubernetes.io/docs/concepts/configuration/configmap/ |
| Kubernetes 官方:Secret | https://kubernetes.io/docs/concepts/configuration/secret/ |
| Kubernetes 官方:配置 Pod 使用 ConfigMap | https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ |
| Kubernetes 官方:Secret 管理最佳实践 | https://kubernetes.io/docs/concepts/configuration/secret/#best-practices |
| Kubernetes 官方:不可变 ConfigMap 与 Secret | https://kubernetes.io/docs/concepts/configuration/configmap/#configmap-immutable |