1、概述

  在Kubernetes集群中,应用的配置管理是一个关键且复杂的任务。随着应用的扩展和微服务架构的普及,传统的配置文件管理方式已经难以满足动态、灵活的配置需求。幸运的是,Kubernetes提供了强大的配置管理能力,其中ConfigMap和Secret结合Volume挂载的方式是实现这一目标的重要手段。

1.1 ConfigMap

  ConfigMap是Kubernetes中的一个API对象,用于存储非敏感的配置信息,如应用的配置参数、环境变量等。它允许你将配置信息与应用的容器镜像解耦,从而更容易地管理和更新配置。

1.2 Secret

  与ConfigMap类似,Secret也是Kubernetes中的一个API对象,但它用于存储敏感信息,如数据库密码、OAuth令牌等。Secret通过Base64编码存储数据,但Kubernetes在将Secret挂载到Pod中时会自动进行解码,以确保数据的安全性。详细Secret资源讲解请参见《Kubernetes对象——Secret》这篇博文。

2、利用Volume挂载ConfigMap与Secret

  Kubernetes允许你将ConfigMap和Secret作为Volume挂载到Pod中,这样容器就可以直接访问到这些配置信息或敏感数据了。这种方式的好处是,支持动态更新。ConfigMap和Secret更新后,容器中的数据也会更新。
  下面以nginx容器镜像为例演示,利用Volume挂载ConfigMap与Secret。

2.1 不挂载任何存储卷

(1)使用Nginx容器镜像的工作负载示例如下,没有挂载任何类型存储卷。
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: test-configmap-volume
labels:
app: nginx-v1
name: nginx-v1
spec:
replicas: 1
selector:
matchLabels:
app: nginx-v1
template:
metadata:
labels:
app: nginx-v1
spec:
containers:
- name: container-jzx3ih
imagePullPolicy: IfNotPresent
image: 'nginx'
ports:
- name: tcp-80
protocol: TCP
containerPort: 80
serviceAccount: default
affinity: {}
initContainers: []
volumes: []
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%

(2)进入容器内部,可以看到使用nginx容器镜像启动nginx容器后,/etc/ssl目录下是存在数据文件的。

2.2 挂载ConfigMap

创建测试用的configmap。

apiVersion: v1
kind: ConfigMap
metadata:
namespace: test-configmap-volume
labels: {}
name: test-configmap-volume1
spec:
template:
metadata:
labels: {}
data:
a: aa
b: bb
c: cc

2.2.1 将整个configmap资源对象挂载到容器内部

更新nginx-v1工作负载配置文件,将测试用的configmap资源对象挂载到nginx容器/etc/ssl目录下。

kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx-v1
namespace: test-configmap-volume
labels:
app: nginx-v1
annotations:
deployment.kubernetes.io/revision: '2'
spec:
replicas: 1
selector:
matchLabels:
app: nginx-v1
template:
metadata:
creationTimestamp: null
labels:
app: nginx-v1
spec:
volumes:
- name: volume-pikzy0
configMap:
name: test-configmap-volume1
defaultMode: 420
containers:
- name: container-jzx3ih
image: 'nginx'
ports:
- name: tcp-80
containerPort: 80
protocol: TCP
resources: {}
volumeMounts:
- name: volume-pikzy0
readOnly: true
mountPath: /etc/ssl
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
affinity: {}
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600

再次进入容器/etc/ssl目录下,结果如下。

当ConfigMap以volume的形式挂载到容器中的指定路径时,如果目标路径在容器中不存在,Kubernetes会在容器启动时自动创建这个路径。如果目标路径已经存在于容器中,ConfigMap默认会会覆盖原先目录下的内容(除非使用子路径),并且ConfigMap的每个key都会被创建为该目录下的一个新文件(文件名与key相同)。

2.2.2 将configmap资源对象指定key挂载到容器内部

更新nginx-v1工作负载配置文件,将测试用的configmap资源对象指定key挂载到nginx容器/etc/ssl目录下。(将key a、b挂载到容器/etc/ssl路径下并且a的文件名改为haa,b的文件名改成hbb)

