【云原生】kubernetes中secret原理详解与应用实战

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:云原生K8S,零基础到进阶实战
景天的主页:景天科技苑

文章目录

  • 1.Secret概述
    • 1.1 Secret是什么?
    • 1.2 使用Secret
      • 1、通过环境变量引入Secret
      • 2、通过volume挂载Secret

1.Secret概述

1.1 Secret是什么?

前面我们一起探讨了k8s的Configmap一般是用来存放明文数据的,如配置文件,
对于一些敏感数据,如密码、私钥等数据时,要用secret类型。

Secret解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。
Secret可以以Volume或者环境变量的方式使用。

要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:
作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,
或者当 kubelet 为 pod 拉取镜像时使用。

secret可选参数有三种:

  • generic: 通用类型,通常用于存储密码数据。
  • tls:此类型仅用于存储私钥和证书。
  • docker-registry: 若要保存docker仓库的认证信息的话,就必须使用此种类型来创建。

Secret类型有三种:

  • Service Account:用于被 serviceaccount 引用。
    serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。
    Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

  • Opaque:base64编码格式的Secret,用来存储密码、秘钥等。可以通过base64 --decode解码获得原始数据,因此安全性弱

  • kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。

1.2 使用Secret

1、通过环境变量引入Secret

#把mysql的root用户的password创建成secret

[root@master01 secret ]#kubectl create secret generic mysql-password --from-literal=password=Jxxxxxxx3x
secret/mysql-password created
[root@master01 secret ]#kubectl get secret
NAME                          TYPE                                  DATA   AGE
default-token-xc8dr           kubernetes.io/service-account-token   3      12d
mysql-password                Opaque                                1      19s
nfs-provisioner-token-8mxt9   kubernetes.io/service-account-token   3      4d22h
[root@master01 secret ]#kubectl describe secret mysql-password
Name:         mysql-password
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password:  14 bytes

#password的值是加密的,
#但secret的加密是一种伪加密,它仅仅是将数据做了base64的编码.

#创建pod,引用secret

[root@master01 secret ]#vim pod-secret.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-secretlabels:app: myapp
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80env:- name: MYSQL_ROOT_PASSWORD   #它是Pod启动成功后,Pod中容器的环境变量名.valueFrom:secretKeyRef:name: mysql-password  #这是secret的对象名key: password      #它是secret中的key名
[root@master01 secret ]#kubectl apply -f pod-secret.yaml 
pod/pod-secret created
[root@master01 secret ]#kubectl exec -it pod-secret -- /bin/sh
/ # printenv 
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://192.168.0.1:443
MYAPP_SVC_PORT_80_TCP_PORT=80
HOSTNAME=pod-secret
SHLVL=1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
HOME=/root
MYSQL_ROOT_PASSWORD=Jxxxxxxxx3x  这就是传递进来的变量
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
TERM=xterm
NGINX_VERSION=1.12.2
KUBERNETES_PORT_443_TCP_ADDR=192.168.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
MYAPP_SVC_SERVICE_HOST=10.98.57.156
KUBERNETES_PORT_443_TCP=tcp://192.168.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=192.168.0.1
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT=tcp://10.98.57.156:80

传递到pod里面后,自动解密了

2、通过volume挂载Secret

1)创建Secret
手动加密,基于base64加密

[root@xianchaomaster1 ~]# echo -n 'admin' | base64
YWRtaW4=
echo -n 'jingtian123456f' | base64

在这里插入图片描述

解码:

echo amluZ3RpYW4xMjM0NTZm|base64 -d

在这里插入图片描述

2)创建yaml文件

[root@master01 secret ]#vim secret.yaml
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: amluZ3RpYW4xMjM0NTZm
[root@master01 secret ]#kubectl apply -f secret.yaml 
secret/mysecret created
[root@master01 secret ]#
[root@master01 secret ]#kubectl get secret
NAME                          TYPE                                  DATA   AGE
default-token-xc8dr           kubernetes.io/service-account-token   3      12d
mysecret                      Opaque                                2      7s
mysql-password                Opaque                                1      14m
nfs-provisioner-token-8mxt9   kubernetes.io/service-account-token   3      4d23h
[root@master01 secret ]#kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password:  15 bytes
username:  5 bytes

