深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret

目录

  • [深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret](#深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret)
    • 一、目录结构
    • [二、ConfigMap 和 Secret 的创建](#二、ConfigMap 和 Secret 的创建)
    • [三、在 Deployment 中使用 ConfigMap 和 Secret](#三、在 Deployment 中使用 ConfigMap 和 Secret)
    • [四、只挂载 ConfigMap 或 Secret 中的某个变量](#四、只挂载 ConfigMap 或 Secret 中的某个变量)
      • [1. 只挂载 ConfigMap 中的某个变量](#1. 只挂载 ConfigMap 中的某个变量)
        • [示例:只将 `APP_ENV` 环境变量从 ConfigMap 中注入到容器:](#示例:只将 APP_ENV 环境变量从 ConfigMap 中注入到容器:)
      • [2. 只挂载 Secret 中的某个变量](#2. 只挂载 Secret 中的某个变量)
        • [示例:只将 `DB_USER` 和 `DB_PASSWORD` 从 Secret 中注入到容器:](#示例:只将 DB_USERDB_PASSWORD 从 Secret 中注入到容器:)
    • 五、部署和管理
    • 六、安全性和最佳实践
    • 七、总结

深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret

在企业级 Kubernetes 环境中,如何高效、安全地管理应用配置是运维和开发的核心任务之一。Kubernetes 提供了 ConfigMap 和 Secret 两种资源对象,分别用于存储非敏感和敏感的配置信息。本文将通过一套完整的 YAML 文件示例,展示如何在 Kubernetes 中使用 ConfigMap 和 Secret 管理应用配置,包括创建、部署、更新和安全控制等方面,并且我们会演示如何只挂载 ConfigMap 或 Secret 中的某个变量。


一、目录结构

以下是示例项目的目录结构:

plaintext 复制代码
├── config/
│   ├── app-config.yaml       # 存储应用配置的 ConfigMap
│   └── db-config.yaml        # 存储数据库配置的 ConfigMap
├── secrets/
│   └── db-credentials.yaml   # 存储数据库凭证的 Secret
├── deployments/
│   └── app-deployment.yaml   # 应用的 Deployment 配置
└── README.md

二、ConfigMap 和 Secret 的创建

1. 创建 ConfigMap

ConfigMap 用于存储非敏感的配置信息,例如环境变量、应用配置等。

config/app-config.yaml
yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: default
data:
  # 应用环境设置
  APP_ENV: production
  LOG_LEVEL: info
  FEATURE_FLAG: "true"  # 特性标志,用于控制功能开关
config/db-config.yaml
yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config
  namespace: default
data:
  # 数据库连接配置
  DB_HOST: db.example.com
  DB_PORT: "5432"
  DB_NAME: myapp

2. 创建 Secret

Secret 用于存储敏感信息,例如数据库凭证、API 密钥等。数据以 base64 编码存储。

secrets/db-credentials.yaml
yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
  namespace: default
type: Opaque
data:
  # 数据库用户名和密码,值经过 base64 编码
  DB_USER: YWRtaW4=  # base64 编码的 'admin'
  DB_PASSWORD: cGFzc3dvcmQ=  # base64 编码的 'password'

注意:Secret 中的值使用 base64 编码存储,实际使用时需要解码。


三、在 Deployment 中使用 ConfigMap 和 Secret

在 Deployment 中挂载 ConfigMap 和 Secret,可以通过环境变量或卷的方式将配置数据注入到容器中。

deployments/app-deployment.yaml
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: app-container
          image: myapp:v1
          ports:
            - containerPort: 8080
          envFrom:
            # 使用 ConfigMap 注入环境变量
            - configMapRef:
                name: app-config
            - configMapRef:
                name: db-config
            # 使用 Secret 注入环境变量
            - secretRef:
                name: db-credentials
          volumeMounts:
            # 将 ConfigMap 挂载为文件
            - name: config-volume
              mountPath: /etc/config
            # 将 Secret 挂载为文件
            - name: secret-volume
              mountPath: /etc/secret
      volumes:
        # ConfigMap 挂载配置文件
        - name: config-volume
          configMap:
            name: app-config
        # Secret 挂载敏感信息文件
        - name: secret-volume
          secret:
            secretName: db-credentials

四、只挂载 ConfigMap 或 Secret 中的某个变量

如果只需要挂载 ConfigMap 或 Secret 中的某个变量,可以使用 envenvFrom 来指定具体的键,而不是将整个 ConfigMap 或 Secret 注入容器。

1. 只挂载 ConfigMap 中的某个变量

示例:只将 APP_ENV 环境变量从 ConfigMap 中注入到容器:
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: app-container
          image: myapp:v1
          ports:
            - containerPort: 8080
          env:
            # 从 ConfigMap 中注入单一环境变量
            - name: APP_ENV
              valueFrom:
                configMapKeyRef:
                  name: app-config
                  key: APP_ENV  # 仅注入 APP_ENV 变量

2. 只挂载 Secret 中的某个变量

示例:只将 DB_USERDB_PASSWORD 从 Secret 中注入到容器:
yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: app-container
          image: myapp:v1
          ports:
            - containerPort: 8080
          env:
            # 从 Secret 中注入数据库用户名和密码
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: DB_USER  # 仅注入 DB_USER
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: DB_PASSWORD  # 仅注入 DB_PASSWORD

五、部署和管理

  1. 应用资源

    使用 kubectl 部署 ConfigMap、Secret 和 Deployment:

    bash 复制代码
    kubectl apply -f config/
    kubectl apply -f secrets/
    kubectl apply -f deployments/
  2. 查看资源状态

    检查部署状态:

    bash 复制代码
    kubectl get deployments
    kubectl get pods
    kubectl get configmaps
    kubectl get secrets
  3. 更新 ConfigMap 和 Secret

    • 编辑 config/app-config.yamlsecrets/db-credentials.yaml

    • 使用 kubectl apply -f 更新资源。

    • 对于以环境变量形式注入的配置,更新后需要重启 Pod:

      bash 复制代码
      kubectl rollout restart deployment app-deployment

六、安全性和最佳实践

  • 加密存储:启用 Kubernetes 的静态加密功能,确保 Secret 在 etcd 中以加密形式存储。
  • 访问控制:使用 RBAC 控制对 ConfigMap 和 Secret 的访问权限,确保只有授权的用户和服务可以访问。
  • 版本管理:为 ConfigMap 和 Secret 添加版本信息,便于追踪和回滚。
  • 外部 Secret 管理:对于敏感信息,建议使用外部 Secret 管理工具(如 HashiCorp Vault)进行管理,并通过 Kubernetes 的 External Secrets Operator 实现同步。

七、总结

通过上述示例,我们展示了如何在 Kubernetes 中使用 YAML 文件创建和管理 ConfigMap 和 Secret,实现应用配置的集中管理和动态更新。在实际操作中,建议将非敏感的配置存储在 ConfigMap 中,将敏感信息存储在 Secret 中,并通过环境变量或卷的方式将其注入到 Pod 中。这样可以有效地解耦应用和配置,提高系统的灵活性和安全性。


相关推荐
饮长安千年月2 小时前
JavaSec-SpringBoot框架
java·spring boot·后端·计算机网络·安全·web安全·网络安全
大咖分享课3 小时前
容器安全最佳实践:云原生环境下的零信任架构实施
安全·云原生·架构
孔令飞3 小时前
Go 为何天生适合云原生?
ai·云原生·容器·golang·kubernetes
淡水猫.4 小时前
ApacheSuperset CVE-2023-27524
安全·web安全
恰薯条的屑海鸥4 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
网络·学习·安全·web安全·渗透测试·csrf·网络安全学习
Bruce_Liuxiaowei4 小时前
Web安全深度解析:源码泄漏与未授权访问漏洞全指南
安全·web安全
代码搬运媛5 小时前
React 中 HTML 插入的全场景实践与安全指南
安全·react.js·html
藥瓿亭6 小时前
K8S认证|CKS题库+答案| 5.日志审计
linux·运维·docker·云原生·容器·kubernetes·cka
藥瓿锻7 小时前
2024 CKA题库+详尽解析| 15、备份还原Etcd
linux·运维·数据库·docker·容器·kubernetes·cka
珹洺7 小时前
数据库系统概论(十七)超详细讲解数据库规范化与五大范式(从函数依赖到多值依赖,再到五大范式,附带例题,表格,知识图谱对比带你一步步掌握)
java·数据库·sql·安全·oracle