管理 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.
请按照以下步骤为 IBM 提供的 Ingress 子域使用默认的 TLS 证书。
-
获取存储默认 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 -
查看私钥详细信息并记下 CRN 值。 这是 TLS 证书的 CRN。 如果没有默认 [Secrets Manager] 实例注册到群集,则说明你的秘密没有 CRN。 请参阅以下步骤中的注释以获取更多详细信息。
ibmcloud oc ingress secret get -c CLUSTER --name SECRET_NAME --namespace openshift-ingress -
在每个存在 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。
-
在存在 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 -
对存在应用程序的每个名称空间重复上一步。
管理非 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 ls 和 ibmcloud oc ingress secret get 命令列出私钥中的字段,但输出仅包含字段名,而不包含与其关联的值。
添加私钥字段
TLS 运行带有 ibmcloud oc ingress secret field add 命令,在其中加入 --field 选项。 使用 ibmcloud oc ingress secret create 命令创建私钥时,还可以使用此选项来添加字段。 此选项不支持用于 TLS 密钥。
有三种方法可指定 --field 选项。 您选择的选项取决于私钥类型以及您希望如何命名私钥中的字段。
| 选项 | 格式 | 描述 | 受支持的密钥类型 |
|---|---|---|---|
| 缺省值 | --field <crn> |
所添加字段的名称是给定 CRN 的私钥类型的 缺省字段名称。 | 所有非 TLS 秘密类型 |
| 指定 | --field <name>=<crn> |
使用此选项为添加的字段指定名称。 添加的字段的名称是为 <name> 指定的值。 |
-任意 -IAM 凭证 |
| 前缀 | --field prefix=<crn> |
添加的字段的名称是由给定 CRN 指定的私钥类型的 缺省字段名称,以 <crn> 指定的私钥名称和下划线作为前缀。 |
|
默认字段名称为 arbitrary 用于任意密钥,api_key 用于IAM凭证,username 或 password 用于用户凭证,以及 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将其除去。