【kubernetes】kubernetes中的应用配置(ConfigMap和Secret)

news2025/1/20 5:45:25

目录

      • 1 为什么需要ConfigMap和Secret
      • 2 k8s中给容器传递配置的方式
      • 3 ConfigMap的基本使用
      • 4 ConfigMap的实践
      • 5 Secret的基本使用
      • 6 ConfigMap和Secret的对比

1 为什么需要ConfigMap和Secret

应用程序启动过程中通常需要传递参数,当参数较多时会将参数保存到配置文件中,并在配置文件中设置默认参数,当程序启动时再从配置文件中读取配置。

k8s中的应用当然也有这种需求,一种方式是将基础的配置文件直接打包到镜像中,然后在启动命令中设置某些需要更改的配置项,但是,既然将配置项放到配置文件中,当然是希望能够方便地修改配置,如果每次修改配置都需要修改命令行参数,那配置文件有何意义?如果修改配置文件的默认配置还需要重新打包镜像,那配置就没作用了,就跟直接将配置项写死在程序中一样。因此,镜像中不应该包含配置文件,而是只有应用程序。

为了能够让应用程序从统一的地方加载配置文件,同时,能够一次性修改Deployment或者DaemonSet的所有Pod的配置项,k8s提供了两种保存配置的方式,ConfigMap和Secret(ConfigMap是直接以键值对的方式保存配置项,Secret则是会对配置项的值进行加密存储),Pod可以将它们作为卷挂载到容器中。

2 k8s中给容器传递配置的方式

  • 直接覆盖容器的ENTRYPOINT和CMD,修改容器启动的命令和参数
  • 为容器设置环境变量
  • 使用ConfigMap分离不同环境的配置

3 ConfigMap的基本使用

ConfigMap的使用包含ConfigMap的创建和挂载。

ConfigMap的创建可以通过命令行和yaml文件。

通过命令行创建ConfigMap:

kubectl create configmap app-config --from-literal=log_level=debug --from-literal=user=admin

上面的命令会创建名为app-config的ConfigMap,里面有两个配置项:user和log_level,值分别是admin和debug。最终在ConfigMap中的配置就是:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  log_level: debug
  user: admin

两个配置项以kv的方式保存在configmap.data。

一般来说,很多程序的配置项比较多,特别是生产环境的配置,因此,实际工作中一般不太可能直接用上面的命令创建ConfigMap,通常都是使用文件或者目录的方式创建:

kubectl create configmap app-config --from-file=a.conf --from-file=config_item=b.conf --from-file=config_dir

上面演示了三种从文件或者文件夹读取配置的方式:

  • –from-file=a.conf 会创建键为a.conf,值为文件内容的配置项
  • –from-file=config_item=b.conf 会创建键为config_item,值为文件内容的配置项
  • –from-file=config_dir 会创建以目录下文件名为键,值为对应内容的配置项

可以发现,用这种从文件中读取配置创建ConfigMap的方式默认情况下会使用文件名作为键,文件内容作为值,当然,也可以自定义键名,这种方式创建的ConfigMap的配置如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  a.conf: |
    a=b
    c=d
    e=f
  config_item: |
    m=n
    p=q
  m.conf: |
    l=m
  n.conf: |
    d=e

在k8s中,创建ConfigMap最常用的肯定还是yaml的方式,根据上面的ConfigMap的yaml结果也可以知道ConfigMap中的配置方式。

唯一需要说明的就是多行文本的表示:上例中,由于配置文件有多行,如果不加后面的|,最终的ConfigMap中的配置项的值会将多行变成一行,这当然不是我们预期的,因此,为了让配置文件能够以原本的样子保存到ConfigMap中,一般都可以带上|,如果真的要让配置文件内容与ConfigMap一模一样,则可以使用|+,前面的|在多个空行的情况下会合并成一个空行。

创建完ConfigMap,下一步就是将ConfigMap挂载给Pod使用。

