K8S 数据卷volumes之Secret
文章目录
- 一、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相关推荐
- K8S 数据卷volumes之ConfigMap
文章目录 一.ConfigMap介绍 二.ConfigMap创建 (一)通过命令行创建configmap 1. 通过文件创建configmap 2. 通过文件夹创建configmap 3. 命令行声明 ...
- Docker数据卷—Volumes
一.引入Docker数据卷的必然性 为了实现容器与主机之间.容器与容器之间共享文件,容器中数据的持久化,将容器中的数据备份.迁移.恢复等,Docker加入了数据卷(volumes)机制.简单的讲,就是 ...
- Docker容器的数据卷(volumes)
目录 1.容器数据卷技术解决什么问题 docker可将应用和环境打包成一个镜像.容器是镜像的实例化. 我们的数据如果都在容器中,一旦容器删除,数据就会丢失. 数据卷技术可将容器产生的数据同步到本地,容 ...
- docker 数据卷 mysql_Docker 入门教程(五)数据卷 Volumes
有些容器在运行的时候是会产生数据的: 这种容器就叫做有状态容器: 比如说 MySQL 容器: 我们在创建镜像的时候希望保留的是 MySQL 各种配置以及扩展: 并不想把 MySQL 的数据也打包到镜像 ...
- docker基础---数据卷volumes
1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...
- 云原生存储详解:容器存储与 K8s 存储卷
作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...
- k8s挂载目录_云原生存储详解:容器存储与 K8s 存储卷
作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...
- docker修改镜像的存储位置_云原生存储详解:容器存储与 K8s 存储卷(内含赠书福利)...
作者 | 阚俊宝 阿里巴巴技术专家 参与文末留言互动,即有机会获得赠书福利! 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新 ...
- 云原生存储详解:容器存储与K8s存储卷
作者 | 阚俊宝 阿里云技术专家 导读:云原生存储详解系列文章将从云原生存储服务的概念.特点.需求.原理.使用及案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战.本文为该系列文章的第二篇,会对容 ...
最新文章
- hibernate4中取得connection的方法
- 卓越软件工程--《微软360度》读后感
- java 与sql设置排序方法是_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合...
- nginx给php做统一入口,Nginx如何来配置隐藏入口文件index.php(代码)
- React之mockjs+sass+生命周期函数
- linux公社 java算法_Java快速排序算法
- tomcat 系统服务 outofmemory
- MyEclipse下连接Mysql
- 蔬菜大棚原理_天津大棚报价大棚的造价、温室大棚
- python出现Unresolved import:库名,已解决
- js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解
- .NET 3.5 Socket APM
- 微星P55-主板是怎样造出来的
- PWM驱动sg90电机
- Boost电路的参数设计
- 谷歌浏览器如何设置internet选项
- DC离职率预测案例分析
- explain是mysql的关键字吗_mysql 中的explain关键字
- 电脑中的耳机插进去没有反应
- java连连看算法_用 JAVA 开发游戏连连看(之三)将算法与界面结合起来