secret学习笔记
Secret是用来保存敏感信息的,比如密码、令牌或者key,redis、mysql密码。
是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
Secret 类似于 ConfigMap 但专门用于保存机密数据。
每个 Secret 的尺寸最多为 1MiB。施加这一限制是为了避免用户创建非常大的 Secret, 进而导致 API 服务器和 kubelet 内存耗尽。不过创建很多小的 Secret 也可能耗尽内存。 你可以使用资源配额来约束每个名字空间中 Secret(或其他资源)的个数
创建 Secret
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
kubectl create secret generic db-user-pass \
--from-file=./username.txt \
--from-file=./password.txt
Kubectl get secret db-user-pass -oyaml
Base64解密
echo YWRtaW4= | base64 --decode
安装字段值创建,特殊字符需要转义,使用单引号不需要转义
kubectl create secret generic db-user-pass \ --from-literal=username=devuser \ --from-literal=password='S!B\*d$zDsb='
验证 Secret
Kubectl get secret
Kubecti get secret db-user-pass -o yaml
Kubectl describe secret db-user-pass
解码 Secret
kubectl get secret db-user-pass -o jsonpath='{.data}'
echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
使用配置文件创建 Secret
手动bas64转义
echo -n 'admin' |base64
echo -n '1f2d1e2e67df' |base64
apiVersion: v1
Kind: Secret
Metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
Password: MWYyZDFlMmU2N2Rm
apiVersion: v1
Kind: Secret
Metadata:
name: mysecret-2
type: Opaque
stringData:
username: admin
Password: 1f2d1e2e67df
Secret 的使用
Pod 可以用三种方式之一来使用 Secret:
- 作为挂载到一个或多个容器上的卷 中的文件。
- 作为容器的环境变量。
- 由 kubelet 在为 Pod 拉取镜像时使用。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
optional: false # 默认设置,意味着 "mysecret" 必须已经存在
挂载路径
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
权限
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
defaultMode: 0400
环境变量
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
optional: false # 此值为默认值;意味着 "mysecret"
# 必须存在且包含名为 "username" 的主键
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
optional: false # 此值为默认值;意味着 "mysecret"
# 必须存在且包含名为 "password" 的主键
restartPolicy: Never
使用场景
创建 ImagePullSecrets
ImagePUllSecret: POD拉取私有镜像时使用的账户密码,里面的账户信息,会传递给kubelet,然后kubelet就可以拉取有密码的仓库里面的镜像
kubectl create secret docker-registry secret-tiger-docker \
--docker-email=tiger@acme.example \
--docker-username=tiger \
--docker-password=pass113 \
--docker-server=my-registry.example:5000
配置文件创建
apiVersion: v1
kind: Secret
metadata:
name: secret-dockercfg
type: kubernetes.io/dockercfg
data:
.dockercfg: |
"<base64 encoded ~/.dockercfg file>"
在 Pod 中引用 ImagePullSecrets
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
imagesPullSecret:
- name: mysecret
containers:
- name: test1-container
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "cat /tmp/keys" ]
volumeMounts:
- name: config-volume
mountPath: /tmp
volumes:
- name: config-volume
configMap:
name: special-config
items:
- key: special.how
path: keys
restartPolicy: Never
将镜像拉取 Secret 添加到服务账号
接着修改命名空间的 default 服务帐户,以将该 Secret 用作 imagePullSecret。
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
或者
kubectl get serviceaccounts default -o yaml > ./sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
resourceVersion: "243024"
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
变成
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: myregistrykey
kubectl replace serviceaccount default -f ./sa.yaml
TLS Secret
Kubernetes 提供一种内置的 kubernetes.io/tls Secret 类型,用来存放 TLS 场合通常要使用的证书及其相关密钥。 TLS Secret 的一种典型用法是为 Ingress 资源配置传输过程中的数据加密,不过也可以用于其他资源或者直接在负载中使用。 当使用此类型的 Secret 时,Secret 配置中的 data (或 stringData)字段必须包含 tls.key 和 tls.crt 主键,尽管 API 服务器实际上并不会对每个键的取值作进一步的合法性检查。
下面的 YAML 包含一个 TLS Secret 的配置示例:
apiVersion: v1
kind: Secret
metadata:
name: secret-tls
type: kubernetes.io/tls
data:
# 此例中的数据被截断
tls.crt: |
MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
tls.key: |
MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
提供 TLS 类型的 Secret 仅仅是出于用户方便性考虑。 你也可以使用 Opaque 类型来保存用于 TLS 服务器与/或客户端的凭据。 不过,使用内置的 Secret 类型的有助于对凭据格式进行归一化处理,并且 API 服务器确实会检查 Secret 配置中是否提供了所需要的主键。
当使用 kubectl 来创建 TLS Secret 时,你可以像下面的例子一样使用 tls 子命令:
kubectl create secret tls my-tls-secret \
--cert=path/to/cert/file \
--key=path/to/key/file
启动引导令牌 Secret
通过将 Secret 的 type 设置为 bootstrap.kubernetes.io/token 可以创建 启动引导令牌类型的 Secret。这种类型的 Secret 被设计用来支持节点的启动引导过程。 其中包含用来为周知的 ConfigMap 签名的令牌。
启动引导令牌 Secret 通常创建于 kube-system 名字空间内,并以 bootstrap-token-<令牌 ID> 的形式命名;其中 <令牌 ID> 是一个由 6 个字符组成 的字符串,用作令牌的标识。
以 Kubernetes 清单文件的形式,某启动引导令牌 Secret 可能看起来像下面这样
apiVersion: v1
kind: Secret
metadata:
name: bootstrap-token-5emitj
namespace: kube-system
type: bootstrap.kubernetes.io/token
data:
auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=
expiration: MjAyMC0wOS0xM1QwNDozOToxMFo=
token-id: NWVtaXRq
token-secret: a3E0Z2lodnN6emduMXAwcg==
usage-bootstrap-authentication: dHJ1ZQ==
usage-bootstrap-signing: dHJ1ZQ==
启动引导令牌类型的 Secret 会在 data 字段中包含如下主键:
- token-id:由 6 个随机字符组成的字符串,作为令牌的标识符。必需。
- token-secret:由 16 个随机字符组成的字符串,包含实际的令牌机密。必需。
- description:供用户阅读的字符串,描述令牌的用途。可选。
- expiration:一个使用 RFC3339 来编码的 UTC 绝对时间,给出令牌要过期的时间。可选。
- usage-bootstrap-<usage>:布尔类型的标志,用来标明启动引导令牌的其他用途。
- auth-extra-groups:用逗号分隔的组名列表,身份认证时除被认证为 system:bootstrappers 组之外,还会被添加到所列的用户组中。
上面的 YAML 文件可能看起来令人费解,因为其中的数值均为 base64 编码的字符串。 实际上,你完全可以使用下面的 YAML 来创建一个一模一样的 Secret:
apiVersion: v1
kind: Secret
metadata:
# 注意 Secret 的命名方式
name: bootstrap-token-5emitj
# 启动引导令牌 Secret 通常位于 kube-system 名字空间
namespace: kube-system
type: bootstrap.kubernetes.io/token
stringData:
auth-extra-groups: "system:bootstrappers:kubeadm:default-node-token"
expiration: "2020-09-13T04:39:10Z"
# 此令牌 ID 被用于生成 Secret 名称
token-id: "5emitj"
token-secret: "kq4gihvszzgn1p0r"
# 此令牌还可用于 authentication (身份认证)
usage-bootstrap-authentication: "true"
# 且可用于 signing (证书签名)
usage-bootstrap-signing: "true"
基本身份认证 Secret
kubernetes.io/basic-auth 类型用来存放用于基本身份认证所需的凭据信息。 使用这种 Secret 类型时,Secret 的 data 字段必须包含以下两个键:
- username: 用于身份认证的用户名;
- password: 用于身份认证的密码或令牌。
以上两个键的键值都是 base64 编码的字符串。 当然你也可以在创建 Secret 时使用 stringData 字段来提供明文形式的内容。 下面的 YAML 是基本身份认证 Secret 的一个示例清单:
apiVersion: v1
kind: Secret
metadata:
name: secret-basic-auth
type: kubernetes.io/basic-auth
stringData:
username: admin # kubernetes.io/basic-auth 类型的必需字段
password: t0p-Secret # kubernetes.io/basic-auth 类型的必需字段
SSH 身份认证 Secret
Kubernetes 所提供的内置类型 kubernetes.io/ssh-auth 用来存放 SSH 身份认证中 所需要的凭据。使用这种 Secret 类型时,你就必须在其 data (或 stringData) 字段中提供一个 ssh-privatekey 键值对,作为要使用的 SSH 凭据。
apiVersion: v1
kind: Secret
metadata:
name: secret-ssh-auth
type: kubernetes.io/ssh-auth
data:
# 此例中的实际数据被截断
ssh-privatekey: |
MIIEpQIBAAKCAQEAulqb/Y ..
使用场景:在 Secret 卷中带句点的文件
通过定义以句点(.)开头的主键,你可以“隐藏”你的数据。 这些主键代表的是以句点开头的文件或“隐藏”文件。 例如,当下面的 Secret 被挂载到 secret-volume 卷中时:
apiVersion: v1
kind: Secret
metadata:
name: dotfile-secret
data:
.secret-file: dmFsdWUtMg0KDQo=
---
apiVersion: v1
kind: Pod
metadata:
name: secret-dotfiles-pod
spec:
volumes:
- name: secret-volume
secret:
secretName: dotfile-secret
containers:
- name: dotfile-test-container
image: k8s.gcr.io/busybox
command:
- ls
- "-l"
- "/etc/secret-volume"
volumeMounts:
- name: secret-volume
readOnly: true
卷中会包含一个名为 .secret-file 的文件,并且容器 dotfile-test-container 中此文件位于路径 /etc/secret-volume/.secret-file 处。
使用场景:带 SSH 密钥的 Pod
创建包含一些 SSH 密钥的 Secret:
kubectl create secret generic ssh-key-secret --from-file=ssh-privatekey=/path/to/.ssh/id_rsa --from-file=ssh-publickey=/path/to/.ssh/id_rsa.pub
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
labels:
name: secret-test
spec:
volumes:
- name: secret-volume
secret:
secretName: ssh-key-secret
containers:
- name: ssh-test-container
image: mySshImage
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
在静态 Pod 中使用 Secret
你不可以在静态 Pod. 中使用 ConfigMap 或 Secret。静态 Pod 在指定的节点上由 kubelet 守护进程直接管理,不需要 API 服务器 监管。 与由控制面管理的 Pod(例如,Deployment) 不同;kubelet 监视每个静态 Pod(在它崩溃之后重新启动)。
https://kubernetes.io/zh/docs/concepts/configuration/secret/
secret学习笔记相关推荐
- CCNP学习笔记(6)
一.交换机 1.二层交换 特性: ①基于MAC地址转发数据帧 ②硬件工作 ③处理数据效率高,数据传输延时低 ④转发广播 2.三层交换 特性: ①提供路由功能 ②提高安全性 ③流量管理 3.网络方案中交 ...
- 我的HTTP/3学习笔记
本文转载自公众号 余晟以为 去年(2018年)1月,沪江的两位前端工程师翻译了O'Reilly的<HTTP/2基础教程>.似乎到目前为止,这似乎仍然是唯一关于HTTP/2的中文技术资料. ...
- Python学习笔记:Day 6 配置文件
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用内建模块4:hmac
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- 小五思科技术学习笔记之SSH
下面介绍一下相关概念: SSH的概念: SSH的英文全称为Secure Shell,SSH使用TCP的22号端口,其目的是要在非安全的网络上提供安全的远程登陆和其他安全的网络服务, 为什么要使用SSH ...
- python的程序异常类型,Python3.4学习笔记之类型判断,异常处理,终止程序操作小结...
本文实例讲述了Python3.4类型判断,异常处理,终止程序操作.分享给大家供大家参考,具体如下: python3.4学习笔记 类型判断,异常处理,终止程序,实例代码: #idle中按F5可以运行代码 ...
- 【cJSON】CJSON学习笔记(二)
1.重要函数说明 [1]两个创建 [创建JSON对象]cJSON *cJSON_CreateObject(void); [创建JSON数组]cJSON *cJSON_CreateArray(v ...
- [NOTE] WebGoat v8.2.2学习笔记
[NOTE] WebGoat v8.2.2学习笔记 文章目录 [NOTE] WebGoat v8.2.2学习笔记 前言 CIA 常见编码形式 OpenSSL使用 docker安全 SQL安全 SQLi ...
- redhat6.x_linux学习笔记
ULE 学习笔记 ls -l install.log -:rw-r--r--: 1 :root: root :39410 :2012-12-03 :install.log 文件类型 : 权限位 : 硬 ...
最新文章
- 机器学习将影响客户互动的8种方式
- linux centos 下载rpm源码包
- 学习笔记Hadoop(四)—— Hadoop集群的安装与部署(1)—— 虚拟机安装、java安装
- Android studio | From Zero To One ——简单布局(View和LinearLayout)
- 在div中设置文字与内部div垂直居中
- 思考:那么些大学生仅凭个人好恶来判断,缺乏是非观
- Python 装饰器@functools.wraps(func)
- 利用Vert.x构建简单的API 服务、分布式服务
- SQL Server 2008 Datetime Cast 成 Date 类型可以使用索引(转载)
- jupyter notebook安装相关问题
- 云单元架构,如何赋能数字化转型呢?
- 决策树系列(二)——剪枝
- Golang 入门系列(十三)用Beego开发web应用
- 测试流程,测试用例模板介绍
- 微博表情包大全,截止2022年5月
- delphi7 调webservice时报错:fault occurred while processing
- 基于SSM的房屋出租管理系统设计与实现
- BS和CS的区别有哪些:
- 《Python编程从入门到实践 第二版》第八章练习
- linux蜂鸣器驱动指令,Linux 设备驱动简析—PC蜂鸣器驱动
热门文章
- 显著目标检测:IVIF
- 微动开关技术知识-微动开关概要
- github self-hosted runner 添加与启动
- 从零开始的UBOOT的学习8--命令体系
- 计算机专业基础综合408备考经验分享
- Activiti6:模拟钉钉上面的请假流程(使用web画图并导出xml然后使用java执行流程)
- 二代旅游CMS网站管理系统使用手册(二)--目的地管理
- Python MySQL 1054 Unknown column '\xe7\x88\xb1\xe6\x83\x85' in 'where clause'错误分析
- 【java】高尔顿瓶
- 计算机等级二级c语言英文,计算机等级考试二级C语言考试大纲(国外英文资料).doc...