【云原生丨Kubernetes系列17】资源对象 Secret 的环境变量配置

前言

Secret ⽤来保存敏感信息,例如密码、OAuth 令牌和 ssh key等等,将这些信息放在 Secret 中⽐放在 Pod 的定义中或者 docker 镜像中来说更加安全和灵活。

【云原生丨Kubernetes系列17】资源对象 Secret 的环境变量配置_第1张图片

文章目录

  • 前言
  • Secret介绍
  • Opaque Secret
  • 环境变量


Secret介绍

学习 ConfigMap 的时候,我们说 ConfigMap 这个资源对象是 Kubernetes 当中⾮常重要的⼀个对象,⼀般情况下 ConfigMap 是⽤来存储⼀些⾮安全的配置信息,如果涉及到⼀些安全相关的数据的话⽤ ConfigMap 就⾮常不妥了。因为 ConfigMap 是名为存储的,我们说这个时候我们就需要⽤到另外⼀个资源对象 Secret 了。

Secret 有三种类型:

  • Opaque:base64 编码格式的 Secret,⽤来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
  • kubernetes.io/dockerconfigjson:⽤来存储私有docker registry的认证信息。
  • kubernetes.io/service-account-token:⽤于被 serviceaccount 引⽤,serviceaccout 创建Kubernetes会默认创建对应的secret。Pod如果使⽤了serviceaccount,对应的secret会⾃动挂载到Pod⽬录 /run/secrets/kubernetes.io/serviceaccount 中。

Opaque Secret

Opaque 类型的数据是⼀个 map 类型,要求value是 base64 编码格式,⽐如我们来创建⼀个⽤户名为admin,密码为 admin321 的 Secret 对象,⾸先我们先把这⽤户名和密码做 base64 编码:

$ echo -n "admin" | base64
YWRtaW4=
$ echo -n "admin321" | base64
YWRtaW4zMjE=

然后我们就可以利⽤上⾯编码过后的数据来编写⼀个 YAML ⽂件:(secret-demo.yaml)

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

然后同样的我们就可以使⽤ kubectl 命令来创建了:

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

利⽤ get secret 命令查看:

$ kubectl get secret
NAME TYPE DATA AGE
default-token-n9w2d kubernetes.io/service-account-token 3 33d
mysecret Opaque 2 40s

其中 default-token-cty7pdefault-token-n9w2d 为创建集群时默认创建的 secret,被
serviceacount/default 引⽤。

使⽤ describe 命令,查看详情:

$ kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 8 bytes
username: 5 bytes

我们可以看到利⽤ describe 命令查看到的 Data 没有直接显示出来,如果想看到 Data ⾥⾯的详细信息,同样我们可以输出成 YAML ⽂件进⾏查看:

$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:
password: YWRtaW4zMjE=
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: 2018-06-19T15:27:06Z
name: mysecret
namespace: default
resourceVersion: "3694084"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 39c139f5-73d5-11e8-a101-525400db4df7
type: Opaque

创建好 Secret 对象后,有两种⽅式来使⽤它:

  • 以环境变量的形式
  • 以Volume的形式挂载

环境变量

⾸先我们来测试下环境变量的⽅式,同样的,我们来使⽤⼀个简单的 busybox 镜像来测试下:(secret1-
pod.yaml)

apiVersion: v1
kind: Pod
metadata:
name: secret1-pod
spec:
containers:
- name: secret1
image: busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password

主要上⾯环境变量中定义的 secretKeyRef 关键字,和我们上节课的 configMapKeyRef 是不是⽐较类似,⼀个是从 Secret 对象中获取,⼀个是从 ConfigMap 对象中获取,创建上⾯的 Pod :

$ kubectl create -f secret1-pod.yaml
pod "secret1-pod" created

然后我们查看 Pod 的⽇志输出:

$ kubectl logs secret1-pod
...
USERNAME=admin
PASSWORD=admin321
...

可以看到有 USERNAME 和 PASSWORD 两个环境变量输出出来。


【云原生丨Kubernetes系列17】资源对象 Secret 的环境变量配置_第2张图片

你可能感兴趣的:(云原生,从入门到进阶,kubernetes,云原生,docker)