k8s configmap 详解, 从理解 k8s volumes 挂载方式, 带你解决挂载 configmap 的种种疑难杂症, 以及 k8s 中如何创建 configmap_configmap挂载配置文件-程序员宅基地

技术标签: 云原生  kubernetes  容器  运维  linux  docker  

在这里插入图片描述

博客原文

引言

ConfigMap 顾名思义,是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件。Secret 可以为 Pod 提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以使用 ConfigMap。

ConfigMap 的创建和使用方式与 Secret 非常类似,主要的不同是以明文的形式存放

创建方式:

序号 创建方式 参数
1 命令行 key-value 格式创建 (字面量方式创建) –from-literal
2 根据文件创建 (env 方式创建) –from-env-file
3 从目录创建 –from-file
4 根据 yaml 创建 kubectl create -f

1. 命令行 key-value 格式创建 (字面量方式创建)

$ kubectl create configmap literal-configmap --from-literal=key1=value1 --from-literal=key2=value2 --from-literal=key3=value3

$ kubectl get configmap literal-configmap -oyaml
apiVersion: v1
data:
  key1: value1
  key2: value2
  key3: value3
kind: ConfigMap
metadata:
  creationTimestamp: "2024-01-09T04:25:43Z"
  name: literal-configmap
  namespace: default
  resourceVersion: "594871"
  uid: b7f8824c-01dd-4438-994d-fc8c9d50649c

2. 根据文件创建 (env 方式创建)

文件格式为: key=value, 与 .ini格式一致

$ cat testenv
envkey1=envvalue1
envkey2=envvalue2

$ kubectl create configmap envfile-configmap --from-env-file testenv

$ kubectl get configmaps envfile-configmap -oyaml
apiVersion: v1
data:
  envkey1: envvalue1
  envkey2: envvalue2
kind: ConfigMap
metadata:
  creationTimestamp: "2024-01-09T04:31:45Z"
  name: envfile-configmap
  namespace: default
  resourceVersion: "595672"
  uid: 8841549f-73da-4040-8c76-39517d1bd2d7

3. 从目录创建

从目录创建 configmap 只会读取文件夹第一级内容, 不会递归搜索

# 创建两个 pod yaml
$ mkdir pods
$ kubectl run nginxpod --image=nginx --dry-run=client -oyaml > pods/nginxpod.yaml
$ kubectl run envoypod --image=envoy --dry-run=client -oyaml > pods/envoypod.yaml

# 把 pods 整个目录下内容作为 configmap 的 data
# key: 文件名
# value: 文件内容
$ kubectl create configmap testfile --from-file pods/

$ kubectl get configmaps testfile -oyaml
apiVersion: v1
data:
  envoypod.yaml: |
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        run: envoypod
      name: envoypod
    spec:
      containers:
      - image: envoy
        name: envoypod
        resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
    status: {}
  nginxpod.yaml: |
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        run: nginxpod
      name: nginxpod
    spec:
      containers:
      - image: nginx
        name: nginxpod
        resources: {}
      dnsPolicy: ClusterFirst
      restartPolicy: Always
    status: {}
kind: ConfigMap
metadata:
  creationTimestamp: "2024-01-09T05:14:01Z"
  name: testfile
  namespace: default
  resourceVersion: "601262"
  uid: 89254512-f822-4414-927f-1bdb4fd1dcef

4. 根据 yaml 创建

创建 configmap yaml:

apiVersion: v1
data:
  yamlkey1: yamlvalue1
  yamlkey1: yamlvalue1
kind: ConfigMap
metadata:
  name: yaml-configmap
  namespace: default
$ kubectl create -f yaml-configmap.yaml

configmap 的使用

  1. 作为环境变量注入
  2. 以 volume 方式挂载

注意!!

  • ConfigMap必须在Pod使用它之前创建
  • 使用envFrom时,将会自动忽略无效的键
  • Pod只能使用同一个命名空间的ConfigMap

1. 作为环境变量注入

创建 pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - image: busybox
    name: busybox
    command: ["/bin/sh","-c","echo $KEY1 && env"]
    env:
    - name: KEY1
      valueFrom:
        configMapKeyRef:
          key: key1
          name: literal-configmap  # configmap 名称
    - name: KEY2
      valueFrom:
        configMapKeyRef:
          key: key2
          name: literal-configmap
  restartPolicy: Never

查看 pod1

$ kubectl get po
NAME                         READY   STATUS      RESTARTS       AGE
pod1                         0/1     Completed   0              7s
......

# 查看 pod1 的标准输出
$ kubectl logs pod1
value1
KEY1=value1
KEY2=value2
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=pod1
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/

2. 以 volume 方式挂载

一个 key 对应一个文件

挂载完整的 configmap

