Kubernetes中的secrets存储

华子目录

  • 2.secrets
    • 2.1secrets功能介绍
    • 2.2secrets的创建
      • 2.2.1从文件创建
      • 2.2.2编写yaml文件
    • 2.3secret的使用案例
      • 2.3.1将secret挂载到volume中
      • 2.3.2设置`子目录`映射`secret`密钥
      • 2.3.3将secret设置为环境变量
      • 2.3.4存储`docker register`的认证信息`spec.imagePullSecrets[]`

2.secrets

2.1secrets功能介绍

  • secret对象类型用来保存敏感信息,如密码Oauth令牌ssh key

  • 敏感信息放在secret中比放在Pod定义或者容器镜像中来说更加安全灵活

  • Pod可以用两种方式使用secret

    • 作为volume中的文件挂载pod中的一个或者多个容器
    • kubeletpod拉取镜像时使用
  • secret类型

    • Service AccountKubernetes自动创建包含访问api凭据secret,并自动修改pod以使用此类型secret
    • Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱
    • kubernetes.io/dockerconfigjson:用于存储docker registry认证信息
[root@k8s-master ~]# mkdir secret
[root@k8s-master ~]# cd secret/

2.2secrets的创建

在创建secrets时,我们可以使用create命令的方式创建或者yaml文件的方式创建

#secret有3中类型
[root@k8s-master secret]# kubectl create secret
docker-registry  (创建一个给 Docker registry 使用的 Secret)
generic          (Create a secret from a local file, directory, or literal value)
tls              (创建一个 TLS secret)

2.2.1从文件创建

先创建文件

#-n取消换行
[root@k8s-master secret]# echo -n huazi > username.txt
[root@k8s-master secret]# echo -n 12345 > password.txt
[root@k8s-master secret]# ls
password.txt  username.txt
#创建一个名为userlist的generic类型的secret资源
[root@k8s-master secret]# kubectl create secret generic userlist --from-file username.txt --from-file password.txt
secret/userlist created
#查看
[root@k8s-master secret]# kubectl get secrets
NAME             TYPE                DATA   AGE
userlist         Opaque              2      3m13s[root@k8s-master secret]# kubectl describe secrets userlist
Name:         userlist
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password.txt:  5 bytes
username.txt:  5 bytes
#以yaml格式查看,我们发现文件名作为了键,文件内容作为了值
[root@k8s-master secret]# kubectl get secrets userlist -o yaml
apiVersion: v1
data:password.txt: MTIzNDU=username.txt: aHVhemk=
kind: Secret
metadata:creationTimestamp: "2024-11-02T10:40:13Z"name: userlistnamespace: defaultresourceVersion: "811492"uid: 198d8aae-b738-4289-bb67-3d23c94ba909
type: Opaque

2.2.2编写yaml文件

#先将内容做base64编码
[root@k8s-master secret]# echo -n huazi | base64
aHVhemk=
[root@k8s-master secret]# echo -n 12345 | base64
MTIzNDU=
#创建一个名为userlist1的generic类型的secret资源
[root@k8s-master secret]# kubectl create secret generic userlist1 --dry-run=client -o yaml > secret-generic.yml[root@k8s-master secret]# vim secret-generic.yml
[root@k8s-master secret]# cat secret-generic.yml
apiVersion: v1
kind: Secret
metadata:name: userlist1
type: Opaque
data:username: aHVhemk=password: MTIzNDU=
[root@k8s-master secret]# kubectl apply -f secret-generic.yml
secret/userlist1 created
[root@k8s-master secret]# kubectl get secrets
NAME        TYPE     DATA   AGE
userlist    Opaque   2      11m
userlist1   Opaque   2      56s
[root@k8s-master secret]# kubectl describe secrets userlist1
Name:         userlist1
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password:  5 bytes
username:  5 bytes
[root@k8s-master secret]# kubectl get secrets userlist1 -o yaml
apiVersion: v1
data:password: MTIzNDU=username: aHVhemk=
kind: Secret
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","data":{"password":"MTIzNDU=","username":"aHVhemk="},"kind":"Secret","metadata":{"annotations":{},"name":"userlist1","namespace":"default"},"type":"Opaque"}creationTimestamp: "2024-11-02T10:50:32Z"name: userlist1namespace: defaultresourceVersion: "812512"uid: b29dc86a-d8f6-4eb3-88ea-11eb3fb707e0
type: Opaque

