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
root

2..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-secret

2.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 created

3.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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银河麒麟V10 SP1安装网络调试助手

文章目录 系统环境文件准备软件配置过程系统环境 系统镜像:Kylin-Desktop-V10-SP1-General-Release-2203-ARM64.iso 内核:5.4.18-53-generic 文件准备 网络调试助手可执行文件压缩包下载m-net-assist-arm64-main.zip 链接:https://pan.baidu.com/s/10Vu8Z6wOzCImXZWAW0Y…

SpringBoot+Vue开发笔记

参考&#xff1a;https://www.bilibili.com/video/BV1nV4y1s7ZN?p1 ----------------------------------------------------------概要总结---------------------------------------------------------- 1、MVC架构&#xff1a; View&#xff1a;与用户交互 Controller&…

解密外接显卡:笔记本能否接外置显卡?如何连接外接显卡?

伴随着电脑游戏和图形处理的需求不断增加&#xff0c;很多笔记本电脑使用者开始考虑是否能够通过外接显卡来提升性能。然而&#xff0c;外接显卡对于笔记本电脑是否可行&#xff0c;以及如何连接外接显卡&#xff0c;对于很多人来说仍然是一个迷。本文将为您揭秘外接显卡的奥秘…

小研究 - 微服务系统服务依赖发现技术综述(一)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…

无涯教程-jQuery - css( properties )方法函数

css(properties)方法将键/值对象设置为所有匹配元素的样式属性。 css( properties ) - 语法 selector.css( properties ) 上面的语法可以写成如下- selector.css( {key1:val1, key2:val2....keyN:valN}) 这是此方法使用的所有参数的描述- key:value - 设置为样式属…

【MySQL】复合查询

复合查询目录 一、基本查询二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 在from子句中使用子查询4.5 合并查询4.5.1 union4.5.2 union all 五、实战OJ 一、基本查询 --查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的…

【数据结构与算法——TypeScript】数组、栈、队列、链表

【数据结构与算法——TypeScript】 算法(Algorithm)的认识 解决问题的过程中&#xff0c;不仅仅 数据的存储方式会影响效率&#xff0c;算法的优劣也会影响效率 什么是算法&#xff1f; 定义&#xff1a; &#x1f7e2; 一个有限指令集&#xff0c;每条指令的描述不依赖于言语…

【音视频SDK测评】线上K歌软件开发技术选型

摘要 在线K歌软件的开发有许多技术难点&#xff0c;需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外&#xff0c;此外&#xff0c;开发者还应关注音乐版权问题&#xff0c;确保开发的应用合规合法。 前言 前面写了几期关于直播 …

[STL]详解list模拟实现

[STL]list模拟实现 文章目录 [STL]list模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1迭代器区间构造函数拷贝构造函数赋值运算符重载析构函数 4. 迭代器及相关函数迭代器整体结构总览迭代器的模拟实现begin函数和end函数begin函数和end函数const版本 5. 数据…

C语言指针详解

C语言指针详解 字符指针1.如何定义2.类型和指向的内容3.代码例子 指针数组1.如何定义2.类型和内容 数组指针1.如何定义2.类型和指向类型3.数组名vs&数组名数组指针运用 数组参数&指针参数一维数组传参二维数组传参一级指针传参二级指针传参 函数指针1.如何定义2.类型和…

【前端知识】React 基础巩固(三十九)——React-Router的基本使用

React 基础巩固(三十九)——React-Router的基本使用 一、Router的基本使用 Router中包含了对路径改变的监听&#xff0c;并且会将相应的路径传递给子组件。 Router包括两个API&#xff1a; BrowserRouter使用history模式 HashRouter使用hash模式&#xff08;路径后面带有#号…

APP自动化测试-Python+Appium+Pytest+Allure框架实战封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest只是单独的…

无人驾驶实战-第五课(动态环境感知与3D检测算法)

激光雷达的分类&#xff1a; 机械式Lidar&#xff1a;TOF、N个独立激光单元、旋转产生360度视场 MEMS式Lidar&#xff1a;不旋转 激光雷达的输出是点云&#xff0c;点云数据特点&#xff1a; 简单&#xff1a;x y z i &#xff08;i为信号强度&#xff09; 稀疏&#xff1a;7%&…

【工具】自动搜索Research网站的学术会议排名

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] Research.com是一个可以搜索学术会议网站的影响因子的网站。 好用是好用&#xff0c;但有一个缺点&#xff1a;得手动选择类目。有这么多类目&#xff0c;一个个手动选也太累了。 所以做了一个自动搜索的小工具&a…

HTTP杂谈之Referer和Origin请求头再探

一 关于Referer和Origin的汇总 1) 知识是凌乱的,各位看官看个热闹即可2) 内容不断更新1、理解有盲区,需要及时纠正2、内容交叉有重复,需要适当删减3、扩展视野3) 以下内容都与Referer和Origin请求头有关联 nginx防盗链 HTTP杂谈之Referrer-Policy响应头 iframe标签referre…

新手入门Jenkins自动化部署入门详细教程

1. 背景 在实际开发中&#xff0c;我们经常要一边开发一边测试&#xff0c;当然这里说的测试并不是程序员对自己代码的单元测试&#xff0c;而是同组程序员将代码提交后&#xff0c;由测试人员测试&#xff1b; 或者前后端分离后&#xff0c;经常会修改接口&#xff0c;然后重新…

vue element el-upload附件上传、在线预览、下载当前预览文件

上传 在线预览&#xff08;iframe&#xff09;&#xff1a; payload&#xff1a; response&#xff1a; 全部代码&#xff1a; <template><div><el-table :data"tableData" border style"width: 100%"><el-table-column prop"d…

.Net6 Core Web API 配置 log4net + MySQL

目录 一、导入NuGet 包 二、添加配置文件 log4net.config 三、创建MySQL表格 四、Program全局配置 五、帮助类编写 六、效果展示 小编没有使用依赖注入的方式。 一、导入NuGet 包 ---- log4net 基础包 ---- Microsoft.Extensions.Logging.Log4Net…

天线辐射机制

电磁场如何从源中产生并最终脱离天线辐射到自由空间中去的呢&#xff1f;让我们首先来研究一下一些基本的辐射源。 1、单线Single Wire 导线是一种电荷运动产生电流特性的材料&#xff0c;假设用qv&#xff08;库仑/m3&#xff09;表示的一个电体积电荷密度均匀分布在一个横截…

ansible控制主机和受控主机之间免密及提权案例

目录 案例描述 环境准备 案例一--免密远程控制主机 效果展示&#xff1a; 解决方案 1.添加主机 2.通过ssh-key生成密钥对 3.生成ssh-copy-id 4.验证 案例二-----免密普通用户提权 效果展示 解决方案 1.使用普通用户&#xff0c;与案例一 一样&#xff0c;进行发送密钥…