最简单的方式就是直接将ConfigMap挂载到容器中,其中的键变成文件名,值就成为文件的内容:

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: my-config
      mountPath: /opt
  volumes:
  - name: my-config 
    configMap:
      name: app-config

Pod将app-config这个ConfigMap命名为my-config,然后将my-config这个卷挂载到nginx容器的/opt目录,创建该Pod后,Pod的nginx容器的/opt目录下就有4个配置文件:a.conf、config-item、m.conf、n.conf,容器的进程在启动后就可以读取这些配置文件。

4 ConfigMap的实践

当然,有时候事情并不是如此美好,k8s中也提供了一些选项用以应对一些特殊场景。

场景一:不允许修改ConfigMap

有时候ConfigMap的值是固定的,需要防止ConfigMap中的值被意外修改,这时候可以设置configmap.immutable为true,该选项只在1.21及以上的版本可用。

将ConfigMap设置为不能修改的好处除了防止被意外修改,还能够降低apiserver的压力,因为系统会关闭对无法修改的ConfigMap的监视操作。

场景二:可选的ConfigMap

默认情况下,当挂载某个不存在的ConfigMap时,Pod会长时间处于ContainerCreating状态,然后启动失败。有时候Pod会弱依赖其他的ConfigMap,也就是说,如果ConfigMap存在则进行挂载,如果不存在,则忽略,此时可以设置pod.spec.volumes.configMap.optional选项为true,那么在ConfigMap不存在的情况下,Pod会启动成功。

场景三:只挂载ConfigMap中的单个配置项

常规场景下是将ConfigMap中的键值对以目录中的文件方式挂载到目标目录,但是有时候只需要挂载某个配置项,这时候可以使用pod.spec.containers.volumeMounts.subPath选项,将该配置设置为ConfigMap中的某个键:

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: my-config
      mountPath: /opt/abc.conf
      subPath: a.conf
  volumes:
  - name: my-config 
    configMap:
      name: app-config

这里就将app-config这个ConfigMap中的a.conf挂载到容器中的/opt/abc.conf文件。

但是使用subPath有个问题:如果后续修改了Configmap的内容,容器重启时会失败。因此,一般不建议使用subPath。

5 Secret的基本使用

ConfigMap中的配置是以明文形式存储,为了增强数据的安全性,k8s提供了Secret。

Secret有三种类型:

  • Opaque:值以base64编码,如果想增强安全性,需要使用额外的安全插件
  • kubernetes.io/service-account-token:SA使用的Secret
  • kubernetes.io/dockerconfigjson:访问镜像仓库的Secret

跟ConfigMap类似,Secret也有命令行和yaml文件的方式创建。

请添加图片描述

可以发现,Opaque类型的Secret的创建命令跟ConfigMap很像,就是多了个类型字段,类型设置为generic,同时,通过base64 -d就可以直接解码成原来的值,因此,实项目中,如果需要高度安全,Opaque类型的Secret肯定还是不合适的。

对于文件类型的创建命令以及挂载到容器中的方式跟ConfigMap没有区别,这里不再过多介绍。

kubernetes.io/service-account-token类型的Secret:

创建ServiceAccount时,会创建对应的Secret,其中就包含证书和token,当pod.spec.serviceAccount设置为某个ServiceAccount时,Pod就会将该ServiceAccount对应的Secret挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录。

kubernetes.io/dockerconfigjson类型的Secret:

当容器运行时需要拉去镜像启动容器时,如果需要认证信息,就需要创建这种类型的Secret。

假设用户可以用admin/pwd登陆到内部的registry.oa.com镜像仓库,如果没有指定pod.spec.imagePullSecrets,而直接拉取不到镜像时,pod就会启动失败。

kubectl create secret docker-registry my-registry --docker-server=registry.oa.com --docker-username=admin --docker-password=pwd

此时查看Secret可以发现,k8s将用户名和密码变成了镜像仓库的登陆token,然后就可以将pod.spec.imagePullSecrets设置为my-registry。

