×

使用秘密

本主题讨论机密的重要属性,并概述开发人员如何使用它们。

这个秘密对象类型提供了一种保存敏感信息的机制,例如作为密码的OpenShift Container Platform客户端配置文件,dockercfg公司文件夹,私有源存储库凭据,等等。机密解耦敏感来自播客的内容。您可以使用卷将机密装载到容器中插件或系统可以使用机密来代表pod执行操作。

YAML机密对象定义
api版本: 第1版
友善的: 秘密
元数据:
  名称: 测试机密
  命名空间: 我的命名空间
类型: 不透明 (1)
数据: (2)
  用户名: dmFsdWUtMQ0K (3)
  密码: dmFsdWUtMg0KDQo=
字符串数据: (4)
  主机名: myapp.mydomain.com (5)
1 指示密钥名称和值的结构.
2 中键的允许格式数据字段必须满足指南DNS_子域中的值这个Kubernetes标识符词汇表.
中与键关联的值数据映射必须是base64编码的。
4 中与键关联的值字符串数据地图由以下部分组成纯文本字符串。
5 中的条目字符串数据映射转换为base64然后将条目移动到数据自动映射。此字段是只读的;该值将仅通过数据字段。
  1. 从您的本地创建秘密.docker/配置.json文件:

    $oc创建秘密通用dockerhub\--from-file=.dockerconfigjson=<路径/to/.docker/config.json>\--type=kubernetes.io/dockerconfigjson

    此命令生成名为dockerhub公司创建对象。

YAML不透明秘密对象定义
api版本: 第1版
友善的: 秘密
元数据:
  名称: 我的秘密
类型: 不透明 (1)
数据:
  用户名: dXNlci1uYW1l型
  密码: cGFzc3dvcmQ公司=
1 指定一个不透明的秘密。
Docker配置JSON文件机密对象定义
api版本: 第1版
友善的: 秘密
元数据:
  名称: 注册密钥
  命名空间: 我的应用程序
类型: kubernetes.io/dockerconfigjson公司 (1)
数据:
  .dockerconfigsson:bm5ubm5ubm5 ubm5 UBm5 ubm 5ubm6 ubmdnZ2dnZ2dnZ 2dnZ2 dnZ2dna Z2cgYXV0aCBrZXlzCg== (2)
1 指定密码是使用Docker配置JSON文件。
2 base64编码的Docker配置JSON文件的输出

秘密的属性

关键属性包括:

  • 可以独立于其定义引用机密数据。

  • 秘密数据卷由临时文件存储设施(tmpfs)支持,永远不会驻留在节点上。

  • 可以在命名空间中共享机密数据。

创造秘密

在创建依赖于该秘密的pods之前,必须先创建一个秘密。

创建秘密时:

  • 使用机密数据创建机密对象。

  • 更新吊舱的服务帐户以允许引用机密。

  • 创建一个pod,它将机密作为环境变量或文件使用(使用秘密卷)。

您可以使用create命令从JSON或YAML文件创建机密对象:

$oc创建-f<文件名>

秘密的类型

中的值类型字段指示密钥名称和值的结构。该类型可用于强制在机密对象中存在用户名和密钥。如果不需要验证,请使用不透明的类型,这是默认值。

指定以下类型之一以触发最小的服务器端验证,以确保机密数据中存在特定的密钥名称:

  • kubernetes.io/service-account-token公司。使用服务帐户令牌。

  • kubernetes.io/dockercfg公司。使用.dockercfg公司文件。获取所需的Docker凭据。

  • kubernetes.io/dockerconfigjson公司。使用.docker/配置.json文件获取所需的Docker凭据。

  • kubernetes.io/basic-授权。与一起使用基本身份验证.

  • kubernetes.io/ssh-auth公司。与一起使用SSH密钥身份验证.

  • kubernetes.io/tls。与一起使用TLS证书颁发机构

指定type=不透明如果您不想进行验证,这意味着机密不要求符合任何密钥名称或值的约定。不透明的秘密,允许非结构化键:值可以包含任意值的对。

您可以指定其他任意类型,例如示例.com/my-secret-type。这些类型不是强制服务器端的,但指出秘密的创建者打算符合该类型的密钥/值要求。

有关不同机密类型的示例,请参阅代码示例在里面使用秘密.

更新秘密

修改机密的值时pod)不会动态更改。要更改密码,必须删除原始pod并创建一个新pod(可能使用相同的PodSpec)。当您将机密装载为卷时,您的机密会自动更新。

更新机密遵循与部署新容器映像相同的工作流。您可以使用kubectl滚动更新命令。

这个资源版本引用机密时未指定机密中的值。因此,如果在pod启动的同时更新了一个秘密,那么该秘密的版本将用于未定义的pod。

目前,无法检查机密对象的资源版本这是在创建pod时使用的。计划pods将报告此情况信息,以便控制器可以使用旧的资源版本.在此期间,不要更新现有机密的数据,但要用不同的名称创建新的。

卷和环境变量中的秘密

如果您的容器使用秘密作为环境变量,必须重新启动容器才能看到更新的秘密。请参阅示例包含机密数据的YAML文件。

在你之后创造秘密,您可以:

  1. 创建豆荚以引用您的秘密:

    $oc创建-f<your_yaml_file>.yaml
  2. 获取日志:

    $oc记录secret-example-pod
  3. 删除机架:

    $oc删除pod secret示例-pod

图片拉动秘密

请参见使用图像重要秘密了解更多信息。

源克隆机密

请参见构建输入了解更多有关在生成期间使用源克隆机密的信息。