3)将Secret挂载到Volume中

[root@master01 secret ]#vim pod_secret_volume.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-secret-volume
spec:containers:- name: myappimage: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1volumeMounts:- name: secret-volumemountPath: /etc/secretreadOnly: truevolumes:- name: secret-volumesecret:secretName: mysecret
[root@master01 secret ]#kubectl apply -f pod_secret_volume.yaml 
pod/pod-secret-volume created
[root@master01 secret ]#kubectl get pods
NAME                               READY   STATUS      RESTARTS        AGE
mysql-pod                          0/1     Completed   0               88m
mysql-pod-envfrom                  0/1     Completed   0               76m
mysql-pod-volume                   0/1     Completed   0               65m
nfs-provisioner-847fb5b8f5-lzvcf   1/1     Running     7 (6h38m ago)   3d7h
pod-pvc                            1/1     Running     1 (7h38m ago)   3d5h
pod-secret                         1/1     Running     0               11m
pod-secret-volume                  1/1     Running     0               15s
test-hostpath                      2/2     Running     6 (7h38m ago)   4d5h
test-nfs-volume                    1/1     Running     3 (7h38m ago)   4d3h
web-0                              1/1     Running     1 (7h38m ago)   2d22h
web-1                              1/1     Running     1 (7h38m ago)   2d22h
web-2                              1/1     Running     1 (7h38m ago)   2d22h
web-3                              1/1     Running     1 (7h38m ago)   2d22h

进去容器查看

[root@master01 secret ]#kubectl exec -it pod-secret-volume -- /bin/sh/ # ls /etc/secret/
password  username
[root@master01 secret ]#kubectl exec -it pod-secret-volume -- /bin/sh
/ # cat /etc/sec
secret/    securetty
/ # cat /etc/secret/username 
admin/ # / # cat /etc/secret/password 
jingtian123456f/ # 

#由上可见,以卷的方式挂载到pod ,在pod中的secret信息实际已经被解密。

Secret 的类型
创建 Secret 时,你可以使用 Secret 资源的 type 字段,或者与其等价的 kubectl 命令行参数(如果有的话)为其设置类型。
Secret 类型有助于对 Secret 数据进行编程处理。

Kubernetes 提供若干种内置的类型,用于一些常见的使用场景。
针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。

内置类型 用法

Opaque	用户定义的任意数据
kubernetes.io/service-account-token	服务账号令牌
kubernetes.io/dockercfg	~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson	~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth	用于基本身份认证的凭据
kubernetes.io/ssh-auth	用于 SSH 身份认证的凭据
kubernetes.io/tls	用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token	启动引导令牌数据

docker私有仓库,加了https认证后拉取镜像:

imagePullSecret资源将Secret提供的密码传递给kubelet从而在拉取镜像前完成必要的认证过程,
简单说就是你的镜像仓库是私有的,每次拉取是需要认证的。

创建docker-registry类型的Secret对象,并在定义pod资源时明确通过"imagePullSecrets"字段来申明使用哪个私钥去认证;

创建docker-registry类型的Secret对象,然后把它添加到某个ServiceAccount对象中,
使用了这个ServiceAccount对象创建出来的pod就自然而然通过认证获取到镜像;

配置过程
这里创建Secret对象有两种方式,各有千秋。

方式一:通过命令行直接创建Secret

kubectl create secret docker-registry video-docker-redistry-key \--docker-server=10.3.9.107:5000 \--docker-username='gsafety' \--docker-password='123456'

查看key

# kubectl get secret
NAME                        TYPE                                  DATA   AGE
default-token-d9phm         kubernetes.io/service-account-token   3      19h
video-docker-redistry-key   kubernetes.io/dockerconfigjson        1      2s

最后在yaml文件中使用这个创建出来的Secret:

