07 ConfigMap/Secret:怎样配置、定制我的应用

news2025/1/21 3:03:07

文章目录

  • 1. ConfigMap/Secret 介绍
    • 1.1 为什么kubernets 要使用应用的配置管理?
    • 1.2 有什么类别的配置信息?
  • 2. 什么是 ConfigMap?
    • 2.1 创建ConfigMap模板文件
      • 2.1.1 ConfigMap 怎么生成带data 字段的 模板
    • 2.2 创建ConfigMap 对象
    • 2.3 查看ConfigMap 对象信息
  • 3. 什么是 Secret?
    • 3.1 创建Secret模板文件
    • 3.2 使用base64 对数据进行编码存储
    • 3.3 创建Secret对象及获取Secret信息
  • 4. 如何使用 ConfigMap/Secret ?
    • 4.1 ConfigMap/Secret 解释
      • 4.1.1 图示ConfigMap 和 Secret 在 Pod 里的组合关系
    • 4.2 创建pod,验证环境变量
      • 4.2.1 ConfigMap 创建
      • 4.2.2 Secret 创建
      • 4.2.3 Pod 创建
      • 4.2.4 验证环境变量是否生效
  • 5. 如何以 Volume 的方式使用 ConfigMap/Secret?
  • 6. ConfigMap/Secret 小结
  • 7. 思考

1. ConfigMap/Secret 介绍

  我们学习了 Kubernetes 里的三种 API 对象:Pod、Job 和 CronJob,虽然还没有讲到更高级的其他对象,但使用它们也可以在集群里编排运行一些实际的业务了。

1.1 为什么kubernets 要使用应用的配置管理?

  不过想让业务更顺利地运行,有一个问题不容忽视,那就是应用的配置管理

  配置文件,你应该有所了解吧,通常来说应用程序都会有一个,它把运行时需要的一些参数从代码中分离出来,让我们在实际运行的时候能更方便地调整优化,比如说 Nginx 有 nginx.conf、Redis 有 redis.conf、MySQL 有 my.cnf 等等。

  我们在“入门篇”里学习容器技术的时候讲过,可以选择两种管理配置文件的方式。第一种是编写 Dockerfile,用 COPY 指令把配置文件打包到镜像里;第二种是在运行时使用 docker cp 或者 docker run -v,把本机的文件拷贝进容器

  但这两种方式都存在缺陷。第一种方法相当于是在镜像里固定了配置文件,不好修改,不灵活,第二种方法则显得有点“笨拙”,不适合在集群中自动化运维管理。

  对于这个问题 Kubernetes 有它自己的解决方案,你也应该能够猜得到,当然还是使用 YAML 语言来定义 API 对象,再组合起来实现动态配置。

  Kubernetes 里专门用来管理配置信息的两种对象:ConfigMap Secret,使用它们可以灵活地配置、定制我们的应用。

1.2 有什么类别的配置信息?

首先你要知道,应用程序有很多类别的配置信息,但从数据安全的角度来看可以分成两类:

  • 一类是明文配置,也就是不保密,可以任意查询修改,比如服务端口、运行参数、文件路径等等。
  • 一类则是机密配置,由于涉及敏感信息需要保密,不能随便查看,比如密码、密钥、证书等等。

这两类配置信息本质上都是字符串,只是由于安全性的原因,在存放和使用方面有些差异,所以 Kubernetes 也就定义了两个 API 对象,ConfigMap 用来保存明文配置Secret 用来保存秘密配置

2. 什么是 ConfigMap?

2.1 创建ConfigMap模板文件

  先来看 ConfigMap,我们仍然可以用命令 kubectl create 来创建一个它的 YAML 样板。注意,它有简写名字“cm”,所以命令行里没必要写出它的全称:

export out="--dry-run=client -o yaml"        # 定义Shell变量
kubectl create cm info $out

得到的样板文件大概是这个样子:

apiVersion: v1
kind: ConfigMap
metadata:
  name: info

  你可能会有点惊讶,ConfigMap 的 YAML 和之前我们学过的 Pod、Job 不一样,除了熟悉的“apiVersion”“kind”“metadata”,居然就没有其他的了,最重要的字段“spec”哪里去了?这是因为 ConfigMap 存储的是配置数据,是静态的字符串,并不是容器,所以它们就不需要用“spec”字段来说明运行时的“规格”。

  既然 ConfigMap 要存储数据,我们就需要用另一个含义更明确的字段“data”。

2.1.1 ConfigMap 怎么生成带data 字段的 模板

  你需要在 kubectl create 后面多加一个参数 --from-literal ,表示从字面值生成一些数据:

kubectl create cm info --from-literal=k=v $out