2.3secret的使用案例

#查看名为userlist1的secret类型
[root@k8s-master ~]# kubectl describe secrets userlist1
Name:         userlist1
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password:  5 bytes
username:  5 bytes
#发现有两个键值对,一个password,一个username

2.3.1将secret挂载到volume中

#创建自主式pod,去使用userlist1
[root@k8s-master secret]# vim pod1.yml
[root@k8s-master secret]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:containers:- image: busyboxplusname: busyboxpluscommand: ["/bin/sh","-c","sleep 10000"]volumeMounts:   ##这是一个列表,定义了Pod中容器要挂载的卷。- name: secret-volume   # #指定了要挂载的卷的名称,这个名称必须与volumes列表中定义的某个卷的名称相匹配。mountPath: /secret   ##卷在容器内的挂载路径。readOnly: true    #/secret这个目录只读权限volumes:   #定义了Pod中可以使用的卷- name: secret-volume   #定义了卷的名称,这个名称将在volumeMounts中被引用secret:   #表示这个卷是由一个secrets支持的secretName: userlist1   #指定了secrets的名称为userlist1
[root@k8s-master secret]# kubectl apply -f pod1.yml
pod/testpod created
[root@k8s-master secret]# kubectl describe pods testpod

在这里插入图片描述

[root@k8s-master secret]# kubectl exec -it pods/testpod -- /bin/sh
/ # ls
bin      etc      lib      linuxrc  mnt      proc     run      secret   tmp      var
dev      home     lib64    media    opt      root     sbin     sys      usr
/ # cd secret/
/secret # ls
password  username
/secret # ls -l
total 0
lrwxrwxrwx    1 root     root            15 Nov  3 02:29 password -> ..data/password
lrwxrwxrwx    1 root     root            15 Nov  3 02:29 username -> ..data/username
/secret # cat username
huazi
/secret # cat password
12345

我们发现userlist1中的变成了文件名变成了文件内容,其中文件是一个软连接文件

#回收
[root@k8s-master secret]# kubectl delete -f pod1.yml
pod "testpod" deleted

2.3.2设置子目录映射secret密钥

[root@k8s-master secret]# vim pod2.yml
[root@k8s-master secret]# cat pod2.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:containers:- image: busyboxplusname: busyboxpluscommand: ["/bin/sh","-c","sleep 10000"]volumeMounts:   #Pod中容器要挂载的卷- name: secret-volume   #挂载的卷的名称,这个名称必须与volumes列表中定义的某个卷的名称相匹配。mountPath: /secret   #容器中的挂载目录readOnly: true   #只读volumes:   #声明pod的数据卷- name: secret-volume  #数据卷的名字为secret-volumesecret:   #表示这个卷是由一个secrets支持的secretName: userlist1   #指定了secrets的名称为userlist1items:- key: username1path: users/username   #username为userlist1中的键,会变为文件名,值会变为文件内容- key: password1path: auth/password   #password为userlist1中的键,会变为文件名,值会变为文件内容

usersauth/secret下的子目录子目录下分别有名为usernamepassword文本文件

[root@k8s-master secret]# kubectl apply -f pod2.yml
pod/testpod created
[root@k8s-master secret]# kubectl describe pods testpod

在这里插入图片描述

[root@k8s-master secret]# kubectl exec -it pods/testpod -- /bin/sh
/ # ls
bin      etc      lib      linuxrc  mnt      proc     run      secret   tmp      var
dev      home     lib64    media    opt      root     sbin     sys      usr
/ # cd secret/
/secret # ls
auth   users
/secret # cd auth/
/secret/..2024_11_03_02_57_47.438164553/auth # ls
password
/secret/..2024_11_03_02_57_47.438164553/auth # ls -l
total 4
-rw-r--r--    1 root     root             5 Nov  3 02:57 password
/secret/..2024_11_03_02_57_47.438164553/auth # cat password
12345/secret/..2024_11_03_02_57_47.438164553/users # cat username
huazi
#回收
[root@k8s-master secret]# kubectl delete -f pod2.yml
pod "testpod" deleted

