Secret
Secret
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 ssh key。将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。用户可以创建 secret,同时系统也创建了一些 secret。要使用 secret,pod 需要引用 secret。
简单使用
Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取镜像时使用。
使用 Volume
$ echo -n "giropops strigus girus" > secret.txt
$ kubectl create secret generic my-secret --from-file=secret.txt
secret/my-secret created
我们来看看那个物体的细节,看看到底发生了什么。
$ kubectl describe secret my-secret
Name: my-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
secret.txt: 18 bytes
需要注意的是,不能使用 describe 查看文件的内容,这是为了保护密钥不被意外暴露。要检查一个 Secret 的内容,我们需要对生成的文件进行解码,要做到这一点,我们必须检查同一文件的清单。
$ kubectl get secret
NAME TYPE DATA AGE
my-secret Opaque 1 13m
$ kubectl get secret my-secret -o yaml
apiVersion: v1
data:
secret.txt: Z2lyb3BvcHMgc3RyaWd1cyBnaXJ1cw==
kind: Secret
metadata:
creationTimestamp: 2018-08-26T17:10:14Z
name: my-secret
namespace: default
resourceVersion: "3296864"
selfLink: /api/v1/namespaces/default/secrets/my-secret
uid: e61d124a-a952-11e8-8723-42010a8a0002
type: Opaque
现在我们有了加密后的密钥,只需使用 Base64 解密即可。
$ echo 'Z2lyb3BvcHMgc3RyaWd1cyBnaXJ1cw==' | base64 --decode
giropops strigus girus
好了,有了我们的 Secret,现在我们将在 Pod 里面使用它,为此我们需要在 Pod 里面使用卷来引用 Secret,我们将创建我们的清单。
vim pod-secret.yaml
apiVersion : v1
kind : Pod
metadata :
name : test-secret
namespace : default
spec :
containers :
- image: busybox
name: busy
command:
- sleep
- "3600"
volumeMounts :
- mountPath: /tmp/giropops
name : my-volume-secret
volumes :
- name : my-volume-secret
secret :
secretName : my-secret
在此清单中,我们将使用卷 my-volume-secret 将 Secret 挂载在容器 my-secret 目录/tmp/giropos 内。
$ kubectl create -f pod-secret.yaml
pod/test-secret created
$ kubectl exec -ti test-secret -- ls /tmp/giropops
secret.txt
$ kubectl exec -ti test-secret -- cat /tmp/giropops/secret.txt
giropops strigus girus
成功了!这就是我们在 Pods 中放置信息或密码的方法之一。
使用环境变量
这是把信息或密码放在我们的 Pod 里面的方法之一,但是还有一个更酷的方法,就是把 Secret 作为一个环境变量。让我们来看看这个家伙,首先让我们用字面键创建一个新的对象 Secret,有键和值。
$ kubectl create secret generic my-literal-secret --from-literal user=linuxtips --from-literal password=catota
secret/my-literal-secret created
$ kubectl describe secret my-literal-secret
Name: my-literal-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 6 bytes
user: 9 bytes
我们刚刚创建了一个有两个密钥的对象 Secret,一个是用户,另一个是密码,现在我们将使用环境变量在 Pod 中引用这个密钥,为此我们将创建新的清单。
vim pod-secret-env.yaml
apiVersion : v1
kind : Pod
metadata :
name : test-secret-env
namespace : default
spec :
containers :
- image : busybox
name : busy-secret-env
command :
- sleep
- " 3600 "
env :
- name : MEU_USERNAME
valueFrom :
secretKeyRef :
name : my-literal-secret
key : user
- name : MEU_PASSWORD
valueFrom :
secretKeyRef :
name : my-literal-secret
key : password
$ kubectl create -f pod-secret-env.yaml
pod/teste-secret-env created
$ kubectl exec teste-secret-env -c busy-secret-env -it -- printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=teste-secret-env
TERM=xterm
MEU_USERNAME=linuxtips
MEU_PASSWORD=catota
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
HOME=/root
看到了吗?现在我们可以把这个 key 在容器里面作为一个环境变量,如果容器里面的任何一个应用需要连接到数据库,比如说使用用户名和密码,只要用这个信息创建一个 secret,并在 Pod 中引用,然后在 Pod 里面作为一个环境变量或者一个文本文件创建卷来消耗就可以了。