apiVersion: v1
kind: Pod
metadata:name: foonamespace: awesomeapps
spec:containers:- name: fooimage: janedoe/awesomeapp:v1imagePullSecrets:- name: xxx-key

方式二:通过现存的docker认证文件来创建Secret,首先使用docker login 登录到某个仓库,会在本地保存认证信息

[root@master01 ~ ]#kubectl create secret generic harborsecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson
secret/harborsecret created

或者:

  #Create a new secret named my-secret from ~/.docker/config.jsonkubectl create secret docker-registry my-secret --from-file=.dockerconfigjson=path/to/.docker/config.json
[root@master01 ~ ]#kubectl create secret docker-registry my-secret --from-file=.dockerconfigjson=/root/.docker/config.json 
secret/my-secret created

注意:config.json文件需要在主机上通过docker login 的方式登录后,才会生成。
这种方式有一个好处,就是如果有多个镜像仓库,都先存在于一个config.json文件中,然后通过命令打入Secret。

[root@master01 ~ ]#kubectl get secret harborsecret -oyaml
apiVersion: v1
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZXBvc2l0b3J5Lmd1b2tpbmdoay5jb20iOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2VkdacGFHSXRjSEp2WkhWamRFQXlNREl5IgoJCX0KCX0KfQ==
kind: Secret
metadata:creationTimestamp: "2022-11-07T05:52:41Z"name: harborsecretnamespace: defaultresourceVersion: "2355"uid: 14503d3d-3992-4d31-9b1d-ff4049990d51
type: kubernetes.io/dockerconfigjson

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

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

相关文章

读AI未来进行式笔记02深度伪造

1. 计算机视觉 1.1. 在人的六感之中&#xff0c;视觉是最重要的 1.1.1. 人类只要看上一眼视频&#xff0c;就能瞬间在脑海中抓取并消化内容和信息 1.1.2. 人类能够对事物进行广义的理解和抽象的认知&#xff0c;即使同一物体在不同的角度…

声量2024 | 内容创作者,该怎样保护你的知识产权

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 阿那亚 联合制作 / 声量The Power of Voice 特别鸣谢 / 深夜谈谈播客网络 本期节目录制于第二届「声量The Power of Voic…

vue3封装echarts组件---通俗易懂

1、封装的原因 如果在vue项目中有多个组件或者同个组件多出地方需要不同的图表&#xff0c;因此自己封装一个方便多次复用的Mycharts图表组件。 2、具体步骤&#xff1a; 2.1 安装echarts pnpm i echarts --save 2.2 新建MyCharts组件 : ~components/echarts/MyCharts.vu…

基于javacv ffmpeg 使用原生ffmpeg命令

基于javacv ffmpeg 使用原生ffmpeg命令 1. ffmpeg2. ffprobe 相关阅读&#xff1a; javacv ffmpeg使用笔记 测试过程中&#xff0c;发现ffmpeg-6.0-1.5.9-linux-x86_64.jar 存在问题&#xff08;ffmpeg原生命令执行失败&#xff09;&#xff0c;降级到ffmpeg-5.1.2-1.5.8-linux…

RPG Maker MV 踩坑十一 精灵及背景绘制问题

精灵绘制问题 RPG Maker MV战斗问题入场飞身战斗背景绘制精灵集及精灵 RPG Maker MV战斗问题 在RMMV中战斗是在场景中调用战斗管理器&#xff0c;通过管理器去操作角色对象行动及精灵的绘制的。 入场飞身 在其中就发现一个问题加载图片进场时&#xff0c;会偏高&#xff0c;…

Python编程学习第一篇——Python零基础快速入门(五)—元组(Tuple)操作

Python元组是一种不可变的有序集合&#xff0c;可以存储多个不同类型的数据。元组使用小括号来表示&#xff0c;其中的元素用逗号分隔开。与列表不同&#xff0c;元组的元素不能被修改、删除或添加。它的一些常规操作包括元组的创建、访问、添加、修改、删除、运算等等&#xf…

电力电子功率模块在工程应用中测温NTC的使用