#会输出以下信息
apiVersion: v1
data:
  k: v
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: info

  注意,因为在 ConfigMap 里的数据都是 Key-Value 结构,所以 --from-literal 参数需要使用 k=v 的形式。

  把 YAML 样板文件修改一下,再多增添一些 Key-Value,就得到了一个比较完整的 ConfigMap 对象:

apiVersion: v1
kind: ConfigMap
metadata:
  name: info

data:
  count: '10'
  debug: 'on'
  path: '/etc/systemd'
  greeting: |
    say hello to kubernetes.

2.2 创建ConfigMap 对象

kubectl apply -f cm.yml

2.3 查看ConfigMap 对象信息

kubectl get cm  
kubectl describe cm info #查看状态

你可以看到,现在 ConfigMap 的 Key-Value 信息就已经存入了 etcd 数据库,后续就可以被其他 API 对象使用。

在这里插入图片描述

3. 什么是 Secret?

  了解了 ConfigMap 对象,我们再来看 Secret 对象就会容易很多,它和 ConfigMap 的结构和用法很类似,不过在 Kubernetes 里 Secret 对象又细分出很多类,比如:

  • 访问私有镜像仓库的认证信息
  • 身份识别的凭证信息
  • HTTPS 通信的证书和私钥
  • 一般的机密信息(格式由用户自行解释)

  前几种我们现在暂时用不到,所以就只使用最后一种。

3.1 创建Secret模板文件

创建 YAML 样板的命令是 kubectl create secret generic ,同样,也要使用参数 --from-literal 给出 Key-Value 值:

kubectl create secret generic user --from-literal=name=root $out

得到的 Secret 对象大概是这个样子:

apiVersion: v1
data:
  name: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: null
  name: user

  Secret 对象第一眼的感觉和 ConfigMap 非常相似,只是“kind”字段由“ConfigMap”变成了“Secret”,后面同样也是“data”字段,里面也是 Key-Value 的数据。

  不过,既然它的名字是 Secret,我们就不能像 ConfigMap 那样直接保存明文了,需要对数据“做点手脚”。你会发现,这里的“name”值是一串“乱码”,而不是刚才在命令行里写的明文“root”。

3.2 使用base64 对数据进行编码存储

   这串“乱码”就是 Secret 与 ConfigMap 的不同之处,不让用户直接看到原始数据,起到一定的保密作用。不过它的手法非常简单,只是做了 Base64 编码,根本算不上真正的加密,所以我们完全可以绕开 kubectl,自己用 Linux 小工具“base64”来对数据编码,然后写入 YAML 文件,比如

echo -n "123456" | base64
MTIzNDU2

   我们再来重新编辑 Secret 的 YAML,为它添加两个新的数据,方式可以是参数 --from-literal 自动编码,也可以是自己手动编码:

apiVersion: v1
kind: Secret
metadata:
  name: user

data:
  name: cm9vdA==  # root
  pwd: MTIzNDU2   # 123456
  db: bXlzcWw=    # mysql

3.3 创建Secret对象及获取Secret信息

   接下来的创建和查看对象操作和 ConfigMap 是一样的,使用 kubectl apply、kubectl get、kubectl describe:

kubectl apply  -f secret.yml
kubectl get secret
kubectl describe secret user

   这样一个存储敏感信息的 Secret 对象也就创建好了,而且因为它是保密的,使用 kubectl describe 不能直接看到内容,只能看到数据的大小,你可以和 ConfigMap 对比一下。
在这里插入图片描述

4. 如何使用 ConfigMap/Secret ?

   在前面讲 Pod 的时候,说过描述容器的字段“containers”里有一个“env”,它定义了 Pod 里容器能够看到的环境变量。

   当时我们只使用了简单的“value”,把环境变量的值写“死”在了 YAML 里,实际上它还可以使用另一个“valueFrom”字段,从 ConfigMap 或者 Secret 对象里获取值,这样就实现了把配置信息以环境变量的形式注入进 Pod,也就是配置与应用的解耦

4.1 ConfigMap/Secret 解释

   由于“valueFrom”字段在 YAML 里的嵌套层次比较深,初次使用最好看一下 kubectl explain 对它的说明:

   “valueFrom”字段指定了环境变量值的来源,可以是“configMapKeyRef”或者“secretKeyRef”,然后你要再进一步指定应用的 ConfigMap/Secret 的“name”和它里面的“key”,要当心的是这个“name”字段是 API 对象的名字,而不是 Key-Value 的名字。

   下面我就把引用了 ConfigMap 和 Secret 对象的 Pod 列出来,给你做个示范,为了提醒你注意,我把“env”字段提到了前面:

  1. 这个 Pod 的名字是“env-pod”,镜像是“busybox”,执行命令 sleep 睡眠 300 秒,我们可以在这段时间里使用命令 kubectl exec 进入 Pod 观察环境变量。

  2. 你需要重点关注的是它的“env”字段,里面定义了 4 个环境变量,COUNT、GREETING、USERNAME、PASSWORD。

  3. 对于明文配置数据, COUNT、GREETING 引用的是 ConfigMap 对象,所以使用字段“configMapKeyRef”,里面的“name”是 ConfigMap 对象的名字,也就是之前我们创建的“info”,而“key”字段分别是“info”对象里的 count 和 greeting。

  4. 同样的对于机密配置数据, USERNAME、PASSWORD 引用的是 Secret 对象,要使用字段“secretKeyRef”,再用“name”指定 Secret 对象的名字 user,用“key”字段应用它里面的 name 和 pwd 。

