×

使用 TLS 证书保护自定义域的服务

配置 Knative 服务的自定义域后,您可以使用 TLS 证书来保护已映射的服务。为此,您必须创建一个 Kubernetes TLS 密钥,然后更新DomainMapping CR 以使用您创建的 TLS 密钥。

先决条件
  • 您已为 Knative 服务配置了自定义域,并且拥有一个可运行的DomainMapping CR。

  • 您拥有来自证书颁发机构提供商的 TLS 证书或自签名证书。

  • 您已从证书颁发机构提供商或自签名证书处获取certkey文件。

  • 安装 OpenShift CLI (oc)。

步骤
  1. 创建 Kubernetes TLS 密钥

    $ oc create secret tls <tls_secret_name> --cert=<path_to_certificate_file> --key=<path_to_key_file>
  2. networking.internal.knative.dev/certificate-uid: <id>标签添加到 Kubernetes TLS 密钥

    $ oc label secret <tls_secret_name> networking.internal.knative.dev/certificate-uid="<id>"

    如果您使用的是第三方密钥提供商(例如cert-manager),您可以配置您的密钥管理器自动为 Kubernetes TLS 密钥添加标签。cert-manager用户可以使用提供的密钥模板自动生成带有正确标签的密钥。在这种情况下,密钥过滤仅基于密钥进行,但此值可以携带有用的信息,例如密钥包含的证书 ID。

    Red Hat OpenShift 的 cert-manager 运算符是技术预览功能。有关更多信息,请参阅**安装 Red Hat OpenShift 的 cert-manager 运算符**文档。

  3. 更新DomainMapping CR 以使用您创建的 TLS 密钥

    apiVersion: serving.knative.dev/v1beta1
    kind: DomainMapping
    metadata:
      name: <domain_name>
      namespace: <namespace>
    spec:
      ref:
        name: <service_name>
        kind: Service
        apiVersion: serving.knative.dev/v1
    # TLS block specifies the secret to be used
      tls:
        secretName: <tls_secret_name>
验证
  1. 验证DomainMapping CR 状态是否为True,并且输出的URL列是否显示带有https方案的已映射域

    $ oc get domainmapping <domain_name>
    示例输出
    NAME                      URL                               READY   REASON
    example.com               https://example.com               True
  2. 可选:如果服务公开对外,请通过运行以下命令验证其是否可用

    $ curl https://<domain_name>

    如果证书是自签名的,请通过向curl命令添加-k标志来跳过验证。

通过使用密钥过滤来改进 net-kourier 的内存使用率

默认情况下,Kubernetes client-go 库的informers实现会获取特定类型的所有资源。当存在许多资源时,这可能会导致相当大的开销,这可能会导致 Knative net-kourier 入口控制器在大型集群上由于内存泄漏而失败。但是,Knative net-kourier 入口控制器提供了一种过滤机制,使控制器能够仅获取与 Knative 相关的密钥。

密钥过滤在 OpenShift Serverless 运算符端默认启用。默认情况下,环境变量ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID=true会添加到net-kourier控制器 pod 中。

如果启用密钥过滤,则所有密钥都需要用networking.internal.knative.dev/certificate-uid: "<id>"标记。否则,Knative Serving 无法检测到它们,这会导致失败。您必须标记新的和现有的密钥。

先决条件
  • 您在 OpenShift Container Platform 上具有集群管理员权限,或者您在 Red Hat OpenShift Service on AWS 或 OpenShift Dedicated 上具有集群或专用管理员权限。

  • 您创建的项目或您拥有创建应用程序和其他工作负载的角色和权限的项目。

  • 安装 OpenShift Serverless 运算符和 Knative Serving。

  • 安装 OpenShift CLI (oc)。

您可以通过在KnativeServing自定义资源 (CR) 中使用workloads字段,将ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID变量设置为false来禁用密钥过滤。

KnativeServing CR示例
apiVersion: operator.knative.dev/v1beta1
kind: KnativeServing
metadata:
  name: knative-serving
  namespace: knative-serving
spec:
...
  workloads:
    - env:
        - container: controller
          envVars:
            - name: ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID
              value: 'false'
      name: net-kourier-controller