服务证书机密

服务服务证书机密旨在支持复杂中间件需要现成证书的应用程序。它的设置与由节点和的管理员工具生成的服务器证书大师。

表1。服务提供证书机密
命名空间 秘密

违约

路由器度量-tls

kube-服务目录

ssl控制器

openshift-ansible服务代理

asb-tls公司

开式换档控制台

控制台服务中心

开放式基础设施

堆取证

开式换档

普罗米修斯·特尔斯

开式换档监控

alertmanager主tls

格拉法纳-tls

kube-state-metrics-tls公司

节点导出器-tls

普罗米修斯-k8s-tls

openshift-template-service-broker

api服务器服务中心

openshift-web-控制台

网络控制台服务中心

为了确保与服务的通信安全,请让集群生成一个已签名的将证书/密钥对提供给命名空间中的机密。为此,请设置这个service.alpha.openshift.io/serving-cert-secret-name注释服务的值设置为要用于机密的名称。然后,你的播客规范可以掌握这个秘密。当它可用时,您的吊舱将运行。该证书适用于内部服务DNS名称,<service.name><service.namespace>.svc.

证书和密钥采用PEM格式,存储在薄层扫描阴极射线管tls.键分别是。证书/密钥对在到期时自动替换一小时内。在中查看到期日期service.alpha.openshift.io/过期机密注释,位于RFC3339格式。

其他pod可以信任群集创建的证书(这些证书仅为签名内部DNS名称),通过使用/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt文件,即自动安装在吊舱中。

此功能的签名算法为x509.SHA256带RSA.手动旋转,删除生成的机密。将创建一个新证书。

限制

要使用秘密,吊舱需要引用该秘密。秘密可以与一起使用吊舱有三种方式:

  • 填充容器的环境变量。

  • 作为一个或多个容器上装载的卷中的文件。

  • 库贝莱特为吊舱拍照时。

卷类型机密使用卷将数据作为文件写入容器机制。imagePullSecrets图片使用服务帐户自动注入名称空间中所有pod的秘密。

当模板包含机密定义时,模板的唯一方法是使用提供的机密是为了确保机密卷源验证,并且指定的对象引用实际指向对象类型为秘密因此,需要在任何豆荚之前创建一个秘密相信它。确保这一点的最有效方法是注射通过使用服务帐户自动执行。

机密API对象驻留在命名空间中。它们只能由中的pods引用相同的名称空间。

个人机密的大小限制为1MB。这是为了阻止创建会耗尽apiserver和kubelet内存的大秘密。然而,创建一些较小的秘密也可能耗尽内存。

机密数据密钥

密钥必须位于DNS子域中。

示例

示例1。将创建四个文件的YAML秘密
api版本: 第1版
友善的: 秘密
元数据:
  名称: 测试机密
数据:
  用户名: dmFsdWUtMQ0K     (1)
  密码: dmFsdWUtMQ0KDQo= (2)
字符串数据:
  主机名: myapp.mydomain.com (3)
  secret.properties(机密属性): |-     (4)
    属性1=值A
    属性2=值B
1 文件包含解码的值。
2 文件包含解码的值。
文件包含提供的字符串。
4 文件包含提供的数据。
示例2。用加密数据填充卷中文件的Pod的YAML
api版本: 第1版
友善的: 豆荚
元数据:
  名称: secret示例pod
规范:
  容器:
    - 名称: 分泌试验控制者
      形象: busybox(软件名)
      命令: [ "/垃圾桶/垃圾桶” "-c“ " /etc/secret-volume/*“ ]
      卷装载数:
          #名称必须与下面的卷名匹配
          - 名称: 分泌量
            装载路径: /等/分泌量
            只读: 真的
  :
    - 名称: 分泌量
      秘密:
        秘书姓名: 测试机密
  重新启动策略: 从未
示例3。用秘密数据填充环境变量的吊舱的YAML
api版本: 第1版
友善的: 豆荚
元数据:
  名称: secret示例pod
规范:
  容器:
    - 名称: 分泌试验控制者
      形象: busybox(软件名)
      命令: [ "/垃圾桶/垃圾桶” "-c“ "出口” ]
      环境价值:
        - 名称: 测试_测试_用户名_ ENV _ VAR
          值从:
            secretKeyRef(密钥参考):
              名称: 测试机密
              钥匙: 用户名
  重新启动策略: 从未
示例4。用秘密数据填充环境变量的构建-配置YAML
api版本: 第1版
友善的: 生成配置
元数据:
  名称: secret示例-bc
规范:
  策略:
    资源策略:
      环境价值:
      - 名称: 测试_测试_用户名_ ENV _ VAR
        值从:
          secretKeyRef(密钥参考):
            名称: 测试机密
            钥匙: 用户名

故障排除

如果服务证书生成失败(服务的服务.alpha.openshift.io/serving-cert-generation-error注释包含):

secret/ssl密钥引用服务UID 62ad25ca-d703-11e6-9d6f-0e9c0057b608,与77b6dd80-d716-11e6-9d6f-0e9c0057b60不匹配

生成证书的服务不再存在,或具有不同的服务UID。必须通过删除旧证书来强制证书重新生成secret,并清除服务上的以下注释service.alpha.openshift.io/serving-cert生成错误服务.alpha.openshift.io/serving-cert-generation-error-num:

$oc删除机密<secret_name>$oc注释服务<service_name>service.alpha.openshift.io/serving-cert-generation-error-$oc注释服务<service_name>service.alpha.openshift.io/serving-cert-generation-error-num-

删除注释的命令具有-在注释名称之后远离的。