kubernetes对象之secrets
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: Opaque
Data
====
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:
通过如下方法查看Secret中key所对应的值,首先运行如下命令:
$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
运行如下命令base64解码:
$ echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
1f2d1e2e67df
使用Secrets
Pod使用Secret的两种方法:volume与环境变量。
通过volume使用Secret基于流程:
创建或者使用已存Secret,同一Secret可被多个pod引用。
修改pod定义,在.spec.volumes[]下增加新volume,名称随意。在相应的.spec.volumes[].secret.secretName指定Secret名称。
为使用Secret的容器添加.spec.containers[].volumeMounts[],同时指定.spec.containers[].volumeMounts[].readOnly = true。指定.spec.containers[].volumeMounts[].mountPath为未使用的目录名称。
在容器的image中,通过指定的目录与Secret中的key访问敏感内容。
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
如果需要引用多个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: 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
以上配置导致的结果为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: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: mysecret
defaultMode: 256
上例中的256等于8进制的0400,在json\yaml配置文件中不可以使用八进制表示数字。单位为key指定permission:
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
items:
- key: username
path: my-group/my-username
mode: 511
当通过Secret通过volume形式被使用时,其中的key如果发生变更的话,由kubelet自动周期性监控变更并为pod更新,但是注意此特性并非实时,存在延迟。
通过环境使用Secret流程:
创建或者使用已存在Secrets,一个Secret可以被多个pod使用。
修改pod声明中使用Secret的容器配置,为其添加环境变量env[].valueFrom.secretKeyRef,每条key对应一个环境变量。
在容器的image中通过引用环境变量使用敏感数据。
示例:
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
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: 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.
kubernetes对象之secrets的更多相关文章
- Kubernetes对象之Service
系列目录 通过ReplicaSet来创建一组Pod来提供具有高可用性的服务.虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题: Pod IP仅仅是集群内可见的虚拟IP,外部无法访问. ...
- Kubernetes对象
Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式 ...
- Kubernetes 对象管理的三种方式
Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...
- Kubernetes对象之Pod
系列目录 Pod是Kubernetes调度的最小单元.一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机.Pod的设计理念是为了支持多个容器在一个Pod中共享网络和文件系统 因此 ...
- Kubernetes对象之ReplicaSet
系列目录 说到ReplicaSet对象,得先说说ReplicationController(简称为RC).在旧版本的Kubernetes中,只有ReplicationController对象.它的主要 ...
- kubernetes对象之Volume
系列目录 概述 Volume是对各种存储资源的抽象.虚拟化.为管理.控制.使用存储资源提供统一接口.Openstack中的volume为虚拟机提供存储,Docker中的volume为容器提供存储.因为 ...
- kubernetes对象之Ingress
系列目录 概述 向外网暴露集群内服务,以使客户端能够访问,有以下几种方法,本文重点描述Ingress. LoadBalancer LoadBalancer一般由云服务供应商提供或者用户自定义,运行在集 ...
- Kubernetes对象中的PersistentVolume、PersistentVolumeClaim和StorageClass的概念关系
Kubernetes容器要持久化数据,离不开volume,k8s的volume和Docker原生概念中的volume有一些差别,不过本次不讲这个,本次要明确的是k8s持久化数据用到的几个对象Persi ...
- kubernetes对象之deployment
系列目录 简述 Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.典型的应 ...
随机推荐
- css3制作扇形菜单
工作中网页中有一个扇形的导航菜单,以前没有接触过,参考了http://www.w3cplus.com/css3/building-a-circular-navigation-with-css-tran ...
- HDU——1213How Many Tables(并查集按秩合并)
J - How Many Tables Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- 安装环境 :win64
1.安装环境 :win64 1.1 下载mysql安装包地址: https://dev.mysql.com/downloads/file/?id=476233 2.安装 2.1 解压下载的ZIP压缩包 ...
- 洛谷P1418 选点问题
P1418 选点问题 74通过 240提交 题目提供者tinylic 标签云端 难度普及+/提高 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 非常重要!! 90分的点这里 题 ...
- linux查找文件命令
(2)find /etc -name httpd.conf #在/etc目录下文件httpd.conf
- 使用gcc的-finstrument-functions选项进行函数跟踪【转】
转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044899 版权声明:本文为博主原创文章,转载请附上原博链接. GCC Functio ...
- Yii CActiveForm 客户端验证(enableClientValidation)和自定义验证
使用Yii的CActiveForm默认使用服务器端模型(model)的rules规则验证数据. 但这会导致无谓的请求提交,比较好的方式是为了用户体验在客户端也验证,而为了安全性,在服务器端和数据库也做 ...
- Python Challenge 第一关
偶然在网上看到这个,PYTHON CHALLENGE,利用Python语言闯关,觉得挺有意思,就记录一下. 第0关应该算个入口吧,试了好几次才试出来,没什么代码就不写了.计算一个结果出来就行. 第一关 ...
- Anaconda3中Python3.5和Python2.7共存
开始-所有程序-Anaconda3-Anaconda Prompt conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/a ...
- POJ 3171 区间覆盖最小值&&线段树优化dp
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4715 Accepted: 1590 D ...