7、Kubernetes核心技术 - Secret
目录
一、Secret概述
二、Secret 三种类型
2.1、Opaque
2..2、kubernetes.io/dockerconfigjson
2.3、kubernetes.io/service-account-token
三、Secret创建
3.1、命令行方式创建 Secret
3.2、yaml方式创建 Secret
四、Secret解码
五、Secret使用
5.1、将 Secret 挂载到 Volume 中
5.2、将 Secret 设置为环境变量
5.3、通过volume挂载和设置为环境变量的区别
六、Secret删除
一、Secret概述
Secret 解决了密码、令牌、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec 中,它把 Pod 想要访问的加密数据存放到 Etcd 中,然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息。
二、Secret 三种类型
2.1、Opaque
使用 base64 编码存储信息,手动加密,用来存储密码、密钥等,可以通过 base64 --decode 解码获得原始数据,因此安全性弱。
# base64编码
$ echo "root" | base64
cm9vdAo=# base64解码
$ echo "cm9vdAo=" | base64 --decode
root2..2、kubernetes.io/dockerconfigjson
用于存储私有docker registry认证的Secret。
下面是一个示例:
# 使用kubectl create secret命令创建Secret,指定docker私有仓库地址,用户名、密码等
kubectl create secret docker-registry habor-registry-secret --docker-server=xxx --docker-username=xxx --docker-password=xxx 如果我们需要拉取私有仓库中的docker镜像的话,在Pod的资源清单中就需要引用前面定义好的habor-registry-secret这个Secret,例如:
apiVersion: v1
kind: Pod
metadata:name: order-service
spec:containers:- name: order-serviceimage: 192.168.1.33:5000/order-service:v1.2imagePullSecrets:- name: habor-registry-secret2.3、kubernetes.io/service-account-token
用于被 serviceaccount 引用,serviceaccout 创建时 Kubernetes 会默认创建对应的 Secret。Pod 如果使用了 serviceaccount,对应的 Secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
下面是一个示例:
$ kubectl run nginx --image nginx
pod/nginx created$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          12s# 进入nginx容器
$ kubectl exec -it  nginx bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.root@nginx:/# ls -l /run/secrets/kubernetes.io/serviceaccount
ca.crt  namespace  token三、Secret创建
Secret的创建一般有两种方式,一种是通过命令行方式【 kubectl create secret命令】,另外一种是使用yaml资源清单方式创建。
3.1、命令行方式创建 Secret
首先需要准备Secret数据的来源,然后使用 kubectl create secret 命令将这些文件打包成一个 Secret 并在 API 服务器上创建Secret对象,生成Secret后会自动加密,而非明文存储。

