ConfigMap配置与密文管理详解

发表于
更新于
2 4.7~6.1 分钟 2136

ConfigMap配置管理 🔧

ConfigMap概述 💡

  • 概念: ConfigMap是Kubernetes中用于存储非敏感配置数据的API对象,以键值对形式存储配置信息
  • 实现: 提供了向Pod注入配置数据的标准方法,实现镜像与配置的解耦,提升应用的可移植性和可复用性

ConfigMap典型使用场景 🎯

  • 概念: ConfigMap在实际应用中的主要用途
  • 实现:
    • 填充环境变量的值
    • 设置容器内的命令行参数
    • 填充卷的配置文件

ConfigMap创建方式 🛠️

1. 使用字面值创建

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

2. 使用文件创建

kubectl create configmap my-config --from-file=path/to/bar

3. 使用目录创建

kubectl create configmap my-config --from-file=path/to/bar

4. 编写YAML文件创建

通过定义完整的 YAML 清单文件来创建 ConfigMap 对象

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: ConfigMap # 资源类型,声明为ConfigMap对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: my-config # ConfigMap的名称
  namespace: default # 所属命名空间
data: # 配置数据,以键值对形式存储
  key1: config1 # 配置键值对1
  key2: config2 # 配置键值对2

ConfigMap注入方式 🚀

1. 环境变量方式

通过spec.envspec.envFrom进行引用配置数据

2. 卷挂载方式

通过spec.volumes引用,将 ConfigMap 挂载到容器内部的文件或目录

环境变量注入示例 📝

使用spec.env方式

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: Pod # 资源类型,声明为Pod对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: cm-pod-test001 # Pod的名称
spec: # Pod规格,定义Pod的配置
  containers: # 容器列表
    - name: cm-test # 容器名称
      image: tomcat:8 # 容器镜像
      command: ["/bin/sh", "-c", "env | grep APP"] # 容器启动命令
      env: # 环境变量配置
        - name: APPCONF01 # 环境变量名称
          valueFrom: # 值来源配置
            configMapKeyRef: # ConfigMap键引用
              name: cm-test01 # ConfigMap名称
              key: appconf01 # ConfigMap中的键名
        - name: APPCONF02 # 环境变量名称
          valueFrom: # 值来源配置
            configMapKeyRef: # ConfigMap键引用
              name: cm-test01 # ConfigMap名称
              key: appconf02 # ConfigMap中的键名

使用spec.envFrom方式

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: Pod # 资源类型,声明为Pod对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: cm-pod-test002 # Pod的名称
spec: # Pod规格,定义Pod的配置
  containers: # 容器列表
    - name: cm-test2 # 容器名称
      image: tomcat:8 # 容器镜像
      command: ["/bin/sh", "-c", "env"] # 容器启动命令
      envFrom: # 环境变量来源配置
        - configMapRef: # ConfigMap引用
            name: cm-test01 # ConfigMap名称,所有键值对都会作为环境变量注入

Volume挂载示例 📁

指定items的方式

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: Pod # 资源类型,声明为Pod对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: cm-pod-test003 # Pod的名称
spec: # Pod规格,定义Pod的配置
  containers: # 容器列表
    - name: cm-test3 # 容器名称
      image: tomcat:8 # 容器镜像
      volumeMounts: # 卷挂载配置
        - name: vm-01-1 # 卷名称,与volumes中的name对应
          mountPath: /conf # 挂载路径,容器内的目录路径
  volumes: # 卷定义列表
    - name: vm-01-1 # 卷名称
      configMap: # ConfigMap卷配置
        name: cm-test-file # ConfigMap名称
        items: # 指定要挂载的键值对
          - key: key-testproperties # ConfigMap中的键名
            path: test.properties # 挂载后的文件名

不指定items的方式

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: Pod # 资源类型,声明为Pod对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: cm-pod-test004 # Pod的名称
spec: # Pod规格,定义Pod的配置
  containers: # 容器列表
    - name: cm-test4 # 容器名称
      image: tomcat:8 # 容器镜像
      volumeMounts: # 卷挂载配置
        - name: vm-02-2 # 卷名称,与volumes中的name对应
          mountPath: /conf # 挂载路径,容器内的目录路径
  volumes: # 卷定义列表
    - name: vm-02-2 # 卷名称
      configMap: # ConfigMap卷配置
        name: cm-test-file # ConfigMap名称,所有键值对都会被挂载

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

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 编码:

