文章目录

  • 一、Secret介绍
  • 二、Secret的创建
    • (一)通过命令行创建secret
      • 1. 通过文件创建secret
      • 2. 通过文件夹创建secret
      • 3. 命令行声明键值对创建secret
    • (二)通过资源清单文件创建secret
  • 三、Secret的使用
    • 1. 将Secret中的数据设置为容器的环境变量
    • 2. 使用Volume将Secret作为文件或目录挂载

一、Secret介绍

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。

Secret资源主要用于存储和管理一些敏感数据,比如密码,token,密钥,证书等敏感信息。它把 Pod 想要访问的加密数据存放到 etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者环境变量的方式访问到这些 Secret 里保存的信息了。

Secret有三种类型:

  • Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所以加密性很弱。

  • Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。

  • kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。
    用来创建用户docker registry认证的Secret:kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

Secret也是使用键值对的形式存储数据,一般经常使用的是Opaque类型的Secret,对于键值对中的值可以进行base64编码后进行存储,然后通过volume挂载到容器内部时,可以看到解码后的信息,如果对于键值对中的值不论进行的是明文定义还是编码后的定义,使用kubectl
describe命令查看是都不会显示具体值,只会显示字节数。

使用base64对数据进行编码

# 用法:
echo -n '需加密的数据' | base64
# 或
base64 文件名
# 对于同样的数据无论编码多少结果都是一样的
[root@k8s-master ~]# echo -n '123456' | base64
MTIzNDU2
[root@k8s-master ~]# echo -n 'admin' | base64
YWRtaW4=
[root@k8s-master ~]# cat test
It is a test !
[root@k8s-master ~]# base64 test
SXQgaXMgYSB0ZXN0ICENCg==# 解码
[root@k8s-master ~]# echo -n 'YWRtaW4=' | base64 -d
admin
[root@k8s-master ~]# echo -n 'MTIzNDU2' | base64 -d
123456

二、Secret的创建

(一)通过命令行创建secret

1. 通过文件创建secret

用法:

# 创建
# 第一种是将文件名作为键,文件内容作为值
kubectl create secret generic secret名 --from-file=文件1 --from-file=文件2 -n namespace
# 第二种,不以文件名作为键,自定义键
kubectl create secret generic secret名 --from-file=键1=文件1 --from-file=键2=文件2 -n namespace# 查看
kubectl get secret secret名 -n namespace
kubectl describe secret secret名 -n namespace# 删除
kubectl delete secret secret名 -n namespace

【例 】

[root@k8s-master ~]# cat file1
admin
[root@k8s-master ~]# cat file2
12345# 第一种是将文件名作为键,文件内容作为值
[root@k8s-master ~]# kubectl create secret generic my-secret1 --from-file=file1 --from-file=file2 -n test
secret/my-secret1 created# 查看
[root@k8s-master ~]# kubectl get secret my-secret1 -n test
NAME         TYPE     DATA   AGE
my-secret1   Opaque   2      39s
[root@k8s-master ~]# kubectl describe secret my-secret1 -n test
Name:         my-secret1
Namespace:    test
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
file1:  6 bytes
file2:  6 bytes[root@k8s-master ~]# kubectl delete secret my-secret1 -n test
secret "my-secret1" deleted# 第二种,不以文件名作为键,自定义键
[root@k8s-master ~]# cat file1
admin
[root@k8s-master ~]# cat file2
12345# 创建
[root@k8s-master ~]# kubectl create secret generic my-secret2 --from-file=user=file1 --from-file=password=file2 -n test
secret/my-secret2 created# 查看
[root@k8s-master ~]# kubectl get secret my-secret2 -n test
NAME         TYPE     DATA   AGE
my-secret2   Opaque   2      9s
[root@k8s-master ~]# kubectl describe secret my-secret2 -n test
Name:         my-secret2
Namespace:    test
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
password:  6 bytes
user:      6 bytes# 删除
[root@k8s-master ~]# kubectl delete secret my-secret1 -n test
secret "my-secret1" deleted
[root@k8s-master ~]# kubectl delete secret my-secret2 -n test
secret "my-secret2" deleted