假如某个Pod要访问数据库,需要用户名密码,分别存放在2个文件中:username.txt,password.txt。
# -n参数确保生成的txt文件在文本末尾不包含额外的换行符,因为当 kubectl 读取文件并将内容编码为 base64 字符串时,多余的换行符也会被编码。
$ echo -n "admin" > ./username.txt
$ echo -n "123456" > ./password.txt# 使用 kubectl create secret 命令将这些文件打包成一个 Secret 并在 API 服务器上创建Secret对象
$ kubectl create secret generic db-account-secret --from-file=./username.txt --from-file=./password.txt
secret/db-account-secret created# 查看secret,为了防止Secret被意外暴露,默认不显示Secret的内容
$ kubectl get secret
NAME                TYPE     DATA   AGE
db-account-secret   Opaque   2      8s# 通过yaml查看secret详细信息
$ kubectl get secret db-account-secret -o yaml
apiVersion: v1
data:  # secret中的key默认就是txt文件名称,可以看到这里是password.txt、password.txtpassword.txt: MTIzNDU2		#secret保存的是base64加密后的数据: 123456password.txt: YWRtaW4=		#secret保存的是base64加密后的数据: admin
kind: Secret
metadata:creationTimestamp: "2023-01-05T02:21:18Z"name: db-account-secretnamespace: defaultresourceVersion: "3212"uid: a11caa2c-e7d7-4234-a20a-453cc05d565b
type: Opaque# base64加密之后的数据
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123456' | base64
MTIzNDU2注意,Secret中的key默认就是文件名称,可以看到这里是password.txt、password.txt。可以使用 --from-file=[key=]source 来设置密钥名称,例如:kubectl create secret generic db-account-secret --from-file=username=./username.txt --from-file=password=./password.txt。
我们还可以使用 --from-literal=<key>=<value> 标签提供 Secret 数据。 可以多次使用 --from-literal标签,提供多个键值对。 请注意,特殊字符(例如:$,\,*,= 和 !)由shell 解释执行,而且需要转义,最简便的方法是用单引号括起来。 比如,如果你的密码是$#123456=,可以像下面一样执行命令:
$ kubectl create secret generic db-secret-test --from-literal=username=admin --from-literal=password='$#123456='
secret/db-secret-test created3.2、yaml方式创建 Secret
因为Secret保存的是base64加密后的数据,所以使用yaml方式创建Secret的时候,我们需要准备好base64加密之后的数据,然后放到Secret的资源清单中。
# base64加密之后的数据
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '123456' | base64
MTIzNDU2创建Secret资源清单文件: vim custom-db-account-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: custom-db-account-secret
type: Opaque
data:username: YWRtaW4=password: MTIzNDU2创建Secret:
$ kubectl apply -f custom-db-account-secret.yaml 
secret/custom-db-account-secret created$ kubectl get secret/custom-db-account-secret
NAME                       TYPE     DATA   AGE
custom-db-account-secret   Opaque   2      22s# 查看Secret描述信息,为了防止Secret被意外暴露,默认不显示Secret的内容
$ kubectl describe secret/custom-db-account-secret
Name:         custom-db-account-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password:  6 bytes
username:  5 bytes四、Secret解码
为了防止Secret被意外暴露,默认不显示Secret的内容,要查看我们创建的 Secret 的内容,可以通过下面的方式。
$ kubectl get secret custom-db-account-secret -o jsonpath=‘{.data}’
‘{"password":"MTIzNDU2","username":"YWRtaW4="}’$ echo "YWRtaW4=" | base64 -d
admin$ echo "MTIzNDU2" | base64 -d
123456五、Secret使用
Secret使用有两种方式,一种是将Secret挂载到存储卷volume中,另外一种是将Secret中的值,设置为Pod中的环境变量。
5.1、将 Secret 挂载到 Volume 中
创建Pod资源清单文件: vim secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- name: nginximage: nginxvolumeMounts:- name: secret-volumemountPath: "/etc/foo"  # 将secret的数据挂载到pod容器中/etc/foo目录下readOnly: truevolumes:- name: secret-volumesecret:  # volume存储卷的类型为secretsecretName: custom-db-account-secret  # 引用前面定义好的secret的名称:custom-db-account-secret创建Pod,然后进入Pod中查看custom-db-account-secret中的数据是否挂载进去。
$ kubectl apply -f secret-pod.yaml 
pod/nginx created$ kubectl get pod/nginx -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          27s   192.168.1.3   node01   <none>           <none>$ kubectl exec -it nginx sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cd /etc/foo/
# ls
password  username
# cat username
admin
# cat password
123456可以看到,custom-db-account-secret中我们定义的username、password已经成功挂载到pod容器中/etc/foo目录下,并且数据也是解密之后的数据。
5.2、将 Secret 设置为环境变量
创建Pod资源清单文件: vim secret-env-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- name: nginximage: nginxenv:	- name: DB_USERNAME			# 声明环境变量DB_USERNAMEvalueFrom:secretKeyRef:		# 指定数据来源是custom-db-account-secret这个secret的username字段name: custom-db-account-secretkey: username	- name: DB_PASSWORD			# 声明环境变量DB_PASSWORDvalueFrom:secretKeyRef:  	# 指定数据来源是custom-db-account-secret这个secret的password字段name: custom-db-account-secretkey: passwordrestartPolicy: Never创建Pod,并进入Pod查看环境变量的值。
$ kubectl apply -f secret-env-pod.yaml 
pod/nginx created$ kubectl get pod/nginx -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          14s   192.168.1.4   node01   <none>           <none>$ kubectl exec nginx -it sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# env | grep -E "USERNAME|PASSWORD"
DB_USERNAME=admin
DB_PASSWORD=123456
# echo $DB_USERNAME
admin
# echo $DB_PASSWORD
123456如上可以看到,进入Pod之后,已经成功将custom-db-account-secret这个secret的username、password,对应生成了$DB_USERNAME、$DB_PASSWORD两个环境了,这样在Pod中就可以使用这两个环境变量了。
5.3、通过volume挂载和设置为环境变量的区别
通过Volume挂载到容器内部时,当该Secret的值发生变化时,容器内部具备自动更新的能力,但是通过环境变量设置到容器内部该值不具备自动更新的能力。所以一般推荐使用Volume挂载的方式使用Secret。
六、Secret删除
使用【kubectl delete secret xxx】命令即可,xxx指定Secret的名称。
$ kubectl get secret
NAME                       TYPE     DATA   AGE
custom-db-account-secret   Opaque   2      44m
db-account-secret          Opaque   2      54m
db-secret-test             Opaque   2      12m$ kubectl delete secret db-secret-test
secret "db-secret-test" deleted$ kubectl get secret
NAME                       TYPE     DATA   AGE
custom-db-account-secret   Opaque   2      44m
db-account-secret          Opaque   2      55m相关文章:
 