echo -n 'name' | base64
echo -n '123456' | base64

然后创建 secret.yaml 文件:

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: Secret # 资源类型,声明为Secret对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: mysecret # Secret的名称
type: Opaque # Secret类型,Opaque表示通用类型
data: # 敏感数据,以base64编码的键值对形式存储
  username: bmFtZQ== # 用户名,base64编码后的值
  password: MTIzNDU2 # 密码,base64编码后的值

Secret注入方式 🚀

1. 将Secret挂载到Volume中

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: Pod # 资源类型,声明为Pod对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: mypod # Pod的名称
spec: # Pod规格,定义Pod的配置
  containers: # 容器列表
    - name: mypod # 容器名称
      image: redis # 容器镜像
      volumeMounts: # 卷挂载配置
        - name: foo # 卷名称,与volumes中的name对应
          mountPath: "/etc/foo" # 挂载路径,容器内的目录路径
          readOnly: true # 只读挂载,增强安全性
  volumes: # 卷定义列表
    - name: foo # 卷名称
      secret: # Secret卷配置
        secretName: mysecret # Secret名称

2. 将Secret设置为环境变量

apiVersion: v1 # API版本,指定使用的Kubernetes API版本
kind: Pod # 资源类型,声明为Pod对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: secret-env-pod # Pod的名称
spec: # Pod规格,定义Pod的配置
  containers: # 容器列表
    - name: mycontainer # 容器名称
      image: redis # 容器镜像
      env: # 环境变量配置
        - name: SECRET_USERNAME # 环境变量名称
          valueFrom: # 值来源配置
            secretKeyRef: # Secret键引用
              name: mysecret # Secret名称
              key: username # Secret中的键名
        - name: SECRET_PASSWORD # 环境变量名称
          valueFrom: # 值来源配置
            secretKeyRef: # Secret键引用
              name: mysecret # Secret名称
              key: password # Secret中的键名

ConfigMap热更新机制 🔄

更新特性说明 ⚡

  • Volume挂载方式: 可以感知配置变化(延迟几秒到一分钟左右)
  • 环境变量方式: 不会自动更新,需要重启Pod才能生效

使用建议 💡

  • 频繁变化的配置: 推荐使用Volume挂载方式
  • 固定配置: 可以使用环境变量注入方式

实际应用示例 🎯

MySQL密码注入Pod示例 🗄️

1. 创建Secret

kubectl create secret generic test --from-literal=MYSQL_ROOT_PASSWORD=1234567

2. 创建Deployment

apiVersion: apps/v1 # API版本,指定使用的Kubernetes API版本
kind: Deployment # 资源类型,声明为Deployment对象
metadata: # 元数据,包含资源的名称、命名空间等信息
  name: myapp-demo # Deployment的名称
  namespace: default # 所属命名空间
spec: # Deployment规格,定义Deployment的配置
  replicas: 1 # 副本数量
  selector: # 选择器,用于匹配Pod
    matchLabels: # 标签匹配规则
      app: myapp # 匹配标签为app=myapp的Pod
  template: # Pod模板,定义Pod的配置
    metadata: # Pod元数据
      labels: # Pod标签
        app: myapp # Pod的标签
    spec: # Pod规格
      containers: # 容器列表
        - name: myapp # 容器名称
          image: ikubernetes/myapp:v1 # 容器镜像
          imagePullPolicy: IfNotPresent # 镜像拉取策略
          ports: # 端口配置
            - name: http # 端口名称
              containerPort: 80 # 容器端口
          volumeMounts: # 卷挂载配置
            - name: mysql # 卷名称,与volumes中的name对应
              mountPath: /test/ # 挂载路径,容器内的目录路径
      volumes: # 卷定义列表
        - name: mysql # 卷名称
          secret: # Secret卷配置
            secretName: test # Secret名称

注意事项 ⚠️

  • 安全性: Secret虽然使用base64编码,但并非真正的加密,敏感信息仍需谨慎处理
  • 性能: ConfigMap和Secret都有大小限制,不宜存储过大的配置文件
  • 更新策略: 根据配置变化频率选择合适的注入方式
  • 权限管理: 合理设置RBAC权限,控制ConfigMap和Secret的访问范围
    通过合理使用ConfigMap和Secret,可以实现Kubernetes应用的配置与镜像分离,提升应用的可维护性和安全性 🚀

0
上一篇 Kubernetes可观测性完整指南
下一篇 Kubernetes存储抽象详解