......
spec:
volumes:
- name: volume-pikzy0
configMap:
name: test-configmap-volume1
items:
- key: a
path: haa
- key: b
path: hbb
defaultMode: 420
containers:
- name: container-jzx3ih
image: 'nginx'
ports:
- name: tcp-80
containerPort: 80
protocol: TCP
resources: {}
volumeMounts:
- name: volume-pikzy0
readOnly: true
mountPath: /etc/ssl
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
.......

结果如下:

当ConfigMap将指定key以volume的形式挂载到容器中的指定路径时,如果目标路径在容器中不存在,Kubernetes会在容器启动时自动创建这个路径。如果目标路径已经存在于容器中,ConfigMap默认会会覆盖原先目录下的内容(除非使用子路径),这些key都会被创建为该目录下的一个新文件(文件名与path相同)。

2.2.3 将configmap资源对象通过子路径挂载到容器内部

不管是将整个configmap资源对象挂载到容器内部,还是将configmap资源对象指定key挂载到容器内部,如果目标路径已经存在于容器中,ConfigMap默认会会覆盖原先目录下的内容。有时候我们就想覆盖原先目录下指定文件,这时候就需要使用子路径,使用subpath选定configMap的指定的key-value挂载在容器中,不会覆盖掉原目录下的其他文件。

更新nginx-v1工作负载配置文件,将测试用的configmap资源对象指定key a通过子路径覆盖容器/etc/ssl/openssl.cnf文件。

.......
spec:
volumes:
- name: volume-pikzy0
configMap:
name: test-configmap-volume1
defaultMode: 420
containers:
- name: container-jzx3ih
image: 'nginx'
ports:
- name: tcp-80
containerPort: 80
protocol: TCP
resources: {}
volumeMounts:
- name: volume-pikzy0
readOnly: true
mountPath: /etc/ssl/openssl.cnf
subPath: a
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
.......

结果如下:

通过使用subpath选定configMap的指定的key-value挂载在容器中,不会覆盖掉原目录下的其他文件。

2.3 挂载Secret

详细步骤参见《Kubernetes对象——Secret》这篇博文,本文不再赘余,使用方式和挂载ConfigMap一致。

3、总结

(1)将整个ConfigMap/Secret资源对象挂载到容器内部

  当ConfigMap/Secret以Volume的形式挂载到容器中的指定路径时,如果目标路径在容器中不存在,Kubernetes会在容器启动时自动创建这个路径。如果目标路径已经存在于容器中,ConfigMap默认会会覆盖原先目录下的内容,并且ConfigMap的每个key都会被创建为该目录下的一个新文件(文件名与key相同)。

(2)将ConfigMap/Secret资源对象指定key挂载到容器内部

当ConfigMap/Secret将指定key以Volume的形式挂载到容器中的指定路径时,如果目标路径在容器中不存在,Kubernetes会在容器启动时自动创建这个路径。如果目标路径已经存在于容器中,ConfigMap默认会会覆盖原先目录下的内容,这些key都会被创建为该目录下的一个新文件(文件名与path相同)。

(3)将ConfigMap/Secret资源对象通过子路径挂载到容器内部

  如果挂载路径是一个已存在的目录,则目录下的内容不会被覆盖。直接将ConfigMap/Secret挂载在容器的路径,会覆盖掉容器路径下原有的文件,使用subpath选定ConfigMap/Secret的指定的key-value挂载在容器中,则不会覆盖掉原目录下的其他文件。

