• Secret概述


    Secret

    概述

    Kubernetes Secret 对象可以用来储存敏感信息,例如:密码、OAuth token、ssh 密钥等。如果不使用 Secret,此类信息可能被放置在 Pod 定义中或者容器镜像中。将此类敏感信息存储到 Secret 中,可以更好地:

    • 控制其使用
    • 降低信息泄露的风险

    用户可以直接创建 Secret,Kubernetes 系统也会创建一些 Secret。

    Secret有如下几种使用方式:

    • 作为 Pod 的数据卷挂载
    • 作为 Pod 的环境变量
    • kubelet 在抓取容器镜像时,作为 docker 镜像仓库的用户名密码

    内建Secret

    Service Account 将自动创建 Secret

    Kubernetes 自动创建包含访问 Kubernetes APIServer 身份信息的 Secret,并自动修改 Pod 使其引用这类 Secret。

    如果需要,可以禁用或者自定义自动创建并使用 Kubernetes APIServer 身份信息的特性。然而,如果您期望安全地访问 Kubernetes APIServer,您应该使用默认的 Secret 创建使用过程。

    如需了解更多细节,参考 Configure Service Accounts for Pods

    解码和编辑

    Kubenetes 中,Secret 使用 base64 编码存储,您可以将其 解码 获得对应信息的原文,创建 Secret 之后,您也可以再次 编辑 Secret

    创建Secret(使用kubectl)

    假设某个 Pod 需要访问数据库。在您执行 kubectl 命令所在机器的当前目录,创建文件 ./username.txt 文件和 ./password.txt 暂存数据库的用户名和密码,后续我们根据这两个文件配置 kubernetes secrets。

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

    执行命令 kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt 在 Kubernetes APIServer 中创建 Secret 对象,并将这两个文件中的内容存储到该 Secret 对象中,输出结果如下所示:

    secret "db-user-pass" created
    

    TIP

    • 上述命令的执行效果与此命令执行效果相同: kubectl create secret generic db-user-pass –from-literal=username=admin –from-literal=password=1f2d1e2e67df
    • 如果您的密码中包含特殊字符需要转码(例如 $*!),请使用 进行转码。例如:实际密码为 S!B*d$zDsb,kubectl 命令应该写成 kubectl create secret generic dev-db-secret –from-literal=username=devuser –from-literal=password=S!B\*d$zDsb。如果通过文件创建(--from-file),则无需对文件中的密码进行转码。

    执行命令 kubectl get secrets,检查 Secret 的创建结果,输出信息如下所示:

    NAME               TYPE                                 DATA      AGE
    db-user-pass          Opaque                                2        51s    
    

    执行命令 kubectl describe secrets/db-user-pass,查看 Secret 详情,输出信息如下所示:

    Name:            db-user-pass
    Namespace:       default
    Labels:          <none>
    Annotations:     <none>
    
    Type:            Opaque
    
    Data
    ====
    password.txt:    12 bytes
    username.txt:    5 bytes
    

    TIP

    默认情况下,kubectl getkubectl describe 命令都避免展示 Secret 的内容。这种做法可以避免密码被偷窥,或者被存储到终端的日志中

    创建Secret(手动)

    和创建其他类型的 API 对象(Pod、Deployment、StatefulSet、ConfigMap 等)一样,您也可以先在 yaml 文件中定义好 Secret,然后通过 kubectl apply -f 命令创建。此时,您可以通过如下两种方式在 yaml 文件中定义 Secret:

    • data:使用 data 字段时,取值的内容必须是 base64 编码的
    • stringData:使用 stringData 时,更为方便,您可以直接将取值以明文的方式写在 yaml 文件中

    在 yaml 中定义 data

    • 假设您要保存 username=adminpassword=1f2d1e2e67df 到 Secret 中,请先将数据的值转化为 base64 编码,执行如下命令:
    echo -n 'admin' | base64
    YWRtaW4=
    echo -n '1f2d1e2e67df' | base64
    MWYyZDFlMmU2N2Rm 
    

    创建 secret.yaml 文件,内容如下所示:

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

    执行命令 kubectl apply -f ./secret.yaml

    secret "mysecret" created
    
    • 此时 Secret 创建成功

    在 yaml 中定义 stringData

    有时,您并不想先将用户名和密码转换为 base64 编码之后再创建 Secret,则您可以通过定义 stringData 来达成,此时 stringData 中的取值部分将被 apiserver 自动进行 base64 编码之后再保存。

    • 创建文件 secret.yaml,内容如下所示:
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    stringData:
      username: admin
      password: 1f2d1e2e67df  
    

    执行命令 kubectl apply -f ./secret.yaml 输出结果如下所示:

    secret "mysecret" created    
    

    此时 Secret 创建成功

    执行命令 kubectl get -f ./secret.yaml -o yaml 输出结果如下所示:

    apiVersion: v1
    data:
      password: MWYyZDFlMmU2N2Rm
      username: YWRtaW4=
    kind: Secret
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"mysecret","namespace":"default"},"stringData":{"password":"1f2d1e2e67df","username":"admin"},"type":"Opaque"}
      creationTimestamp: "2019-09-23T14:16:56Z"
      name: mysecret
      namespace: default
      resourceVersion: "10318365"
      selfLink: /api/v1/namespaces/default/secrets/mysecret
      uid: 24602031-e18d-467a-b7fe-0962af8ec8b8
    type: Opaque  
    
    • 注意
    • 此时 annotation 中可以看到 password 的明文,这也许并不是您所期望的
    • 输出的 Secret 对象中,stringData 字段不再出现

    同时定义了 data 和 stringData

    TIP

    如果您同时定义了 data 和 stringData,对于两个对象中 key 重复的字段,最终将采纳 stringData 中的 value

    • 创建文件 secret.yaml,该文件同时定义了 data 和 stringData,内容如下所示:
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
    stringData:
      username: administrator
    

    执行命令 kubectl apply -f ./secret.yaml 输出结果如下所示:

    secret "mysecret" created    
    

    此时 Secret 创建成功

    执行命令 kubectl get -f ./secret.yaml -o yaml 输出结果如下所示:

    apiVersion: v1
    kind: Secret
    metadata:
      creationTimestamp: 2018-11-15T20:46:46Z
      name: mysecret
      namespace: default
      resourceVersion: "7579"
      uid: 91460ecb-e917-11e8-98f2-025000000001
    type: Opaque
    data:
      username: YWRtaW5pc3RyYXRvcg==
    

    TIP

    此处 YWRtaW5pc3RyYXRvcg== 解码后的值是 administrator

    将配置文件存入 Secret

    假设您的某个应用程序需要从一个配置文件中读取敏感信息,此时,您可以将该文件的内容存入 Secret,再通过数据卷的形式挂载到容器。[挂载方式未完待续]

    例如,您的应用程序需要读取如下配置文件内容:

    apiUrl: "https://my.api.com/api/v1"
    username: user
    password: password
    

    您可以使用下面的 secret.yaml 创建 Secret

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    stringData:
      config.yaml: |-
        apiUrl: "https://my.api.com/api/v1"
        username: user
        password: password
    

    执行命令 kubectl apply -f ./secret.yaml 输出结果如下所示:

    secret "mysecret" created
    

    此时 Secret 创建成功

    执行命令 kubectl get -f ./secret.yaml -o yaml 输出结果如下所示:

    apiVersion: v1
    kind: Secret
    metadata:
      creationTimestamp: 2018-11-15T20:40:59Z
      name: mysecret
      namespace: default
      resourceVersion: "7225"
      uid: c280ad2e-e916-11e8-98f2-025000000001
    type: Opaque
    data:
      config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
    

    创建Secret(使用Generator)

    从 kubernetes v1.14 开始,kubectl 集成了 Kustomize

    。通过 Kustomize,您可以使用 generator(Kustomize 的概念)创建 Secret,并保存到 API Server。Generator 必须在 kustomization.yaml 文件中指定。

    TIP

    需要结合 Kustomize 一起使用,在您决定采纳 Kustomize 之前,可以暂时不看这篇文章的内容

    从文件生成 Secret

    例如,如果想从 ./username.txt./password.txt 文件生成(generate)一个 Secret,则可以:

    • 执行如下指令创建 kustomization.yaml 文件
    # Create a kustomization.yaml file with SecretGenerator
    cat <<EOF >./kustomization.yaml
    secretGenerator:
    - name: db-user-pass
      files:
      - username.txt
      - password.txt
    EOF
    

    执行指令 kubectl apply -k . 以创建 Secret 对象,输出结果如下所示:

    secret/db-user-pass-96mffmfh4k created    
    

    执行指令 kubectl get secrets 以检查创建结果,输出结果如下所示:

    NAME                      TYPE                                  DATA      AGE
    db-user-pass-96mffmfh4k          Opaque                                2        51s
    

    执行指令 kubectl describe secrets/db-user-pass-96mffmfh4k 以查看 Secret 详情(请使用您自己的 Secret 名字),输出结果如下所示:

    Name:            db-user-pass
    Namespace:       default
    Labels:          <none>
    Annotations:     <none>
    
    Type:            Opaque
    
    Data
    ====
    password.txt:    12 bytes
    username.txt:    5 bytes
    

    TIP

    生成的 Secret 的名字包含一个 hash 值(Secret 内容的 hash)做为后缀,这种做法可以确保每次修改 Secret 的内容时,都将产生新的 Secret 对象

    从明文生成 Secret

    例如,如果要从明文 username=adminpassword=secret,您可以:

    • 通过如下指令创建 secret generator 的 kustomization.yaml 文件:
    # Create a kustomization.yaml file with SecretGenerator
    cat <<EOF >./kustomization.yaml
    secretGenerator:
    - name: db-user-pass
      literals:
      - username=admin
      - password=secret
    EOF  
    

    然后执行指令 kubectl apply -k . 创建 Secret 对象,输出结果如下所示:

    secret/db-user-pass-dddghtt9b5 created
    

    解码和编辑Secret

    解码Secret

    Secret 中的信息可以通过 kubectl get secret 命令获取。例如,执行命令 kubectl get secret mysecret -o yaml 可获取前面章节中所创建的 Secret,输出信息如下:

    apiVersion: v1
    kind: Secret
    metadata:
      creationTimestamp: 2016-01-22T18:41:56Z
      name: mysecret
      namespace: default
      resourceVersion: "164619"
      uid: cfee02d6-c137-11e5-8d73-42010af00002
    type: Opaque
    data:
      username: YWRtaW4=
      password: MWYyZDFlMmU2N2Rm
    

    执行命令 echo 'MWYyZDFlMmU2N2Rm' | base64 --decode 可解码密码字段,输出结果如下:

    1f2d1e2e67df
    

    执行命令 echo 'YWRtaW4=' | base64 --decode 可解码用户名字段,输出结果如下:

    admin
    

    编辑Secret

    执行命令 kubectl edit secrets mysecret 可以编辑已经创建的 Secret,该命令将打开一个类似于 vi 的文本编辑器,您可以直接编辑已经进行 base64 编码的字段,如下所示:

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
      username: YWRtaW4=
      password: MWYyZDFlMmU2N2Rm
    kind: Secret
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: { ... }
      creationTimestamp: 2016-01-22T18:41:56Z
      name: mysecret
      namespace: default
      resourceVersion: "164619"
      uid: cfee02d6-c137-11e5-8d73-42010af00002
    type: Opaque
    
  • 相关阅读:
    css 父层 透明 子层不透明Alpha
    ecshop循环foreach,iteration,key,index
    ecshop变量介绍
    ecshop 获取某个商品的 所有订单信息 或者销量
    echosp 销量排行 新增实际价格
    ecshop后台模板设置中将非可编辑区改为可编辑区
    ecshop 影响全局的标量lib_main.php
    个人js
    fixed的left:50%,漂浮
    js返回顶部
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/13086139.html
Copyright © 2020-2023  润新知