×

在 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子资源具有createupdate权限。

  • 您有一个要公开的Service资源。

步骤
  1. 通过运行以下命令,为您的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 指定路由所在的命名空间。
  2. 运行以下命令创建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所在的名空间。它应该与您的路由的名空间相同。
  3. 运行以下命令为路由创建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 指定包含证书的密钥的名称。
  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 指定您的密钥和路由都位于哪个名空间。
  5. 使用以下命令创建一个RoleBinding资源,以将路由服务帐户与新创建的Role资源绑定。

    $ oc create rolebinding secret-reader-binding \
      --role=secret-reader \
      --serviceaccount=openshift-ingress:router \
      --namespace=<namespace> (1)
    1 指定您的密钥和路由都位于哪个名空间。
  6. 使用以下命令更新您的路由的.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 指定路由的主机名。
  • 运行以下命令验证服务器证书的subjectsubjectAltNameissuer是否都符合curl详细输出中的预期。

    $ curl -v https://<hostname> (1)
    1 指定路由的主机名。

    路由现在已通过cert-manager颁发的所引用密钥中的证书成功保护。cert-manager将自动管理证书的生命周期。