k8s之ConfigMap和secret

news2024/12/23 9:35:52

写在前面

我们知道k8s的数据都是存储到kv数据库etcd中的,那么我们程序中使用到各种配置信息是否可以也存储到etcd,然后在pod中使用呢?是可以的,k8s为了实现将自定义的数据存储到etcd,定义了ConfigMap 和secret两种API对象 。其中ConfigMap用来保存明文数据,如端口号,普通配置参数等,Secret用来配置需要加密的数据,如密码,秘钥等。本文就一起来看下这两个对象的定义以及如何在pod中使用。

1:ConfigMap

先来生成yaml模板:

dongyunqi@dongyunqi-virtual-machine:~/test$ export out="--dry-run=client -o yaml" && kubectl create configmap info $out
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: info

修改完善后如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: info

data:
  count: '10'
  debug: 'on'
  path: '/etc/systemd'
  greeting: |
    say hello to kubernetes.

这里主要增加了data,即需要存储到etcd的配置项,如果是我们想要在生成模板时就生成data内容,则可以增加--from-literal=k=v,如 kubectl create cm info --from-literal=k=v $out,yaml文件编写完了,我们就可以apply了,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl apply -f configmap.yml 
configmap/info created

执行完毕数据就写到etcd中了,如下查看:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get configmap
NAME               DATA   AGE
info               4      97s
...
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl describe configmap info
Name:         info
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
count:
----
10
debug:
----
on
greeting:
----
say hello to kubernetes.

path:
----
/etc/systemd

BinaryData
====

Events:  <none>

可以看到数据已经成功写到etcd数据库中了,明文存储方式就看完了,接下来我们看下加密存储方式。

2:Secret

Secret API对象提供了对于配置项的加密存储功能,首先生成yaml模板,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ export out="--dry-run=client -o yaml" && kubectl create secret generic user --from-literal=name=root $out
apiVersion: v1
data:
  name: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: null
  name: user

–from-literal=name=root 是指定初始写入的kv,cm9vdA==是base64(root)后的结果,
generic user:是设置secret的加密类型,这里是一般机密信息,完整的包括:
1:访问私有镜像仓库的认证信息
2:身份识别的凭证信息
3:HTTPS 通信的证书和私钥
4:一般的机密信息(格式由用户自行解释)
这里先只看4。

对yaml文件修改完善后如下:

apiVersion: v1
kind: Secret
metadata:
  name: user

data:
  name: cm9vdA==  # root
  pwd: MTIzNDU2   # 123456
  db: bXlzcWw=    # mysql

base 64结果可以通过命令:echo -n "123456" | base64获取,其中-n用来删除隐含的换行符,否则就会因为多了换行符而造成加密错误。

然后创建并查看结果:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl apply -f secret.yml 
secret/user created
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-vw5c8   kubernetes.io/service-account-token   3      4d1h
user                  Opaque                                3      10s
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl describe secret user
Name:         user
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
db:    5 bytes
name:  4 bytes
pwd:   6 bytes

可以看到已经存储数据到etcd数据库中,但是因为是加密存储,所以这里只能看到字节数。现在基于ConfigMap和Secret两种API对象的存储方式都看完了,配置信息也都存储完毕了,那么该如何在Pod中使用呢,接下来继续看下这部分内容。

3:在Pod中使用

在Pod中有两种使用方式,一种是以环境变量的方式来使用,另一种是Volume,即文件卷的方式。

3.1:环境变量方式使用

这种方式需要使用valueFrom,如果是引用ConfigMap,则要进一步使用configMapKeyRef,引用Secret,则进一步使用secretKeyRef,定义后如下:

apiVersion: v1
kind: Pod
metadata:
  name: env-pod

spec:
  containers:
  - env:
      - name: COUNT
        valueFrom:
          configMapKeyRef:
            name: info
            key: count
      - name: GREETING
        valueFrom:
          configMapKeyRef:
            name: info
            key: greeting
      - name: USERNAME
        valueFrom:
          secretKeyRef:
            name: user
            key: name
      - name: PASSWORD
        valueFrom:
          secretKeyRef:
            name: user
            key: pwd

    image: busybox
    name: busy
    imagePullPolicy: IfNotPresent
    command: ["/bin/sleep", "300"]

命令休眠300秒,主要是为了留下进入容器验证环境变量的时间。文件比较长,主要还是看valueFrom部分的内容,其就是读取我们前面定义的名称为info的confimap,以及名称为user的secret,关系如下图:

在这里插入图片描述

看图的话会清晰很多,文字确实不是很好表达。创建Pod,如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl apply -f podUseCmAndSecret.yml 
pod/env-pod created
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
env-pod   1/1     Running   0          6s
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl exec --it -c busy env-pod -- sh
error: unknown flag: --it
See 'kubectl exec --help' for usage.
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl exec -it -c busy env-pod -- sh
/ # echo $COUNT
10
/ # echo $GREETING
say hello to kubernetes.
/ # echo $USERNAME $PASSWORD
root 123456
/ # 

