9.9. 使用 Red Hat OpenShift 的 cert-manager Operator 保护路由
在 OpenShift Container Platform 中,路由 API 被扩展为提供可配置的选项,以通过 secret 引用 TLS 证书。启用 外部管理的证书技术预览功能创建路由 后,您可以最小化手动干预的错误,简化证书管理过程,并使 OpenShift Container Platform 路由器能够及时提供引用的证书。
使用 cert-manager Operator for Red Hat OpenShift 保护路由只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
9.9.1. 配置证书以保护集群中的路由
以下步骤演示了在 OpenShift 中使用 cert-manager Operator for Red Hat OpenShift 的流程,并带有 Let's Encrypt ACME HTTP-01 challenge 类型来保护 OpenShift 中的路由资源。
先决条件
- 您已为 Red Hat OpenShift 安装了 cert-manager Operator 版本 1.14.0 或更高版本。
-
您已启用了
RouteExternalCertificate
功能门。 -
在
routes/custom-host
子资源上具有create
和update
权限。 -
您有一个要公开的
Service
资源。
流程
运行以下命令,使用边缘 TLS 终止和自定义主机名为
Service
资源创建Route
资源。在以下步骤中创建一个Certificate
资源时将使用主机名。$ oc create route edge <route_name> \ 1 --service=<service_name> \ 2 --hostname=<hostname> \ 3 --namespace=<namespace> 4
运行以下命令,创建一个
Issuer
来配置 HTTP-01 solver。有关其他 ACME 签发者类型,请参阅"配置 ACME 签发者"。Issuer.yaml
文件示例$ oc create -f - << EOF apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-acme namespace: <namespace> 1 spec: acme: server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-acme-account-key solvers: - http01: ingress: ingressClassName: openshift-default EOF
- 1
- 指定
Issuer
所在的命名空间。它应与您的路由的命名空间相同。
运行以下命令,为路由创建
Certificate
对象。secretName
指定将由 cert-manager 发布和管理的 TLS secret,并在下一步中在路由中引用。$ oc create -f - << EOF apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: example-route-cert namespace: <namespace> 1 spec: commonName: <hostname> 2 dnsNames: - <hostname> 3 usages: - server auth issuerRef: kind: Issuer name: letsencrypt-acme secretName: <secret_name> 4 EOF
使用以下命令,创建一个
Role
来提供路由器服务帐户权限来读取引用的 secret:$ oc create role secret-reader \ --verb=get,list,watch \ --resource=secrets \ --resource-name=<secret_name> \ 1 --namespace=<namespace> 2
使用以下命令,创建一个
RoleBinding
资源,将 router 服务帐户与新创建的Role
资源绑定:$ oc create rolebinding secret-reader-binding \ --role=secret-reader \ --serviceaccount=openshift-ingress:router \ --namespace=<namespace> 1
- 1
- 指定 secret 和路由所在的命名空间。
更新路由的
.spec.tls.externalCertificate
字段来引用之前创建的 secret,并使用 cert-manager 发布的证书:$ oc patch route <route_name> \ 1 -n <namespace> \ 2 --type=merge \ -p '{"spec":{"tls":{"externalCertificate":{"name":"<secret_name>"}}}}' 3
验证
运行以下命令验证证书是否已创建并就绪:
$ oc get certificate -n <namespace> 1 $ oc get secret -n <namespace> 2
运行以下命令,验证路由器是否使用引用的外部证书。该命令应该返回状态代码
200 OK
。$ curl -IsS https://<hostname> 1
- 1
- 指定路由的主机名。
运行以下命令,从 curl 详细输出验证服务器证书 的
subject
,subjectAltName
和issuer
都如预期:$ curl -v https://<hostname> 1
- 1
- 指定路由的主机名。
现在,路由可以被 cert-manager 发布的引用的 secret 的证书成功保护。cert-manager 将自动管理证书的生命周期。