管理 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 值,您必须使用 OpenShift oc
插件 命令手动复制这些私钥。
要查看集群中 TLS 证书的所有 Ingress 私钥,请运行以下命令。
ibmcloud oc ingress secret ls -c <cluster>
为 IBM提供的 Ingress 子域设置 TLS 私钥
IBM 提供了 Ingress 子域和缺省 TLS 证书,这些证书作为 Kubernetes 私钥存储在集群中,您可以在 Ingress 资源中指定。 IBM 提供的 TLS 证书由 LetsEncrypt 签署,并由 IBM 全面管理。
缺省情况下,已为集群注册 IBM提供的 Ingress 子域通配符 *.<cluster_name>.<globally_unique_account_HASH>-0000.<region>.containers.appdomain.cloud
。 IBM 提供的 TLS 证书是通配符证书,可用于通配符子域。
执行以下步骤以将缺省 TLS 证书用于 IBM提供的 Ingress 子域。
-
获取存储缺省 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 证书,然后将此私钥导入到应用程序所在的每个名称空间中。
通过在 Secrets Manager 中存储定制 TLS 证书,可以将证书直接导入到集群中的 Kubernetes 私钥中。
-
在 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
命令。
有 4 种类型的非 TLS 私钥:
- 任意私钥 包含一个字符串值。
- IAM 凭证 包含 IAM API 密钥。
- 用户名和密码私钥 将用户名和密码作为两个单独的值保存。
- 键值 包含 JSON 值。
了解如何使用 IBM Cloud Secrets Manager 集中管理非 TLS 私钥。 通过 Secrets Manager,您可以创建受管 Kubernetes 私钥,自动更新私钥,创建控制谁有权访问集群中的私钥的私钥组等。
在集群中创建非 TLS 私钥
通过在 ibmcloud oc ingress secret create
命令中指定 --type Opaque
选项来创建非 TLS 私钥。 通过 Opaque
类型,可以包含多个非证书 CRN 值。 如果未指定 "--type
选项,则默认使用 TLS。 有关更多信息和其他命令选项,请参阅 CLI 参考。
以下示例命令创建指定了 Opaque
类型的非 TLS 私钥。 非 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://travis.ibm.com/alchemy-containers/armada-ingress-secret-mgr/builds/78876583
razee.io/source-url: https://github.ibm.com/alchemy-containers/armada-ingress-secret-mgr/commit/651fa822632128163cf638c47f0a14b1e0e2915a
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
命令列出私钥中的字段,但输出仅包含字段名,而不包含与其关联的值。
添加私钥字段
通过运行带有 --field
选项的 ibmcloud oc ingress secret field add
命令,将私钥字段添加到非 TLS 私钥。 使用 ibmcloud oc ingress secret create
命令创建私钥时,还可以使用此选项来添加字段。 TLS 保密不支持该选项。
有三种方法可指定 --field
选项。 您选择的选项取决于私钥类型以及您希望如何命名私钥中的字段。
选项 | 格式 | 描述 | 受支持的密钥类型 |
---|---|---|---|
缺省值 | --field <crn> |
所添加字段的名称是给定 CRN 的私钥类型的 缺省字段名称。 | 所有非 TLS 密钥类型 |
指定 | --field <name>=<crn> |
使用此选项为添加的字段指定名称。 添加的字段的名称是为 <name> 指定的值。 |
-任意 -IAM 凭证 |
前缀 | --field prefix=<crn> |
添加的字段的名称是由给定 CRN 指定的私钥类型的 缺省字段名称,以 <crn> 指定的私钥名称和下划线作为前缀。 |
-IAM 凭证 -username/password -key/value |
缺省字段名称为 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
将其除去。