2. 通过文件夹创建secret

用法:

# 创建
kubectl create secret generic secret名 --from-file=目录 -n namespace
# 该目录下的每个文件被定义为一个键值对,其中文件名作为键,文件内容作为值# 查看
kuebctl get secret secret名 -n namespace
kubectl describe secret secret名 -n namespace# 删除
kubectl delete secret secret名 -n namespace

【例 】

[root@k8s-master ~]# mkdir secret-test
[root@k8s-master ~]# echo "zhangsan" > secret-test/name.txt
[root@k8s-master ~]# echo "18" > secret-test/age.txt
# 创建
[root@k8s-master ~]# kubectl create secret generic my-secret3 --from-file=secret-test/ -n test
secret/my-secret3 created# 查看
[root@k8s-master ~]# kubectl get secret my-secret3 -n test
NAME         TYPE     DATA   AGE
my-secret3   Opaque   2      12s
[root@k8s-master ~]# kubectl describe secret my-secret3 -n test
Name:         my-secret3
Namespace:    test
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
age.txt:   3 bytes
name.txt:  9 bytes# 删除
[root@k8s-master ~]# kubectl delete secret my-secret3 -n test
secret "my-secret3" deleted

3. 命令行声明键值对创建secret

用法:

# 创建
kubectl create secret generic secret名 --from-literal=键1=值1  --from-literal=键2=值2 ... -n test# 查看
kuebctl get secret secret名 -n namespace
kubectl describe secret secret名 -n namespace# 删除
kubectl delete secret secret名 -n namespace

【例 】

# 创建
[root@k8s-master ~]# kubectl create secret generic my-secret4 --from-literal=user=admin --from-literal=password=123456  -n test
secret/my-secret4 created# 查看
[root@k8s-master ~]# kubectl get secret my-secret4 -n test
NAME         TYPE     DATA   AGE
my-secret4   Opaque   2      10s
[root@k8s-master ~]# kubectl describe secret my-secret4 -n test
Name:         my-secret4
Namespace:    test
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
password:  6 bytes
user:      5 bytes# 删除
[root@k8s-master ~]# kubectl delete secret my-secret4 -n test
secret "my-secret4" deleted# 使用base64编码后的值进行定义
[root@k8s-master ~]# echo -n 'lisi' | base64
bGlzaQ==
[root@k8s-master ~]# echo -n '10001' | base64
MTAwMDE=
[root@k8s-master ~]# kubectl create secret generic my-secret5 --from-literal=sname=bGlzaQ== --from-literal=sno=MTAwMDE=  -n test
secret/my-secret5 created
[root@k8s-master ~]# kubectl describe secret my-secret5 -n test
Name:         my-secret5
Namespace:    test
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
sname:  8 bytes
sno:    8 bytes
# 该secret通过volume挂载到容器内部后查看就是解码后的明文

(二)通过资源清单文件创建secret

通过资源清单文件创建Opaque类型的Secret值需要进行base64编码

用法:

# 资源清单文件
apiVersion: v1
kind: Secret
metadata:name: namespace:
type:
data:key1: value1       # 使用资源清单文件定义键值对中的值时,必须是base64编码后的密文key2: value2...# 下面是嵌套写法
data:key1: key2:value2   key3:value2...# 创建
kubectl create -f 资源清单文件
kubectl apply -f 资源清单文件# 查看
kubectl describe cm cm名 -n namespace
kubectl describe -f 资源清单文件# 删除
kubectl delete cm cm名 -n namespace
kubectl delete -f 资源清单文件

【例 】

