Secrets是Kubernetes中一种对象类型,用来保存密码、私钥、口令等敏感信息。与直接将敏感信息嵌入image、pod相比,Secrets更安全、更灵活,用户对敏感信息的控制力更强。同Docker对敏感信息的管理类似,首先用户创建Secrets将敏感信息加密后保存在集群中,创建pod时通过volume、环境变量引用Secrets。

创建Secrets

假设pod需要访问数据库。首先将用户名保存在文件./username.txt,将密码保存在./password.txt文件:

# Create files needed for rest of example.
$ echo -n 'admin' > ./username.txt
$ echo -n '1f2d1e2e67df' > ./password.txt

将两个文件作为参数运行如下命令创建Secret,此时敏感数据被保存在系统中:

$ kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret "db-user-pass" created

用Secret名称查看创建Secret:

$ kubectl get secrets
NAME                  TYPE                                  DATA      AGE
db-user-pass          Opaque                                2         51s$ kubectl describe secrets/db-user-pass
Name:            db-user-pass
Namespace:       default
Labels:          <none>
Annotations:     <none>Type:            OpaqueData
====
password.txt:    12 bytes
username.txt:    5 bytes

以上通过命令行创建Secret,需要首先将敏感内容保存在文件中,文件名作为Secret中单条条目的key。另外一种创建Secret的方法是声明对象。敏感信息可能包含任何控制字符、不可显示字符等,首先进行base64编码:

$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm

然后像下边这样声明Secret对象:

apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm

Kubernetes用map存储Secret中的data数据部分,合法的key由字母、数字、'-'、'_'、'.'组成,value可以是任何值,但要base64编码。运行如下命令创建Secret:

$ kubectl create -f ./secret.yaml
secret "mysecret" created

通过如下方法查看Secret中key所对应的值,首先运行如下命令:

$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:creationTimestamp: 2016-01-22T18:41:56Zname: mysecretnamespace: defaultresourceVersion: "164619"selfLink: /api/v1/namespaces/default/secrets/mysecretuid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque

运行如下命令base64解码:

$ echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
1f2d1e2e67df

使用Secrets

Pod使用Secret的两种方法:volume与环境变量。

通过volume使用Secret基于流程:

  1. 创建或者使用已存Secret,同一Secret可被多个pod引用。
  2. 修改pod定义,在.spec.volumes[]下增加新volume,名称随意。在相应的.spec.volumes[].secret.secretName指定Secret名称。
  3. 为使用Secret的容器添加.spec.containers[].volumeMounts[],同时指定.spec.containers[].volumeMounts[].readOnly = true。指定.spec.containers[].volumeMounts[].mountPath为未使用的目录名称。
  4. 在容器的image中,通过指定的目录与Secret中的key访问敏感内容。

示例:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecret

如果需要引用多个Secret,需要为每个Secret在.spec.volumes[]添加相应的条目。如果单个容器需要引用多个Secret,则在.spec.containers[].volumeMounts[]中为每个Secret添加Mount。可以将多个文件添加到一个Secret中,或者为每个文件创建Secret。

默认情况下Secret中的所有key被映射到相同目录下,可以通过 .spec.volumes[].secret.items为key设定映射目录:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecretitems:- key: usernamepath: my-group/my-username

以上配置导致的结果为username被映射到/etc/foo/my-group/my-username,而非默认的/etc/foo/username,并且password未被映射。 如果不使用.spec.volumes[].secret.items,Secret中所有key被映射到默认目录,如果在.spec.volumes[].secret.items指定了key与特定的映射目录,则只映射列出的key。如果打算使用.spec.volumes[].secret.items并且映射所有Secret的key,那么需要列出Secret中所有key。

可以在.spec.volumes[].secret.defaultMode中为Secret指定Permission,如果需要进一步在.spec.volumes[].secret.items[].mode为每个key单独指定permission。如果没有指定permission,默认为0644。示例如下:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"volumes:- name: foosecret:secretName: mysecretdefaultMode: 256