**注意: **直接挂载 configmap 会覆盖 mountPath 文件夹, 需要确保 mountPath 为空目录, 否则 pod 无法创建

查看 configmap 值

# 输出 go map 类型
# kubectl get cm testfile -o go-template='{
    {.data}}'
Name:         testfile
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
envoypod.yaml:
----
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: envoypod
  name: envoypod
spec:
  containers:
  - image: envoy
    name: envoypod
    resources: {
    }
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {
    }

nginxpod.yaml:
----
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginxpod
  name: nginxpod
spec:
  containers:
  - image: nginx
    name: nginxpod
    resources: {
    }
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {
    }


BinaryData
====

Events:  <none>
  • 两个 key

创建 pod

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  volumes:
  - name: cm
    configMap:
      name: testfile
  containers:
  - image: busybox
    name: busybox
    command: ["sleep", "24h"]
    volumeMounts:
    - mountPath: /etc/config
      name: cm
$ kubectl create -f pod2.yaml

$ kubectl exec pod2 -- ls /etc/config
envoypod.yaml
nginxpod.yaml
$ kubectl exec pod2 -- cat /etc/config/nginxpod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginxpod
  name: nginxpod
spec:
  containers:
  - image: nginx
    name: nginxpod
    resources: {
    }
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {
    }
挂载 configmap 中特定 key

**注意: ** configmap 挂载都是覆盖行为

  • 对于多个 key: 确保挂载 mountPath 为空目录
  • 对于单一 key: 确保 mountPath 为空文件

创建 pod

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  volumes:
  - name: cm
    configMap:
      name: testfile
      items:
      - key: nginxpod.yaml
        path: keys/nginx.yaml  # 该字段指定相对路径地址
      - key: envoypod.yaml
        path: envoy.yaml
  containers:
  - image: busybox
    name: busybox
    command: ["sleep", "24h"]
    volumeMounts:
    - mountPath: /etc/yaml
      name: cm
$ kubectl exec pod3 -- ls -l /etc/yaml/
lrwxrwxrwx    1 root     root            17 Jan  9 06:34 envoy.yaml -> ..data/envoy.yaml
lrwxrwxrwx    1 root     root            11 Jan  9 06:34 keys -> ..data/keys
$ kubectl exec pod3 -- ls -l /etc/yaml/keys/
-rw-r--r--    1 root     root           241 Jan  9 06:34 nginx.yaml

练习

  1. 真实世界的案例:使用 ConfigMap 来配置 Redis

参考:

  1. https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#add-configmap-data-to-a-volume
  2. https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#use-configmap-defined-environment-variables-in-pod-commands
  3. k8s – ConfigMap - 简书 (jianshu.com)
  4. k8s之ConfigMap详细理解及使用-程序员宅基地
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_51964671/article/details/135480707

智能推荐

自然语言处理—初始自然语言处理技术—自然语言处理的前置技术_# 任务1:抽取years_string中所有的年份并输出# 任务2:匹配text_string中包-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏17次。(一)正则表达式在NLP中的应用正则表达式简介正则表达式是一种定义了搜索模式的特征序列,主要是用于字符串的模式匹配,或是字符的匹配。_# 任务1:抽取years_string中所有的年份并输出# 任务2:匹配text_string中包含“文

在ubuntu terminal(终端)的命令提示行 隐藏/显示 当前工作目录_ubuntu终端隐藏输出信息-程序员宅基地

文章浏览阅读1.4w次,点赞7次,收藏9次。ubuntu的终端里,命令行提示是默认显示当前工作目录的绝对路径,如下:user@system:/folder1/folder2/folder3/folder4$当绝对路径比较长的时候就有点烦了,因为输入的命令就不得不过行写(因为第一行里路径就占用太多space了)。。而且terminal的窗口标题就是显示当前目录的绝对路径,加上还有个pwd命令可以显示当前路径,所以个人感觉没必要在命_ubuntu终端隐藏输出信息

javaScript简介(第一章)_javascript第一章-程序员宅基地

文章浏览阅读398次。1.1 js简史Javascript诞生于1995年。当时的作用仅仅是用来处理一些以前由服务器语言来处理的表单验证等操作,节约拨号上网验证时间。就职于Netscape公司的布兰登-艾奇,开始为计划于1995年发售的Netacape Navigator 2开发一种名为Livescript的脚本语言,在发布前夕,Netscape为了搭上媒体炒作java的顺风车,改名为Javascript。1997年,以_javascript第一章

Java source1.5不支持diamond运算符,请使用source 7或更高版本以启用diamond运算符_java source demond-程序员宅基地

文章浏览阅读1.5k次。转载:https://blog.csdn.net/xsm666/article/details/80076253 Maven默认用的是JDK1.5去编译diamond运算符,指的是JDK1.7的一个新特性 List&lt;String&gt; list = new ArrayList&lt;String&gt;(); // 老版本写法 List&lt;String&g..._java source demond