6 ConfigMap和Secret的对比

ConfigMap和Secret都是用于存储应用的配置,但是Secret用于存储特定场景下的安全性较高的配置。

  • ConfigMap以明文形式保存应用程序的配置,可以通过卷的形式挂载到容器中进行使用
  • Opaque类型的Secret就是将数据以base64进行编码;SA类型的Secret是供Pod挂载,用以跟apiserver进行通信;dockerconfigjson类型的Secret用以保存访问镜像仓库的认证信息
  • Secret除了这里讲解的三种类型,还有其他的类型,例如tls和helm

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

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

相关文章

Parse [5/10/2020 7:05:04 PM] with format [yyyy-MM-dd] error!

项目场景: 对日期格式转化报错: Parse [5/10/2020 7:05:04 PM] with format [yyyy-MM-dd] error! 问题描述 例如:数据日期格式无法强行转化为常见格式 String releaseDate"5/10/2020 7:05:04 PM";String format DateUtil.format…

C++设计模式-适配器(Adapter)

目录 C设计模式-适配器(Adapter) 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-适配器(Adapter) 一、意图 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工…

Python: 库decimal()用于浮点数相加

from decimal import Decimal a1.1 b2.2 print(Decimal(2.2)Decimal(1.1))结果为:3.3 Pyhton中浮点数是不能直接相加的。 可以看到结果并不对。 因此需要用到decimal 可以看到ac时不计算的结果是正确的。 因此在python中,计算浮点数时,一部…

SpringCloud学习一

单体应用存在的问题 随着业务的发展,开发变得越来越复杂。 修改、新增某个功能,需要对整个系统进行测试、重新部署。 一个模块出现问题,很可能导致整个系统崩溃。 多个开发团队同时对数据进行管理,容易产生安全漏洞。 各个模块…

王道考研操作系统——文件管理

磁盘的基础知识 .txt用记事本这个应用程序打开,文件最重要的属性就是文件名了 保护信息:操作系统对系统当中的各个用户进行了分组,不同分组的用户对文件的操作权限是不一样的 文件的逻辑结构就是文件内部的数据/记录应该被怎么组织起来&…

【C++深入浅出】类和对象下篇

一. 前言 老样子,先来回顾一下上期的内容:上期我们着重学了C类中的六大默认成员函数,并自己动手实现了一个日期类,相信各位对C中的类已经有了一定程度的了解。本期就是类和对象的最后一篇啦,终于要结束咯,吧…

Java编程题(完数)

题目 一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和&#xff0c;这个数就称为完数。例如61&#xff0b;2&#xff0b;3(6的因子是1,2,3)。 现在&#xff0c;你要写一个程序&#xff0c;读入两个正整数n和m&#xff08;1<n<m<…

《Spring安全配置》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【Python】简记操作:Centos安装、卸载、升级Python运行环境

目录 安装 1、选择合适自己的python版本 2、选择合适的目录进行指定版本源码下载 3、解压编译安装 解压 编译安装&#xff0c;完成即可执行python相关命令 测试是否已成功安装python 4、设置python的全局环境变量&#xff08;/etc/profile&#xff09; 设置环境变量 校…

RPC分布式网络通信框架项目

文章目录 对比单机聊天服务器、集群聊天服务器以及分布式聊天服务器RPC通信原理使用Protobuf做数据的序列化&#xff0c;相比较于json&#xff0c;有哪些优点&#xff1f;环境配置使用项目代码工程目录vscode远程开发Linux项目muduo网络库编程示例CMake构建项目集成编译环境Lin…

【RabbitMQ 实战】08 集群原理剖析

上一节&#xff0c;我们用docker-compose搭建了一个RabbitMQ集群&#xff0c;这一节我们来分析一下集群的原理 一、基础概念 1.1 元数据 前面我们有介绍到 RabbitMQ 内部有各种基础构件&#xff0c;包括队列、交换器、绑定、虚拟主机等&#xff0c;他们组成了 AMQP 协议消息…

