跳至内容

配置外部域加密

Knative 允许使用自定义 TLS 证书或使用自动生成的 TLS 证书,为您的 Knative 服务启用对外部域(如 application.example.com)的安全 HTTPS 连接。

开始之前

您必须满足以下要求才能启用安全的 HTTPS 连接

  • 必须安装 Knative Serving。有关安装 Serving 组件的详细信息,请参阅 Knative 安装指南
  • 您必须将 Knative 集群配置为使用 自定义外部域
  • 您的 DNS 提供商必须设置为您的域并配置为您的域。
  • 网络层,例如 Kourier、具有 SDS v1.3 或更高版本的 Istio 或 Contour v1.1 或更高版本。请参阅 安装网络层

自动获取和更新证书

安装和配置 cert-manager 及其集成

信息

如果要使用 HTTP-01 挑战,您需要将自定义域配置为映射到入口的 IP。您可以通过添加 DNS A 记录来映射域到 IP,这与您的 DNS 提供商的说明一致。

首先,您需要安装和配置 cert-manager 以及 Knative cert-manager 集成。有关详细信息,请参阅 配置 Knative cert-manager 集成

配置 Knative Serving

自动证书配置允许以两种方式请求证书

  • 每个 Knative 服务一个证书
  • 每个命名空间一个通配符证书

它们中只能有一个处于活动状态!

使用每个 Knative 服务的证书

更新 knative-serving 命名空间中的 config-network ConfigMap,以启用 external-domain-tls

  1. 运行以下命令来编辑您的 config-network ConfigMap

    kubectl edit configmap config-network -n knative-serving
    
  2. data 部分下添加 external-domain-tls: Enabled 属性

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-network
      namespace: knative-serving
    data:
       ...
       external-domain-tls: Enabled
       ...
    
  3. 重新启动 Knative Serving 控制器以启动 Knative cert-manager 集成

    kubectl rollout restart deploy/controller -n knative-serving
    

使用每个命名空间的一个通配符证书

警告

每个命名空间配置一个通配符证书仅适用于 DNS-01 挑战。此功能不适用于 HTTP-01 挑战。

每个命名空间配置使用命名空间标签来选择应该应用证书的命名空间。选择使用 config-network ConfigMap 中的键 namespace-wildcard-cert-selector 进行配置。例如,您可以使用以下配置

  • namespace-wildcard-cert-selector: "" = 使用空值禁用此功能(这是默认设置)。
  • namespace-wildcard-cert-selector: {} = 使用空对象为所有命名空间启用。

您还可以配置选择器,以便在命名空间上存在特定标签时选择退出

namespace-wildcard-cert-selector: |-
  matchExpressions:
  - key: "networking.knative.dev/disableWildcardCert"
    operator: "NotIn"
    values: ["true"] 
这将选择所有标签值不在集合 "true" 中的命名空间。

或使用现有的 kubernetes 标签根据名称选择命名空间

namespace-wildcard-cert-selector: |-
  matchExpressions:
    - key: "kubernetes.io/metadata.name"
      operator: "In"
      values: ["my-namespace", "my-other-namespace"] 

要应用配置,您可以使用以下命令(可选择调整标签选择器)

kubectl patch --namespace knative-serving configmap config-network -p '{"data": {"namespace-wildcard-cert-selector": "{\"matchExpressions\": [{\"key\":\"networking.knative.dev/disableWildcardCert\", \"operator\": \"NotIn\", \"values\":[\"true\"]}]}"}}'

有关命名空间选择器的更多详细信息,请参阅 Kubernetes 文档

重新启动 Knative Serving 控制器以启动 Knative cert-manager 集成

kubectl rollout restart deploy/controller -n knative-serving

恭喜!Knative 现在已配置为获取和更新 TLS 证书。当您的 TLS 证书签发并可用于您的集群时,您的 Knative 服务将能够处理外部域上的 HTTPS 流量。

手动获取和更新证书

手动获取证书的方法多种多样。您可以使用 Certbotcert-manager 等工具,也可以手动从其他来源提供证书。通常,在获取证书后,您必须创建 Kubernetes 密钥才能在集群中使用该证书。有关手动获取和配置证书的详细信息,请参阅本主题后面的步骤。

使用工具获取证书

请参阅该工具的相应文档

Knative 预计会获得一个针对集群外部域 DNS 域签名的通配符证书,例如

*.yourdomain.com

获取证书和私钥后,创建 Kubernetes 密钥,以便 Knative 可以使用证书和密钥。

警告

由 Let's Encrypt 签发的证书有效期仅为 90 天。因此,如果您选择手动获取和配置证书,则必须确保在每个证书到期之前续订证书。

创建 Kubernetes 密钥

在相关选项卡中使用以下步骤将您的证书添加到 Knative 集群