机器学习笔记 预测的原则和风险_机器学习风险预测-程序员宅基地

文章浏览阅读588次。预测可以采取多种形式——盯着水晶球或茶叶碗、结合专家的意见、头脑风暴、情景生成、假设分析、蒙特卡罗模拟、求解由物理定律或经济理论决定的方程——但统计预测,这是这里要讨论的主要话题,是根据数据进行预测的艺术和科学,无论您事先知道或不知道您应该使用什么等式。 这个想法很简单:在当前可用的数据中寻找统计模式,你认为这些模式会持续到未来。 换句话说,要弄清楚未来与现在非常相似的方式,只是时间更长。_机器学习风险预测

IP路由原理 直连路由和静态路由 路由协议_路由器接口ip及直联路由-程序员宅基地

文章浏览阅读7.4k次,点赞15次,收藏94次。学习基于前人的PPT和维基百科、百度百科等一系列权威资料。学习笔记仅个人学习用,便于记录和复习,无广泛传播之意,若有侵权,请联系我删除。1IP路由原理路由是指导IP报文发送的路径信息。(就是指导路由器如何进行数据报文发送的路径信息) 2直连路由和静态路由根据路由器学习路由信息、生成并维护路由表的方法包括直连路由(Direct)、静态路由(Static)和动态路由(Dynamic)。直连路..._路由器接口ip及直联路由

随便推点

JPS命令的安装和使用_jps命令安装-程序员宅基地

文章浏览阅读2w次,点赞5次,收藏29次。一、简介jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。二、安装安装完java (yum install java)后,还需要安装openjdk-devel包才能使用jps命令。yum instal..._jps命令安装

linux远程开发——使用vs2019远程连接linux_vs2019远程调试linux-程序员宅基地

文章浏览阅读9k次,点赞18次,收藏85次。步骤一、新建项目1、打开vs2019,选择创建新项目。2、选择c++、Linux,创建一个空项目,点击下一步。3、项目命名并选择存放位置(不要有中文),点击创建。4、右键项目,添加——>新建项。5、选择c++文件(只包含一个.cpp文件,如果要创建类的话选择c++类会创建.cpp和.h两个文件),名称改为main.cpp,点击添加。_vs2019远程调试linux

使用SpringBoot实现邮件发送_springboot发送邮件-程序员宅基地

文章浏览阅读9.1k次,点赞15次,收藏68次。邮件发送是一个非常常见的功能,注册时的身份认证、重要通知发送等都会用到邮件发送。Sun公司提供了JavaMail用来实现邮件发送,但是配置烦琐,Spring中提供了JavaMailSender用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration对邮件的发送做了进一步简化。下面就来看看Spring Boot中如何发送邮件。发送前的准备以QQ邮箱为例,首先要申请开通POP3/SMTP服务或者IMAP/SMTP服务。SMTP全称为Simple MailTr._springboot发送邮件

【FFMpeg】获取ffmpeg版本号_获取ffmpeg版本接口-程序员宅基地

文章浏览阅读5.8k次。ffmpeg版本号首先,我们通常所说的ffmpeg版本号,如ffmpeg 4.3.2这种,是官网进行整体打包发布时的版本号这个版本号,在我们使用代码时,是获取不了的因为我们在代码中使用ffmpeg库时,并是按照整体进行引用的而是按单个组件去引用的,每个组件都可以使用不同的版本,我们只能在代码中获取单个组件的版本号查看组件版本号ffmpeg官网下载页面 - http://ffmpeg.org/download.html在官网页面,我们可以看到某个ffmpeg发布包中,某个组件的版本号是多少_获取ffmpeg版本接口

python 正则表达式 前瞻_大数据分析Python正则表达式有哪些?-程序员宅基地

文章浏览阅读86次。学习大数据分析的难点在于记住所有语法。在AAA教育时,我们提倡习惯于查阅Python文档,有时可以得到方便的PDF参考,这很好,因此我们整理了此Python正则表达式(regex)备忘单,为您提供帮助!此正则表达式备忘单基于Python 3的正则表达式文档。如果您对学习Python感兴趣,我们可以免费提供交互式的初学者和中级Python编程课程。大数据分析的正则表达式(PDF)特殊的角色^| 在字..._python 正则前瞻

【Golang】教你简单部署GO语言服务端_go服务端-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏20次。众所周知,go语言是可以直接将代码编译为二进制可执行文件的,因此服务器上不需要准备go的环境,仅服务端的部署也非常的简单,对比java真的是太便捷了。下面我就来简单分享一下,怎么实现部署。......_go服务端

推荐文章

热门文章

相关标签