## 概览 Secret是用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。 用户可以创建自己的secret,系统也会有自己的secret。 Pod需要先引用才能使用某个secret,Pod有2种方式来使用secret:作为volume的一个域被一个或多个容器挂载;在拉取镜像的时候被kubelet引用。 ### 內建的Secrets **由ServiceAccount创建的API证书附加的秘钥** k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信 ### 创建自己的Secret **使用kubectl create secret命令创建Secret** 假如mougePod要访问数据库,需要用户名密码,分别存放在2个文件中:username.txt,password.txt ```sh # Create files needed for rest of example. $ echo -n 'admin' > ./username.txt $ echo -n '1f2d1e2e67df' > ./password.txt ``` ```kubectl create secret```指令将用户名密码写到secret中,并在apiserver创建Secret ```sh $ kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt secret "db-user-pass" created ``` 查看创建结果: ```sh $ 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: Annotations: Type: Opaque Data ==== password.txt: 12 bytes username.txt: 5 bytes ``` get或describe指令都不会展示secret的实际内容,这是出于对数据的保护的考虑,如果想查看实际内容请继续往下看。 ### 手动创建Secret 创建一个secret.yaml文件,内容用base64编码 ```sh $ echo -n 'admin' | base64 YWRtaW4= $ echo -n '1f2d1e2e67df' | base64 MWYyZDFlMmU2N2Rm ``` yaml文件内容: ```yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm ``` 创建: ```sh $ kubectl create -f ./secret.yaml secret "mysecret" created ``` ### 解析Secret中内容 ```sh $ 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解码: ```sh $ echo 'MWYyZDFlMmU2N2Rm' | base64 --decode 1f2d1e2e67df ``` ### 使用Secret secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。比如可以用secret导入与外部系统交互需要的证书文件等。 **在Pod中以文件的形式使用secret** 1. 创建一个Secret,多个Pod可以引用同一个Secret 2. 修改Pod的定义,在```spec.volumes[]```加一个volume,给这个volume起个名字,```spec.volumes[].secret.secretName```记录的是要引用的Secret名字 3. 在每个需要使用Secret的容器中添加一项```spec.containers[].volumeMounts[]```,指定```spec.containers[].volumeMounts[].readOnly = true```,```spec.containers[].volumeMounts[].mountPath```要指向一个未被使用的系统路径。 4. 修改镜像或者命令行使系统可以找到上一步指定的路径。此时Secret中```data```字段的每一个key都是指定路径下面的一个文件名 下面是一个Pod中引用Secret的列子: ```yaml 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都要在```spec.volumes```中定义 如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的```volumeMounts```,但是Pod定义中声明一次```spec.volumes```就好了。 **映射secret key到指定的路径** 可以控制secret key被映射到容器内的路径,利用```spec.volumes[].secret.items```来修改被映射的具体路径 ```yaml 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没有变 **Secret文件权限** 可以指定secret文件的权限,类似linux系统文件权限,如果不指定默认权限是```0644```,等同于linux文件的```-rw-r--r--```权限 设置默认权限位 ```yaml 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 ``` 上述文件表示将secret挂载到容器的```/etc/foo```路径,每一个key衍生出的文件,权限位都将是```0400``` 由于JSON不支持八进制数字,因此用十进制数256表示0400,如果用yaml格式的文件那么就很自然的使用八进制了 同理可以单独指定某个key的权限 ```yaml 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 ``` **从volume中读取secret的值** 值得注意的一点是,以文件的形式挂载到容器中的secret,他们的值已经是经过base64解码的了,可以直接读出来使用。 ```sh $ ls /etc/foo/ username password $ cat /etc/foo/username admin $ cat /etc/foo/password 1f2d1e2e67df ``` **被挂载的secret内容自动更新** 也就是如果修改一个Secret的内容,那么挂载了该Secret的容器中也将会取到更新后的值,但是这个时间间隔是由kubelet的同步时间决定的。最长的时间将是一个同步周期加上缓存生命周期(period+ttl) > 特例:以[subPath](https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath)形式挂载到容器中的secret将不会自动更新 **以环境变量的形式使用Secret** 1. 创建一个Secret,多个Pod可以引用同一个Secret 2. 修改pod的定义,定义环境变量并使用```env[].valueFrom.secretKeyRef```指定secret和相应的key 3. 修改镜像或命令行,让它们可以读到环境变量 ```yaml 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 ``` 容器中读取环境变量,已经是base64解码后的值了: ```sh $ echo $SECRET_USERNAME admin $ echo $SECRET_PASSWORD 1f2d1e2e67df ```