次方计数的拆贡献法(考虑组合意义)+限定类问题善用值域与位置进行ds:1006T3

对于多次方的计数问题可以考虑拆贡献。 题目问 ∣ S ∣ 3 |S|^3 ∣S∣3&#xff0c; ∣ S ∣ |S| ∣S∣ 表示选的点数。相当于在 ∣ S ∣ |S| ∣S∣ 中选了3次&#xff0c;也就是选了3个可相同的点。 先考虑3个不相同点的贡献&#xff0c;对应任意3个点&#xff0c;必然会对…

Go Gin Gorm Casbin权限管理实现 - 2. 使用Gorm存储Casbin权限配置以及`增删改查`

文章目录 0. 背景1. 准备工作2. 权限配置以及增删改查2.1 策略和组使用规范2.2 用户以及组关系的增删改查2.2.1 获取所有用户以及关联的角色2.2.2 角色组中添加用户2.2.3 角色组中删除用户 2.3 角色组权限的增删改查2.3.1 获取所有角色组权限2.3.2 创建角色组权限2.3.3 修改角色…

uni-app 经验分享,从入门到离职(实战篇)——模拟从后台获取图片路径数据后授权相册以及保存图片

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;需求描述&#x1f3af;前置知识点&#x1f9e9;uni.showLoading()&#x1f9e9;uni.authorize()&#x1f9e9;uni.downloadFile()&#x1f9e9;uni.saveImageToPhotosAlbum() &#x1f3af;演示代码&#x1f9e9;关于图片接…

不能一棍子敲死刚诞生不久的USB-C,虽然它有时确实很惹人厌

今年iPhone机型最大的预期之一是从苹果专有的Lightning端口过渡到USB-C标准。一些人担心过渡需要他们更换所有配件&#xff0c;而另一些人&#xff08;包括你&#xff09;则期待着未来能够为iPad、MacBook和iPhone使用一根电缆。 然而&#xff0c;现在新机型已经问世&#xff…

微信小程序使用路由传参和传对象的方法

近期在做微信小程序开发&#xff0c;在页面跳转时&#xff0c;需要携带参数到下一个页面&#xff0c;尤其是将对象传入页面。为了方便重温&#xff0c;特此记录。 路由传字符串参数 原始页面 传递字符串参数比较简单。路由跳转有两种方式&#xff0c;一种是通过navigator组件…

【AI视野·今日CV 计算机视觉论文速览 第262期】Fri, 6 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 6 Oct 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Improved Baselines with Visual Instruction Tuning Authors Haotian Liu, Chunyuan Li, Yuheng Li, Yong Jae Lee大型多模…

java Spring Boot在配置文件中关闭热部署

之前更大家一起搭建了一个热部署的开发环境 但是 大家要清楚一个情况 我们线上程序运行突然内部发生变化这是不可能的。 所以 他就只会对我们开发环境有效 是否开启 我们可以通过 application配置文件来完成 我这里是yml格式的 参考代码如下 spring:devtools:restart:enabled…

雷达天线、信号链路、大气衰减基本概念

一、 有效各向同性辐射功率 有效各向同性辐射功率是各向同性天线必须辐射的假设功率,以在天线最强波束的方向上提供与实际源天线相同(等效)的信号强度。 二、电磁波传播 图1 从发射机到接收机的链路路径 信号与环境传播模型远离地面的高频和/或链路路径和/或窄天线Line of …

基础算法之——【动态规划之路径问题】1

今天更新动态规划路径问题1&#xff0c;后续会继续更新其他有关动态规划的问题&#xff01;动态规划的路径问题&#xff0c;顾名思义&#xff0c;就是和路径相关的问题。当然&#xff0c;我们是从最简单的找路径开始&#xff01; 动态规划的使用方法&#xff1a; 1.确定状态并…