可以看到环境变量设置成功了。

3.2:Volume方式使用

这种方式在使用上分为2步,第一步是要先使用ConfigMap/Secret定义Volume,此时会将里边的内容映射为磁盘文件的形式,具体后续我们可以看到,第二步是将第一步定义的Volume挂载到pod中容器指定的目录,首先第一步:

spec:
  volumes:
  - name: cm-vol
    configMap:
      name: info
  - name: sec-vol
    secret:
      secretName: user

分别定义了Volumecm-vol使用的数据源是ConfigMapinfo,Volume sec-vol使用的数据源是Secretuser,接下来就是第二步将Volume挂载到pod中(其实是挂载到pod内的容器中),如下:

containers:
- volumeMounts:
  - mountPath: /tmp/cm-items
    name: cm-vol
  - mountPath: /tmp/sec-items
    name: sec-vol

此时的结构如下:

在这里插入图片描述

太难描述了,真的是一图胜万言。完整yaml如下:

apiVersion: v1
kind: Pod
metadata:
  name: vol-pod

spec:
  volumes:
  - name: cm-vol
    configMap:
      name: info
  - name: sec-vol
    secret:
      secretName: user

  containers:
  - volumeMounts:
    - mountPath: /tmp/cm-items
      name: cm-vol
    - mountPath: /tmp/sec-items
      name: sec-vol

    image: busybox
    name: busy
    imagePullPolicy: IfNotPresent
    command: ["/bin/sleep", "300"]

运行并查看如下:

dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl apply -f podUseVolume.yml 
pod/vol-pod created
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl get pod | grep vol-pod
vol-pod   1/1     Running   0               18s
dongyunqi@dongyunqi-virtual-machine:~/test$ kubectl exec -it -c busy vol-pod -- sh
/ # ls /tmp/cm-items/
count     debug     greeting  path
/ # ls /tmp/sec-items/
db    name  pwd
/ # cat /tmp/cm-items/greeting
say hello to kubernetes.
/ # cat /tmp/sec-items/pwd 
123456/ # 

可以看到我们定义的kv中的k映射成为了文件系统中文件名为k的文件,文件的内容是v。

写在后面

小结

本文分析了k8s提供的两种配置相关的API对象,分别是ConfigMap和Secret,然后看了其具体的使用,最后分析了在Pod中基于环境变量和Volume文件卷的两种使用方式。希望本文能帮助到你。

参考文章列表

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

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

相关文章

《后端技术面试 38 讲》学习笔记 Day 01

《后端技术面试 38 讲》学习笔记 Day 01 学习目标 在2022年春节将至&#xff08;半个月&#xff09;&#xff0c;适合在这个冬天里&#xff0c;温故知新。通过学习一门覆盖面较广的课程&#xff0c;来夯实基础&#xff0c;完善自己的知识体系&#xff0c;是一个很棒的选择。 …

LCHub:未来,低代码产品矩阵是500强企业的绝佳选择

近日,国内知名咨询机LCHub发布2022《中国大型企业数字化升级路径研究》。 报告认为由于大型企业的数字化需求旺盛、购买力充足,因此国内成熟的数字化服务商普遍以大型企业为核心客户。大型企业与数字化服务商的供需磨合决定了我国数字化市场的形态,造就了我国数字化市场与海…

go map 源码逐行阅读

map粗略介绍 源码开头注释&#xff1a; A map is just a hash table. The data is arranged into an array of buckets. Each bucket contains up to 8 key/elem pairs. The low-order bits of the hash are used to select a bucket. Each bucket contains a few high-order…

Linux学习笔记——RabbitMQ安装部署

5.4、RabbitMQ安装部署 5.4.1、简介 RabbitMQ是一款知名的开源消息列队系统&#xff0c;为企业提供消息的发布、订阅、点对点传输等消息服务。 RabbitMQ在企业开发中十分常见&#xff0c;课程为大家演示快速搭建RabbitMQ环境。 5.4.2、安装 RabbitMQ在yum仓库中的版本比较老…

用于从单细胞FRET数据中提取灵敏度分布的Matlab代码

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 对于分子生物学来讲&#xff0c;生物分析手段的发展&#xff0c;是阐明机理的必要条件。在研究分子间相互作用的道路上&#xf…

Leetcode - 106 - 相交链表

160. 相交链表 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&am…

【阶段三】Python机器学习04篇:机器学习项目实战:多元线性回归模型、岭回归模型与套索回归模型

本篇的思维导图: 一元线性回归的数学原理 一元线性回归模型又称为简单线性回归模型,其形式可以表示为如下所示的公式。 y=ax+b 其中,y为因变量,x为自变量,a为回归系数,b为截距。 如下图所示,其中y(i)为实际值,y(i)为预测值,一元线性回归的目的就是拟合出一…