上例中的256等于8进制的0400,在json\yaml配置文件中不可以使用八进制表示数字。单位为key指定permission:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"volumes:- name: foosecret:secretName: mysecretitems:- key: usernamepath: my-group/my-usernamemode: 511

当通过Secret通过volume形式被使用时,其中的key如果发生变更的话,由kubelet自动周期性监控变更并为pod更新,但是注意此特性并非实时,存在延迟。

通过环境使用Secret流程:

  1. 创建或者使用已存在Secrets,一个Secret可以被多个pod使用。
  2. 修改pod声明中使用Secret的容器配置,为其添加环境变量env[].valueFrom.secretKeyRef,每条key对应一个环境变量。
  3. 在容器的image中通过引用环境变量使用敏感数据。

示例:

apiVersion: v1
kind: Pod
metadata:name: secret-env-pod
spec:containers:- name: mycontainerimage: redisenv:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: passwordrestartPolicy: Never

Secrets限制条件

创建Pod时需要对其使用的Secret进行有效性检查,因此Secrets要先于pod创建。

Secrets寄居于namespace之下,只有处于同一namespace下的pod可以引用。

单个Secret的size不能超过1M,防止Secrets占用太多内存引起apiServer性能恶化。但过多的Secrets仍然会占用大量的内在,关于限制所有Secrets占用内存的特性正在计划中。

kubelet在不经过apiServer、控制器创建pod,如--manifest-url、--config时不能使用Secrets。

如果在创建pod时Secret不存在或者key不存在,pod不能启动。通过环境变量引用Secret时,如果envFrom中指定的key的名称不合法,pod仍然能启动但会触发相应错误事件,如:

$ kubectl get events
LASTSEEN   FIRSTSEEN   COUNT     NAME            KIND      SUBOBJECT                         TYPE      REASON
0s         0s          1         dapi-test-pod   Pod                                         Warning   InvalidEnvironmentVariableNames   kubelet, 127.0.0.1      Keys [1badkey, 2alsobad] from the EnvFrom secret default/mysecret were skipped since they are considered invalid environment variable names.

参考:https://kubernetes.io/docs/concepts/configuration/secret/

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. 微软职位内部推荐-Senior Software Engineer-Eco
  2. javascript客户端检测技术
  3. python获取路径下所有图片:
  4. 使用 XML 实现 REST 式的 SOA
  5. C# 基础知识 (二).独特的知识及用法篇
  6. SpringCloud熔断器介绍
  7. python创建函数、可以接受任意多个整数参数并求和_pythonxlwt:求和函数最大参数限制?...
  8. java jvm对象_Java对象在JVM中长啥样
  9. 马斯克说,特斯拉卡车有Mad Max狂野模式,危险的变道操作?
  10. js获取服务器控件DropDownList所选中的各项属性
  11. 3dmax导出unity3d模型设置
  12. 伊利诺伊香槟分校计算机排名,伊利诺伊大学香槟分校计算机专业排名好不好?_托普仕留学...
  13. edp和edt哪个好_香水edt和edp是什么意思
  14. 相忘于江湖:《监控》
  15. Java显示the type xxx is already defined的解决方法
  16. 近十年量化交易领域最重要的十本参考书是哪些
  17. 有计划,坚决执行——写给大三犹豫的女生
  18. IBMV7000存储电源模块PSU报错“Power Supply Fault type 2“
  19. 看尚电视adb安装当贝桌面,并开机自启
  20. 好的学习资源-好好学习

热门文章

  1. CNVD国家区块链漏洞库漏洞通报
  2. Aip接口自动化测试框架pytest+allure+request+jsonpath+excle
  3. html中js alert函数,javascript的alert是什么
  4. 又一个奇葩要求,Python是如何将“中文”转“拼音”的?
  5. 看完此文,告诉你什么是黑中介
  6. UCanCode发布跨平台开源组态\ 建模\仿真\工控VX++ 2021
  7. 你的程序员是在努力工作还是在偷懒?
  8. maven dependency 警告:Overriding managed version XXX for XXX
  9. Matlab中isequal函数的使用
  10. android下划线链接,android7.0 TextView去除超链接下划线就这么难吗?