secret的更多相关文章

  1. Android Secret Code

    我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...

  2. ASP.NET OAuth:access token的加密解密,client secret与refresh token的生成

    在 ASP.NET OWIN OAuth(Microsoft.Owin.Security.OAuth)中,access token 的默认加密方法是: 1) System.Security.Crypt ...

  3. Lucky 2048 - The secret of being lucky

    Lucky 2048 uses a normal distribution to create "lucky" start. Generally speaking, it prov ...

  4. Secret Codes

    Secret Codes   This is a list of codes that can be entered into the dialer to output the listed info ...

  5. 微信企业号开发之-如何获取secret 序列号

    最近有项目基于微信企业号开发,简单记录下如何查看企业号secert 工具/原料 微信企业号   方法/步骤  用管理员的帐号登录后,选择[设置]-[权限管理]进入管理组设置界面      在左边点击[ ...

  6. hdu.1111.Secret Code(dfs + 秦九韶算法)

    Secret Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. 2078 Problem H Secret Message 中石油-未提交-->已提交

    题目描述 Jack and Jill developed a special encryption method, so they can enjoy conversations without wo ...

  8. Rails4 中 因为secret key 引起在production环境下无法运行

    错误信息 Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` ...

  9. URAL 1932 The Secret of Identifier 题解

    http://acm.timus.ru/problem.aspx?space=1&num=1932 B - The Secret of Identifier Time Limit:1000MS ...

  10. Android 编程下的 Secret Code

    我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...

随机推荐

  1. 前端与HTTP

    本文整理在,我的github 上.欢迎Star. 各版本的http 发展 在HTTP建立之初,主要是为了传输超文本标记语言(HTML)文档.随着时代的发展,也进行了若干次演进.下图是各个版本发布的时间 ...

  2. [Git01]Pro Git 第三章 分支 读书笔记

    [git]分支   Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来. Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在 ...

  3. Hadoop各个组件与端口

    组件 Daemon 端口 配置 说明 HDFS DataNode 50010 dfs.datanode.address datanode服务端口,用于数据传输 HDFS DataNode 50075 ...

  4. docker-compose 部署 Redis

    信息: Docker版本($ docker --version):Docker版本18.06.1-ce,版本e68fc7a 系统信息($ cat /etc/centos-release):CentOS ...

  5. Word2007文档中怎么输入上标下标

    1.Word中输出Z = X2 + Y2 此公式流程: 首先在Word中写入:Z = X2 + Y2: 方法1:选中X后面的2,再按组合键“Ctrl+Shift+加号键”即可,如此操作Y后面的2即可.

  6. java使用memcached2--集群部署

    一.集群安装 1.编译安装magent-0.5到/usr/local/下 # cd /usr/local # mkdir magent # cd magent/ # wget http://memag ...

  7. linux防火墙(五)—— 防火墙的规则备份与还原

    一.第一种备份还原用法,使用工具 iptables-save >/opt/iprules.txt iptables-restore < /opt/iprules.txt #注意导入的文件必 ...

  8. IDEA 引入外部jar包 pom 配置,防止打包失败

    1. <!--添加外部依赖-->        <dependency>            <groupId>Ice</groupId>       ...

  9. Bootstrap Modal 关闭时右侧滚动条消失,页面左移的解决方法

    问题描述:页面在打开Modal之前右侧有滚动条,Modal关闭之后,body中的class="modal-open"和style="padding-right: 17px ...

  10. ORACLE Sequence 自增长

    Sequence是数据库系统按照一定规则自动增加的数字序列.这个序列一般作为代理主键(因为不会重复),没有其他任何意义. Sequence是数据库系统的特性,有的数据库有Sequence,有的没有.比 ...