管理 TLS 和非 TLS 证书和机密

了解如何在集群中使用证书和私钥。

考虑使用 Secrets Manager 来集中管理并自动更新您的密钥。

使用 Ingress 管理 TLS 证书和秘密

您的 Ingress TLS 证书存储为 Kubernetes 秘密。 要管理集群中的 TLS 秘密,可以使用 ibmcloud oc ingress secret 命令集。

例如,可以通过运行以下命令将证书从 Secrets Manager 导入到集群中的 Kubernetes 私钥。

ibmcloud oc ingress secret create --cluster CLUSTER_NAME_OR_ID --cert-crn CRN --name SECRET_NAME --namespace openshift-ingress

要使用命令 ibmcloud oc ingress secret create 导入证书,您必须在集群中注册默认 Secrets Manager 实例。 若您未部署 Secrets Manager 实例,而是将密钥直接写入集群,则这些密钥将缺少必需的CRN值,您必须使用 OpenShiftoc插件命令手动复制它们。

要查看集群中 TLS 证书的所有 Ingress 保密信息,请运行以下命令。

ibmcloud oc ingress secret ls -c CLUSTER

为 IBM 提供的 Ingress 子域设置 TLS 秘密

IBM 提供了一个 Ingress 子域和一个默认的 TLS 证书,该证书以 Kubernetes secret 的形式存储在集群中,你可以在你的 Ingress 资源中指定该证书。 IBM 提供的 TLS 证书由 LetsEncrypt 签署,并由 IBM 全面管理。

IBM 提供的 Ingress 子域通配符 *.<cluster_name>-<globally_unique_account_HASH>-0000. .containers.appdomain.cloud`` 默认已为您集群注册。 IBM 提供的 TLS 证书是通配符证书,可用于通配符子域。

请按照以下步骤为 IBM 提供的 Ingress 子域使用默认的 TLS 证书。

  1. 获取存储默认 TLS 证书的密文名称。 请注意,这是您在 Ingress 资源的 spec.tls 部分中指定的私钥名称。

    ibmcloud oc cluster get -c CLUSTER | grep Ingress
    

    示例输出

    Ingress Subdomain:      mycluster-<hash>-0000.us-south.containers.appdomain.cloud
    Ingress Secret:         mycluster-<hash>-0000
    
  2. 查看私钥详细信息并记下 CRN 值。 这是 TLS 证书的 CRN。 如果没有默认 [Secrets Manager] 实例注册到群集,则说明你的秘密没有 CRN。 请参阅以下步骤中的注释以获取更多详细信息。

    ibmcloud oc ingress secret get -c CLUSTER --name SECRET_NAME --namespace openshift-ingress
    
  3. 在每个存在 Ingress 资源或应用程序的命名空间中为默认 TLS 证书创建一个密文。 使用 --cert-crn 命令选项指定 TLS 证书 CRN。

    ibmcloud oc ingress secret create --cluster CLUSTER_NAME_OR_ID --cert-crn CRN --name SECRET_NAME --namespace openshift-ingress
    

    要使用命令 ibmcloud oc ingress secret create 复制密钥,您必须在集群中注册默认 Secrets Manager 实例。 若您未部署 Secrets Manager 实例,而是将密钥直接写入集群,则这些密钥将缺少必需的CRN值,您必须使用 OpenShiftoc 插件命令手动复制它们。

为自定义子域设置 TLS 保密信息

如果在 Ingress 资源中定义了自定义子域,就可以使用自己的 TLS 证书来管理 TLS 终止。 您必须创建一个 Kubernetes 秘密来存储 TLS 证书,然后将此秘密导入应用程序所在的每个命名空间。

通过将自定义 TLS 证书存储在 Secrets Manager 中存储自定义的 Kubernetes 证书,就可以将证书直接导入集群中的 secret。

  1. 在存在 Ingress 资源的命名空间中创建或导入 TLS 证书的密文。 例如,您可以运行以下命令,将 Secrets Manager 中的秘密导入群集。 使用 --cert-crn 命令选项指定 TLS 证书的 CRN。

    要使用命令 ibmcloud oc ingress secret create 导入证书,您必须在集群中注册默认 Secrets Manager 实例。 若您未部署 Secrets Manager 实例,而是将密钥直接写入集群,则这些密钥将缺少必需的CRN值,您必须使用 OpenShiftoc插件命令手动复制它们。

    ibmcloud oc ingress secret create --name SECRET_NAME --cluster CLUSTER_NAME_OR_ID --cert-crn CERTIFICATE_CRN --namespace openshift-ingress
    
  2. 对存在应用程序的每个名称空间重复上一步。