[root@k8s-master ~]# echo -n 'computer' | base64
Y29tcHV0ZXI=
[root@k8s-master ~]# echo -n 'Lenovo' | base64
TGVub3Zv
[root@k8s-master ~]# echo -n '1000 dollars' | base64
MTAwMCBkb2xsYXJz[root@k8s-master ~]# vim my-secret6.yaml
apiVersion: v1
kind: Secret
metadata:name: my-secret6namespace: test
type: Opaque
data:goods: Y29tcHV0ZXI=brand: TGVub3Zvprice: MTAwMCBkb2xsYXJz[root@k8s-master ~]# kubectl describe -f my-secret6.yaml
Name:         my-secret6
Namespace:    test
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
brand:  6 bytes
goods:  8 bytes
price:  12 bytes

三、Secret的使用

1. 将Secret中的数据设置为容器的环境变量

[root@k8s-master ~]# vim pod-secret-env.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-secret-envnamespace: test
spec:containers:- name: busyboximage: busyboxargs:- sleep- "86400"env:- name: SNAMEvalueFrom:secretKeyRef:name: my-secret5key: sname- name: SNOvalueFrom:secretKeyRef:name: my-secret5key: sno
# my-secret5是上面创建的secret,两个键值对,sname:bGlzaQ==(对应的明文为 lisi) sno:MTAwMDE= (对应的明文为10001)
[root@k8s-master ~]# kubectl describe secret my-secret5 -n test
Name:         my-secret5
Namespace:    test
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
sname:  8 bytes
sno:    8 bytes# 创建pod
[root@k8s-master ~]# kubectl create -f pod-secret-env.yaml
pod/pod-secret-env created# 查看pod
[root@k8s-master ~]# kubectl get pod pod-secret-env -n test -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
pod-secret-env   1/1     Running   0          30s   10.244.2.227   k8s-node02   <none>           <none># 在容器内验证环境变量是否存在
[root@k8s-master ~]# kubectl exec -it pod-secret-env -n test -- sh
/ # env
……省略……
SNO=MTAwMDE=
SNAME=bGlzaQ==
/ # echo $SNO
MTAwMDE=
/ # echo $SNAME
bGlzaQ==
# 解码查看
/ # echo $SNO | base64 -d
10001
/ # echo $SNAME | base64 -d
lisi

2. 使用Volume将Secret作为文件或目录挂载

通过该方式将Secret挂载到容器内的目录后,同样会将键值对生成相应文件,键对应文件名,值对应文件内容,且经过base64编码的secret在容器内部会被自动解码

[root@k8s-master ~]# vim pod-secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-secret-volume
spec:containers:- name: busyboximage: busybox:1.30.1args:- sleep- "86400"volumeMounts:- name: volume-secretmountPath: /volume/secretvolumes:- name: volume-secretsecret:secretName: my-secret6[root@k8s-master ~]# kubectl describe secret my-secret6 -n test
Name:         my-secret6
Namespace:    test
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
brand:  6 bytes
goods:  8 bytes
price:  12 bytes[root@k8s-master ~]# kubectl create -f pod-secret-volume.yaml
pod/pod-secret-volume created[root@k8s-master ~]# kubectl get pod pod-secret-volume -n test -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
pod-secret-volume   1/1     Running   0          3s    10.244.2.228   k8s-node02   <none>           <none>[root@k8s-master ~]# kubectl exec -it pod-secret-volume -n test -- sh
/ # cd /volume/secret
/volume/secret # ls
brand  goods  price
/volume/secret # cat brand
Lenovo
/volume/secret # cat goods
computer
/volume/secret # cat price
1000 dollars
# 编码的值会被自动解码# 查看热更新
[root@k8s-master ~]# echo -n "6000 ¥" | base64
NjAwMCDvv6U=
# 修改值
[root@k8s-master ~]# kubectl edit secret my-secret6 -n test
# 将  price: MTAwMCBkb2xsYXJz 改为 price: NjAwMCDvv6U=
secret/my-secret6 edited
# 在容器中查看
[root@k8s-master ~]# kubectl exec -it pod-secret-volume -n test -- sh
/ # cd /volume/secret
/volume/secret # cat price
6000 ¥
# 会同时更新

通过volume挂载和环境变量的区别:

通过Volume挂载到容器内部时,当该Secret的值发生变化时,容器内部具备自动更新的能力,但是通过环境变量设置到容器内部该值不具备自动更新的能力。所以一般推荐使用Volume挂载的方式使用Secret。

