Kubernetes(十二)Kubernetes ConfigMap&Secret详解

本文详细介绍了Kubernetes的ConfigMap和Secret两种资源对象。ConfigMap用于存储非敏感配置数据,可作为环境变量、命令行参数或挂载为卷。Secret用于安全地存储敏感信息如密码、Token,类型包括Opaque、服务账号令牌等。ConfigMap和Secret可通过数据卷挂载、环境变量、命令行参数等方式在Pod中使用,并支持热更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ConfigMap

官方文档 ConfigMap

概念

ConfigMap的功能在k8s1.2版本中引入的,许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息。ConfigMap API会给我们提供了向容器中注入配置信息的机制,ConigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制的对象

1. 为什么需要configmap

我们经常都需要为我们的应用程序配置一些特殊的数据,比如密钥、Token 、数据库连接地址或者其他私密的信息。你的应用可能会使用一些特定的配置文件进行配置,比如settings.py文件,或者我们可以在应用的业务逻辑中读取环境变量或者某些标志来处理配置信息。我们要做到这个,有好多种方案,比如:

  • 我们可以直接在打包镜像的时候写在应用配置文件里面,但是这种方式的坏处显而易见而且非常明显。
  • 我们可以在配置文件里面通过 env 环境变量传入,但是这样的话我们要修改 env 就必须去修改 yaml 文件,而且需要重启所有的 container 才行。
通过env设置不同的环境,使用不同的yaml配置文件
  • 我们可以在应用启动的时候去数据库或者某个特定的地方拿,没问题!但是第一,实现起来麻烦;第二,如果配置的地方变了怎么办?

当然还有别的方案,但是各种方案都有各自的问题。

而且,还有一个问题就是,如果说我的一个配置,是要多个应用一起使用的,以上除了第三种方案,都没办法进行配置的共享,就是说我如果要改配置的话,那得一个一个手动改。假如我们有 100 个应用,就得改 100 份配置,以此类推……

kubernetes 对这个问题提供了一个很好的解决方案,就是用 ConfigMap 和 Secret。

有很多种方案可以将项目 和 项目的配置解耦:


configMap就是让项目镜像 和 配置、环境变量、配置文件等配置数据 解耦,保证镜像的可移植性

  • ConfigMap功能在kubernetes1.2版本中引入,许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息,ConfigAPI给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象。
  • ConfigMap对像是一系列配置的集合,k8s会将这一集合注入到对应的Pod对像中,并为容器成功启动使用。注入的方式一般有两种,一种是挂载存储卷,一种是传递变量。ConfigMap被引用之前必须存在,属于名称空间级别,不能跨名称空间使用,内容明文显示。ConfigMap内容修改后,对应的pod必须重启或者重新加载配置(支持热更新的应用,不需要重启)。
  • Secret类似于ConfigMap,是用Base64加密,密文显示,一般存放敏感数据。一般有两种创建方式,一种是使用kubectl create创建,一种是用Secret配置文件。

2. 应用场景

应用场景:镜像往往是一个应用的基础,还有很多需要自定义的参数或配置,例如资源的消耗、日志的位置级别等等,这些配置可能会有很多,因此不能放入镜像中,Kubernetes中提供了Configmap来实现向容器中提供配置文件或环境变量来实现不同配置,从而实现了镜像配置与镜像本身解耦,使容器应用做到不依赖于环境配置。

向容器传递参数:

Docker Kubernetes 描述
ENTRYPOINT command 容器中的可执行文件
CMD args 需要传递给可执行文件的参数

Kubernetes如果需要向容器传递参数,可以在Yaml文件中通过command和args或者环境变量的方式实现。(不使用configMap的场景)

示例: demo-mpconft.yaml

apiVersion: v1
kind: Pod
metadata:
  name: print-mapenv
spec:
  containers:
  - name: env-print-demo
    image: centos:7.9.2009
    imagePullPolicy: IfNotPresent
    env: #添加了一个环境变量
    - name: GREETING
      value: "hello"
    - name: HONORIFIC
      value: "welcome"
    - name: NAME
      value: "Kubernetes is a good product"
    command: 
    - "echo" #执行echo命令
    args: 
    - "$(GREETING) $(HONORIFIC) $(NAME)"  #命令中传入了这些参数,引用的就是上面env中定义的

等待一会儿时间后,看到STATUS是Completed,Ready是0/1,pod中的容器已经结束了 因为我们yaml文件里就要求容器运行以后只执行一条指令,执行完成后就结束了

# 创建后,命令 echo hello welcome Kubernetes is a good product 将在容器中运行,也就是环境变量中的值被传递到了容器中。
# 查看pod就可以看出
# [root@k8s-master yaml]# kubectl logs print-mapenv
hello welcome Kubernetes is a good product
现在测试的这种情况是将配置数据和yaml资源文件耦合在一起了,接下来我们使用configMap分离

3. 创建ConfigMap

3.1 help文档

通过hepl命令可以查看configmap的用法:

# [root@k8s-master-155-221 configmap]# kubectl create  configmap --help
......
Aliases:
configmap, cm  #可以使用cm替代

Examples:
  # Create a new configmap named my-config based on folder bar
  # 从目录创建  文件名称为键  文件内容为值
  kubectl create configmap my-config --from-file=path/to/bar  

  # Create a new configmap named my-config with specified keys instead of file basenames on disk
  # 从文件创建 key1为键 文件内容为值
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt 

  # Create a new configmap named my-config with key1=config1 and key2=config2
  # 直接命令行给定,键为key1 值为config1
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2   

  # Create a new configmap named my-config from the key=value pairs in the file
  # 从文件创建 文件名为键 文件内容为值
  kubectl create configmap my-config --from-file=path/to/bar   

  # Create a new configmap named my-config from an env file
  kubectl create configmap my-config --from-env-file=path/to/bar.env

  Usage:
  kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run=server|client|none]
[options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

3.2 使用目录创建

# 指定目录
# 创建configmap目录
# ls /opt/yaml/configmap

# 创建game.properties文件
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

# ui.propertes文件
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
# 创建configmap ,指令
# game-config-test :configmap的名称
# --from-file:指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容
# [root@k8s-master configmap]# kubectl create configmap game-config-test --from-file=/opt/yaml/configmap
configmap/game-config-test created

# 查看configmap文件
# [root@k8s-master configmap]# kubectl get cm 
NAME               DATA   AGE
game-config-test   2      24s


# 查看详细信息 -o 指定输出格式为yaml
# [root@k8s-master configmap]# kubectl get cm game-config-test -o yaml
apiVersion: v1
data:
  game.properties: |   # | 前是文件名; | 后是文件内容
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
  ui.propertes: |     # | 前是文件名; | 后是文件内容
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap      # 类型
metadata:
  creationTimestamp: "2021-06-04T06:45:42Z"
  name: game-config-test   # 名称
  namespace: default       # 命名空间
  resourceVersion: "625034"
  uid: 8a7f0064-f816-4e70-a367-bd37371dcaec
data就是数据区,存放的就是配置文件,key就是文件名,后面"|"后跟的就是配置文件内容,这个是yaml语法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值