系列文章

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使用相关推荐

  1. Kubernetes学习笔记之Calico Startup源码解析

    女主宣言 我们目前生产k8s和calico使用ansible二进制部署在私有机房,没有使用官方的calico/node容器部署,并且因为没有使用network policy只部署了confd/bird ...

  2. 运行支持kubernetes原生调度的Spark程序

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 Spark 概念说明 Apache Spark 是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLa ...

  3. 艰难的选择_如何艰难地保护Kubernetes

    艰难的选择 Kubernetes is open-source, robust, and one of the most popular container orchestration platfor ...

  4. Kubernetes的五种最佳安全实践

    Kubernetes还不到6岁,但它已经是每个人最喜欢的容器编排程序了.云和基础设施监测公司Datadog发现Kubernetes主导着容器市场:"大约45%的运行容器的Datadog客户使 ...

  5. Spark on K8S及history服务部署

    Spark on K8S环境部署细节 https://www.cnblogs.com/lanrish/p/12267623.html spark history helm部署 https://gith ...

  6. 云原生生态周报 Vol. 2

    业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布并详细解读了其开源的K8s外部 Secrets 管理项目: Kuberne ...

  7. Nodejs 开发最佳实践

    1. 项目结构实践 ✔ 1.1 组件式构建你的解决方案 TL;DR: 大型项目的最坏的隐患就是维护一个庞大的,含有几百个依赖的代码库 - 当开发人员准备整合新的需求的时候,这样一个庞然大物势必减缓了开 ...

  8. 浅谈服务治理、微服务与Service Mesh(二) Spring Cloud从入门到精通到放弃

    引言 作为本系列文章的第二篇,本文主要为大家介绍下微服务概念中非常火热的Spring Cloud开发框架.由于网上关于Spring Cloud的文章多如牛毛,为了让大家阅读后能有不一样的收获,因此本文 ...

  9. 浅谈服务治理、微服务与Service Mesh(一二三)

    本文为转载#原文链接:易商阜极 引言 本系列文章将为大家介绍当下最流行的服务治理.微服务等相关内容,从服务治理.SOA.微服务到最新的服务网格(Service Mesh)进行综合介绍和分析.作为本系列 ...

  10. 使用 KMS 驱动进行数据加密

    本页展示了如何配置密钥管理服务(Key Management Service,KMS)驱动和插件以启用 Secret 数据加密. 目前有两个 KMS API 版本.KMS v1 将继续工作,而 KMS ...

最新文章

  1. JVM最佳学习笔记一---Java内存区域与内存溢出异常
  2. Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?
  3. Oracle优化06-Hint
  4. mysql 10分钟_10分钟入门mysql(含常用的sql语句,mysql常见问题及解决方案)
  5. 女人的安全感到底是什么?
  6. zabbix mysql复制延迟_Zabbix监控mysql主从复制状态
  7. 真的能去太空旅游了!单人票价......打扰了!
  8. 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
  9. linux 所有邮件地址群发,linux sendmail群发邮件
  10. IOS 百度地图集成
  11. Spring Cloud入门五 hystrix
  12. Oracle-----Plsql导出表结构和表数据,数据库对象
  13. 微信api中转站(用python搭建flask服务器)
  14. cmd控制台通过sftp命令下载服务器文件
  15. 文档管理系统mindoc安装
  16. MySQL-查询本周过生日的人-终极答案
  17. MySQL中全局变量、会话变量、用户变量和局部变量的区别
  18. AVR446步进电机算法推导及应用
  19. 【独立按键鼠标式的单击与双击】
  20. DOIP SOME/IP

热门文章

  1. C#——初识Console
  2. mysqlclient和pymysql如何选择?_gevent_waiter的使用
  3. pytorch加载数据时中途卡死且未报错
  4. html规范eml文件,eml文件【操作办法】
  5. python中面向对象编程简称为_Python-面向对象编程
  6. 我在华为的十年(转)
  7. 哪些人适合学大数据分析
  8. 【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用
  9. UIButton基础以及使用block+UIButton处理点击事件
  10. VS使用NPOI替换word模板中的关键字