要将 TLS 证书添加到 Knative 集群,您必须创建 Kubernetes 密钥,然后配置 Knative Contour 插件。

  1. 通过运行以下命令,创建 Kubernetes 密钥来保存您的 TLS 证书 cert.pem 和私钥 key.pem

    kubectl create -n contour-external secret tls default-cert \
      --key key.pem \
      --cert cert.pem
    

    注意

    记下命名空间和密钥名称。您将在以后的步骤中需要这些信息。

  2. 要在不同的命名空间中使用此证书和私钥,您必须创建一个委派。为此,请使用以下模板创建一个 YAML 文件

    apiVersion: projectcontour.io/v1
    kind: TLSCertificateDelegation
    metadata:
      name: default-delegation
      namespace: contour-external
    spec:
      delegations:
        - secretName: default-cert
          targetNamespaces:
          - "*"
    
  3. 通过运行以下命令,应用 YAML 文件

    kubectl apply -f <filename>.yaml
    
    其中 <filename> 是您在上一步中创建的文件的名称。

  4. 更新 Knative Contour 插件,使其在 external-domain-tls 被禁用时使用证书作为备用,方法是运行以下命令

    kubectl patch configmap config-contour -n knative-serving \
      -p '{"data":{"default-tls-secret":"contour-external/default-cert"}}'
    

要将 TLS 证书添加到 Knative 集群,您必须创建 Kubernetes 密钥,然后配置 knative-ingress-gateway

  1. 通过输入以下命令,创建 Kubernetes 密钥来保存您的 TLS 证书 cert.pem 和私钥 key.pem
kubectl create --namespace istio-system secret tls tls-cert \
  --key key.pem \
  --cert cert.pem
  1. 配置 Knative 使用您为 HTTPS 连接创建的新密钥

  2. 运行以下命令以在编辑模式下打开 Knative 共享 gateway

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving
    
  3. 更新 gateway 以包含以下 tls: 部分和配置

    tls:
      mode: SIMPLE
      credentialName: tls-cert
    

    示例

    # Edit the following object. Lines beginning with a '#' will be ignored.
    # An empty file will abort the edit. If an error occurs while saving this
    # file will be reopened with the relevant failures.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      # ... skipped ...
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - "*"
          port:
            name: http
            number: 80
            protocol: HTTP
        - hosts:
            - TLS_HOSTS
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            mode: SIMPLE
            credentialName: tls-cert
    
    在此示例中,TLS_HOSTS 代表您的 TLS 证书的主机。它可以是单个主机、多个主机或通配符主机。有关详细说明,请参阅 Istio 文档

验证

  1. 部署 Knative 服务

  2. 使用 kubectl get ksvc -n <your-namespace> 检查 URL

  3. 服务 URL 现在应为 https

    NAME           URL                                          LATEST               AGE     CONDITIONS   READY   REASON
    autoscale-go   https://autoscale-go.default.1.example.com   autoscale-go-dd42t   8m17s   3 OK / 3     True
    

信任

注意

关于信任的一个快速说明,所有调用 Knative 服务外部域的客户端都需要信任签署证书的证书颁发机构。这超出了 Knative 的范围,但需要解决才能确保系统正常运行。尤其是当证书颁发机构执行 CA 或中间证书的轮换时。有关更多信息,请参阅 配置 Knative cert-manager 集成

其他配置

配置 HTTP 重定向

Knative Serving 允许在外部域上启用 HTTPS 时自动重定向 HTTP 流量。要配置此功能

  1. 使用 http-protocol 属性配置如何处理 HTTP 和 HTTPS 请求。

    默认情况下,Knative 入口被配置为提供 HTTP 流量(http-protocol: Enabled)。现在您的集群已配置为使用 TLS 证书并处理外部域上的 HTTPS 流量,您可以指定是否允许任何 HTTP 流量。

    支持的 http-protocol

    • 启用: 提供 HTTP 流量。
    • 重定向: 使用 302 重定向响应 HTTP 请求,要求客户端使用 HTTPS。
    data:
      http-protocol: Redirected
    

    示例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-network
      namespace: knative-serving
    data:
      ...
      external-domain-tls: Enabled
      http-protocol: Redirected
      ...
    

禁用每个服务或路由的自动 TLS 证书配置

如果您在集群中启用了自动 TLS 证书配置,可以选择通过添加注释 networking.knative.dev/disable-external-domain-tls: true 来禁用单个 Knative 服务或路由的此功能。

使用 autoscale-go 示例

  1. 使用 kubectl edit service.serving.knative.dev/autoscale-go -n default 编辑服务并添加注释

     apiVersion: serving.knative.dev/v1
     kind: Service
     metadata:
       annotations:
        ...
         networking.knative.dev/disable-external-domain-tls: "true"
        ...
    
  2. 服务 URL 现在应为 http,表明已禁用自动 TLS 证书配置。

    NAME           URL                                          LATEST               AGE     CONDITIONS   READY   REASON
    autoscale-go   http://autoscale-go.default.1.example.com    autoscale-go-dd42t   8m17s   3 OK / 3     True
    

我们使用分析和 Cookie 来了解网站流量。有关您使用我们网站的信息将与 Google 共享,以用于该目的。 了解更多。