ConfigMap配置管理 🔧
ConfigMap概述 💡
- 概念: ConfigMap是Kubernetes中用于存储非敏感配置数据的API对象,以键值对形式存储配置信息
- 实现: 提供了向Pod注入配置数据的标准方法,实现镜像与配置的解耦,提升应用的可移植性和可复用性
ConfigMap典型使用场景 🎯
- 概念: ConfigMap在实际应用中的主要用途
- 实现:
- 填充环境变量的值
- 设置容器内的命令行参数
- 填充卷的配置文件
ConfigMap创建方式 🛠️
1. 使用字面值创建
1
| kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
|
2. 使用文件创建
1
| kubectl create configmap my-config --from-file=path/to/bar
|
3. 使用目录创建
1
| kubectl create configmap my-config --from-file=path/to/bar
|
4. 编写YAML文件创建
通过定义完整的YAML清单文件来创建ConfigMap对象
1 2 3 4 5 6 7 8
| apiVersion: v1 kind: ConfigMap metadata: name: my-config namespace: default data: key1: config1 key2: config2
|
ConfigMap注入方式 🚀
1. 环境变量方式
通过spec.env或spec.envFrom进行引用配置数据
2. 卷挂载方式
通过spec.volumes引用,将ConfigMap挂载到容器内部的文件或目录
环境变量注入示例 📝
使用spec.env方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| apiVersion: v1 kind: Pod metadata: name: cm-pod-test001 spec: containers: - name: cm-test image: tomcat:8 command: ["/bin/sh", "-c", "env | grep APP"] env: - name: APPCONF01 valueFrom: configMapKeyRef: name: cm-test01 key: appconf01 - name: APPCONF02 valueFrom: configMapKeyRef: name: cm-test01 key: appconf02
|
使用spec.envFrom方式
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: Pod metadata: name: cm-pod-test002 spec: containers: - name: cm-test2 image: tomcat:8 command: ["/bin/sh", "-c", "env"] envFrom: - configMapRef: name: cm-test01
|
Volume挂载示例 📁
指定items的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: v1 kind: Pod metadata: name: cm-pod-test003 spec: containers: - name: cm-test3 image: tomcat:8 volumeMounts: - name: vm-01-1 mountPath: /conf volumes: - name: vm-01-1 configMap: name: cm-test-file items: - key: key-testproperties path: test.properties
|
不指定items的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| apiVersion: v1 kind: Pod metadata: name: cm-pod-test004 spec: containers: - name: cm-test4 image: tomcat:8 volumeMounts: - name: vm-02-2 mountPath: /conf volumes: - name: vm-02-2 configMap: name: cm-test-file
|
Secret密文管理 🔒
Secret概述 🔐
- 概念: Secret对象与ConfigMap对象类似,专门用于存储敏感信息
- 实现: 主要存储密码、OAuth token和SSH key等敏感数据,比直接存储在Pod定义或Docker镜像中更加安全和灵活
Secret类型 🏷️
1. Opaque类型
- 特点: 使用base64编码存储信息
- 安全性: 可以通过
base64 --decode解码获得原始数据,安全性相对较弱
2. kubernetes.io/dockerconfigjson类型
- 用途: 专门用于存储docker registry的认证信息
3. kubernetes.io/service-account-token类型
- 用途: 用于被serviceaccount引用的服务账号令牌
Secret创建方式 🛠️
1. 从文件中创建Secret
1 2 3
| echo -n "admin" > ./username.txt echo -n "123456" > ./password.txt kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
|
2. 使用描述文件创建Secret
首先进行base64编码:
1 2
| echo -n 'name' | base64 echo -n '123456' | base64
|
然后创建secret.yaml文件:
1 2 3 4 5 6 7 8
| apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: bmFtZQ== password: MTIzNDU2
|
Secret注入方式 🚀
1. 将Secret挂载到Volume中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret
|
2. 将Secret设置为环境变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: v1 kind: Pod metadata: name: secret-env-pod spec: containers: - name: mycontainer image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password
|
ConfigMap热更新机制 🔄
更新特性说明 ⚡
- Volume挂载方式: 可以感知配置变化(延迟几秒到一分钟左右)
- 环境变量方式: 不会自动更新,需要重启Pod才能生效
使用建议 💡
- 频繁变化的配置: 推荐使用Volume挂载方式
- 固定配置: 可以使用环境变量注入方式
实际应用示例 🎯
MySQL密码注入Pod示例 🗄️
1. 创建Secret
1
| kubectl create secret generic test --from-literal=MYSQL_ROOT_PASSWORD=1234567
|
2. 创建Deployment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| apiVersion: apps/v1 kind: Deployment metadata: name: myapp-demo namespace: default spec: replicas: 1 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: mysql mountPath: /test/ volumes: - name: mysql secret: secretName: test
|
注意事项 ⚠️
- 安全性: Secret虽然使用base64编码,但并非真正的加密,敏感信息仍需谨慎处理
- 性能: ConfigMap和Secret都有大小限制,不宜存储过大的配置文件
- 更新策略: 根据配置变化频率选择合适的注入方式
- 权限管理: 合理设置RBAC权限,控制ConfigMap和Secret的访问范围
通过合理使用ConfigMap和Secret,可以实现Kubernetes应用的配置与镜像分离,提升应用的可维护性和安全性 🚀