当前位置: 首页 > backend >正文

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

目录

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

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

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


一、目录结构

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

├── 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
apiVersion: v1
kind: ConfigMap
metadata:name: app-confignamespace: default
data:# 应用环境设置APP_ENV: productionLOG_LEVEL: infoFEATURE_FLAG: "true"  # 特性标志,用于控制功能开关
config/db-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: db-confignamespace: default
data:# 数据库连接配置DB_HOST: db.example.comDB_PORT: "5432"DB_NAME: myapp

2. 创建 Secret

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

secrets/db-credentials.yaml
apiVersion: v1
kind: Secret
metadata:name: db-credentialsnamespace: 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
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deploymentnamespace: default
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: app-containerimage: myapp:v1ports:- containerPort: 8080envFrom:# 使用 ConfigMap 注入环境变量- configMapRef:name: app-config- configMapRef:name: db-config# 使用 Secret 注入环境变量- secretRef:name: db-credentialsvolumeMounts:# 将 ConfigMap 挂载为文件- name: config-volumemountPath: /etc/config# 将 Secret 挂载为文件- name: secret-volumemountPath: /etc/secretvolumes:# ConfigMap 挂载配置文件- name: config-volumeconfigMap:name: app-config# Secret 挂载敏感信息文件- name: secret-volumesecret:secretName: db-credentials

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

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

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

示例:只将 APP_ENV 环境变量从 ConfigMap 中注入到容器:
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deploymentnamespace: default
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: app-containerimage: myapp:v1ports:- containerPort: 8080env:# 从 ConfigMap 中注入单一环境变量- name: APP_ENVvalueFrom:configMapKeyRef:name: app-configkey: APP_ENV  # 仅注入 APP_ENV 变量

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

示例:只将 DB_USERDB_PASSWORD 从 Secret 中注入到容器:
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deploymentnamespace: default
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: app-containerimage: myapp:v1ports:- containerPort: 8080env:# 从 Secret 中注入数据库用户名和密码- name: DB_USERvalueFrom:secretKeyRef:name: db-credentialskey: DB_USER  # 仅注入 DB_USER- name: DB_PASSWORDvalueFrom:secretKeyRef:name: db-credentialskey: DB_PASSWORD  # 仅注入 DB_PASSWORD

五、部署和管理

  1. 应用资源
    使用 kubectl 部署 ConfigMap、Secret 和 Deployment:

    kubectl apply -f config/
    kubectl apply -f secrets/
    kubectl apply -f deployments/
    
  2. 查看资源状态
    检查部署状态:

    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:

      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 中。这样可以有效地解耦应用和配置,提高系统的灵活性和安全性。


http://www.xdnf.cn/news/1674.html

相关文章:

  • 字典与集合——测试界的黑话宝典与BUG追捕术
  • C语言编程--16.删除链表的倒数第n个节点
  • 触觉智能RK3506核心板,工业应用之RK3506 RT-Linux实时性测试
  • arm64适配系列文章-第九章-arm64环境上sentinel的部署
  • 【mysql】windows mysql命令
  • Verilog 语法 (一)
  • springboot在eclipse里面运行 run as 是Java Application还是 Maven
  • Java面试场景篇:分布式锁的实现与组件详解
  • MCP‌和LangGraph‌结合2
  • 基于Vue3 的 h5监听从左到右手滑返回上一页
  • 开源模型应用落地-语音合成-MegaTTS3-零样本克隆与多语言生成的突破
  • 从工作到娱乐:Codigger Desktop 让桌面环境更智能
  • c#-命名和书写规范
  • k8s基于角色的访问控制(RBAC)
  • GPT-4o最新图像生成完全指南:10大应用场景与提示词模板
  • opencv--图像变换
  • 悟空统计:小而美的网站流量统计工具,免费好用
  • 【金仓数据库征文】从云计算到区块链:金仓数据库的颠覆性创新之路
  • ThreadLocal
  • 医学图像(DICOM数据)读取及显示(横断面、冠状面、矢状面、3D显示)为什么用ITK+VTK,单独用ITK或者VTK能实一样功能吗?
  • centos离线安装ssh
  • C语言中封装JSON数组对象
  • 深度解析@SneakyThrows注解:原理、应用与最佳实践
  • 23种设计模式-行为型模式之策略模式(Java版本)
  • 基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案
  • DPIN在AI+DePIN孟买峰会阐述全球GPU生态系统的战略愿景
  • MySQL:数据库设计
  • 【C++入门:类和对象】[3]
  • LJF-Framework 第15章 想想搞点啥-若依管理系统兼容一下
  • 在Windows11上用wsl配置docker register 镜像地址