管理非 TLS 秘密

要管理非 TLS 保密信息,可以使用 ibmcloud oc ingress secret 命令。

非 TLS 秘密有 5 种类型:

  • 任意私钥 包含一个字符串值。
  • IAM 凭证 包含 IAM API 密钥。
  • 用户名和密码私钥 将用户名和密码作为两个单独的值保存。
  • 键值 包含 JSON 值。
  • 自定义凭据保存自定义(字符串)值。

了解如何通过以下工具集中管理非 TLS 秘密 IBM Cloud Secrets Manager. 有了 Secrets Manager,你可以创建可管理的 Kubernetes 保密信息,自动更新保密信息,创建保密组来控制谁可以访问集群中的保密信息,等等。

在群集中创建非 TLS 秘密

TLS --type Opaque 通过在 ibmcloud oc ingress secret create 选项,创建非 秘密。 通过 Opaque 类型,可以包含多个非证书 CRN 值。 如果未指定 --type 选项,则默认应用 TLS。 有关更多信息和其他命令选项,请参阅 CLI 参考

下面的示例命令创建了一个非 TLS 秘密,并指定了 Opaque 类型。 非 TLS 保密要求至少有一个保密 字段。 请注意,指定 --field 选项的方式会有所不同 基于您创建的私钥类型

ibmcloud oc ingress secret create -c cluster-test --name example-secret --namespace openshift-ingress --field crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa1a11111aaa1a1111aa1aa111:111a1111-11a1 --type Opaque

要验证是否已创建私钥,请列出名称空间中的所有私钥。

kubectl get secret -n default

以下示例展示了输出结果。

NAME                   TYPE                                  DATA   AGE
all-icr-io             kubernetes.io/dockerconfigjson        1      41h
default-token-8t6xw    kubernetes.io/service-account-token   3      41h
example-secret         Opaque                                        3m

管理非 TLS 保密字段

密文字段是存储在非 TLS 密文中的键值对。 请参考以下示例,查看、添加、更新或删除非 TLS 保密字段。

查看字段值

您可以通过获取私钥的详细信息来查看私钥字段的值。

kubectl get secret -n default example-secret -o yaml

以下示例输出显示了 data 部分中的私钥字段及其值。

apiVersion: v1
data:
  arbitraryFVT: AAAaaAAaAAA1AAAaaAAa
  userCredsFVT_password: aAAaa1aaaA=
  userCredsFVT_username: aAAaaa==
kind: Secret
metadata:
  annotations:
    ingress.cloud.ibm.com/cert-source: ibm
    razee.io/build-url: https://url.com
    razee.io/source-url: https://url.com
  creationTimestamp: "2022-11-08T19:45:05Z"
  name: example-secret
  namespace: default
  resourceVersion: "111111"
  uid: 1aaa1111-1a11-111a-a1a1-11111a1a1a1a
type: Opaque

您还可以使用 ibmcloud oc ingress secret field lsibmcloud oc ingress secret get 命令列出私钥中的字段,但输出仅包含字段名,而不包含与其关联的值。

添加私钥字段

TLS 运行带有 ibmcloud oc ingress secret field add 命令,在其中加入 --field 选项。 使用 ibmcloud oc ingress secret create 命令创建私钥时,还可以使用此选项来添加字段。 此选项不支持用于 TLS 密钥。

有三种方法可指定 --field 选项。 您选择的选项取决于私钥类型以及您希望如何命名私钥中的字段。

