Kubernetes 入门实战课
罗剑锋
Kong 高级工程师,Nginx/OpenResty 开源项目贡献者
19527 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 41 讲
Kubernetes 入门实战课
15
15
1.0x
00:00/00:00
登录|注册

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

你好,我是 Chrono。
前两节课里我们学习了 Kubernetes 里的三种 API 对象:Pod、Job 和 CronJob,虽然还没有讲到更高级的其他对象,但使用它们也可以在集群里编排运行一些实际的业务了。
不过想让业务更顺利地运行,有一个问题不容忽视,那就是应用的配置管理。
配置文件,你应该有所了解吧,通常来说应用程序都会有一个,它把运行时需要的一些参数从代码中分离出来,让我们在实际运行的时候能更方便地调整优化,比如说 Nginx 有 nginx.conf、Redis 有 redis.conf、MySQL 有 my.cnf 等等。
我们在“入门篇”里学习容器技术的时候讲过,可以选择两种管理配置文件的方式。第一种是编写 Dockerfile,用 COPY 指令把配置文件打包到镜像里;第二种是在运行时使用 docker cp 或者 docker run -v,把本机的文件拷贝进容器。
但这两种方式都存在缺陷。第一种方法相当于是在镜像里固定了配置文件,不好修改,不灵活,第二种方法则显得有点“笨拙”,不适合在集群中自动化运维管理。
对于这个问题 Kubernetes 有它自己的解决方案,你也应该能够猜得到,当然还是使用 YAML 语言来定义 API 对象,再组合起来实现动态配置。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes中的ConfigMap和Secret是管理应用配置信息的重要对象。ConfigMap用于保存明文配置,而Secret用于保存敏感信息。通过YAML文件创建ConfigMap和Secret对象,并使用kubectl命令管理它们。这些对象可以通过环境变量或加载文件的方式注入到Pod中,以便应用程序读取配置信息。文章详细介绍了ConfigMap和Secret的创建和使用方法,包括以环境变量和Volume的方式使用它们。通过示例和图表,读者可以清晰了解如何在Pod中使用ConfigMap和Secret,以及它们与应用的解耦关系。总结了ConfigMap和Secret的异同点,并提出了两个思考题作为课下作业。整体而言,本文深入浅出地介绍了Kubernetes中配置管理的重要概念和实践方法,适合读者快速了解和掌握相关知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kubernetes 入门实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(34)

  • 最新
  • 精选
  • 江湖十年
    ConfigMap 和 Secret 对存储数据的大小是有限制的,限制为 1MiB,官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/#motivation

    作者回复: 感谢补充。

    2022-07-22
    2
    48
  • 陶乐思
    用env和volume两种方式创建的pod都尝试了,修改了ConfigMap/Secret 的 YAML后 kubectl apply,Pod里的value并不会改变。 所以这两种方式在创建pod的时候,其实都是一次性拷贝,POD controller manager只会管理POD这个层级,并不会发现POD之下层级发生的变化。

    作者回复: good

    2022-07-23
    3
    27
  • 朱雯
    1. configmap 和secret相同点有很多,其中一点就是键值对数据存储。不同点就是一个加密,一个不加密,但是secret只支持base64加密吗,可以支持其他格式加密吗?如果都是base64加密,存在破解的可能性吗。是否不安全,如果不是可以选择不同的加密方式,会不会安全点。 2. 我看大家的答案是pod并不会修改里面的值,可我测试的结果是env-pod确实不会修改值,实际上应该是大家说的一次性拷贝,但另外一个vol-pod我测试的结果是,会改变值啊,难道我测试的方式有什么问题吗?

    作者回复: 1.base64只是一种编码方式,不是加密,Kubernetes里可以配置成对secret加密。 2.环境变量是pod启动时注入的,所以不会改,volume的方式会改,两种方式不一样。

    2022-07-27
    2
    18
  • 星垂平野阔
    把configmap挂进了pod里面,然后重新deploy了下configmap,发现pod里面的变量还是原来的,没有同步更新。 个人猜测应该是挂载的同时已经把configmap的内容引入pod内部,除非pod重启,不然不会随着它更新。

    作者回复: great

    2022-07-22
    2
    7
  • Jasper
    迫不及待的看完,期待下一节

    作者回复: nice

    2022-07-22
    6
  • 霍霍
    相见恨晚,老师带着,感觉k8s的概念学起来轻松愉快

    作者回复: great.

    2023-02-17归属地:陕西
    4
  • lesserror
    老师,有几个小问题: 1. 像配置这块儿,有多少个不同类型的配置,就需要定义多少个不同的Volume进行挂载吗?例如ConfigMap 和 Secret 这里挂载了两个Volume。 2. vol-pod 0/1 CrashLoopBackOf 当pod变成这个状态的时候,只能删除了再重新创建吗? 使用命令 :kubectl delete -f vol-pod.yml。 3. 课外小贴士的最后一条,没太明白,老师能再说说看吗?

    作者回复: 1.是的,一个对象只能挂成一个volume。 2.是的,不过删之前最好用describe看看它为什么出错,不然可能删除后也不能恢复。 3.加载volome的文件名就是ConfigMap、secret的key名,有的时候就不合适,可以用这种方式来改名。

    2022-08-01归属地:北京
    4
  • 郑小鹿
    课后问题回答: 1、说一说你对 ConfigMap 和 Secret 这两个对象的理解,它们有什么异同点? 相同点: 都可以用来把配置数据和服务程序分离 都是一种用于存储的API对象 都以键值对k-v的方式存储数据 都可以作为数据卷挂载在其他API对象上使用 都不适合存储大数据,每个 ConfigMap /Secret 最多支持存储1MB的数据,毕竟对内存有消耗 不同点: ConfigMap一般存储非机密信息 Secret用于存储机密信息,默认是Base64编码方式对value字符进行处理。 Secret保存在etcd中内容是未经过加密的,对于Secret资源的权限要做好控制,可以通过RBAC规则来限制或者是使用其他加密方式 2、如果我们修改了 ConfigMap/Secret 的 YAML,然后使用 kubectl apply 命令更新对象,那么 Pod 里关联的信息是否会同步更新呢?你可以自己验证看看。 如果 ConfigMap 是作为环境变量方式使用的,那数据不会被自动更新。 想要更新这些数据需要重新启动 Pod。

    作者回复: great

    2022-07-28归属地:北京
    3
    4
  • pyhhou
    想请教老师几个问题: 1、`echo -n "123456" | base64` 加 -n 仅仅是为了去掉换行符吗,`"123456"` 中并没有换行符,为什么加 -n 与不加 -n 的结果有区别? 2、构建 Pod 的时候,Secret 中的变量会被自动解码,K8S 是如何知道该用何种方式进行解码?需要通过 Secret 对象中的参数进行指定吗?

    作者回复: 1. echo会默认加上一个换行符,看不到但是有,所以-n就可以去掉。 2.Secret的规范就是用base64编码,所以不需要指定。

    2022-07-23
    2
    4
  • 罗耀龙@坐忘
    yaml文件还真不好写,我对着课文写minikube运行不了,用老师的一下就过了

    作者回复: 一开始肯定容易写错,特别是多个嵌套字段的层次,可以先用kubectl create创建样板,写多了就熟能生巧。

    2022-07-22
    3
收起评论
显示
设置
留言
34
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部