Kubernetes之secrets使用
系列文章
1. mac上安装docker并运行kubernetes
2. Docker上部署并运行SpringBoot项目
3. 利用kubernetes部署docker的镜像文件
4. Kubernetes之secrets使用
背景
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 PodSpecification中或者container image中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。
Secret 类似于 ConfigMap 但专门用于保存机密数据。
1. 创建secret
1.1. 通过kubectl command 方式
一个 Secret
可以包含 Pod 访问数据库所需的用户凭证。 例如,由用户名和密码组成的数据库连接字符串。 你可以在本地计算机上,将用户名存储在文件 ./username.txt
中,将密码存储在文件 ./password.txt
中。
echo -n 'system' > ./username.txt
echo -n 'system123' > ./password.txt
在这些命令中,-n
标志确保生成的文件在文本末尾不包含额外的换行符。 这一点很重要,因为当 kubectl
读取文件并将内容编码为 base64 字符串时,多余的换行符也会被编码。
kubectl create secret
命令将这些文件打包成一个 Secret 并在 API 服务器上创建对象。
kubectl create secret generic testsecretbyfile \--from-file=./username.txt \--from-file=./password.txt
默认密钥名称是文件名。 你可以选择使用 --from-file=[key=]source
来设置密钥名称。例如:
kubectl create secret generic testsecretbyfile \--from-file=username=./username.txt \--from-file=password=./password.txt
1.2. 通过配置文件的方式
你可以先用 JSON 或 YAML 格式在一个清单文件中定义 Secret
对象,然后创建该对象。 Secret 资源包含 2 个键值对:data
和 stringData
。 data
字段用来存储 base64 编码的任意数据。 提供 stringData
字段是为了方便,它允许 Secret 使用未编码的字符串。
$ echo -n "system" | base64
c3lzdGVt
$ echo -n "system123" | base64
c3lzdGVtMTIz
my_secret.yml,
apiVersion: v1
kind: Secret
metadata:name: testsecret
type: Opaque
data:password: c3lzdGVtMTIzusername: c3lzdGVt
通过下面命令创建
kubectl apply -f my_secret.yml
用stringData的方式
apiVersion: v1
kind: Secret
metadata:name: testsecret
type: Opaque
stringData:password: system123username: system
1.3. 通过kustomize方式
你可以在 kustomization.yaml
中定义 secreteGenerator
字段,并在定义中引用其它本地文件生成 Secret。 例如:下面的 kustomization 文件 引用了 ./username.txt
和 ./password.txt
文件:
secretGenerator:
- name: testsecretfiles:- username.txt- password.txt
你也可以在 kustomization.yaml
文件中指定一些字面量定义 secretGenerator
字段。 例如:下面的 kustomization.yaml
文件中包含了 username
和 password
两个字面量:
secretGenerator:
- name: testsecretliterals:- username=system- password=system123
你也可以使用 .env
文件在 kustomization.yaml
中定义 secretGenerator
。 例如:下面的 kustomization.yaml
文件从 .env.secret
文件获取数据。
secretGenerator:
- name: testsecretenvs:- .env.secret
2. 验证 Secret
检查 secret 是否已创建:
kubectl get secrets
输出类似于:
NAME TYPE DATA AGE
testsecret Opaque 2 51s
你可以查看 Secret
的描述:
kubectl describe secrets/testsecret
3. 删除Secret
删除创建的 Secret:
kubectl delete secret testsecret
4. Opaque Secret的使用
创建好secret之后,有两种方式来使用它:
- 以Volume方式
- 以环境变量方式
4.1. 以Volume方式
加下面配置在spec.volumes和spec.containers.volumeMounts这两个标签里。
spec:volumes:- name: secretssecret:secretName: testsecretcontainers:- name: test123image: test-demo1:v1.0volumeMounts:- name: secretsmountPath: /etc/secrets readOnly: true
利用下面命令重新部署你的项目
#kubectl apply -f yourapp.yaml
进入你的pod , 注:test123-5595d9fdf9-bsdj6是我pod名字
#Kubectl exec -ti test123-5595d9fdf9-bsdj6 -- /bin/sh
在/etc/secrets/目录里查看password文件
root@test123-5595d9fdf9-bsdj6:/# cd etc/secrets/
root@test123-5595d9fdf9-bsdj6:/etc/secrets# cat password
system123
注意:如果你重新编辑secret的password,每个pod里的password也会改变。
完整的yourapp.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:name: test123labels:app: test123
spec:replicas: 1template:metadata:name: test123labels:app: test123spec:volumes:- name: secretssecret:secretName: testsecretcontainers:- name: test123image: test-demo1:v1.0imagePullPolicy: IfNotPresentvolumeMounts:- name: secretsmountPath: /etc/secrets readOnly: trueports:- containerPort: 8080resources: requests: cpu: 100mmemory: 128Milimits:cpu: 250mmemory: 256MirestartPolicy: Alwaysselector:matchLabels:app: test123
---
apiVersion: v1
kind: Service
metadata:name: test123-servicelabels:app: test123-service
spec:selector:app: test123ports:- port: 8087targetPort: 8089nodePort: 30082type: NodePort
4.2. 以环境变量方式
在Container的env里配置下面环境参数
env:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: testsecretkey: usernameoptional: false # same as default; "mysecret" must exist# and include a key named "username"- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: testsecretkey: passwordoptional: false # same as default; "mysecret" must exist# and include a key named "password"
利用下面命令重新部署你的项目
#kubectl apply -f yourapp.yaml
进入你的pod , 注:test123-675b6f7c8-psh6w是我pod名字
#Kubectl exec -ti test123-675b6f7c8-psh6w -- /bin/sh
输出环境变量
root@test123-675b6f7c8-psh6w:/# echo SECRET_USERNAME
SECRET_USERNAME
root@test123-675b6f7c8-psh6w:/# echo $SECRET_PASSWORD
system123
完整的yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:name: test123labels:app: test123
spec:replicas: 1template:metadata:name: test123labels:app: test123spec:containers:- name: test123image: test-demo1:v1.0env:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: testsecretkey: usernameoptional: false # same as default; "mysecret" must exist# and include a key named "username"- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: testsecretkey: passwordoptional: false # same as default; "mysecret" must exist# and include a key named "password"imagePullPolicy: IfNotPresentports:- containerPort: 8080resources: requests: cpu: 100mmemory: 128Milimits:cpu: 250mmemory: 256MirestartPolicy: Alwaysselector:matchLabels:app: test123
---
apiVersion: v1
kind: Service
metadata:name: test123-servicelabels:app: test123-service
spec:selector:app: test123ports:- port: 8087targetPort: 8089nodePort: 30082type: NodePort
5. 所有的secret类型
Built-in Type | Usage |
---|---|
Opaque
|
arbitrary user-defined data |
kubernetes.io/service-account-token
|
ServiceAccount token |
kubernetes.io/dockercfg
|
serialized ~/.dockercfg file
|
kubernetes.io/dockerconfigjson
|
serialized ~/.docker/config.json file
|
kubernetes.io/basic-auth
|
credentials for basic authentication |
kubernetes.io/ssh-auth
|
credentials for SSH authentication |
kubernetes.io/tls
|
data for a TLS client or server |
bootstrap.kubernetes.io/token
|
bootstrap token data |
参考资料
Secrets | Kubernetes
Kubernetes之secrets使用相关推荐
- Kubernetes学习笔记之Calico Startup源码解析
女主宣言 我们目前生产k8s和calico使用ansible二进制部署在私有机房,没有使用官方的calico/node容器部署,并且因为没有使用network policy只部署了confd/bird ...
- 运行支持kubernetes原生调度的Spark程序
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 Spark 概念说明 Apache Spark 是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLa ...
- 艰难的选择_如何艰难地保护Kubernetes
艰难的选择 Kubernetes is open-source, robust, and one of the most popular container orchestration platfor ...
- Kubernetes的五种最佳安全实践
Kubernetes还不到6岁,但它已经是每个人最喜欢的容器编排程序了.云和基础设施监测公司Datadog发现Kubernetes主导着容器市场:"大约45%的运行容器的Datadog客户使 ...
- Spark on K8S及history服务部署
Spark on K8S环境部署细节 https://www.cnblogs.com/lanrish/p/12267623.html spark history helm部署 https://gith ...
- 云原生生态周报 Vol. 2
业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布并详细解读了其开源的K8s外部 Secrets 管理项目: Kuberne ...
- Nodejs 开发最佳实践
1. 项目结构实践 ✔ 1.1 组件式构建你的解决方案 TL;DR: 大型项目的最坏的隐患就是维护一个庞大的,含有几百个依赖的代码库 - 当开发人员准备整合新的需求的时候,这样一个庞然大物势必减缓了开 ...
- 浅谈服务治理、微服务与Service Mesh(二) Spring Cloud从入门到精通到放弃
引言 作为本系列文章的第二篇,本文主要为大家介绍下微服务概念中非常火热的Spring Cloud开发框架.由于网上关于Spring Cloud的文章多如牛毛,为了让大家阅读后能有不一样的收获,因此本文 ...
- 浅谈服务治理、微服务与Service Mesh(一二三)
本文为转载#原文链接:易商阜极 引言 本系列文章将为大家介绍当下最流行的服务治理.微服务等相关内容,从服务治理.SOA.微服务到最新的服务网格(Service Mesh)进行综合介绍和分析.作为本系列 ...
- 使用 KMS 驱动进行数据加密
本页展示了如何配置密钥管理服务(Key Management Service,KMS)驱动和插件以启用 Secret 数据加密. 目前有两个 KMS API 版本.KMS v1 将继续工作,而 KMS ...
最新文章
- JVM最佳学习笔记一---Java内存区域与内存溢出异常
- Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?
- Oracle优化06-Hint
- mysql 10分钟_10分钟入门mysql(含常用的sql语句,mysql常见问题及解决方案)
- 女人的安全感到底是什么?
- zabbix mysql复制延迟_Zabbix监控mysql主从复制状态
- 真的能去太空旅游了!单人票价......打扰了!
- 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
- linux 所有邮件地址群发,linux sendmail群发邮件
- IOS 百度地图集成
- Spring Cloud入门五 hystrix
- Oracle-----Plsql导出表结构和表数据,数据库对象
- 微信api中转站(用python搭建flask服务器)
- cmd控制台通过sftp命令下载服务器文件
- 文档管理系统mindoc安装
- MySQL-查询本周过生日的人-终极答案
- MySQL中全局变量、会话变量、用户变量和局部变量的区别
- AVR446步进电机算法推导及应用
- 【独立按键鼠标式的单击与双击】
- DOIP SOME/IP
热门文章
- C#——初识Console
- mysqlclient和pymysql如何选择?_gevent_waiter的使用
- pytorch加载数据时中途卡死且未报错
- html规范eml文件,eml文件【操作办法】
- python中面向对象编程简称为_Python-面向对象编程
- 我在华为的十年(转)
- 哪些人适合学大数据分析
- 【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用
- UIButton基础以及使用block+UIButton处理点击事件
- VS使用NPOI替换word模板中的关键字