Kubernetes利用Volume挂载ConfigMap与Secret的更多相关文章

  1. Kubernetes中的Configmap和Secret

    本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 应用场景:镜像往往是一个应用的基础,还有很多需要 ...

  2. kubernetes ConfigMap和Secret:配置应用程序

    7.1.配置容器化应用程序 7.2.向容器传递命令行参数 7.2.1.待Docker中定义命令与参数 1.了解ENTRYPOINT与CMD ENTRYPOINT定义容器启动时被调用的可以执行程序 CM ...

  3. kubernetes系列12—二个特色的存储卷configmap和secret

    本文收录在容器技术学习系列文章总目录 1.configmap 1.1 认识configmap ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.ConfigMa ...

  4. (十)Kubernetes ConfigMap和Secret

    ConfigMap资源 介绍 ConfigMap是让配置文件从镜像中解耦,让镜像的可移植性和可复制性.许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.这些配置信息需要与docker im ...

  5. Kubernetes学习笔记(六):使用ConfigMap和Secret配置应用程序

    概述 本文的核心是:如何处理应用程序的数据配置. 配置应用程序可以使用以下几种途径: 向容器传递命令行参数 为每个容器配置环境变量 通过特殊的卷将配置文件挂载到容器中 向容器传递命令行参数 在Kube ...

  6. 012.Kubernetes的configmap和secret配置

    使用configmap对多有的配置文件进行统一管理 一 configmap配置管理 1.1 检查mysql的配置 [root@docker-server1 storage]# kubectl get ...

  7. 3.k8s存储之ConfigMap、Secret

    1.ConfigMap ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们提供了向容器 ...

  8. 深入探究 K8S ConfigMap 和 Secret

    ConfigMap 1.什么是 ConfigMap? ConfigMap 是用来存储配置文件的 Kubernetes 资源对象,配置对象存储在 Etcd 中,配置的形式可以是完整的配置文件.key/v ...

  9. 九,configMap及secret的基本使用

    目录 制定容器配置的方式 configMap(存储数据为明文,敏感数据慎用) 创建configMap的几种方式 命令行创建和测试configMap实例 创建一个Pod 挂载测试 通过指定文件创建con ...

  10. kubernetes系列(十二) - 存储之Secret

    1. Secret简介 2. Secret类型 3. Service Account 4. Opaque 4.1 Opaque类型说明 4.2 Opaque创建方式 4.2.1 命令行创建 4.2.2 ...

随机推荐

  1. sqlCel查询一个表中部分字段的数据后插入到另一个表中

    问题: 部门每天需要从后台系统将物流总表数据导出,Excel中整理出订单的物流发货渠道和发货时间,再手动导入到数据库中,整个过程不麻烦,但在Excel中比较繁琐. 需求: 将这个繁琐的过程变得更简单, ...

  2. SpringBoot集成Mongodb文档数据库

    添加Maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  3. JS中this的几种指向

    这些this的指向,是当我们调用函数的时候确定的.调用方式的不同决定了this的指向不同一般指向我们的调用者.普通函数调用          window.定时器函数             wind ...

  4. P1681

    和上一道题差不多,要注意一些细节 #include<iostream> #include<utility> using namespace std; typedef long ...

  5. AI生成前端组件的价值思考

    想法来源 这个想法来源于我自己的需求,我自己首先就是最精准的目标用户,在这个AI时代,我希望AI可以帮我尽量多地干活. 结合自己的日常独立开发情况,发现花在调前端组件样式上的时间很多,因此思考能不能让 ...

  6. 女朋友问我 LB 是谁?

    科普一下 LB(负载均衡)技术 我的编程导航网站:www.code-nav.cn 大家好,我是鱼皮. 周末在家写代码,无意中跟女朋友提了下 LB,还说 LB 好的呱呱叫. 她笑了笑,问我 LB 是谁? ...

  7. 服务之间的调用之RPC深入理解

    一:RPC RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法).通常的实现有 XML-RPC , J ...

  8. Django配置为连接到Microsoft SQL Server

    可以将Django配置为连接到Microsoft SQL Server 2019.为此,你需要更改数据库设置中的一些配置选项.首先,确保你已经安装了 django 和 pyodbc 这两个库:   p ...

  9. 常用ffmpeg命令集合(收藏吧,帮你省一个录屏软件的会员费)

    录制屏幕: 全屏的话用screen-capture-recoder下载地址:https://github.com/rdp/screen-capture-recorder-to-video-window ...

  10. 手把手教你!STM32单片机入门指南:从初级到中级工程师的学习路线

    ​在当今科技日新月异的时代,嵌入式系统作为智能设备的核心驱动力,正以前所未有的速度渗透到我们生活的方方面面.STM32系列微控制器,以其高性能.低功耗及丰富的外设资源,成了许多开发者踏入嵌入式领域首选 ...