$ oc create route edge <route_name> \ (1)
--service=<service_name> \ (2)
--hostname=<hostname> \ (3)
--namespace=<namespace> (4)
在 OpenShift Container Platform 中,路由 API 扩展为提供一个可配置选项,可以通过密钥引用 TLS 证书。启用使用外部管理的证书创建路由 技术预览功能后,您可以最大限度地减少手动干预造成的错误,简化证书管理流程,并使 OpenShift Container Platform 路由器能够迅速提供引用的证书。
使用 Red Hat OpenShift 的 cert-manager 运算符保护路由只是一个技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可以提前访问即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。 有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围。 |
以下步骤演示了如何将 Red Hat OpenShift 的 cert-manager 运算符与Let’s Encrypt ACME HTTP-01 质询类型结合使用,以保护 OpenShift Container Platform 集群中的路由资源。
您已安装 1.14.0 或更高版本的 Red Hat OpenShift 的 cert-manager 运算符。
您已启用RouteExternalCertificate
功能开关。
您对routes/custom-host
子资源具有create
和update
权限。
您有一个要公开的Service
资源。
通过运行以下命令,为您的Service
资源创建一个使用边缘 TLS 终止和自定义主机名的Route
资源。在接下来的步骤中创建Certificate
资源时,将使用此主机名。
$ oc create route edge <route_name> \ (1)
--service=<service_name> \ (2)
--hostname=<hostname> \ (3)
--namespace=<namespace> (4)
1 | 指定路由的名称。 |
2 | 指定您要公开的服务。 |
3 | 指定路由的主机名。 |
4 | 指定路由所在的命名空间。 |
运行以下命令创建Issuer
以配置HTTP-01解析器。有关其他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密钥,并且在接下来的步骤中也将引用您的路由。
$ 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
1 | 指定Certificate 资源所在的名空间。它应该与您的路由的名空间相同。 |
2 | 使用路由的主机名指定证书的公用名。 |
3 | 将路由的主机名添加到证书的DNS名称中。 |
4 | 指定包含证书的密钥的名称。 |
使用以下命令创建一个Role
,以向路由服务帐户提供读取所引用密钥的权限
$ oc create role secret-reader \
--verb=get,list,watch \
--resource=secrets \
--resource-name=<secret_name> \ (1)
--namespace=<namespace> (2)
1 | 指定要授予访问权限的密钥的名称。它应该与您在Certificate 资源中指定的secretName 一致。 |
2 | 指定您的密钥和路由都位于哪个名空间。 |
使用以下命令创建一个RoleBinding
资源,以将路由服务帐户与新创建的Role
资源绑定。
$ oc create rolebinding secret-reader-binding \
--role=secret-reader \
--serviceaccount=openshift-ingress:router \
--namespace=<namespace> (1)
1 | 指定您的密钥和路由都位于哪个名空间。 |
使用以下命令更新您的路由的.spec.tls.externalCertificate
字段以引用先前创建的密钥,并使用cert-manager颁发的证书。
$ oc patch route <route_name> \ (1)
-n <namespace> \ (2)
--type=merge \
-p '{"spec":{"tls":{"externalCertificate":{"name":"<secret_name>"}}}}' (3)
1 | 指定路由名称。 |
2 | 指定您的密钥和路由都位于哪个名空间。 |
3 | 指定包含证书的密钥的名称。 |
运行以下命令验证证书是否已创建并可以使用。
$ oc get certificate -n <namespace> (1)
$ oc get secret -n <namespace> (1)
1 | 指定您的密钥和路由都位于哪个名空间。 |
运行以下命令验证路由是否正在使用引用的外部证书。该命令应返回状态代码200 OK
。
$ curl -IsS https://<hostname> (1)
1 | 指定路由的主机名。 |
运行以下命令验证服务器证书的subject
、subjectAltName
和issuer
是否都符合curl详细输出中的预期。
$ curl -v https://<hostname> (1)
1 | 指定路由的主机名。 |
路由现在已通过cert-manager颁发的所引用密钥中的证书成功保护。cert-manager将自动管理证书的生命周期。