电力电子功率模块在工程应用中测温NTC的使用 1.概述2.什么是NTC3.模块内部NTC3.1 绝缘隔离措施3.2 NTC热量考虑 4.使用模拟方法测量NTC温度4.1 分压电阻大小 5.使用数字方法测量NTC温度 1.概述 最近做项目的时候突然被问到一个问题。做实验测温用的NTC到底怎么用&#xff1f;为…

JAVA设计模式-策略模式及在Springboot2.X中写法

JAVA设计模式-策略模式及在Springboot2.X中写法 一、经典的策略模式写法二、Springboot2.X中策略模式写法 策略模式的定义&#xff1a;策略模式是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换 策略模式&#xff1a;在策略模式&#xff08;Str…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;稳定&#xff09;选择排序&#xff08;不稳定&#xff09;插入排序&#xff08;稳定&#xff09;希尔排序&#xff08;不稳定&#xff09;归并排序&#xff08;稳定&#xff09;快速排序&#xff08;不稳定&#xff09;堆排序计数排序桶排序基数…

YOLOv8+PyQt5海洋船只检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频&#xff1a;海洋船只检测yoloV8检测&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_哔哩哔哩_bilibili资源包含可视化的海洋船只检测系统&#xff0c;可对于高空拍摄到的海洋图片进行轮船检测&#xff0c;基于最新的YOLOv8训练的海洋船只检测模型&a…

C++设计模式-策略模式,AI角色动态选择行为

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式让算法的选择与使用独立开来&#xff0c;使得代码更灵活、可扩展和易维护。应用&#xff1a;如在游戏开发中&#xff0c;AI角色需要根据环境和条件做出不同的行为&#xff0c;如寻路、攻击、躲避等。可…

【安装笔记-20240529-Windows-Electerm 终端工具】

安装笔记-系列文章目录 安装笔记-20240529-Windows-Electerm 终端工具 文章目录 安装笔记-系列文章目录安装笔记-20240529-Windows-Electerm 终端工具 前言一、软件介绍名称&#xff1a;Wireshark主页官方介绍功能特性 二、安装步骤测试版本&#xff1a;electerm-1.39.35-win-…

【AIoT-Robot】3d hand pose

手语是聋哑人士的主要沟通工具,它是利用手部和身体的动作来传达意义。虽然手语帮助它的使用者之间互相沟通,但聋哑人士与一般人的沟通却十分困难,这个沟通障碍是源于大部分人不懂得手语。 1. 手势&&手语 手势:手的姿势 ,通常称作手势。它指的是人在运用手臂时,所…

初识springcloud

springcloud eureka eureka的作用 消费者该如何获取服务提供者具体信息&#xff1f; 服务提供者启动时向eureka注册自己的信息,eureka保存这些信息消费者,根据服务名称向eureka拉取提供者信息 如果有多个服务提供者&#xff0c;消费者该如何选择&#xff1f; 服务消费者利…

创建模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;自定义模块有两个作用&#xff1a;一个是规范代码&#xff0c;让代码更易于阅读&#xff0c;另一个是方便其他程序使用已经编…

ORACLE创建dblink

dblink的作用 dblink数据库链接顾名思义就是数据库的链接&#xff0c;当我们要跨本地数据库&#xff0c;访问另外一个数据库表中的数据时&#xff0c;本地数据库中就必须要创建远程数据库的dblink&#xff0c;通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中…

Ubuntu22.04之解决:terminal使用alt+1/alt+2/alt+3失效问题(二百三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安卓玩机搞机技巧综合资源----电脑控制手机 投屏操控的软件工具操作步骤解析【二十二】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

外发邮件监控的六种方法, 监控软件如何防止邮件泄密?

外发邮件监控的六种方法&#xff0c; 监控软件如何防止邮件泄密&#xff1f; 外发邮件监控是现代企业信息安全管理的重要组成部分&#xff0c;它有助于防止敏感信息泄露、保护知识产权、以及确保企业合规。以下是外发邮件监控的几种主要方法&#xff0c;这些方法结合使用可以为…

2024最新 Jenkins + Docker实战教程(八)- Jenkins实现集群并发构建

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…