美文网首页
Kubernetes学习笔记--Secret

Kubernetes学习笔记--Secret

作者: 木子一酱 | 来源:发表于2020-10-18 10:43 被阅读0次

            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:          <none>

    Annotations:    <none>

    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<<EOF >./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<<EOF >./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

          本文链接:https://www.haomeiwen.com/subject/dyjfmktx.html