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 子资源上具有 createupdate 权限。
  • 您有一个要公开的 Service 资源。

流程

  1. 运行以下命令,使用边缘 TLS 终止和自定义主机名为 Service 资源创建 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 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 所在的命名空间。它应与您的路由的命名空间相同。
  3. 运行以下命令,为路由创建 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
    1
    指定 Certificate 资源所在的命名空间。它应与您的路由的命名空间相同。
    2
    使用路由的主机名指定证书的通用名称。
    3
    将路由的主机名添加到证书的 DNS 名称。
    4
    指定包含证书的 secret 名称。
  4. 使用以下命令,创建一个 Role 来提供路由器服务帐户权限来读取引用的 secret:

    $ oc create role secret-reader \
      --verb=get,list,watch \
      --resource=secrets \
      --resource-name=<secret_name> \ 1
      --namespace=<namespace> 2
    1
    指定要授予访问权限的 secret 的名称。它应该与您的在 Certificate 资源中指定的 secretName 一致。
    2
    指定 secret 和路由所在的命名空间。
  5. 使用以下命令,创建一个 RoleBinding 资源,将 router 服务帐户与新创建的 Role 资源绑定:

    $ oc create rolebinding secret-reader-binding \
      --role=secret-reader \
      --serviceaccount=openshift-ingress:router \
      --namespace=<namespace> 1
    1
    指定 secret 和路由所在的命名空间。
  6. 更新路由的 .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
    1
    指定路由名称。
    2
    指定 secret 和路由所在的命名空间。
    3
    指定包含证书的 secret 名称。

验证

  • 运行以下命令验证证书是否已创建并就绪:

    $ oc get certificate -n <namespace> 1
    $ oc get secret -n <namespace> 2
    1 2
    指定 secret 和路由所在的命名空间。
  • 运行以下命令,验证路由器是否使用引用的外部证书。该命令应该返回状态代码 200 OK

    $ curl -IsS https://<hostname> 1
    1
    指定路由的主机名。
  • 运行以下命令,从 curl 详细输出验证服务器证书 的 subject, subjectAltNameissuer 都如预期:

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

    现在,路由可以被 cert-manager 发布的引用的 secret 的证书成功保护。cert-manager 将自动管理证书的生命周期。

9.9.2. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.