apiVersion: v1
kind: Pod
metadata:
  name: env-pod

spec:
  containers:
  - env:
      - name: COUNT
        valueFrom:
          configMapKeyRef:
            name: info
            key: count
      - name: GREETING
        valueFrom:
          configMapKeyRef:
            name: info
            key: greeting
      - name: USERNAME
        valueFrom:
          secretKeyRef:
            name: user
            key: name
      - name: PASSWORD
        valueFrom:
          secretKeyRef:
            name: user
            key: pwd

    image: busybox
    name: busy
    imagePullPolicy: IfNotPresent
    command: ["/bin/sleep", "300"]

4.1.1 图示ConfigMap 和 Secret 在 Pod 里的组合关系

  这段解释确实是有点绕口令的感觉,因为 ConfigMap 和 Secret 在 Pod 里的组合关系不像 Job/CronJob 那么简单直接,所以我还是用画图来表示它们的引用关系:
在这里插入图片描述

4.2 创建pod,验证环境变量

  我们用 kubectl apply 创建 Pod,再用 kubectl exec 进入 Pod,验证环境变量是否生效:

4.2.1 ConfigMap 创建

kubectl apply -f cm.yml
test@juzi:/k8s$ cat cm.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: info

data:
  count: '10'
  debug: 'on'
  path: '/etc/systemd'
  greeting: 
    say hello to kubernetes.

4.2.2 Secret 创建

kubectl apply -f secret.yml
test@juzi:/k8s$ cat secret.yml
apiVersion: v1
kind: Secret
metadata:
  name: user

data:
  name: cm9vdA==  # root
  pwd: MTIzNDU2   # 123456
  db: bXlzcWw=    # mysql

4.2.3 Pod 创建

kubectl apply -f env-pod.yml
test@juzi:/k8s$ cat env.yml
apiVersion: v1
kind: Pod
metadata:
  name: env-pod

spec:
  containers:
  - env:
      - name: COUNT
        valueFrom:
          configMapKeyRef:
            name: info
            key: count
      - name: USERNAME
        valueFrom:
          secretKeyRef:
            name: user
            key: name

    image: busybox:latest
    name: busy
    imagePullPolicy: IfNotPresent
    command: ["/bin/sleep", "300"]

4.2.4 验证环境变量是否生效

kubectl exec -it env-pod -- sh
echo $COUNT
echo $GREETING
echo $USERNAME $PASSWORD

  这张截图就显示了 Pod 的运行结果,可以看到在 Pod 里使用 echo 命令确实输出了我们在两个 YAML 里定义的配置信息,也就证明 Pod 对象成功组合了 ConfigMap 和 Secret 对象。

  以环境变量的方式使用 ConfigMap/Secret 还是比较简单的,下面来看第二种加载文件的方式。
在这里插入图片描述

5. 如何以 Volume 的方式使用 ConfigMap/Secret?

6. ConfigMap/Secret 小结

7. 思考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

傻白入门芯片设计,一颗芯片的诞生(九)

CPU生产和制造似乎很神秘,技术含量很高。许多对电脑知识略知一二的朋友大多会知道CPU里面最重要的东西就是晶体管了,提高CPU的速度,最重要的一点说白了提高主频并塞入更多的晶体管。由于CPU实在太小,太精密,里面组成了…

Java中的多线程如何理解——精简

目录 线程池处理Runnable任务 线程池处理Callable任务 Executors的工具类构建线程池对象 引言 通过前面的学习,我们已经学会了线程是如何创建的以及线程的常用方法,接下来呢,我们将要深入性了解线程中的知识,主要是线程安全&…

基于PHP+MySQL学生信息管理系统的开发与设计

一直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对学生信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对学生信息进行管理,才能够更加积极的培养国家的栋梁之才。 本系统是一个学生信息信息管理系统,为了能够更加灵活的对学…

mysql InnoDB 事务的实现原理

