Kubernetes学习笔记--Secret

        Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活。

Pod 可以用三种方式之一来使用 Secret:

        1. 作为挂载到一个或多个容器上的 卷 中的文件。

        2. 作为容器的环境变量

        3. 由 kubelet 在为 Pod 拉取镜像时使用

内置 Secret:

Kubernetes 自动创建包含访问 API 凭据的 Secret,并以使用此类型的 Secret自动修改 Pod 。

自定义Secret:

使用Kubernetes创建secret:

创建本例中要使用的文件:

        echo-n'admin'> ./username.txt

        echo-n'1f2d1e2e67df'> ./password.txt

kubectl create secret 命令将这些文件打包到一个 Secret 中并在 API server 中创建了一个对象:

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

输出类似于:

        secret "db-user-pass" created

默认的键名是文件名

检查刚创建的 Secret:

        kubectl get secrets

其输出类似于:

NAME                  TYPE                                  DATA      AGE

db-user-pass          Opaque                                2        51s

查看 Secret 的描述:

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

手动创建 Secret:

        先以 JSON 或 YAML 格式文件创建一个 Secret,然后创建该对象。 Secret 包含两个映射:data 和 stringData。 data 字段用于存储使用 base64 编码的任意数据。 提供 stringData 字段允许用未编码的字符串提供机密数据。

如:

echo-n'1f2d1e2e67df'| base64

输出类似于:

MWYyZDFlMmU2N2Rm

写一个 Secret 对象:

apiVersion: v1

kind: Secret

metadata: 

            name: mysecret

type: Opaque

data:

         username: YWRtaW4= 

         password: MWYyZDFlMmU2N2Rm

使用 kubectl apply 创建 Secret 对象:

kubectl apply -f ./secret.yaml

查看secret:

kubectl get secret mysecret -o yaml

从生成器创建 Secret:

使用 Kustomize 管理对象。 Kustomize 提供资源生成器创建 Secret 和 ConfigMaps。 Kustomize 生成器要在当前目录内的 kustomization.yaml 中指定。 生成 Secret 之后,使用 kubectl apply 在 API 服务器上创建对象。

从文件生成 Secret:

你可以通过定义基于文件 ./username.txt 和 ./password.txt 的 secretGenerator 来生成一个 Secret。

        cat<./kustomization.yamlsecretGenerator:- name: db-user-pass  files:  - username.txt  - password.txtEOF

应用包含 kustomization.yaml 目录以创建 Secret 对象:

        kubectl apply -k .

检查 Secret 是否创建成功:

kubectl get secrets

基于字符串值来创建 Secret:

通过定义使用字符串值 username=admin 和 password=secret 的 secretGenerator 来创建 Secret。

cat<./kustomization.yamlsecretGenerator:- name: db-user-pass  literals:  - username=admin  - password=secretEOF

应用包含 kustomization.yaml 目录以创建 Secret 对象。

kubectl apply -k .

解码 Secret:

可以使用 kubectl get secret 命令获取 Secret。例如,获取创建的 secret:

kubectl get secret mysecret -o yaml

输出类似于:

apiVersion: v1

kind: Secret

metadata:  

        creationTimestamp: 2016-01-22T18:41:56Z  

        name: mysecret  

        namespace: default  

        resourceVersion: "164619"  

        uid: cfee02d6-c137-11e5-8d73-42010af00002

type: Opaquedata:  

        username: YWRtaW4=  

        password: MWYyZDFlMmU2N2Rm


解码 password 字段:

echo'MWYyZDFlMmU2N2Rm'| base64 --decode

输出类似于:

1f2d1e2e67df


编辑 Secret:

可以通过下面的命令可以编辑一个已经存在的 secret 。

kubectl edit secrets mysecret

使用 Secret:

        Secret 可以作为数据卷被挂载,或作为环境变量 暴露出来以供 Pod 中的容器使用。也可以被系统的其他部分使用,而不直接暴露在 Pod 内。 例如,可以保存凭据,系统的其他部分将用它来代表你与外部系统进行交互。


1. 使用来自卷中的 Secret 值

 在 Pod 中使用存放在卷中的 Secret:

创建一个 Secret 或者使用已有的 Secret。多个 Pod 可以引用同一个 Secret。

            1). 修改 Pod 定义,在 spec.volumes[] 下增加一个卷。可以给这个卷随意命名,spec.volumes[].secret.secretName为 Secret 对象的名字。

            2). 修改你的 Pod 定义,在 spec.volumes[] 下增加一个卷。可以给这个卷随意命名, 它的 spec.volumes[].secret.secretName 必须是 Secret 对象的名字。

            3). 将 spec.containers[].volumeMounts[] 加到需要用到该 Secret 的容器中。 指定 spec.containers[].volumeMounts[].readOnly = true 和 spec.containers[].volumeMounts[].mountPath 为你想要该 Secret 的目录

            4.) 修改镜像并且/或者命令行,让程序从该目录下寻找文件。 Secret 的 data 映射中的每一个键都对应 mountPath 下的一个文件名。

如:

volumes:

   -name: foo 

   secret: 

         secretName: mysecret

2. 以环境变量的形式使用 Secrets

        在一个以环境变量形式使用 Secret 的容器中,Secret 键表现为常规的环境变量,其中 包含 Secret 数据的 base-64 解码值。

3.使用 imagePullSecret

        imagePullSecrets 字段中包含一个列表,列举对同一名字空间中的 Secret 的引用。 你可以使用 imagePullSecrets 将包含 Docker(或其他)镜像仓库密码的 Secret 传递给 kubelet。kubelet 使用此信息来替你的 Pod 拉取私有镜像。

你可能感兴趣的:(Kubernetes学习笔记--Secret)