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. Sqlalchemy 连接SQL Server 登录失败

    实验系统环境 Windows平台 Sqlalchemy 2.0.23 Python 3.10 SQL Server 2012 aioodbc 0.5.0 问题详情 sqlalchemy.exc.Int ...

  2. oeasy教您玩转vim - 39 - # 剪切粘贴

    ​ 剪切粘贴 回忆上节课内容 我们大幅度地复习了整个 motion: 直接运动 h j k l 行运动 首行g g 末行G 第n行n G 单词运动 wbe w 是到下一个 word 的开头 b 是到当 ...

  3. Django 安全之跨站点请求伪造(CSRF)保护

    Django 安全之跨站点请求伪造(CSRF)保护 by:授客 QQ:1033553122 测试环境 Win7 Django 1.11   跨站点请求伪造(CSRF)保护 中间件配置 默认的CSRF中 ...

  4. CCF 无线网络

    题目原文 问题描述(题目链接登陆账号有问题,要从这个链接登陆,然后点击"模拟考试",进去找本题目) 试题编号: 201403-4 试题名称: 无线网络 时间限制: 1.0s 内存限 ...

  5. 【MySQL】MySQL 执行创建存储过程报错的解决方法

    源码 创建使用while循环插入数据的存储过程 设置mysql分隔符为// delimiter // drop procedure if exists while1 ; create procedur ...

  6. 对比python学julia(第一章)--(第二节)似曾相识燕归来

    Julia和python一样,都是跨平台开源语言,而且都是动态语言,所以毫无疑问,需要运行时支撑.很简单,到官网去下载julia(https://julialang.org/downloads/).和 ...

  7. 【Spring】03 XML配置

    Alias别名设置 可以为一个Bean的ID再设置一个ID 多一个可用标识,大概... 在获取实例注入参数时,两个标识都可以使用 除了Alias可以设置别名之外,Bean的标签本身也可以设置第二别名 ...

  8. 【JavaScript】 文本滚动消息提示

    需要引入JQ库 <script src="https://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script ...

  9. Efficientvit: Enhanced linear attention for high-resolution low-computation visual recognition

    GitHub地址: https://github.com/mit-han-lab/efficientvit#usage 相关: https://www.jetson-ai-lab.com/vit/tu ...

  10. 【转载】 tensorflow gfile文件操作详解

    原文地址: https://zhuanlan.zhihu.com/p/31536538 -------------------------------------------------------- ...