前言 关于mysql的InnoDB存储引擎的关键知识点,已经输出了6篇文章了,但是好像阅读量并不大,可能大家都不太喜欢理论性特别强的东西?或者是这些知识点难度有点高,不太容易被接受?不过,我觉得我分享…

【Java实战】工作中并发处理规范

目录 一、前言 二、并发处理规范 1.【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 2.【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。 3.【强制】线程资源必须通过线程池提供,不允许在应用中…

数仓数据同步策略

学习内容一、同步策略一、同步策略 数据同步策略的类型包括:全量同步、增量同步、新增及变化同步、特殊情况 全量表:存储完整的数据增量表:存储新增加的数据新增及变化表:存储新增加的数据和变化的数据特殊表:只需要…

定义自定义指令;inserted()、update()

自定义指令的意义:对普通DOM元素进行底层操作; 作用 :可以获取到底层的dom,拿到想要的节点,从而进行操作; 实际应用:可以通过指令知道什么时候dom创建完成,从而进行依赖dom的库的初…

刷爆力扣之有效的山脉数组

刷爆力扣之有效的山脉数组 HELLO,各位看官大大好,我是阿呆 🙈🙈🙈 今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜 该专栏按照不同类别标签进行刷题&#x…

超级浏览器的Cookies实现跨境电商防关联

大家有没有过这种感觉,打开电脑或手机,一些你喜欢的视频,总能一下子打到心巴上;心心念念想要下单的东西,总是不停出现在屏幕上诱惑你下单。你以为网络才是最懂你的人,其实是大数据正在研究你的一举一动。而聊到大数据&…

Cerebral Cortex:疼痛热刺激引起的脑功能网络分离与整合

目前的研究旨在确定热痛期间大脑网络整合/分离的变化,使用高时间分辨率的网络连接事件优化方法。参与者(n 33)主动判断施加于前臂掌侧的热刺激是否疼痛,然后在每次试验后评价温暖/疼痛强度。我们表明,试验中整合/分离的时间演化与疼痛的主观…

Ubuntu中安装Qt

文章目录Ubuntu中安装必要的软件安装流程配置运行配置运行Ubuntu中安装必要的软件 主要为了打开图形程序 sudo apt-get update sudo apt-get --assume-yes upgrade sudo apt-get install --assume-yes xfce4 xorg-dev libopencc2 libopencc2-data unzip zip主要是一些共享lib…

ECU简介

ECU是电子控制单元的简称,广泛用于汽车系统中,是电控系统的神经中枢。本文将以比较基础的方式展开ECU的工作原理。 一、基本结构 ECU主要由CPU、存储器、IO接口、信息传递总线组成。ECU可以把传感器传入的信号用内存程序和数据启动相应的程序&#xff0c…

人工智能:语音识别技术介绍

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&…

移动Web

her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人! 博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正。 目录 一、字体图标 1.1 使用字体图…

Windows使用scp上传文件到linux服务器

我不是管理员,所以上传有点麻烦,需要在windows电脑上操作scp命令, 命令格式:上传文件夹带上-r,上传文件就不用带-r了,而且只能上传到tmp目录下,然后再使用mv命令移动到你想要的目录下&#xff…

宝塔上的wordpress站点更换域名+配置SSL+改版百度收录

前言 好久没写文章了,甚是想念,近半年来发生了很多事情,心态也变了很多。 这个博客自创办以来,原域名叫“is-hash.com”,是我2019年的突发奇想注册此域名,“is-hash”即为“是#”(hash是#的英…

力扣第73题

一、题目:73. 矩阵置零 二、题目解析: 解题步骤:注意题目要求原地算法–>利用矩阵的第一行和第一列记录矩阵需要置0的行和列,只要把0所在行和列的第一个位置置为0, 然后再根据第一行和第一列0的位置,对…

设备树覆盖:实现 DTO

前面我们学习了dts,也知道这个dtc、dtb。这个dto是什么? 实现 DTO 包括分割设备树、构建、分区和运行。 在实现可以正常工作之后,您还必须保持两个 DT 之间的兼容性,并确定用于确保每个 DT 分区安全性的策略。 1、分割 DT 首先…

Linux-用户概念和用户管理命令,用户组概念和用户组管理命令。

一,用户概念和用户管理命令: 1,linux是一个多用户操作系统,多个用户可以在同一时间内登录同一系统。 用户可理解为获取系统资源权限的集合,每个用户都会分配一个uid。分为三种: 超级用户:uid为…

String的方法介绍以及实现

今天需要掌握的有如下方法,有点多,但是不难,加油吧 1.字符串的查找 2.字符串的转化 3.字符串的截取 4.字符串的替换 5.字符串的拆分 6.字符串的其他方法 1.字符串的查找 public class TestDemo {public static void main(String[] ar…