Helm 构建 ConfigMap 与 Secret 教程
# Helm 构建 ConfigMap 与 Secret 教程
## 一、背景说明
在 Kubernetes 中:
- **ConfigMap**:用于存储非敏感配置(如地址、端口、开关)
- **Secret**:用于存储敏感信息(如密码、密钥)
Helm 通过模板机制,将 `values.yaml` 中的配置渲染为 K8S 资源,实现统一管理。
---
## 二、项目结构
一个标准 Helm Chart 结构如下:
my-chart/
├── Chart.yaml
├── values.yaml
└── templates/
├── configmap.yaml
├── secret.yaml
└── deployment.yaml
---
## 三、定义 ConfigMap
### 1. 编写模板(templates/configmap.yaml)
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.config.name }}
namespace: {{ .Release.Namespace }}
data:
{{- range $key, $value := .Values.config.data }}
{{ $key }}: {{ $value | quote }}
{{- end }}
2. 编写配置(values.yaml)
config:
name: app-config
data:
APP_ENV: production
LOG_LEVEL: info
SERVICE_HOST: app-service
SERVICE_PORT: "8080"
3. 生成效果(示例)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
SERVICE_HOST: "app-service"
SERVICE_PORT: "8080"
四、定义 Secret
1. 编写模板(templates/secret.yaml)
apiVersion: v1
kind: Secret
metadata:
name: {{ .Values.secret.name }}
namespace: {{ .Release.Namespace }}
type: Opaque
data:
{{- range $key, $value := .Values.secret.data }}
{{ $key }}: {{ $value | b64enc }}
{{- end }}
2. 编写配置(values.yaml)
secret:
name: app-secret
data:
DB_PASSWORD: mypassword
API_KEY: my-api-key
3. 生成效果(示例)
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_PASSWORD: bXlwYXNzd29yZA==
API_KEY: bXktYXBpLWtleQ==
注意:Secret 中的数据会自动进行 base64 编码
五、在 Deployment 中引用
1. 引用 ConfigMap 和 Secret
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
template:
spec:
containers:
- name: app
image: my-app:latest
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
2. 容器内效果
容器启动后,会自动拥有如下环境变量:
APP_ENV=production
LOG_LEVEL=info
SERVICE_HOST=app-service
SERVICE_PORT=8080
DB_PASSWORD=mypassword
API_KEY=my-api-key
六、部署流程
1. 安装 Chart
helm install my-app ./my-chart
2. 更新配置
helm upgrade my-app ./my-chart
3. 查看资源
kubectl get configmap
kubectl get secret
4. 查看渲染结果(推荐)
helm template my-app ./my-chart
七、多环境配置(推荐)
可以通过不同 values 文件区分环境:
values-dev.yaml
values-test.yaml
values-prod.yaml
部署方式:
helm install my-app -f values-prod.yaml ./my-chart
八、进阶优化
1. 自动触发 Pod 重启(配置变更)
在 Deployment 中增加:
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
2. 按模块拆分配置
建议不要将所有配置放在一个 ConfigMap 中:
app-db-config
app-cache-config
app-message-config
3. 最小权限原则
只给需要的服务注入对应配置
避免所有服务共享所有 Secret
九、总结
Helm 构建配置的核心逻辑:
values.yaml(配置)
+
templates/*.yaml(模板)
↓
生成 Kubernetes ConfigMap / Secret
通过这种方式,可以实现:
配置集中管理
多环境隔离
自动化部署
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu