[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap

2023-11-09

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122856681


目录

前言:

第1章 ConfigMap概述

1.1 什么是ConfigMap?

1.2 配置信息真正的保存地方

1.3 配置信息保存格式

1.4 创建ConfigMap对象的4种方式

第2章 创建ConfigMap对象, 关联pod内部的配置文件的路径

2.1 通过命令行参数--from-literal创建

2.2 根据键值对文件创建(非configmap文件)

2.3 根据多个键值对文件创建(一个configmap支持多个配置文件)

2.4 根据键值对文件所在文件目录(目录中可能有多个文件)

2.5 根据configmap.yaml文件生成

第3章 创建pod,关联ConfigMap对象

3.1 通过环境变量使用

3.2 通过在pod的命令行下运行的方式(启动命令中)

3.3 作为volume的方式挂载到pod内。


前言:

PV和PVC解决了pod间共享目录的挂载,有时候,我们只期望挂载pod内部的配置文件,以便于在pod外部对pod的配置进行修改,PV和PVC就搞不定了,新的机制来满足上述需求,这就是ConfigMap。

第1章 ConfigMap概述

1.1 什么是ConfigMap?

为了让Docker镜像和Docker镜像运行时的配置文件解耦,以便实现镜像的可移植性和可复用性,进入了ConfigMap。

ConfigMap是用来存储集群中的Pod所需要的配置文件信息的kubernetes资源对象。Map是键值对的映射,是一种字典。

ConfigMap所管辖的配置信息是非加密的非安全性要求的数据。

通过configmpa,多个pods对象可以在集群内部共享相同的配置文件。

1.2 配置信息真正的保存地方

ConfigMap只是用来在集群内部,在Pod外部,描述配置信息的对资源对象,本身并不存放配置信息。所有的配置内容实际上都存储在K8S系统中的etcd,并通过ConfigMap这个对象实现pod之间,pod与pod外部共享配置信息。

1.3 配置信息保存格式

存放在etcd中的配置文件信息,是按照键值对的方式存储的,如IP:value; port:value等。

1.4 创建ConfigMap对象的4种方式

(1)通过指定命令行参数创建,即--from-literal

(2)通过指定特定文件创建,即将一个配置文件创建为一个ConfigMap--from-file=<文件>

(3)通过指定特定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录>

(4)事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

第2章 创建ConfigMap对象, 关联pod内部的配置文件的路径

2.1 通过命令行参数--from-literal创建

$ kubectl create configmap config-map1 --from-literal=db.host=10.5.10.116 --from-literal=db.port='3306'

$ kubectl get configmap

# 以yaml 格式输出config map的内容
$ kubectl get configmap config-map1 -o yaml >> config-map1.yaml
$ cat config-map1.yaml
[root@k8s-master1 ~]# cat config-map1.yaml
apiVersion: v1
data:                     # 配置文件的名称data
  db.host: 10.5.10.116    # 配置文件的内容
  db.port: "3306"         # 配置文件的内容
kind: ConfigMap  
metadata:
  creationTimestamp: "2022-02-10T06:23:49Z"
  name: config-map1   # configmap对象的名称
  namespace: default
  resourceVersion: "72089"
  uid: 5aaef0ba-2ac3-4a19-a97a-ebbe53c16d84

因此,configmap的内容以字典的形式存在的:

configmap对象的名称:name: config-map1

配置文件的名称:无

配置文件的内容:

  db.host: 10.5.10.116
  db.port: "3306"

2.2 根据键值对文件创建(非configmap文件)

(1)生成属性文件

touch app.properties
vi app.properties

propertie1 = 1
propertie2 = 2
propertie3 = 3

(2)根据属性文件生成configmap对象

kubectl create configmap config-map2 --from-file=./app.properties  --from-file=./app.params 
  • --from-file=./app.properties  : 指定配置文件名

(3)展现configmap对象的内容

[root@k8s-master1 ~]#  kubectl get configmap config-map2 -o yaml
apiVersion: v1
data:
  app.properties: |    # 配置文件的名称
    propertie1 = 1     # 配置文件的内容
    propertie2 = 2     # 配置文件的内容
    propertie3 = 3     # 配置文件的内容
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-10T06:35:55Z"
  name: config-map2    # configmap对象的名称
  namespace: default
  resourceVersion: "73035"
  uid: 8d773265-b04f-4017-ace4-c557c1c517fd

configmap对象的名称:name: config-map2

配置文件的名称:app.properties,一个configmap可以包含多个配置文件

配置文件的内容:

    propertie1 = 1     # 配置文件的内容
    propertie2 = 2     # 配置文件的内容
    propertie3 = 3     # 配置文件的内容

2.3 根据多个键值对文件创建(一个configmap支持多个配置文件)

(1)生成多个配置文件

touch app.properties1
vi app.properties1

propertie1 = 1
propertie2 = 2
propertie3 = 3



touch app.properties2
vi app.properties2

propertie1 = 4
propertie2 = 5
propertie3 = 6

(2)根据多个配置文件生成configmap对象

kubectl create configmap config-map3 --from-file=./app.properties1  --from-file=./app.properties2

--from-file=./app.properties  : 指定配置文件名

(3)展现configmap对象的内容

2.4 根据键值对文件所在文件目录(目录中可能有多个文件)

方法基本同2.2, 不同的是:--from-file参数指定的是键值对文件所在的目录,而是是文件本身。

$ mkdir config

$ kubectl create configmap config-map2 --from-file=./config/
[root@k8s-master1 ~]#  kubectl get configmap config-map3 -o yaml
apiVersion: v1
data:
  app.properties1: |
    propertie1 = 1
    propertie2 = 2
    propertie3 = 3
  app.properties2: |
    propertie1 = 4
    propertie2 = 5
    propertie3 = 6
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-10T09:14:46Z"
  name: config-map3
  namespace: default
  resourceVersion: "85423"
  uid: f0b24171-b45a-460f-8fd8-d11a343d2699

app.properties1: 配置文件1

app.properties2: 配置文件2

通过items来指定configmap中的多个不同的文件名。

2.5 根据configmap.yaml文件生成

这是最标准的方法。

kubectl create configmap config-map1 --from-file=./config-map1.yaml
# 以yaml 格式输出config map的内容
$ kubectl get configmap config-map1 -o yaml >> config-map1.yaml
$ cat config-map1.yaml

[root@k8s-master1 ~]# cat config-map1.yaml
apiVersion: v1
data:
  db.host: 10.5.10.116
  db.port: "3306"
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-10T06:23:49Z"
  name: config-map1
  namespace: default
  resourceVersion: "72089"
  uid: 5aaef0ba-2ac3-4a19-a97a-ebbe53c16d84

configmap对象的名称:name: config-map1

配置文件的名称:无

配置文件的内容:

  db.host: 10.5.10.116
  db.port: "3306"

第3章 创建pod,关联ConfigMap对象

创建ConfigMap对象后,把配置文件的内容存放在K8S的etcd档案库中,并且通过ConfigMap对象就可以访问键值对的配置文件的值,而不是需要通过文件路径名访问。

前一章创建了configmap对象以及相关的内容,有三种使用configmap中键值对配置的方式。

  • 第一种是通过环境变量的方式,直接传递给pod
    • 使用configmap中指定的key
    • 使用configmap中所有的key
  • 第二种是通过在pod的命令行下运行的方式(启动命令中)
  • 第三种是作为volume的方式挂载到pod内。

3.1 通过环境变量使用

3.2 通过在pod的命令行下运行的方式(启动命令中)

3.3 作为volume的方式挂载到pod内。

(1)configmap的内容解读

configmap对象的名称:name: config-map1

配置文件的名称:redis-conf, 一个configmap可以包含多个配置文件名。

配置文件的内容:

  appendonly=yes

(2)pod的mount映射解读

  • 第1个mount

本地的路径:mountpath=data

远程的volume:data

        data即不是NFS, 也不是configmap,而是空目录

  • 第2个mount

本地的路径:mountpath=redis-master

远程的volume:config

        config对象的类型是K8S的configmap,而不是NFS, 也不是本地目录

        config对应的configmap的对象名为redis-conf

                items: 指定redis-master目录应该包含configmap中哪些配置文件。

                        key:redis-conf =》指定configmap中一个配置文件名。

                        path:redis-conf =》 指定configmap中的配置文件名,mount后的文件名。

至此,第2个mount为的映射结果为:redis-master/redis-conf

如果有多个配置文件需要映射到redis-master/目录中,则至少有两个步骤要改进

首先,configmap中有多个配置文件,至少有两个配置文件。

然后,在items再增加新的key和path。

3.4 配置命令详解

$ vi cm-redis.conf

appendonly = yes
$ kubectl create configmap cm-redis-conf --from-file=./cm-redis.conf


[root@k8s-master1 ~]# kubectl get configmap cm-redis-conf  -o yaml
apiVersion: v1
data:
  cm-redis.conf: |+
    appendonly yes

kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-10T16:44:40Z"
  name: cm-redis-conf

$ touch redis-pod-cm.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: my-redis-pod
spec:
  containers:
  - name: my-redis-container
    image: kubernetes/redis:v1
    env:
    - name: MASTER
      value: "true"
    ports:
    - containerPort: 6379
    resources:
      limits:
        cpu: "0.1"
    volumeMounts:
    - mountPath: /redis-master-data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
  - name: data
    emptyDir: {}
  - name: config
    configMap:
      name: cm-redis-conf
      items:
      - key:  cm-redis.conf
        path: redis.conf

$ kubectl apply -f redis-pod-cm.yaml 


$ kubectl get pod


$ kubectl exec -it my-redis-pod -- /bin/sh


[root@k8s-master1 ~]# kubectl exec -it my-redis-pod -- /bin/sh
# cd /redis-master-data
# ls

# cd /redis-master
# ls
redis.conf

# cat redis.conf
appendonly yes

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122856681

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap 的相关文章

  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • Apache 端口转发 80 到 8080 并访问 Apache (80) 中托管的应用程序,即 phpMyadmin 和 Tomcat (8080)

    我想访问托管在 tomcat 服务器 8080 中的应用程序 myapp 当前可以通过以下方式访问http example com 8080 myapp http example com 8080 myapp in http example
  • 选择fasta文件中氨基酸超过300个且“C”出现至少4次的序列

    我有一个包含蛋白质序列的 fasta 文件 我想选择超过 300 个氨基酸且半胱氨酸 C 氨基酸出现超过 4 次的序列 我使用此命令来选择具有超过 300 个 aa 的序列 cat 72hDOWN fasta fasta bioawk c
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R

随机推荐

  • 微信公众号订阅通知介绍

    功能介绍 订阅通知是一个用户主动订阅 服务号按需下发的通知能力 使用过程请遵守 微信公众平台服务协议 微信公众平台运营规范 如有疑问 可在微信开放社区反馈 设置订阅功能 服务号可以在图文消息 网页等场景设置订阅功能 下发条件 用户在前述场景
  • mybatis 自动填充无效_mybatis-plus3.3.0自动填充方法有改变?

    源自 mybatis plus3 3 0自动填充方法有改变 Slf4j Component public class MyMetaObjectHandler implements MetaObjectHandler Override pub
  • git 服务器 文件目录结构,查看Jenkins 服务器上的目录结构

    1 很多同学 不太清楚 默认的Jenkins安装后 文件在服务器 的哪个目录 其实 大家随便构建一个JOB 看 控制台输出 是的 Jenkins的所有文件 存储在 root jenkins这个文件夹 2 通过xshell等工具 进入 jen
  • 网页设计规范 网页设计稿尺寸

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 移动端H5设计稿尺寸 移动端H5尺寸 设计移动端 H5 项目的时候 我们一般以用户量较高的 iPhone6 7 8的尺寸 750x1334px为准 然后我们要在顶部预留出微
  • Native memory allocation (mmap) failed to map 6215958528 bytes for committing reserved memory

    今天突然发现es报错 无法正常启动 报错信息如下 Exception in thread main java lang RuntimeException starting java failed with 1 output There is
  • 【微信小程序入门到精通】— 渲染列表的详细方法

    目录 前言 一 引入 wx for 1 1 wx for 语法结构 1 2 wx for 实例 二 wx key 应用 总结 前言 对于目前形式 微信小程序是一个热门 那么我们该如何去学习并且掌握之后去做实际项目呢 为此我特意开设此专栏 在
  • CVE-2021-3493漏洞复现案例(提权)

    下面复现需要在虚拟机中完成 CVE 2021 3493漏洞案例 可以在下面链接下载关于该漏洞的代码脚本 https github com inspiringz CVE 2021 3493 1 攻击工具及环境说明 在虚拟机上完成 Ubuntu
  • 【已更新】2023mothercup妈妈杯D题数学建模挑战赛思路代码-航空安全风险分析和飞行技术评估问题

    我们来看下D题 这道题是一道数据分析类题目 总共有五个小问 第一题是要求我们针对附件1的数据质量开展可靠性研究 提取与飞行安全相关的部分关键数据项 并对数据项的重要程度进行分析 第一步是对数据的可靠性分析 数据质量的可靠性研究主要包括数据完
  • win32 socket编程 示例(功能简单,完善)

    最近在做的一个项目要用到网络通信方面的内容 于是自学了下win32socket 原来自己学过计算机网络 只了解网络各层的原理 但没有真正的编程来实现这些原理 哎 不过现在还来得及 下面是自己的一个示例 虽然简单 但了解了它 就知道了最基本的
  • Idea 学生认证

    Idea 学生认证 具体步骤 认证地址 操作如图 具体步骤 认证地址 https www jetbrains com community education students 操作如图 学生邮箱会收到来信 认证完成
  • linux常用命令笔记(二)

    2020 03 18 一 echo 1 原文输出 双引号可加可不加 echo hello world echo hello world 2 输出变量的值 echo 变量名 echo PATH 输出环境变量PATH的值 注意 linux环境变
  • 每一代内存的读写速度大概是多少?

    每一代内存的读写速度大概是多少 原文 https zhidao baidu com question 1797460631148535467 html 内存 有核心频率 I O频率 等效频率 最后由等效频率而算出带宽 带宽就等于内存的速度
  • vite+react+ts+eslint+prettier构建react开发项目

    目录 一 构建项目 二 安装eslint和prettier的依赖 三 修改 eslintrc cjs 创建 prettierrc cjs 1 eslintrc cjs文件配置 2 prettierrc cjs文件配置 三 将错误显示在页面上
  • 蓝桥杯嵌入式CT117E-M4学习笔记08-串口通信实验

    文章目录 前言 一 实验原理 二 配置步骤 三 串口发送 1 直接使用HAL USART Transmit发送 2 使用重定向prtinf函数发送 四 串口接收 总结 前言 本节我们学习开发板的串口通信 一 实验原理 1 串口通信原理 详见
  • 浏览器的渲染机制、提升页面性能、错误监控上报

    js运行机制 微任务队列 事件循环 单线程 错误监控 CSRF防范 css盒模型 Dom事件 原型链
  • 接口测试工具-apipost

    apiost Postman Swagger Mock 功能特色 实现多人实时协作 接口自动化测试 选择接口 组成流程 执行流程 基于接口创建在线文档可分享 官网 Apipost API 文档 调试 Mock 测试一体化协作平台 API列表
  • 02.07_两个链表相交

    给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表没有交点 返回 null 解法一 如果两个链表有相交 那么从后面看一定是相同的 所以只需要把长的移动到和短的链表一样的长度开始遍历即可
  • 低成本副业:开发小程序商城攻略

    随着互联网的普及和电子商务的兴起 越来越多的人选择做点副业 其中开发小程序商城是一个不错的选择 相比传统的实体店 小程序商城的成本更低 而且门槛更低 可以让更多的人参与到副业中来 那么 如何开发自己的小程序商城呢 下面为大家介绍步骤和技巧
  • STM32中遇到的问题--关于串口的一些常见问题

    在单片机的开发过程中 最常用的外设就是串口了 是用来进行bug纠错 log输出的常用工具 也是用来与外部通讯的常见协议之一 但是在使用串口的过程中难免会遇到一些问题 下面就我在工作遇到的一些问题做了一些记录 与大家分享 其实也是为了自己在以
  • [云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122856681 目录 前言 第1章