为非 TLS 保密信息添加字段的选项
选项 格式 描述 受支持的密钥类型
缺省值 --field <crn> 所添加字段的名称是给定 CRN 的私钥类型的 缺省字段名称 所有非 TLS 秘密类型
指定 --field <name>=<crn> 使用此选项为添加的字段指定名称。 添加的字段的名称是为 <name> 指定的值。 -任意
-IAM 凭证
前缀 --field prefix=<crn> 添加的字段的名称是由给定 CRN 指定的私钥类型的 缺省字段名称,以 <crn> 指定的私钥名称和下划线作为前缀。
  • IAM 凭据
  • 用户名/密码
  • 键/值
  • 自定义凭据

默认字段名称为 arbitrary 用于任意密钥,api_key 用于IAM凭证,usernamepassword 用于用户凭证,以及 key 用于键值对。

以下示例添加了三个私钥字段 (使用名为 iam 的相同 IAM 凭证私钥),以演示不同的 --field 选项如何影响生成的字段名称。 您可以通过运行 kubectl get secret 并查看输出的 data 块来 查看 添加到私钥的字段。

ibmcloud oc ingress secret field add --cluster example-cluster --name example-iam-secret --namespace openshift-ingress  --field crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa-1a11-111a-aa1a-1111aa1aa111:secret:111a1111-11a1-11aa-a1a1-111aa12345aa --field custom_iam_name=crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa-1a11-111a-aa1a-1111aa1aa111:secret:111a1111-11a1-11aa-a1a1-111aa12345aa --field prefix=crn:v1:bluemix:public:secrets-manager:us-south:a/1aa111aa-1a11-111a-aa1a-1111aa1aa111:secret:111a1111-11a1-11aa-a1a1-111aa12345aa

私钥详细信息的 data 块中列出的示例字段。

data:
  api_key: bmZrUHR1VS1fNVpMOExsTmIxeTdQcXFTSENMc2pTUjRsNTQyTzZkZ2ZQMkk=  # Default field type using the default `api_key` field name
  custom_iam_name: bmZrUHR1VS1fNVpMOExsTmIxeTdQcXFTSENMc2pTUjRsNTQyTzZkZ2ZQMkk=  # Named field type using the specified `custom_iam_name` field name.
  iam_api_key: bmZrUHR1VS1fNVpMOExsTmIxeTdQcXFTSENMc2pTUjRsNTQyTzZkZ2ZQMkk= # Prefixed field type using the `iam` name in Secrets Manager followed by the `api_key` default name.

更新私钥字段

运行 ingress secret update 命令以更新私钥字段的值。 请注意,这不会更新 CRN。 有关更多信息和命令选项,请参阅 CLI 参考

ibmcloud oc ingress secret update --cluster example-cluster --name example-secret --namespace openshift-ingress

除去私钥字段

您可以从非 TLS 保密信息中删除保密字段。 有关更多信息和命令选项,请参阅 CLI 参考

ibmcloud oc ingress secret field rm -c example-cluster --name example-secret --namespace openshift-ingress --field-name example-Field

您可以通过检查私钥详细信息的 data 块来验证是否已除去该字段。

kubectl get secret -n default example-secret -o yaml

私钥常见问题解答

查看有关管理集群中的私钥的常见问题的答案。

如果未创建和注册 Secrets Manager 实例,是否会自动更新私钥?
如果未向集群注册 Secrets Manager 实例,那么缺省 Ingress 私钥将继续每 90 天自动更新一次并应用于集群。 但是,不会自动更新您创建的任何用于 引用 缺省 Ingress 私钥的私钥。
示例方案: 您在 default 名称空间中具有缺省 Ingress 证书。 运行 ibmcloud oc ingress secret create 命令并引用缺省 Ingress 证书的 CRN 以在 istio-system 名称空间中镜像该证书。 如果没有 Secrets Manager 实例,那么 default 名称空间中的缺省 Ingress 证书会自动更新。 但是,您负责使用 **kubectl** 命令或其他轮换方法定期更新 istio-system 名称空间中的证书。
我创建了引用缺省 Ingress 证书的私钥,但未创建和注册 Secrets Manager 实例。 如何管理我的私钥?
如果未注册 Secrets Manager 实例,那么 Red Hat OpenShift on IBM Cloud 将仅自动更新缺省 Ingress 私钥。 您负责使用 kubectl 命令或其他旋转方法来管理任何其他私钥。 如果私钥引用缺省 Ingress 证书,请使用 ibmcloud ks ingress secret rm 将其除去。