Vision-Only Robot Navigation in a Neural Radiance World

Paper name Vision-Only Robot Navigation in a Neural Radiance World Paper Reading Note URL: https://arxiv.org/abs/2110.00168 TL;DR RA-L 2022 文章&#xff0c;提出在 NeRF 表达的环境中进行机器人导航及循迹任务的方法 Introduction 背景 基于 on-board 传感器…

HTML与CSS基础(五)—— CSS布局(盒子模型)、PxCook使用

目标能够认识 盒子模型 的组成部分 能够掌握盒子模型的 边框、内边距、外边距 的作用及简写形式能够计算盒子的 实际大小 能够了解 外边距折叠现象&#xff0c;并知道如何解决 盒子塌陷问题一、PxCook的基本使用1. 通过软件打开设计图① 打开软件 ② 拖拽入设计图 ③ 新建项目2…

Acwing---99.激光炸弹

激光炸弹1.题目2.基本思想3.代码实现1.题目 地图上有 NNN 个目标&#xff0c;用整数 Xi,YiXi,YiXi,Yi 表示目标在地图上的位置&#xff0c;每个目标都有一个价值 WiWiWi。 注意&#xff1a;不同目标可能在同一位置。 现在有一种新型的激光炸弹&#xff0c;可以摧毁一个包含 …

Java中常用API总结(4)—— Object类(含实例解读和源码阅读)

Object类一、前言二、概述1.API帮助文档2.使用方法三、常用方法1.toString方法1️⃣格式2️⃣实例3️⃣源码阅读4️⃣快捷键重写方法2.equals方法1️⃣格式2️⃣实例3️⃣源码阅读4️⃣重写方法3.对象克隆四、结语一、前言 本文将讲述有关于Object类相关知识点 二、概述 1.A…

C语言文件操作的细节

目录 文本文件和二进制文件 概念 一个数据在内存中是怎么存储的呢&#xff1f; 通过VS2013可以查看二进制数值 文件读取结束的判定 文件缓冲区 文本文件和二进制文件 概念 根据数据的组织形式&#xff0c;数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的…

YOLOv5 以txt 或json格式输出预测结果

YOLOv5 以txt 或json格式输出预测结果1.YOLOv5源码以多种格式输出预测结果1.run函数——传入参数2.run函数——保存打印2.YOLOv5以.txt格式输出预测结果1.执行以下代码就可以得到以.txt格式输出预测结果2.输出格式&#xff1a;3.YOLOv5以.json格式输出预测结果1.需要在源码中加…

零售行业交易数据分析(3)——群组/同期群分析(留存率分析)

内容简介 本文介绍了群组分析&#xff08;同期群分析&#xff09;的方法以及Python实现过程&#xff0c;并继续对一家零售公司的交易数据进行用户留存分析和可视化。 本系列的文章&#xff1a; 《零售行业交易数据分析&#xff08;1&#xff09;——客户终身价值(CLTV)计算和…

Qt扫盲-QSplitter理论总结

QSplitter理论总结一、概述二、使用说明1. 添加子控件2. 内部控件大小和位置一、概述 QSplitter允许用户通过拖动子部件之间的边界来控制子部件的大小。这个经常在我们使用的一些工具软件中最常使用 比如就像 QAssistant 里面的索引栏和内容直间&#xff0c;鼠标放在那个分界区…

3dMax中的两足动物及动画制作方法

3dMax的两足动物简介 3DMax是一款专业的3D电脑设计软件&#xff0c;用于制作3D动画、游戏、模型、图像等&#xff0c;在视频游戏开发商、影视工作室的工作中发挥着重要作用。Biped 是3D max 软件中动画的基本部分。3dMax中的Biped为角色建模中的角色部分提供运动并将其连接到现…

基于Java+SpringMvc+vue+element实现驾校管理系统详细设计

基于JavaSpringMvcvueelement实现驾校管理系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

PPI网络的构建与美化(String+Cytoscape)

目录写在前面一、使用string分析数据二、使用Cytoscape构建网络1. 导入TSV文件2. Analyze Network3. Generate Style4. CytoNCA计算Betweenness三、美化网络1. 根据Betweenness调整网络2. 选择你需要的蛋白&#xff0c;做个双环网络图3. 调整字体大小颜色、气泡大小等4. 保存图…

【TypeScript】JavaScript VS TypeScript数据类型

&#x1f4ad;&#x1f4ad; ✨&#xff1a;JavaScript VS TypeScript数据类型   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 你若盛开&#xff0c;清风自来&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0c;希望可以指正&…

【TS】TypeScript 实践中的 Equals 是如何工作的?

How does the Equals work in typescript 循着线索慢慢来 在 ts 中如何判断两种类型完全一致&#xff1f; 三年前&#xff0c;在社区有一场关于支持 type level equal operator 的讨论 TypeScript#27024。 大佬 mattmccutchen 给出了一个非常精彩的解决方案&#xff1a; Her…