7、Kubernetes核心技术 - Secret
目录 一、Secret概述 二、Secret 三种类型 2.1、Opaque 2..2、kubernetes.io/dockerconfigjson 2.3、kubernetes.io/service-account-token 三、Secret创建 3.1、命令行方式创建 Secret 3.2、yaml方式创建 Secret 四、Secret解码 五、Secret使用 5.1、将 Secret 挂载…...
MATLAB算法实战应用案例精讲-【自动驾驶】路径规划(补充篇)
目录 前言 几个高频面试题目 无人车运动规划,路径规划,轨迹规划的区别和联系?...
 
农业与太阳能的互利共生
不断增长的人口需要更多的食物和能源,而这些都在争夺有限的空间……除非能改变这样的竞争局面。 农业光伏装置将农业和太阳能生产结合起来。 农业光伏 (AV) 是 20 世纪 80 年代提出的概念,它在同一块土地上将农业和太阳能生产结合起来。 从业者在太阳能…...
每日一题(822. 翻转卡片游戏)-集合set
题目 822. 翻转卡片游戏 题解思路 简述为:找到桌面卡片中 不重复的最小值,卡片可以来回反转 如果 卡片前面后面的数字相同 则抛弃不用在剩下的卡片中 找到最小值(前后可以反转 卡片不分前后) 代码 C class Solution { pub…...
 
windows服务器iis PHP套件出现FastCGI等错误解决方法汇总
如果您的服务器安装了PHP套件,出现了无法打开的情况,请参照如下办法解决: 首先,需要设置IIS允许输出详细的错误信息到浏览器,才好具体分析 错误一: 处理程序“FastCGI”在其模块列表中有一个错误模块“Fast…...
 
Qt Creator 11 开放源码集成开发环境新增集成终端和 GitHub Copilot 支持
导读Qt 项目今天发布了 Qt Creator 11,这是一款开源、免费、跨平台 IDE(集成开发环境)软件的最新稳定版本,适用于 GNU/Linux、macOS 和 Windows 平台。 Qt Creator 11 的亮点包括支持标签、多外壳、颜色和字体的集成终端模拟器&am…...
 
Collections工具类(java)
文章目录 7.1 常用方法 参考操作数组的工具类:Arrays,Collections 是一个操作 Set、List 和 Map 等集合的工具类。 7.1 常用方法 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、…...
 
C++ 第六弹 STL
目录 1.什么是stl 2.六大组件-容器-序列式容器-C98 string 3.六大组件-容器-序列式容器-C98 vector 4.六大组件-容器-序列式容器-C98 list 5.六大组件-容器-序列式容器-C98 deque 6.六大组件-容器-序列式容器-C11 array 7.六大组件-容器-序列式容器-C11 forward_list 8…...
蓝桥杯上岸每日N题 第四期(最少刷题数)!!!
蓝桥杯上岸每日N题第四期 ❗️ ❗️ ❗️ 最少刷题数 同步收录 👇 蓝桥杯上岸必背!!!(持续更新中~) 大家好 我是寸铁💪 冲刺蓝桥杯省一模板大全来啦 🔥 蓝桥杯4月8号就要开始了 🙏 距离蓝…...
 
STM32 LWIP UDP 一对一 一对多发送
STM32 LWIP UDP通信 前言设置 IP 地址UDP函数配置实验结果单播发送,一对一发送广播发送,一对多发送 可能遇到的问题总结 前言 之前没有接触过网络的通信,工作需要 UDP 接收和发送通信,在网上没有找到一对一、一对多的相关例程&am…...
 
【有趣的设计模式】23 种设计模式详解和场景分析
前言 七大设计原则 1、单一原则:一个类只负责一个职责 2、开闭原则:对修改关闭,对扩展开放 3、里氏替换原则:不要破坏继承关系 4、接口隔离原则:暴露最小接口,避免接口过于臃肿 5、依赖倒置原则࿱…...
 
【数据结构与算法】TypeScript 实现图结构
class Grapg<T> {// 用于存储所有的顶点verteces: T[] [];// 用于存储所有的边 采用邻接表的形式adjList: Map<T, T[]> new Map();// 添加顶点addVertex(v: T) {this.verteces.push(v);// 初始化顶点的邻接表this.adjList.set(v, []);}// 添加边addEdge(v: T, w:…...
 
《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)
文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 1.1 角色 AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。ConcreteFactory(具体工厂…...
 
改进粒子群算法优化BP神经网络---回归+分类两种案例
今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章:基于改进莱维飞行和混沌映射(10种混沌映射随意切换)的粒子群优化算法,附matlab代码 文章一次性讲解两种案例,回归…...
 
VSCode和QT联合开发
提示:本文为学习记录,若有错误,请联系作者,谦虚受教。 文章目录 前言一、VSCODE下载二、使用步骤1.下载扩展 二、新建工程1.新建文件夹2.新建工程3.UI界面文件操作4.效果 总结 前言 一、VSCODE下载 下载地址 二、使用步骤 1.下…...
YOLO5-1 使用YOLO5检测 水面漂浮物记录
一 数据集 robflow 漂浮物数据集:buoy Computer Vision Dataset by ai 二 YOLO5管网 yolo5 :https://github.com/ultralytics/yolov5 克隆代码: git clone https://github.com/ultralytics/yolov5 # clone cd yolov5 pip install -r requirements.…...
MongoDB教程-7
正如在MongoDB关系的最后一章中所看到的,为了在MongoDB中实现规范化的数据库结构,我们使用了引用关系的概念,也被称为手动引用,在这个概念中,我们手动将被引用文档的id存储在其他文档中。然而,在一个文档包…...
Redisson提供优秀的并发控制机制
1. JDK集合类 对于JDK的集合类,forEach方法其实并不能完全避免并发修改异常。 forEach本质上还是一个循环遍历,如果在循环体内直接对集合进行修改,仍然会产生ConcurrentModificationException。 例如: List<String> lis…...
 
Linux: 设置qmake的Qt版本
Qt开发,qmake会对应一个Qt版本,有时候需要切换这个版本,例如把qmake从Qt5.12切换到Qt5.9, 怎么操作呢? 案例如下: 银河麒麟V10系统,下载安装了Qt5.9.8,但是检查qmake发现它使用的是5.12.8&…...
使用LLM插件从命令行访问Llama 2
大家好,最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2,这是一项非常重要的进展。Facebook最初的LLaMA模型于今年2月发布,掀起了开源LLM领域的创新浪潮——从微调变体到从零开始的再创造。 如果在Llama 2版本发布之日&a…...
 
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
 
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
 
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
 
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
 
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