2.3.3将secret设置为环境变量

[root@k8s-master secret]# vim pod3.yml
[root@k8s-master secret]# cat pod3.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:containers:- image: busyboxplusname: busyboxpluscommand: ["/bin/sh","-c","env"]env:- name: Username   #容器中的环境变量名valueFrom:   #指定环境变量值的来源secretKeyRef:  #表示环境变量的值是从一个secret中获取的name: userlist1   #secret资源的名字key: username   #在指定的secret中,username键对应的值将用作环境变量Username的值- name: Password   #容器中的环境变量名valueFrom:    #指定环境变量值的来源secretKeyRef:  #表示环境变量的值是从一个secret中获取的name: userlist1  #secret资源的名字key: password  #在指定的secret中,password键对应的值将被用作环境变量Password的值restartPolicy: Never
[root@k8s-master secret]# kubectl apply -f pod3.yml
pod/testpod created
[root@k8s-master secret]# kubectl get pods
NAME      READY   STATUS      RESTARTS   AGE
testpod   0/1     Completed   0          7s
[root@k8s-master secret]# kubectl logs pods/testpod -c busyboxplus
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=testpod
SHLVL=1
HOME=/
Username=huazi     #我们发现了创建的环境变量 
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
Password=12345     #我们发现了创建的环境变量
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
#回收
[root@k8s-master secret]# kubectl delete -f pod3.yml --force

2.3.4存储docker register的认证信息spec.imagePullSecrets[]

在做这个案例之前,我们先介绍一下docker公有仓库私有仓库

  • 公有仓库上传镜像需要认证下载镜像不需要认证
  • 私有仓库上传下载都需要认证

先在harbor上创建一个私有仓库
在这里插入图片描述
因为node1主机上,我们之前做过认证,这里我们先退出登录

[root@k8s-node1 ~]# docker logout harbor.huazi.org
Removing login credentials for harbor.huazi.org

node2做过认证,在node2上传myapp:v1镜像到huazi这个私有仓库

[root@k8s-node2 ~]# docker images
myapp                                         v1                d4a5e0eaa84f   6 years ago     15.5MB[root@k8s-node2 ~]# docker tag myapp:v1 harbor.huazi.org/huazi/myapp:v1
[root@k8s-node2 ~]# docker push harbor.huazi.org/huazi/myapp:v1
The push refers to repository [harbor.huazi.org/huazi/myapp]
a0d2c4392b06: Pushed
05a9e65e2d53: Pushed
68695a6cfd7d: Pushed
c1dc81a64903: Pushed
8460a579ab63: Pushed
d39d92664027: Pushed
v1: digest: sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e size: 1569

验证node1上是否退出成功

#发现下载私有仓库中的myapp:v1镜像失败,说明退出成功
[root@k8s-node1 ~]# docker pull harbor.huazi.org/huazi/myapp:v1
Error response from daemon: unauthorized: unauthorized to access repository: huazi/myapp, action: pull: unauthorized to access repository: huazi/myapp, action: pull

创建名为docker-auth的类型为docker-registrysecret资源

#创建名为docker-auth的类型为docker-registry的secret资源
[root@k8s-master secret]# kubectl create secret docker-registry \
> docker-auth \    #secret名字
> --docker-server harbor.huazi.org \ 
> --docker-username admin \
> --docker-password 123456 \
> --docker-email huazi@huazi.org
secret/docker-auth created
#查看创建的docker-auth
[root@k8s-master secret]# kubectl get secrets
NAME          TYPE                             DATA   AGE
docker-auth   kubernetes.io/dockerconfigjson   1      112s
userlist      Opaque                           2      17h
userlist1     Opaque                           2      17h[root@k8s-master secret]# kubectl describe secrets docker-auth
Name:         docker-auth
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  kubernetes.io/dockerconfigjsonData
====
.dockerconfigjson:  123 bytes

创建pod去使用名为docker-authsecret资源