Secret 与 ConfigMap 对比:

相同点:

  • key/value的形式
  • 属于某个特定的namespace
  • 可以导出到环境变量
  • 可以通过目录/文件形式挂载
  • 通过 volume 挂载的配置信息均可热更新

不同点:

  • Secret 可以被 ServerAccount 关联
  • Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
  • Secret 支持 Base64 编码
  • Secret分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类

K8S 数据卷volumes之Secret相关推荐

  1. K8S 数据卷volumes之ConfigMap

    文章目录 一.ConfigMap介绍 二.ConfigMap创建 (一)通过命令行创建configmap 1. 通过文件创建configmap 2. 通过文件夹创建configmap 3. 命令行声明 ...

  2. Docker数据卷—Volumes

    一.引入Docker数据卷的必然性 为了实现容器与主机之间.容器与容器之间共享文件,容器中数据的持久化,将容器中的数据备份.迁移.恢复等,Docker加入了数据卷(volumes)机制.简单的讲,就是 ...

  3. Docker容器的数据卷(volumes)

    目录 1.容器数据卷技术解决什么问题 docker可将应用和环境打包成一个镜像.容器是镜像的实例化. 我们的数据如果都在容器中,一旦容器删除,数据就会丢失. 数据卷技术可将容器产生的数据同步到本地,容 ...

  4. docker 数据卷 mysql_Docker 入门教程(五)数据卷 Volumes

    有些容器在运行的时候是会产生数据的: 这种容器就叫做有状态容器: 比如说 MySQL 容器: 我们在创建镜像的时候希望保留的是 MySQL 各种配置以及扩展: 并不想把 MySQL 的数据也打包到镜像 ...

  5. docker基础---数据卷volumes

    1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...

  6. 云原生存储详解:容器存储与 K8s 存储卷

    作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...

  7. k8s挂载目录_云原生存储详解:容器存储与 K8s 存储卷

    作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...

  8. docker修改镜像的存储位置_云原生存储详解:容器存储与 K8s 存储卷(内含赠书福利)...

    作者 | 阚俊宝  阿里巴巴技术专家 参与文末留言互动,即有机会获得赠书福利! 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新 ...

  9. 云原生存储详解:容器存储与K8s存储卷

    作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...

最新文章

  1. hibernate4中取得connection的方法
  2. 卓越软件工程--《微软360度》读后感
  3. java 与sql设置排序方法是_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合...
  4. nginx给php做统一入口,Nginx如何来配置隐藏入口文件index.php(代码)
  5. React之mockjs+sass+生命周期函数
  6. linux公社 java算法_Java快速排序算法
  7. tomcat 系统服务 outofmemory
  8. MyEclipse下连接Mysql
  9. 蔬菜大棚原理_天津大棚报价大棚的造价、温室大棚
  10. python出现Unresolved import:库名,已解决
  11. js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解
  12. .NET 3.5 Socket APM
  13. 微星P55-主板是怎样造出来的
  14. PWM驱动sg90电机
  15. Boost电路的参数设计
  16. 谷歌浏览器如何设置internet选项
  17. DC离职率预测案例分析
  18. explain是mysql的关键字吗_mysql 中的explain关键字
  19. 电脑中的耳机插进去没有反应
  20. java连连看算法_用 JAVA 开发游戏连连看(之三)将算法与界面结合起来

热门文章

  1. python--圆周率的计算
  2. 如何使用低代码平台设计一套请假流程?
  3. win10找不到输入法问题的解决办法
  4. “知识共享”与智能数学老师
  5. Matlab视频处理
  6. 10个超赞的jQuery图片滑块动画
  7. 惠普服务器做linux系统安装系统教程,HP刀片服务器安装系统步骤
  8. 基于PHP+MySQL的大学生求职招聘网站
  9. 集成灶怎么选品牌(拒绝陷阱避坑指南)
  10. Mockplus Cloud自动生成规格,Mockplus Cloud交互式动画原型