本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

01

Secret

关于Secret

在应用启动过程中需要一些敏感信息,比如数据库用户名、密码,如果直接明文存储在容器镜像中是不安全的,K8S提供的方案是Secret

  

  Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。

  Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据,也可以使用环境变量的方式使用。

创建与查看Secret

这里假设我们要创建一个包含以下信息的Secret:

  (1)用户名:Edison

  (2)密码:EDC123456*

  有4种方法来创建Secret:

  (1)通过 --from-literal:

  PS:每个 --from-literal 对应一个信息条目

  (2)通过 --from-file:

  PS:每个文件内容对应一个信息条目

  (3)通过 --from-env-file:

  PS:文件 env.txt 中每行 Key=Value 对应一个信息条目

  (4)通过YAML配置文件创建:(推荐方式

  由于配置文件中的敏感数据必须是通过base64编码后的结果,因此需要获取base64编码后的值:

  

  下面就是这个YAML文件的内容:

apiVersion: v1
kind: Secret
metadata:   name: edc-secret
data:   username: RWRpc29u  password: RURDMTIzNDU2Kg==

  通过kubectl apply来创建Secret:

  

  创建成功后,验证一下,查看一下这个Secret:

  

  将Value进行base64反编码,如下所示,与预期一致:

  

在Pod中使用Secret

  K8S中Pod中使用Secret有两种方式,一是Volume方式,二是环境变量的方式。

  (1)Volume方式

  这里我们以一个示例演示一下如何通过Volume方式使用Secret,首先定义一个Pod:

  该Pod中会使用到刚刚定义的secret(edc-secret),然后volumeMounts定义了将foo mount到容器中的路径为/etc/foo的目录下,并且指定了读写权限为只读。

  通过kubectl apply创建之后,我们试着在容器中读取secret来验证一下,如下图所示:

  

  可以看到,K8S为每条敏感数据创建了一个文件,而且其Value是以明文存放的。

  当然,你也可以自定义存放数据的目录,如下配置所示:

  这时,该secret就会存放于/etc/foo/edc-group/username 和 /etc/foo/edc-group/password 两个目录下了。

  (2)动态更新

  以Volume方式使用Secret,其中一个优点就是支持动态更新。例如,我们将Secret更新一下,重新应用到K8S中:

  通过kubectl apply重新应用之后,等待一段时间后,再次进入容器中验证:

  

  已经改为了 abcdefg*,符合预期。

  (2)环境变量方式

  通过Volume使用Secret看起来稍微麻烦了一点,容器必须通过文件读取数据。K8S提供了另外一种方式,那就是环境变量方式。

  下面仍以上面的例子为例,修改配置文件:

  

  可以看到,可以方便地通过环境变量获取到Value。

PS:需要注意的也是,虽然通过环境变量读取Secret比较方便,但是无法支持Secret动态更新!

02

Configmap

关于Configmap

上面提到的Secret可以为Pod提供机密数据的存储,而对于一些非机密敏感的数据,像一些应用的配置信息啊神马的,则可以使用Configmap。

  Configmap的创建与使用方式与Secret非常类似,不同点只在于数据以明文形式存放(不过,我觉得Secret的密文形式也并不密文,只能算得上是简单编码)。

  

创建Configmap

和Secret一样,可以通过 --from-literal,--from-file 和 --from-env-file来创建,这里我们跳过,直接说下我们最常用的yaml配置文件的方式。

使用Configmap

和Secret一样,也可以通过Volume 或 环境变量两种方式来使用Configmap。

  (1)Volume方式

  (2)环境变量方式

最佳实践

大多数情况下,大家建议的最佳实践是:

  (1)创建ConfigMap采用YAML配置方式 => 便于复用和版本管理

  (2)读取ConfigMap采用Volume方式 => 便于配置动态更新

  下面我们创建一个Configmap,其YAML内容如下:

  这里注意别忘了:后面的 | 符号,然后创建&查看Configmap:

  

  如果想要在Pod中使用此Configmap,可以在YAML配置如下:

  这里将Volume mount到了容器的 /etc/configmap 目录中,下面我们验证一下:

  

  这时我们将configmap更新一下,如下:

  通过kubectl apply更新一下configmap,然后再到pod中验证是否动态更新:

  

  可以看出,已经动态更新,符合预期!

03

小结

本文探索了在K8S中如何进行配置管理,如果需要密文配置,可以使用Secret,如果是一般应用配置,可以使用ConfigMap。虽然Secret和ConfigMap都定义了好几种定义方式,但是我们一般采用YAML配置创建和Volume方式读取,因为Volume方式可以支持动态更新。

参考资料:

(1)CloudMan,《每天5分钟玩转Kubernetes》

(2)李振良,《一天入门Kubernets教程》

(3)马哥(马永亮),《Kubernetes快速入门》

(4)benjamin杨,《K8S通过Secret管理敏感信息》

(5)伊凡的一天,《K8S对象之Secret》

你点的每个赞,我都认真当成了喜欢

ASP.NET Core on K8S深入学习(9)Secret Configmap相关推荐

  1. ASP.NET Core on K8S深入学习(7)Dashboard知多少

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 在第二篇<部署过程解析与Dashboard>中介绍了如何部署Das ...

  2. ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard

    上一篇<K8S集群部署>中搭建好了一个最小化的K8S集群,这一篇我们来部署一个ASP.NET Core WebAPI项目来介绍一下整个部署过程的运行机制,然后部署一下Dashboard,完 ...

  3. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

  4. ASP.NET Core on K8S深入学习(11)K8S网络知多少

    Photo :Kubernetes 文 | Edison Zhou 本文已加入<.NET Core on K8S 学习与实践系列文章索引目录>,点击查看容器化相关文章,希望对你有所帮助! ...

  5. ASP.NET Core on K8S深入学习(10)K8S包管理器Helm-Part 2

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇 Part 1 中介绍了Helm的基本概念与基本使用,这一篇我们来自定义一 ...

  6. ASP.NET Core on K8S深入学习(10)K8S包管理器Helm-Part 1

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 关于Helm Why Helm? 虽然K8S能够很好地组织和编排容器,但是缺少 ...

  7. ASP.NET Core on K8S深入学习(5)Rolling Update

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 01 - What is Rolling Update? 为了服务升级过程中提 ...

  8. ASP.NET Core on K8S深入学习(6)Health Check

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.预计阅读时间为10分钟. 01 - 关于K8S中的健康监测 所谓Health C ...

  9. ASP.NET Core on K8S深入学习(3-2)DaemonSet与Job

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 上一篇<3-1 Deployment>中介绍了Deployment ...

最新文章

  1. 用python设计学生管理系统_python+tkinter实现学生管理系统
  2. 《软件设计精要与模式》第二版源代码
  3. 演示:配置日志发送到VTY虚拟终端线路
  4. python全栈面试题_全栈工程师对Python面试中is和==区别的详细解说!看完真的学到了!...
  5. mysql行级视图与列级视图_[数据库]--DML、DDL、TCL语言
  6. java 保护类型_Java 类的受保护访问(学习 Java 编程语言 046)
  7. [导入]FreeTextBox 1.6.3 中文版使用说明
  8. 服务器上的安全数据没有此工作站信任关系的计算机账户_综合监控系统等级保护安全解决方案...
  9. 源码包安装mysql_源码包安装MySQL
  10. framework7日期插件使用
  11. 计算机控制实验比例环节,自动控制原理实验一典型环节的电路模拟与软件仿真...
  12. 【24点】java减治法实现二十四点,输出所有求值结果为24的组合
  13. setuid函数解析
  14. 从0开始ubuntu16.04(虚拟机)安装tensorflow,spinningup
  15. JAVA专业课题研究方向有哪些_教师课题研究方向与范围有哪些
  16. 在 unity中可以使用的直接设置音量大小的方法
  17. Qt编写可视化大屏电子看板系统13-基础版
  18. DOM ------ 仿淘宝关闭二维码
  19. pytorch指定GPU训练
  20. opencv创建和显示窗口

热门文章

  1. vue3.0、cli4项目引入element plus
  2. Cocos Creator Ui系统
  3. 基于DeepConvLSTM的传感器信号分类
  4. CSS浮动属性Float到底什么怎么回事,下面详细解释一下
  5. Lucene5.5.4入门以及基于Lucene实现博客搜索功能
  6. Ubuntu系统备份和恢复
  7. WebService学习笔记---CXF入门
  8. php 数组什么情况下是空的?
  9. Android Donut SDK 1.6r1 今日发布
  10. .NET6 新功能和新生态