[root@k8s-master secret]# vim pod4.yml
[root@k8s-master secret]# cat pod4.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:nodeSelector:kubernetes.io/hostname: k8s-node1.org    #指定让它在node1上运行containers:- image: harbor.huazi.org/huazi/myapp:v1  #指定拉取的镜像是huazi这个私有仓库的name: myappv1
#  imagePullSecrets:  #我们先把这里注释了
#  - name: docker-auth
[root@k8s-master secret]# kubectl apply -f pod4.yml
pod/testpod created#我们发现这里的状态是ErrImagePull,表示镜像拉取失败
[root@k8s-master secret]# kubectl get pods -o wide
NAME      READY   STATUS         RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
testpod   0/1     ErrImagePull   0          6s    10.244.1.13   k8s-node1.org   <none>           <none>#回收
[root@k8s-master secret]# kubectl delete -f pod4.yml
pod "testpod" deleted

再去掉注释

[root@k8s-master secret]# vim pod4.yml
[root@k8s-master secret]# cat pod4.yml
apiVersion: v1
kind: Pod
metadata:labels:run: testpodname: testpod
spec:nodeSelector:kubernetes.io/hostname: k8s-node1.orgcontainers:- image: harbor.huazi.org/huazi/myapp:v1  #指定拉取的镜像是huazi这个仓库的name: myappv1imagePullSecrets:- name: docker-auth
#发现运行成功,说明node1上已经成功拉取了私有
[root@k8s-master secret]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
testpod   1/1     Running   0          7s    10.244.1.14   k8s-node1.org   <none>           <none>
#我们发现node1已经成功拉取了私有仓库中myapp:v1这个镜像
[root@k8s-node1 ~]# docker images
harbor.huazi.org/huazi/myapp                  v1                d4a5e0eaa84f   6 years ago     15.5MB
  • imagePullSecrets是一个在Kubernetes中用于配置Pod以拉取私有Docker镜像字段。当你在Kubernetes集群中部署应用时,如果应用依赖于存储在私有Docker仓库中的镜像,你就需要配置imagePullSecrets来确保Kubernetes能够访问这些私有镜像

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

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

相关文章

Java已死,大模型才是未来?

作者&#xff1a;不惑_ 引言 在数字技术的浪潮中&#xff0c;编程语言始终扮演着至关重要的角色。Java&#xff0c;自1995年诞生以来&#xff0c;便以其跨平台的特性和丰富的生态系统&#xff0c;成为了全球范围内开发者们最为青睐的编程语言之一 然而&#xff0c;随着技术的…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

Java项目实战II基于Spring Boot的文理医院预约挂号系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在医疗资源日益紧张的背景下&#xff0…

Mac下载 安装MIMIC-IV 3.0数据集

参考blog MIMIC IV 3.0数据库安装方法_mimic数据下载-CSDN博客 MIMIC IV数据库安装&#xff08;二&#xff09;_mimic数据库安装-CSDN博客 MIMIC-IV3.0安装_mimic iv 3.0-CSDN博客 MIMIC-IV-v2.0安装教程_mimic iv 安装教程-CSDN博客 MIMIC IV 3.0数据库安装方法或者思路&…

[ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

UI 组件的二次封装

UI 组件的二次封装是指&#xff0c;在基础 UI 库的组件上进行自定义封装&#xff0c;以实现更贴合业务需求的功能和样式。通过二次封装&#xff0c;可以增强组件的复用性、便捷性和一致性&#xff0c;简化业务代码&#xff0c;同时降低后续维护成本。 1. 二次封装的原理 二次…

Redis高级篇之缓存一致性详细教程

文章目录 0 前言1.缓存双写一致性的理解1.1 缓存按照操作来分 2. 数据库和缓存一致性的几种更新策略2.1 可以停机的情况2.2 我们讨论4种更新策略2.3 解决方案 总结 0 前言 缓存一致性问题在工作中绝对没办法回避的问题&#xff0c;比如&#xff1a;在实际开发过程中&#xff0c…

python爬虫实现自动获取论文GB 7714引用

在写中文论文、本硕博毕业设计的时候要求非常严格的引用格式——GB 7714引用。对于普通学生来说都是在google scholar上获取&#xff0c;一个一个输入点击很麻烦&#xff0c;就想使用python完成这个自动化流程&#xff0c;实现批量的倒入论文标题&#xff0c;导出引用。 正常引…

redis v6.0.16 安装 基于Ubuntu 22.04

redis安装 基于Ubuntu 22.04 本文演示如何在ubuntu22.04下&#xff0c;安装redis v6.0.16&#xff0c;并配置测试远程访问。 Step1 更新环境 sudo apt updateStep2 安装redis sudo apt install redis-server -yStep3 启动 sudo systemctl restart redissudo systemctl sta…

✨基于python实现的文档管理系统✨

本项目是使用Django和layui实现的一个文档转换系统&#xff0c;支持各种文档的相互转换 &#x1f4c4; PPT转Word &#x1f4d1; PDF转Word &#x1f4da; 合并PDF &#x1f4dc; Word转PDF 系统支持用户注册、登录&#xff0c;还能管理你的转换任务&#xff1a; &#x1f504;…

ES索引:索引管理

索引管理 再讲索引&#xff08;Index&#xff09;前&#xff0c;我们先对照下 ElasticSearch Vs 关系型数据库&#xff1a; PUT /customer/_doc/1 {"name": "DLBOY" }系统默认是自动创建索引的 如果我们需要对这个建立索引的过程做更多的控制&#xff1a…

Linux安装Dcoker

目录 1、卸载&#xff08;可选&#xff09; 2、安装docker 3、启动docker 4、配置镜像加速 1、卸载&#xff08;可选&#xff09; 如果之前安装过旧版本的Docker&#xff0c;可以使用下面命令卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \…

智能无损网络技术详解

什么是智能无损网络&#xff1f; 智能无损网络是一种集流量控制与拥塞控制于一体的先进技术&#xff0c;旨在提升网络性能&#xff0c;降低时延。同时&#xff0c;它通过智能无损存储网络等技术实现网络和应用系统的优化融合。该技术为AI人工智能、集中式/分布式存储以及HPC等应…

基于SSM+小程序的购物管理系统1

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的购物管理系统1&#xff0c;可以实现首页、个人中心、商品分类管理、商品信息管理、特价商品管理、用户管理、留言板管理、系统管理、订单管理等功能。方便用户对首页、商品…

楼梯区域分割系统:Web效果惊艳

楼梯区域分割系统源码&#xff06;数据集分享 [yolov8-seg-FocalModulation&#xff06;yolov8-seg-GFPN等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al l…

ROS2入门学习——ROS在机器人中的运行

一、入门级基础平台TurtleBot TurtleBot 是 ROS 中重要且资源丰富的机器人之一&#xff0c;特别适合入门级机器人爱好者提供基础平台。用户可以直接利用其自带的软硬件&#xff0c;专注于应用程序的开发。TurtleBot 随着 ROS 的发展&#xff0c;一直处于开发前沿。 TurtleBot…

智谱发布AI助理,帮人类敲响AGI的大门

人工智能之父John McCarthy曾说&#xff1a;“只要AI可以开始正常工作&#xff0c;就不会有人再把它当AI了。”如今&#xff0c;这一预言正在逐渐变为现实。 10月25日&#xff0c;智谱AI推出了自主智能体AutoGLM&#xff0c;能够模拟人类操作手机&#xff0c;执行各种任务。 …

Profinet、Ethernet/IP 工业以太网无线通信解决方案

在工业现场&#xff0c;我们常常会面临这样的困扰&#xff1a;两个PLC之间、PLC 跟远程IO之间或者PLC 跟伺服之间由于种种原因不方便布线&#xff0c;严重影响了通讯效率和生产进程。为了解决这一难题&#xff0c;三格电子设计了一款工业以太网无线网桥&#xff0c;这款无线网桥…

重塑未来,开源AI数字人系统引领个性化语音新纪元!AigcPanel v0.03开启公测

你是否曾梦想拥有一个能够与你对话、与你共鸣的AI数字人伙伴&#xff1f;现在&#xff0c;这一切都不再是幻想&#xff01;我们自豪地推出——全新的开源AI数字人系统&#xff0c;一个集视频合成、声音合成、声音克隆与模型管理于一体的创新平台&#xff0c;让你轻松打造专属的…

js逆向-模拟加密

实战七麦数据&#xff1a; 1.寻找加密入口 尝试搜索的方法&#xff1a; 那只能使用跟栈的方法&#xff0c;进入send发包位置&#xff1a; 打上断点&#xff0c;寻找加密入口&#xff0c;前面是发包分包&#xff0c;promise注意到是一个异步操作&#xff0c;看是否在此加密&…